terraform: config graph respects depends_on

This commit is contained in:
Mitchell Hashimoto 2015-01-21 15:37:17 -08:00
parent eb1a1fa7c9
commit 012dcca7d5
3 changed files with 51 additions and 19 deletions

View File

@ -54,8 +54,7 @@ func Graph2(mod *module.Tree) (*depgraph.Graph, error) {
// of var names to the actual node with that name. // of var names to the actual node with that name.
for _, n := range nodes { for _, n := range nodes {
m := make(map[string]depgraph.Node) m := make(map[string]depgraph.Node)
for _, v := range n.Variables() { for _, id := range n.Variables() {
id := varNameForVar(v)
m[id] = fullMap[id] m[id] = fullMap[id]
} }

View File

@ -14,8 +14,9 @@ type graphNodeConfig interface {
depgraph.Node depgraph.Node
// Variables returns the full list of variables that this node // Variables returns the full list of variables that this node
// depends on. // depends on. The values within the slice should map to the VarName()
Variables() map[string]config.InterpolatedVariable // values that are returned by any nodes.
Variables() []string
// VarName returns the name that is used to identify a variable // VarName returns the name that is used to identify a variable
// maps to this node. It should match the result of the // maps to this node. It should match the result of the
@ -67,8 +68,14 @@ func (n *GraphNodeConfigModule) Name() string {
return fmt.Sprintf("module.%s", n.Module.Name) return fmt.Sprintf("module.%s", n.Module.Name)
} }
func (n *GraphNodeConfigModule) Variables() map[string]config.InterpolatedVariable { func (n *GraphNodeConfigModule) Variables() []string {
return n.Module.RawConfig.Variables vars := n.Module.RawConfig.Variables
result := make([]string, 0, len(vars))
for _, v := range vars {
result = append(result, varNameForVar(v))
}
return result
} }
func (n *GraphNodeConfigModule) VarName() string { func (n *GraphNodeConfigModule) VarName() string {
@ -88,8 +95,14 @@ func (n *GraphNodeConfigProvider) Name() string {
return fmt.Sprintf("provider.%s", n.Provider.Name) return fmt.Sprintf("provider.%s", n.Provider.Name)
} }
func (n *GraphNodeConfigProvider) Variables() map[string]config.InterpolatedVariable { func (n *GraphNodeConfigProvider) Variables() []string {
return n.Provider.RawConfig.Variables vars := n.Provider.RawConfig.Variables
result := make([]string, 0, len(vars))
for _, v := range vars {
result = append(result, varNameForVar(v))
}
return result
} }
func (n *GraphNodeConfigProvider) VarName() string { func (n *GraphNodeConfigProvider) VarName() string {
@ -107,19 +120,20 @@ func (n *GraphNodeConfigResource) Name() string {
return n.Resource.Id() return n.Resource.Id()
} }
func (n *GraphNodeConfigResource) Variables() map[string]config.InterpolatedVariable { func (n *GraphNodeConfigResource) Variables() []string {
var m map[string]config.InterpolatedVariable result := make([]string, len(n.Resource.DependsOn),
if n.Resource != nil { len(n.Resource.RawCount.Variables)+
m = make(map[string]config.InterpolatedVariable) len(n.Resource.RawConfig.Variables)+
for k, v := range n.Resource.RawCount.Variables { len(n.Resource.DependsOn))
m[k] = v copy(result, n.Resource.DependsOn)
} for _, v := range n.Resource.RawCount.Variables {
for k, v := range n.Resource.RawConfig.Variables { result = append(result, varNameForVar(v))
m[k] = v
} }
for _, v := range n.Resource.RawConfig.Variables {
result = append(result, varNameForVar(v))
} }
return m return result
} }
func (n *GraphNodeConfigResource) VarName() string { func (n *GraphNodeConfigResource) VarName() string {

View File

@ -40,6 +40,19 @@ func TestGraph(t *testing.T) {
} }
} }
func TestGraph2_dependsOn(t *testing.T) {
g, err := Graph2(testModule(t, "graph-depends-on"))
if err != nil {
t.Fatalf("err: %s", err)
}
actual := strings.TrimSpace(g.String())
expected := strings.TrimSpace(testGraphDependsOnStr)
if actual != expected {
t.Fatalf("bad:\n\n%s", actual)
}
}
func TestGraph2_modules(t *testing.T) { func TestGraph2_modules(t *testing.T) {
g, err := Graph2(testModule(t, "graph-modules")) g, err := Graph2(testModule(t, "graph-modules"))
if err != nil { if err != nil {
@ -64,6 +77,12 @@ provider.aws
openstack_floating_ip.random openstack_floating_ip.random
` `
const testGraphDependsOnStr = `
aws_instance.db
aws_instance.web
aws_instance.web
`
const testGraphModulesStr = ` const testGraphModulesStr = `
aws_instance.web aws_instance.web
aws_security_group.firewall aws_security_group.firewall