public void Setup()
        {
            variables = Substitute.For <IVariables>();
            var commandLineRunner = Substitute.For <ICommandLineRunner>();

            commandLineRunner.Execute(Arg.Do <CommandLineInvocation>(invocation => invocation.AdditionalInvocationOutputSink.WriteInfo("Terraform v0.15.0")))
            .Returns(new CommandResult("foo", 0));
            cliExecutor = new TerraformCliExecutor(Substitute.For <ILog>(),
                                                   Substitute.For <ICalamariFileSystem>(),
                                                   commandLineRunner,
                                                   new RunningDeployment("blah", variables),
                                                   new Dictionary <string, string>());
        }
        protected override Task Execute(RunningDeployment deployment, Dictionary <string, string> environmentVariables)
        {
            using var cli = new TerraformCliExecutor(log,
                                                     fileSystem,
                                                     commandLineRunner,
                                                     deployment,
                                                     environmentVariables);
            cli.ExecuteCommand("apply",
                               "-no-color",
                               "-auto-approve",
                               cli.TerraformVariableFiles,
                               cli.ActionParams);

            // Attempt to get the outputs. This will fail if none are defined in versions prior to v0.11.15
            // Please note that we really don't want to log the following command output as it can contain sensitive variables etc. hence the IgnoreCommandOutput()
            if (cli.ExecuteCommand(out var result,
                                   false,
                                   "output",
                                   "-no-color",
                                   "-json")
                .ExitCode
                != 0)
            {
                return(this.CompletedTask());
            }

            foreach (var(name, token) in OutputVariables(result))
            {
                bool.TryParse(token.SelectToken("sensitive")?.ToString(), out var isSensitive);

                var json  = token.ToString();
                var value = token.SelectToken("value")?.ToString();

                log.SetOutputVariable($"TerraformJsonOutputs[{name}]", json, deployment.Variables, isSensitive);
                if (value != null)
                {
                    log.SetOutputVariable($"TerraformValueOutputs[{name}]", value, deployment.Variables, isSensitive);
                }

                log.Info(
                    $"Saving {(isSensitive ? "sensitive " : string.Empty)}variable 'Octopus.Action[{deployment.Variables["Octopus.Action.StepName"]}].Output.TerraformJsonOutputs[\"{name}\"]' with the JSON value only of '{json}'");
                if (value != null)
                {
                    log.Info(
                        $"Saving {(isSensitive ? "sensitive " : string.Empty)}variable 'Octopus.Action[{deployment.Variables["Octopus.Action.StepName"]}].Output.TerraformValueOutputs[\"{name}\"]' with the value only of '{value}'");
                }
            }

            return(this.CompletedTask());
        }
Beispiel #3
0
        protected override Task Execute(RunningDeployment deployment, Dictionary <string, string> environmentVariables)
        {
            using (var cli = new TerraformCliExecutor(log,
                                                      fileSystem,
                                                      commandLineRunner,
                                                      deployment,
                                                      environmentVariables))
            {
                cli.ExecuteCommand("destroy",
                                   "-auto-approve",
                                   "-no-color",
                                   cli.TerraformVariableFiles,
                                   cli.ActionParams)
                .VerifySuccess();
            }

            return(this.CompletedTask());
        }
Beispiel #4
0
        protected override Task Execute(RunningDeployment deployment, Dictionary <string, string> environmentVariables)
        {
            string results;

            using (var cli = new TerraformCliExecutor(log,
                                                      fileSystem,
                                                      commandLineRunner,
                                                      deployment,
                                                      environmentVariables))
            {
                if (cli.Version.IsLessThan(TerraformPlanJsonMinVersion) && deployment.Variables.GetFlag(TerraformSpecialVariables.Action.Terraform.PlanJsonOutput))
                {
                    log.Warn($"JSON output is not supported in versions of Terraform prior to {TerraformPlanJsonMinVersion}. The version of Terraform being used is {cli.Version}");
                }

                var commandResult = cli.ExecuteCommand(out results,
                                                       "plan",
                                                       "-no-color",
                                                       "-detailed-exitcode",
                                                       GetOutputParameter(deployment, cli.Version),
                                                       ExtraParameter,
                                                       cli.TerraformVariableFiles,
                                                       cli.ActionParams);
                var resultCode = commandResult.ExitCode;

                cli.VerifySuccess(commandResult, r => r.ExitCode == 0 || r.ExitCode == 2);

                log.Info(
                    $"Saving variable 'Octopus.Action[{deployment.Variables["Octopus.Action.StepName"]}].Output.{TerraformSpecialVariables.Action.Terraform.PlanDetailedExitCode}' with the detailed exit code of the plan, with value '{resultCode}'.");
                log.SetOutputVariable(TerraformSpecialVariables.Action.Terraform.PlanDetailedExitCode, resultCode.ToString(), deployment.Variables);

                if (IsUsingPlanJSON(deployment, cli.Version))
                {
                    CaptureJsonOutput(deployment, results);
                }
                else
                {
                    CapturePlainTextOutput(deployment, results);
                }
            }

            return(this.CompletedTask());
        }