diff --git a/tfexec/apply.go b/tfexec/apply.go index 40d9e69b..92fbf89c 100644 --- a/tfexec/apply.go +++ b/tfexec/apply.go @@ -9,6 +9,7 @@ import ( type applyConfig struct { backup string + destroy bool dirOrPlan string lock bool @@ -28,6 +29,7 @@ type applyConfig struct { } var defaultApplyOptions = applyConfig{ + destroy: false, lock: true, parallelism: 10, refresh: true, @@ -90,6 +92,10 @@ func (opt *ReattachOption) configureApply(conf *applyConfig) { conf.reattachInfo = opt.info } +func (opt *DestroyFlagOption) configureApply(conf *applyConfig) { + conf.destroy = opt.destroy +} + // Apply represents the terraform apply subcommand. func (tf *Terraform) Apply(ctx context.Context, opts ...ApplyOption) error { cmd, err := tf.applyCmd(ctx, opts...) @@ -140,6 +146,14 @@ func (tf *Terraform) applyCmd(ctx context.Context, opts ...ApplyOption) (*exec.C args = append(args, "-replace="+addr) } } + if c.destroy { + err := tf.compatible(ctx, tf0_15_2, nil) + if err != nil { + return nil, fmt.Errorf("-destroy option was introduced in Terraform 0.15.2: %w", err) + } + args = append(args, "-destroy") + } + if c.targets != nil { for _, ta := range c.targets { args = append(args, "-target="+ta) diff --git a/tfexec/apply_test.go b/tfexec/apply_test.go index 1cf2f562..6ef9d0ba 100644 --- a/tfexec/apply_test.go +++ b/tfexec/apply_test.go @@ -35,6 +35,7 @@ func TestApplyCmd(t *testing.T) { Target("target2"), Var("var1=foo"), Var("var2=bar"), + Destroy(true), DirOrPlan("testfile"), ) if err != nil { @@ -57,6 +58,7 @@ func TestApplyCmd(t *testing.T) { "-refresh=false", "-replace=aws_instance.test", "-replace=google_pubsub_topic.test", + "-destroy", "-target=target1", "-target=target2", "-var", "var1=foo", diff --git a/tfexec/internal/e2etest/apply_test.go b/tfexec/internal/e2etest/apply_test.go index 8c3154a4..1c809873 100644 --- a/tfexec/internal/e2etest/apply_test.go +++ b/tfexec/internal/e2etest/apply_test.go @@ -9,6 +9,10 @@ import ( "github.com/hashicorp/terraform-exec/tfexec" ) +var ( + validateMinApplyDestroyVersion = version.Must(version.NewVersion("0.15.2")) +) + func TestApply(t *testing.T) { runTest(t, "basic", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) { err := tf.Init(context.Background()) @@ -22,3 +26,25 @@ func TestApply(t *testing.T) { } }) } + +func TestApplyDestroy(t *testing.T) { + runTest(t, "basic", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) { + if tfv.LessThan(validateMinApplyDestroyVersion) { + t.Skip("terraform apply -destroy was added in Terraform 0.15.2, so test is not valid") + } + err := tf.Init(context.Background()) + if err != nil { + t.Fatalf("error running Init in test directory: %s", err) + } + + err = tf.Apply(context.Background()) + if err != nil { + t.Fatalf("error running Apply: %s", err) + } + + err = tf.Apply(context.Background(), tfexec.Destroy(true)) + if err != nil { + t.Fatalf("error running Apply -destroy: %s", err) + } + }) +}