diff --git a/terraform/context_apply_test.go b/terraform/context_apply_test.go index f933301bc..27f89da18 100644 --- a/terraform/context_apply_test.go +++ b/terraform/context_apply_test.go @@ -1014,6 +1014,61 @@ aws_instance.bar.1: `) } +// Test that when we have a deposed instance but a good primary, we still +// destroy the deposed instance. +func TestContext2Apply_createBeforeDestroy_deposedOnly(t *testing.T) { + m := testModule(t, "apply-cbd-deposed-only") + p := testProvider("aws") + p.ApplyFn = testApplyFn + p.DiffFn = testDiffFn + + state := &State{ + Modules: []*ModuleState{ + &ModuleState{ + Path: rootModulePath, + Resources: map[string]*ResourceState{ + "aws_instance.bar": &ResourceState{ + Type: "aws_instance", + Primary: &InstanceState{ + ID: "bar", + }, + + Deposed: []*InstanceState{ + &InstanceState{ + ID: "foo", + }, + }, + }, + }, + }, + }, + } + + ctx := testContext2(t, &ContextOpts{ + Module: m, + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + State: state, + }) + + if p, err := ctx.Plan(); err != nil { + t.Fatalf("err: %s", err) + } else { + t.Logf(p.String()) + } + + state, err := ctx.Apply() + if err != nil { + t.Fatalf("err: %s", err) + } + + checkStateString(t, state, ` +aws_instance.bar: + ID = bar + `) +} + func TestContext2Apply_destroyComputed(t *testing.T) { m := testModule(t, "apply-destroy-computed") p := testProvider("aws") diff --git a/terraform/test-fixtures/apply-cbd-deposed-only/main.tf b/terraform/test-fixtures/apply-cbd-deposed-only/main.tf new file mode 100644 index 000000000..4e5f481c5 --- /dev/null +++ b/terraform/test-fixtures/apply-cbd-deposed-only/main.tf @@ -0,0 +1,3 @@ +resource "aws_instance" "bar" { + lifecycle { create_before_destroy = true } +} diff --git a/terraform/test-fixtures/apply-good-create-before-count/main.tf b/terraform/test-fixtures/apply-good-create-before-count/main.tf new file mode 100644 index 000000000..324ad5285 --- /dev/null +++ b/terraform/test-fixtures/apply-good-create-before-count/main.tf @@ -0,0 +1,7 @@ +resource "aws_instance" "bar" { + count = 2 + require_new = "xyz" + lifecycle { + create_before_destroy = true + } +} diff --git a/terraform/transform_diff.go b/terraform/transform_diff.go index 68e905346..ad46d3c61 100644 --- a/terraform/transform_diff.go +++ b/terraform/transform_diff.go @@ -58,7 +58,7 @@ func (t *DiffTransformer) Transform(g *Graph) error { addr.Path = m.Path[1:] // If we're destroying, add the destroy node - if inst.Destroy { + if inst.Destroy || inst.GetDestroyDeposed() { abstract := &NodeAbstractResource{Addr: addr} g.Add(&NodeDestroyResource{NodeAbstractResource: abstract}) } diff --git a/test/foo/main.tf b/test/foo/main.tf new file mode 100644 index 000000000..ce7a57d4c --- /dev/null +++ b/test/foo/main.tf @@ -0,0 +1,9 @@ +resource "null_resource" "foo" { + count = 2 + + provisioner "local-exec" { command = "sleep ${count.index*3}" } + + //provisioner "local-exec" { command = "exit 1" } + + lifecycle { create_before_destroy = true } +} diff --git a/test/index.html b/test/index.html new file mode 100644 index 000000000..3fa0d4b98 --- /dev/null +++ b/test/index.html @@ -0,0 +1 @@ +Hello, World diff --git a/test/main.tf b/test/main.tf new file mode 100644 index 000000000..09f29ef13 --- /dev/null +++ b/test/main.tf @@ -0,0 +1,13 @@ +variable "username" { + default = "bob" +} + +data "template_file" "user" { + template = "$${USERNAME}" + vars { + USERNAME = "${var.username}" + } + provisioner "local-exec" { + command = "echo ${self.rendered} > user.txt" + } +} diff --git a/test/real.tfstate b/test/real.tfstate new file mode 100644 index 000000000..807ef6963 --- /dev/null +++ b/test/real.tfstate @@ -0,0 +1,45 @@ +{ + "version": 3, + "terraform_version": "0.7.2", + "serial": 393, + "lineage": "e8e8cc31-ebe6-4260-bb6a-eed53258cc08", + "modules": [ + { + "path": [ + "root" + ], + "outputs": {}, + "resources": { + "aws_route53_record.rslc-xxx-test-route53-record": { + "type": "aws_route53_record", + "depends_on": [ + ], + "primary": { + "id": "ZKBENUPLDUDMJ_xxx-test.rslcare.com.au_A", + "attributes": { + "alias.#": "1", + "alias.2624757427.evaluate_target_health": "false", + "alias.2624757427.name": "awseb-e-3-AWSEBLoa-1OO1X7V7IRMMF-999999999.ap-southeast-2.elb.amazonaws.com.", + "alias.2624757427.zone_id": "Z2999QAZ9SRTIC", + "fqdn": "hws-test.rslcare.com.au", + "health_check_id": "", + "id": "ZKBENUPLDUDMJ_hws-test.rslcare.com.au_A", + "name": "xxx-test.example.com", + "records.#": "0", + "set_identifier": "", + "ttl": "0", + "type": "A", + "zone_id": "ZKBENUPLDUDMJ" + }, + "meta": { + "schema_version": "2" + }, + "tainted": false + }, + "deposed": [], + "provider": "" + } + } + } + ] +}