8 // ResourceRefreshPlannableTransformer is a GraphTransformer that replaces any
9 // nodes that don't have state yet exist in config with
10 // NodePlannableResourceInstance.
12 // This transformer is used when expanding count on managed resource nodes
13 // during the refresh phase to ensure that data sources that have
14 // interpolations that depend on resources existing in the graph can be walked
16 type ResourceRefreshPlannableTransformer struct {
17 // The full global state.
21 // Transform implements GraphTransformer for
22 // ResourceRefreshPlannableTransformer.
23 func (t *ResourceRefreshPlannableTransformer) Transform(g *Graph) error {
25 for _, v := range g.Vertices() {
26 addr := v.(*NodeRefreshableManagedResourceInstance).Addr
28 // Find the state for this address, if there is one
29 filter := &StateFilter{State: t.State}
30 results, err := filter.Filter(addr.String())
35 // Check to see if we have a state for this resource. If we do, skip this
37 for _, result := range results {
38 if _, ok := result.Value.(*ResourceState); ok {
42 // If we don't, convert this resource to a NodePlannableResourceInstance node
43 // with all of the data we need to make it happen.
44 log.Printf("[TRACE] No state for %s, converting to NodePlannableResourceInstance", addr.String())
45 new := &NodePlannableResourceInstance{
46 NodeAbstractResource: v.(*NodeRefreshableManagedResourceInstance).NodeAbstractResource,
48 // Replace the node in the graph
49 if !g.Replace(v, new) {
50 return fmt.Errorf("ResourceRefreshPlannableTransformer: Could not replace node %#v with %#v", v, new)