github.com/skyscape-cloud-services/terraform@v0.9.2-0.20170609144644-7ece028a1747/terraform/transform_resource_refresh_plannable.go (about) 1 package terraform 2 3 import ( 4 "fmt" 5 "log" 6 ) 7 8 // ResourceRefreshPlannableTransformer is a GraphTransformer that replaces any 9 // nodes that don't have state yet exist in config with 10 // NodePlannableResourceInstance. 11 // 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 15 // properly. 16 type ResourceRefreshPlannableTransformer struct { 17 // The full global state. 18 State *State 19 } 20 21 // Transform implements GraphTransformer for 22 // ResourceRefreshPlannableTransformer. 23 func (t *ResourceRefreshPlannableTransformer) Transform(g *Graph) error { 24 nextVertex: 25 for _, v := range g.Vertices() { 26 addr := v.(*NodeRefreshableManagedResourceInstance).Addr 27 28 // Find the state for this address, if there is one 29 filter := &StateFilter{State: t.State} 30 results, err := filter.Filter(addr.String()) 31 if err != nil { 32 return err 33 } 34 35 // Check to see if we have a state for this resource. If we do, skip this 36 // node. 37 for _, result := range results { 38 if _, ok := result.Value.(*ResourceState); ok { 39 continue nextVertex 40 } 41 } 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, 47 } 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) 51 } 52 } 53 54 return nil 55 }