From 0a3d7bd121ecc20fb6394dacd9447b41c2b123f2 Mon Sep 17 00:00:00 2001 From: Armon Dadgar Date: Tue, 9 Dec 2014 00:25:06 -0800 Subject: [PATCH] terraform: Check module config for resource instead of state --- terraform/context.go | 99 +++++++++++++++++++++++++++----------------- 1 file changed, 60 insertions(+), 39 deletions(-) diff --git a/terraform/context.go b/terraform/context.go index 3553c716d..e17f39a14 100644 --- a/terraform/context.go +++ b/terraform/context.go @@ -1650,21 +1650,28 @@ func (c *walkContext) computeResourceVariable( c.Context.sl.RLock() defer c.Context.sl.RUnlock() - // Get the relevant module - module := c.Context.state.ModuleByPath(c.Path) - - var r *ResourceState - if module != nil { - var ok bool - r, ok = module.Resources[id] - if !ok && v.Multi && v.Index == 0 { - r, ok = module.Resources[v.ResourceId()] - } - if !ok { - r = nil - } + // Get the information about this resource variable, and verify + // that it exists and such. + module, _, err := c.resourceVariableInfo(v) + if err != nil { + return "", err } + // If we have no module in the state yet or count, return empty + if module == nil || len(module.Resources) == 0 { + return "", nil + } + + // Get the resource out from the state. We know the state exists + // at this point and if there is a state, we expect there to be a + // resource with the given name. + r, ok := module.Resources[id] + if !ok && v.Multi && v.Index == 0 { + r, ok = module.Resources[v.ResourceId()] + } + if !ok { + r = nil + } if r == nil { return "", fmt.Errorf( "Resource '%s' not found for variable '%s'", @@ -1707,34 +1714,14 @@ func (c *walkContext) computeResourceMultiVariable( c.Context.sl.RLock() defer c.Context.sl.RUnlock() - childPath := c.Path[1:len(c.Path)] - - var modTree *module.Tree - if len(childPath) == 0 { - modTree = c.Context.module - } else { - modTree = c.Context.module.Child(childPath) + // Get the information about this resource variable, and verify + // that it exists and such. + module, cr, err := c.resourceVariableInfo(v) + if err != nil { + return "", err } - // Get the resource from the configuration so we can know how - // many of the resource there is. - var cr *config.Resource - for _, r := range modTree.Config().Resources { - if r.Id() == v.ResourceId() { - cr = r - break - } - } - if cr == nil { - return "", fmt.Errorf( - "Resource '%s' not found for variable '%s'", - v.ResourceId(), - v.FullKey()) - } - - // Get the relevant module - module := c.Context.state.ModuleByPath(c.Path) - + // Get the count so we know how many to iterate over count, err := cr.Count() if err != nil { return "", fmt.Errorf( @@ -1787,6 +1774,40 @@ func (c *walkContext) computeResourceMultiVariable( return strings.Join(values, config.InterpSplitDelim), nil } +func (c *walkContext) resourceVariableInfo( + v *config.ResourceVariable) (*ModuleState, *config.Resource, error) { + // Get the module tree that contains our current path. This is + // either the current module (path is empty) or a child. + var modTree *module.Tree + childPath := c.Path[1:len(c.Path)] + if len(childPath) == 0 { + modTree = c.Context.module + } else { + modTree = c.Context.module.Child(childPath) + } + + // Get the resource from the configuration so we can verify + // that the resource is in the configuration and so we can access + // the configuration if we need to. + var cr *config.Resource + for _, r := range modTree.Config().Resources { + if r.Id() == v.ResourceId() { + cr = r + break + } + } + if cr == nil { + return nil, nil, fmt.Errorf( + "Resource '%s' not found for variable '%s'", + v.ResourceId(), + v.FullKey()) + } + + // Get the relevant module + module := c.Context.state.ModuleByPath(c.Path) + return module, cr, nil +} + type walkInputMeta struct { sync.Mutex