Skip to content

Commit

Permalink
Merge pull request #1587 from hashicorp/b-count-deps
Browse files Browse the repository at this point in the history
terraform: inner-count dependencies work [GH-1540]
  • Loading branch information
mitchellh committed Apr 22, 2015
2 parents 5dcf639 + 2fffec9 commit d201143
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 6 deletions.
19 changes: 19 additions & 0 deletions terraform/graph_config_node.go
Original file line number Diff line number Diff line change
Expand Up @@ -283,6 +283,25 @@ func (n *GraphNodeConfigResource) DependentOn() []string {
return result
}

// VarWalk calls a callback for all the variables that this resource
// depends on.
func (n *GraphNodeConfigResource) VarWalk(fn func(config.InterpolatedVariable)) {
for _, v := range n.Resource.RawCount.Variables {
fn(v)
}
for _, v := range n.Resource.RawConfig.Variables {
fn(v)
}
for _, p := range n.Resource.Provisioners {
for _, v := range p.ConnInfo.Variables {
fn(v)
}
for _, v := range p.RawConfig.Variables {
fn(v)
}
}
}

func (n *GraphNodeConfigResource) Name() string {
result := n.Resource.Id()
switch n.DestroyMode {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
resource "aws_instance" "foo" {
count = 3
value = "${aws_instance.foo.0.value}"
}
8 changes: 8 additions & 0 deletions terraform/test-fixtures/transform-resource-count-deps/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
resource "aws_instance" "foo" {
count = 2

provisioner "local-exec" {
command = "echo ${aws_instance.foo.0.id}"
other = "echo ${aws_instance.foo.id}"
}
}
30 changes: 28 additions & 2 deletions terraform/transform_resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -134,8 +134,34 @@ func (n *graphNodeExpandedResource) DependableName() []string {

// GraphNodeDependent impl.
func (n *graphNodeExpandedResource) DependentOn() []string {
config := &GraphNodeConfigResource{Resource: n.Resource}
return config.DependentOn()
configNode := &GraphNodeConfigResource{Resource: n.Resource}
result := configNode.DependentOn()

// Walk the variables to find any count-specific variables we depend on.
configNode.VarWalk(func(v config.InterpolatedVariable) {
rv, ok := v.(*config.ResourceVariable)
if !ok {
return
}

// We only want ourselves
if rv.ResourceId() != n.Resource.Id() {
return
}

// If this isn't a multi-access (which shouldn't be allowed but
// is verified elsewhere), then we depend on the specific count
// of this resource, ignoring ourself (which again should be
// validated elsewhere).
if rv.Index > -1 {
id := fmt.Sprintf("%s.%d", rv.ResourceId(), rv.Index)
if id != n.stateId() && id != n.stateId()+".0" {
result = append(result, id)
}
}
})

return result
}

// GraphNodeProviderConsumer
Expand Down
28 changes: 25 additions & 3 deletions terraform/transform_resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,33 @@ func TestResourceCountTransformer_countNegative(t *testing.T) {
}
}

func TestResourceCountTransformer_deps(t *testing.T) {
cfg := testModule(t, "transform-resource-count-deps").Config()
resource := cfg.Resources[0]

g := Graph{Path: RootModulePath}
{
tf := &ResourceCountTransformer{Resource: resource}
if err := tf.Transform(&g); err != nil {
t.Fatalf("err: %s", err)
}
}

actual := strings.TrimSpace(g.String())
expected := strings.TrimSpace(testResourceCountTransformDepsStr)
if actual != expected {
t.Fatalf("bad:\n\n%s", actual)
}
}

const testResourceCountTransformStr = `
aws_instance.foo #0
aws_instance.foo #2
aws_instance.foo #1
aws_instance.foo #2
aws_instance.foo #2
aws_instance.foo #2
`

const testResourceCountTransformDepsStr = `
aws_instance.foo #0
aws_instance.foo #1
aws_instance.foo #0
`

0 comments on commit d201143

Please sign in to comment.