github.com/xgoffin/jenkins-library@v1.154.0/cmd/terraformExecute_generated.go (about) 1 // Code generated by piper's step-generator. DO NOT EDIT. 2 3 package cmd 4 5 import ( 6 "fmt" 7 "os" 8 "path/filepath" 9 "time" 10 11 "github.com/SAP/jenkins-library/pkg/config" 12 "github.com/SAP/jenkins-library/pkg/log" 13 "github.com/SAP/jenkins-library/pkg/piperenv" 14 "github.com/SAP/jenkins-library/pkg/splunk" 15 "github.com/SAP/jenkins-library/pkg/telemetry" 16 "github.com/SAP/jenkins-library/pkg/validation" 17 "github.com/spf13/cobra" 18 ) 19 20 type terraformExecuteOptions struct { 21 Command string `json:"command,omitempty"` 22 TerraformSecrets string `json:"terraformSecrets,omitempty"` 23 GlobalOptions []string `json:"globalOptions,omitempty"` 24 AdditionalArgs []string `json:"additionalArgs,omitempty"` 25 Init bool `json:"init,omitempty"` 26 CliConfigFile string `json:"cliConfigFile,omitempty"` 27 Workspace string `json:"workspace,omitempty"` 28 } 29 30 type terraformExecuteCommonPipelineEnvironment struct { 31 custom struct { 32 terraformOutputs map[string]interface{} 33 } 34 } 35 36 func (p *terraformExecuteCommonPipelineEnvironment) persist(path, resourceName string) { 37 content := []struct { 38 category string 39 name string 40 value interface{} 41 }{ 42 {category: "custom", name: "terraformOutputs", value: p.custom.terraformOutputs}, 43 } 44 45 errCount := 0 46 for _, param := range content { 47 err := piperenv.SetResourceParameter(path, resourceName, filepath.Join(param.category, param.name), param.value) 48 if err != nil { 49 log.Entry().WithError(err).Error("Error persisting piper environment.") 50 errCount++ 51 } 52 } 53 if errCount > 0 { 54 log.Entry().Error("failed to persist Piper environment") 55 } 56 } 57 58 // TerraformExecuteCommand Executes Terraform 59 func TerraformExecuteCommand() *cobra.Command { 60 const STEP_NAME = "terraformExecute" 61 62 metadata := terraformExecuteMetadata() 63 var stepConfig terraformExecuteOptions 64 var startTime time.Time 65 var commonPipelineEnvironment terraformExecuteCommonPipelineEnvironment 66 var logCollector *log.CollectorHook 67 var splunkClient *splunk.Splunk 68 telemetryClient := &telemetry.Telemetry{} 69 70 var createTerraformExecuteCmd = &cobra.Command{ 71 Use: STEP_NAME, 72 Short: "Executes Terraform", 73 Long: `This step executes the terraform binary with the given command, and is able to fetch additional variables from vault.`, 74 PreRunE: func(cmd *cobra.Command, _ []string) error { 75 startTime = time.Now() 76 log.SetStepName(STEP_NAME) 77 log.SetVerbose(GeneralConfig.Verbose) 78 79 GeneralConfig.GitHubAccessTokens = ResolveAccessTokens(GeneralConfig.GitHubTokens) 80 81 path, _ := os.Getwd() 82 fatalHook := &log.FatalHook{CorrelationID: GeneralConfig.CorrelationID, Path: path} 83 log.RegisterHook(fatalHook) 84 85 err := PrepareConfig(cmd, &metadata, STEP_NAME, &stepConfig, config.OpenPiperFile) 86 if err != nil { 87 log.SetErrorCategory(log.ErrorConfiguration) 88 return err 89 } 90 log.RegisterSecret(stepConfig.CliConfigFile) 91 92 if len(GeneralConfig.HookConfig.SentryConfig.Dsn) > 0 { 93 sentryHook := log.NewSentryHook(GeneralConfig.HookConfig.SentryConfig.Dsn, GeneralConfig.CorrelationID) 94 log.RegisterHook(&sentryHook) 95 } 96 97 if len(GeneralConfig.HookConfig.SplunkConfig.Dsn) > 0 { 98 splunkClient = &splunk.Splunk{} 99 logCollector = &log.CollectorHook{CorrelationID: GeneralConfig.CorrelationID} 100 log.RegisterHook(logCollector) 101 } 102 103 validation, err := validation.New(validation.WithJSONNamesForStructFields(), validation.WithPredefinedErrorMessages()) 104 if err != nil { 105 return err 106 } 107 if err = validation.ValidateStruct(stepConfig); err != nil { 108 log.SetErrorCategory(log.ErrorConfiguration) 109 return err 110 } 111 112 return nil 113 }, 114 Run: func(_ *cobra.Command, _ []string) { 115 stepTelemetryData := telemetry.CustomData{} 116 stepTelemetryData.ErrorCode = "1" 117 handler := func() { 118 commonPipelineEnvironment.persist(GeneralConfig.EnvRootPath, "commonPipelineEnvironment") 119 config.RemoveVaultSecretFiles() 120 stepTelemetryData.Duration = fmt.Sprintf("%v", time.Since(startTime).Milliseconds()) 121 stepTelemetryData.ErrorCategory = log.GetErrorCategory().String() 122 stepTelemetryData.PiperCommitHash = GitCommit 123 telemetryClient.SetData(&stepTelemetryData) 124 telemetryClient.Send() 125 if len(GeneralConfig.HookConfig.SplunkConfig.Dsn) > 0 { 126 splunkClient.Send(telemetryClient.GetData(), logCollector) 127 } 128 } 129 log.DeferExitHandler(handler) 130 defer handler() 131 telemetryClient.Initialize(GeneralConfig.NoTelemetry, STEP_NAME) 132 if len(GeneralConfig.HookConfig.SplunkConfig.Dsn) > 0 { 133 splunkClient.Initialize(GeneralConfig.CorrelationID, 134 GeneralConfig.HookConfig.SplunkConfig.Dsn, 135 GeneralConfig.HookConfig.SplunkConfig.Token, 136 GeneralConfig.HookConfig.SplunkConfig.Index, 137 GeneralConfig.HookConfig.SplunkConfig.SendLogs) 138 } 139 terraformExecute(stepConfig, &stepTelemetryData, &commonPipelineEnvironment) 140 stepTelemetryData.ErrorCode = "0" 141 log.Entry().Info("SUCCESS") 142 }, 143 } 144 145 addTerraformExecuteFlags(createTerraformExecuteCmd, &stepConfig) 146 return createTerraformExecuteCmd 147 } 148 149 func addTerraformExecuteFlags(cmd *cobra.Command, stepConfig *terraformExecuteOptions) { 150 cmd.Flags().StringVar(&stepConfig.Command, "command", `plan`, "") 151 cmd.Flags().StringVar(&stepConfig.TerraformSecrets, "terraformSecrets", os.Getenv("PIPER_terraformSecrets"), "") 152 cmd.Flags().StringSliceVar(&stepConfig.GlobalOptions, "globalOptions", []string{}, "") 153 cmd.Flags().StringSliceVar(&stepConfig.AdditionalArgs, "additionalArgs", []string{}, "") 154 cmd.Flags().BoolVar(&stepConfig.Init, "init", false, "") 155 cmd.Flags().StringVar(&stepConfig.CliConfigFile, "cliConfigFile", os.Getenv("PIPER_cliConfigFile"), "Path to the terraform CLI configuration file (https://www.terraform.io/docs/cli/config/config-file.html#credentials).") 156 cmd.Flags().StringVar(&stepConfig.Workspace, "workspace", os.Getenv("PIPER_workspace"), "") 157 158 } 159 160 // retrieve step metadata 161 func terraformExecuteMetadata() config.StepData { 162 var theMetaData = config.StepData{ 163 Metadata: config.StepMetadata{ 164 Name: "terraformExecute", 165 Aliases: []config.Alias{}, 166 Description: "Executes Terraform", 167 }, 168 Spec: config.StepSpec{ 169 Inputs: config.StepInputs{ 170 Secrets: []config.StepSecrets{ 171 {Name: "cliConfigFileCredentialsId", Description: "Jenkins 'Secret file' credentials ID containing terraform CLI configuration. You can find more details about it in the [Terraform documentation](https://www.terraform.io/docs/cli/config/config-file.html#credentials).", Type: "jenkins"}, 172 }, 173 Parameters: []config.StepParameters{ 174 { 175 Name: "command", 176 ResourceRef: []config.ResourceReference{}, 177 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 178 Type: "string", 179 Mandatory: false, 180 Aliases: []config.Alias{}, 181 Default: `plan`, 182 }, 183 { 184 Name: "terraformSecrets", 185 ResourceRef: []config.ResourceReference{ 186 { 187 Name: "terraformFileVaultSecretName", 188 Type: "vaultSecretFile", 189 Default: "terraform", 190 }, 191 }, 192 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 193 Type: "string", 194 Mandatory: false, 195 Aliases: []config.Alias{}, 196 Default: os.Getenv("PIPER_terraformSecrets"), 197 }, 198 { 199 Name: "globalOptions", 200 ResourceRef: []config.ResourceReference{}, 201 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 202 Type: "[]string", 203 Mandatory: false, 204 Aliases: []config.Alias{}, 205 Default: []string{}, 206 }, 207 { 208 Name: "additionalArgs", 209 ResourceRef: []config.ResourceReference{}, 210 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 211 Type: "[]string", 212 Mandatory: false, 213 Aliases: []config.Alias{}, 214 Default: []string{}, 215 }, 216 { 217 Name: "init", 218 ResourceRef: []config.ResourceReference{}, 219 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 220 Type: "bool", 221 Mandatory: false, 222 Aliases: []config.Alias{}, 223 Default: false, 224 }, 225 { 226 Name: "cliConfigFile", 227 ResourceRef: []config.ResourceReference{ 228 { 229 Name: "cliConfigFileCredentialsId", 230 Type: "secret", 231 }, 232 233 { 234 Name: "cliConfigFileVaultSecretName", 235 Type: "vaultSecretFile", 236 Default: "terraform", 237 }, 238 }, 239 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 240 Type: "string", 241 Mandatory: false, 242 Aliases: []config.Alias{}, 243 Default: os.Getenv("PIPER_cliConfigFile"), 244 }, 245 { 246 Name: "workspace", 247 ResourceRef: []config.ResourceReference{}, 248 Scope: []string{"PARAMETERS", "STAGES", "STEPS"}, 249 Type: "string", 250 Mandatory: false, 251 Aliases: []config.Alias{}, 252 Default: os.Getenv("PIPER_workspace"), 253 }, 254 }, 255 }, 256 Containers: []config.Container{ 257 {Name: "terraform", Image: "hashicorp/terraform:1.0.10", EnvVars: []config.EnvVar{{Name: "TF_IN_AUTOMATION", Value: "piper"}}, Options: []config.Option{{Name: "--entrypoint", Value: ""}}}, 258 }, 259 Outputs: config.StepOutputs{ 260 Resources: []config.StepResources{ 261 { 262 Name: "commonPipelineEnvironment", 263 Type: "piperEnvironment", 264 Parameters: []map[string]interface{}{ 265 {"name": "custom/terraformOutputs", "type": "map[string]interface{}"}, 266 }, 267 }, 268 }, 269 }, 270 }, 271 } 272 return theMetaData 273 }