github.com/brandonstevens/terraform@v0.9.6-0.20170512224929-5367f2607e16/terraform/transform_attach_state.go (about)

     1  package terraform
     2  
     3  import (
     4  	"log"
     5  
     6  	"github.com/hashicorp/terraform/dag"
     7  )
     8  
     9  // GraphNodeAttachResourceState is an interface that can be implemented
    10  // to request that a ResourceState is attached to the node.
    11  type GraphNodeAttachResourceState interface {
    12  	// The address to the resource for the state
    13  	ResourceAddr() *ResourceAddress
    14  
    15  	// Sets the state
    16  	AttachResourceState(*ResourceState)
    17  }
    18  
    19  // AttachStateTransformer goes through the graph and attaches
    20  // state to nodes that implement the interfaces above.
    21  type AttachStateTransformer struct {
    22  	State *State // State is the root state
    23  }
    24  
    25  func (t *AttachStateTransformer) Transform(g *Graph) error {
    26  	// If no state, then nothing to do
    27  	if t.State == nil {
    28  		log.Printf("[DEBUG] Not attaching any state: state is nil")
    29  		return nil
    30  	}
    31  
    32  	filter := &StateFilter{State: t.State}
    33  	for _, v := range g.Vertices() {
    34  		// Only care about nodes requesting we're adding state
    35  		an, ok := v.(GraphNodeAttachResourceState)
    36  		if !ok {
    37  			continue
    38  		}
    39  		addr := an.ResourceAddr()
    40  
    41  		// Get the module state
    42  		results, err := filter.Filter(addr.String())
    43  		if err != nil {
    44  			return err
    45  		}
    46  
    47  		// Attach the first resource state we get
    48  		found := false
    49  		for _, result := range results {
    50  			if rs, ok := result.Value.(*ResourceState); ok {
    51  				log.Printf(
    52  					"[DEBUG] Attaching resource state to %q: %#v",
    53  					dag.VertexName(v), rs)
    54  				an.AttachResourceState(rs)
    55  				found = true
    56  				break
    57  			}
    58  		}
    59  
    60  		if !found {
    61  			log.Printf(
    62  				"[DEBUG] Resource state not found for %q: %s",
    63  				dag.VertexName(v), addr)
    64  		}
    65  	}
    66  
    67  	return nil
    68  }