Skip to content

Commit

Permalink
Merge pull request #7131 from hashicorp/b-destroy-module-provider-config
Browse files Browse the repository at this point in the history
core: Fix destroy when module vars used in provider config
  • Loading branch information
jen20 authored Jun 12, 2016
2 parents f35812c + bf0e770 commit 445cd84
Show file tree
Hide file tree
Showing 4 changed files with 71 additions and 0 deletions.
39 changes: 39 additions & 0 deletions terraform/context_apply_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,45 @@ func TestContext2Apply_destroySkipsCBD(t *testing.T) {
}
}

func TestContext2Apply_destroyModuleVarProviderConfig(t *testing.T) {
m := testModule(t, "apply-destroy-mod-var-provider-config")
p := testProvider("aws")
p.ApplyFn = testApplyFn
p.DiffFn = testDiffFn
state := &State{
Modules: []*ModuleState{
&ModuleState{
Path: []string{"root", "child"},
Resources: map[string]*ResourceState{
"aws_instance.foo": &ResourceState{
Type: "aws_instance",
Primary: &InstanceState{
ID: "foo",
},
},
},
},
},
}
ctx := testContext2(t, &ContextOpts{
Module: m,
Providers: map[string]ResourceProviderFactory{
"aws": testProviderFuncFixed(p),
},
State: state,
Destroy: true,
})

if _, err := ctx.Plan(); err != nil {
t.Fatalf("err: %s", err)
}

_, err := ctx.Apply()
if err != nil {
t.Fatalf("err: %s", err)
}
}

// https://github.com/hashicorp/terraform/issues/2892
func TestContext2Apply_destroyCrossProviders(t *testing.T) {
m := testModule(t, "apply-destroy-cross-providers")
Expand Down
21 changes: 21 additions & 0 deletions terraform/graph_config_node_variable.go
Original file line number Diff line number Diff line change
Expand Up @@ -234,3 +234,24 @@ func (n *GraphNodeConfigVariableFlat) Path() []string {

return nil
}

func (n *GraphNodeConfigVariableFlat) Noop(opts *NoopOpts) bool {
// First look for provider nodes that depend on this variable downstream
modDiff := opts.Diff.ModuleByPath(n.ModulePath)
if modDiff != nil && modDiff.Destroy {
ds, err := opts.Graph.Descendents(n)
if err != nil {
log.Printf("[ERROR] Error looking up descendents of %s: %s", n.Name(), err)
} else {
for _, d := range ds.List() {
if _, ok := d.(GraphNodeProvider); ok {
log.Printf("[DEBUG] This variable is depended on by a provider, can't be a noop.")
return false
}
}
}
}

// Then fall back to existing impl
return n.GraphNodeConfigVariable.Noop(opts)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
variable "input" {}

provider "aws" {
region = "us-east-${var.input}"
}

resource "aws_instance" "foo" { }
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
module "child" {
source = "./child"
input = "1"
}

0 comments on commit 445cd84

Please sign in to comment.