Skip to content

Commit

Permalink
apply: allow use of -destroy flag for compatible terraform versions
Browse files Browse the repository at this point in the history
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`.
  • Loading branch information
rstandt committed Jun 14, 2023
1 parent 2fecacb commit 8e043bf
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
14 changes: 14 additions & 0 deletions tfexec/apply.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

type applyConfig struct {
backup string
destroy bool
dirOrPlan string
lock bool

Expand All @@ -32,6 +33,7 @@ type applyConfig struct {
}

var defaultApplyOptions = applyConfig{
destroy: false,
lock: true,
parallelism: 10,
refresh: true,
Expand Down Expand Up @@ -94,6 +96,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...)
Expand Down Expand Up @@ -191,6 +197,14 @@ func (tf *Terraform) buildApplyArgs(ctx context.Context, c applyConfig) ([]strin
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)
Expand Down
2 changes: 2 additions & 0 deletions tfexec/apply_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func TestApplyCmd(t *testing.T) {
Target("target2"),
Var("var1=foo"),
Var("var2=bar"),
Destroy(true),
DirOrPlan("testfile"),
)
if err != nil {
Expand All @@ -60,6 +61,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",
Expand Down
26 changes: 26 additions & 0 deletions tfexec/internal/e2etest/apply_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ import (
"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())
Expand Down Expand Up @@ -62,3 +66,25 @@ func TestApplyJSON_TF015AndLater(t *testing.T) {
}
})
}

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)
}
})
}

0 comments on commit 8e043bf

Please sign in to comment.