github.com/SAP/jenkins-library@v1.362.0/cmd/terraformExecute.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/SAP/jenkins-library/pkg/command"
     7  	"github.com/SAP/jenkins-library/pkg/log"
     8  	"github.com/SAP/jenkins-library/pkg/piperutils"
     9  	"github.com/SAP/jenkins-library/pkg/telemetry"
    10  	"github.com/SAP/jenkins-library/pkg/terraform"
    11  )
    12  
    13  type terraformExecuteUtils interface {
    14  	command.ExecRunner
    15  
    16  	FileExists(filename string) (bool, error)
    17  }
    18  
    19  type terraformExecuteUtilsBundle struct {
    20  	*command.Command
    21  	*piperutils.Files
    22  }
    23  
    24  func newTerraformExecuteUtils() terraformExecuteUtils {
    25  	utils := terraformExecuteUtilsBundle{
    26  		Command: &command.Command{},
    27  		Files:   &piperutils.Files{},
    28  	}
    29  	// Reroute command output to logging framework
    30  	utils.Stdout(log.Writer())
    31  	utils.Stderr(log.Writer())
    32  	return &utils
    33  }
    34  
    35  func terraformExecute(config terraformExecuteOptions, telemetryData *telemetry.CustomData, commonPipelineEnvironment *terraformExecuteCommonPipelineEnvironment) {
    36  	utils := newTerraformExecuteUtils()
    37  
    38  	err := runTerraformExecute(&config, telemetryData, utils, commonPipelineEnvironment)
    39  	if err != nil {
    40  		log.Entry().WithError(err).Fatal("step execution failed")
    41  	}
    42  }
    43  
    44  func runTerraformExecute(config *terraformExecuteOptions, telemetryData *telemetry.CustomData, utils terraformExecuteUtils, commonPipelineEnvironment *terraformExecuteCommonPipelineEnvironment) error {
    45  	if len(config.CliConfigFile) > 0 {
    46  		utils.AppendEnv([]string{fmt.Sprintf("TF_CLI_CONFIG_FILE=%s", config.CliConfigFile)})
    47  	}
    48  
    49  	if len(config.Workspace) > 0 {
    50  		utils.AppendEnv([]string{fmt.Sprintf("TF_WORKSPACE=%s", config.Workspace)})
    51  	}
    52  
    53  	args := []string{}
    54  
    55  	if piperutils.ContainsString([]string{"apply", "destroy"}, config.Command) {
    56  		args = append(args, "-auto-approve")
    57  	}
    58  
    59  	if piperutils.ContainsString([]string{"apply", "plan"}, config.Command) && config.TerraformSecrets != "" {
    60  		args = append(args, fmt.Sprintf("-var-file=%s", config.TerraformSecrets))
    61  	}
    62  
    63  	if piperutils.ContainsString([]string{"init", "validate", "plan", "apply", "destroy"}, config.Command) {
    64  		args = append(args, "-no-color")
    65  	}
    66  
    67  	if config.AdditionalArgs != nil {
    68  		args = append(args, config.AdditionalArgs...)
    69  	}
    70  
    71  	if config.Init {
    72  		err := runTerraform(utils, "init", []string{"-no-color"}, config.GlobalOptions)
    73  
    74  		if err != nil {
    75  			return err
    76  		}
    77  	}
    78  
    79  	err := runTerraform(utils, config.Command, args, config.GlobalOptions)
    80  
    81  	if err != nil {
    82  		return err
    83  	}
    84  
    85  	var outputBuffer bytes.Buffer
    86  	utils.Stdout(&outputBuffer)
    87  
    88  	err = runTerraform(utils, "output", []string{"-json"}, config.GlobalOptions)
    89  
    90  	if err != nil {
    91  		return err
    92  	}
    93  
    94  	commonPipelineEnvironment.custom.terraformOutputs, err = terraform.ReadOutputs(outputBuffer.String())
    95  
    96  	return err
    97  }
    98  
    99  func runTerraform(utils terraformExecuteUtils, command string, additionalArgs []string, globalOptions []string) error {
   100  	args := []string{}
   101  
   102  	if len(globalOptions) > 0 {
   103  		args = append(args, globalOptions...)
   104  	}
   105  
   106  	args = append(args, command)
   107  
   108  	if len(additionalArgs) > 0 {
   109  		args = append(args, additionalArgs...)
   110  	}
   111  
   112  	return utils.RunExecutable("terraform", args...)
   113  }