From 6914d605c8b18a46d3f54f6737b63e558497c7af Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 7 Nov 2016 13:55:35 -0800 Subject: [PATCH] terraform: connect references --- terraform/context_plan_test.go | 2 +- terraform/node_resource_plan.go | 3 +++ terraform/transform_reference.go | 25 +++++++++++++++++-------- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/terraform/context_plan_test.go b/terraform/context_plan_test.go index e42e83ff2..f2b473623 100644 --- a/terraform/context_plan_test.go +++ b/terraform/context_plan_test.go @@ -626,7 +626,7 @@ func TestContext2Plan_moduleVar(t *testing.T) { } } -func TestContext2Plan_moduleVarWrongType(t *testing.T) { +func TestContext2Plan_moduleVarWrongTypeBasic(t *testing.T) { m := testModule(t, "plan-module-wrong-var-type") p := testProvider("aws") p.DiffFn = testDiffFn diff --git a/terraform/node_resource_plan.go b/terraform/node_resource_plan.go index 82656f58e..8faf8e0de 100644 --- a/terraform/node_resource_plan.go +++ b/terraform/node_resource_plan.go @@ -80,6 +80,9 @@ func (n *NodePlannableResource) DynamicExpand(ctx EvalContext) (*Graph, error) { // Attach the state &AttachStateTransformer{State: state}, + // Connect references so ordering is correct + &ReferenceTransformer{}, + // Make sure there is a single root &RootTransformer{}, } diff --git a/terraform/transform_reference.go b/terraform/transform_reference.go index 613f1484c..d5bcdac33 100644 --- a/terraform/transform_reference.go +++ b/terraform/transform_reference.go @@ -2,6 +2,7 @@ package terraform import ( "fmt" + "log" "github.com/hashicorp/terraform/config" "github.com/hashicorp/terraform/dag" @@ -53,6 +54,14 @@ func (t *ReferenceTransformer) Transform(g *Graph) error { // Find the things that reference things and connect them for _, v := range vs { parents, _ := m.References(v) + parentsDbg := make([]string, len(parents)) + for i, v := range parents { + parentsDbg[i] = dag.VertexName(v) + } + log.Printf( + "[DEBUG] ReferenceTransformer: %q references: %v", + dag.VertexName(v), parentsDbg) + for _, parent := range parents { g.Connect(dag.BasicEdge(v, parent)) } @@ -209,10 +218,9 @@ func NewReferenceMap(vs []dag.Vertex) *ReferenceMap { func ReferencesFromConfig(c *config.RawConfig) []string { var result []string for _, v := range c.Variables { - if r := ReferenceFromInterpolatedVar(v); r != "" { - result = append(result, r) + if r := ReferenceFromInterpolatedVar(v); len(r) > 0 { + result = append(result, r...) } - } return result @@ -220,15 +228,16 @@ func ReferencesFromConfig(c *config.RawConfig) []string { // ReferenceFromInterpolatedVar returns the reference from this variable, // or an empty string if there is no reference. -func ReferenceFromInterpolatedVar(v config.InterpolatedVariable) string { +func ReferenceFromInterpolatedVar(v config.InterpolatedVariable) []string { switch v := v.(type) { case *config.ModuleVariable: - return fmt.Sprintf("module.%s.output.%s", v.Name, v.Field) + return []string{fmt.Sprintf("module.%s.output.%s", v.Name, v.Field)} case *config.ResourceVariable: - return v.ResourceId() + result := []string{v.ResourceId()} + return result case *config.UserVariable: - return fmt.Sprintf("var.%s", v.Name) + return []string{fmt.Sprintf("var.%s", v.Name)} default: - return "" + return nil } }