apply: allow use of -destroy flag for compatible terraform versions (#292)
Implement the ApplyOption interface for the DestroyFlagOption
struct which enables the user to run `terraform apply -destroy`
as they would using the terraform binary directly by calling
`func (tf *Terraform) Apply`.
diff --git a/tfexec/apply.go b/tfexec/apply.go
index 43c8bb6..a13ff85 100644
--- a/tfexec/apply.go
+++ b/tfexec/apply.go
@@ -13,6 +13,7 @@
type applyConfig struct {
backup string
+ destroy bool
dirOrPlan string
lock bool
@@ -32,6 +33,7 @@
}
var defaultApplyOptions = applyConfig{
+ destroy: false,
lock: true,
parallelism: 10,
refresh: true,
@@ -94,6 +96,10 @@
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...)
@@ -191,6 +197,14 @@
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 28e6b58..c226a1f 100644
--- a/tfexec/apply_test.go
+++ b/tfexec/apply_test.go
@@ -38,6 +38,7 @@
Target("target2"),
Var("var1=foo"),
Var("var2=bar"),
+ Destroy(true),
DirOrPlan("testfile"),
)
if err != nil {
@@ -60,6 +61,7 @@
"-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 d15d11a..03785fc 100644
--- a/tfexec/internal/e2etest/apply_test.go
+++ b/tfexec/internal/e2etest/apply_test.go
@@ -15,6 +15,10 @@
"github.com/hashicorp/terraform-exec/tfexec/internal/testutil"
)
+var (
+ applyDestroyMinVersion = 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())
@@ -62,3 +66,25 @@
}
})
}
+
+func TestApplyDestroy(t *testing.T) {
+ runTest(t, "basic", func(t *testing.T, tfv *version.Version, tf *tfexec.Terraform) {
+ if tfv.LessThan(applyDestroyMinVersion) {
+ 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)
+ }
+ })
+}