From 770d4e1e71fef93947be3c00b91e6b00c8f449a2 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Wed, 2 Jul 2014 19:56:29 -0700 Subject: [PATCH] terraform: destroy should remove from state --- terraform/terraform.go | 12 ++++----- terraform/terraform_test.go | 54 ++++++++++++++++++++++++++++++++++--- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/terraform/terraform.go b/terraform/terraform.go index e2c88fe6c..5b4fe60c5 100644 --- a/terraform/terraform.go +++ b/terraform/terraform.go @@ -252,12 +252,6 @@ func (t *Terraform) applyWalkFn( // Force the resource state type to be our type rs.Type = r.State.Type - // If no state was returned, then no variables were updated so - // just return. - if rs == nil { - return nil, nil - } - var errs []error for ak, av := range rs.Attributes { // If the value is the unknown variable value, then it is an error. @@ -271,7 +265,11 @@ func (t *Terraform) applyWalkFn( // Update the resulting diff l.Lock() - result.Resources[r.Id] = rs + if rs.ID == "" { + delete(result.Resources, r.Id) + } else { + result.Resources[r.Id] = rs + } l.Unlock() // Update the state for the resource itself diff --git a/terraform/terraform_test.go b/terraform/terraform_test.go index 9b3d98dec..1f9b1d83d 100644 --- a/terraform/terraform_test.go +++ b/terraform/terraform_test.go @@ -196,6 +196,55 @@ func TestTerraformApply_destroy(t *testing.T) { } } +func TestTerraformApply_destroyOrphan(t *testing.T) { + rpAWS := new(MockResourceProvider) + rpAWS.ResourcesReturn = []ResourceType{ + ResourceType{Name: "aws_instance"}, + } + rpAWS.DiffFn = func(*ResourceState, *ResourceConfig) (*ResourceDiff, error) { + return &ResourceDiff{ + Attributes: map[string]*ResourceAttrDiff{ + "num": &ResourceAttrDiff{ + New: "bar", + }, + }, + }, nil + } + rpAWS.ApplyFn = func(*ResourceState, *ResourceDiff) (*ResourceState, error) { + return nil, nil + } + + c := testConfig(t, "apply-error") + tf := testTerraform2(t, &Config{ + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(rpAWS), + }, + }) + + s := &State{ + Resources: map[string]*ResourceState{ + "aws_instance.baz": &ResourceState{ + ID: "bar", + Type: "aws_instance", + }, + }, + } + + p, err := tf.Plan(&PlanOpts{Config: c, State: s}) + if err != nil { + t.Fatalf("err: %s", err) + } + + state, err := tf.Apply(p) + if err != nil { + t.Fatalf("err: %s", err) + } + + if len(state.Resources) != 0 { + t.Fatalf("bad: %#v", state.Resources) + } +} + func TestTerraformApply_error(t *testing.T) { errored := false @@ -908,10 +957,7 @@ aws_instance.foo: ` const testTerraformApplyDestroyStr = ` -aws_instance.bar: - ID = -aws_instance.foo: - ID = + ` const testTerraformApplyErrorStr = `