github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/terraform/transform_attach_state.go (about)

     1  package terraform
     2  
     3  import (
     4  	"log"
     5  
     6  	"github.com/muratcelep/terraform/not-internal/dag"
     7  	"github.com/muratcelep/terraform/not-internal/states"
     8  )
     9  
    10  // GraphNodeAttachResourceState is an interface that can be implemented
    11  // to request that a ResourceState is attached to the node.
    12  //
    13  // Due to a historical naming inconsistency, the type ResourceState actually
    14  // represents the state for a particular _instance_, while InstanceState
    15  // represents the values for that instance during a particular phase
    16  // (e.g. primary vs. deposed). Consequently, GraphNodeAttachResourceState
    17  // is supported only for nodes that represent resource instances, even though
    18  // the name might suggest it is for containing resources.
    19  type GraphNodeAttachResourceState interface {
    20  	GraphNodeResourceInstance
    21  
    22  	// Sets the state
    23  	AttachResourceState(*states.Resource)
    24  }
    25  
    26  // AttachStateTransformer goes through the graph and attaches
    27  // state to nodes that implement the interfaces above.
    28  type AttachStateTransformer struct {
    29  	State *states.State // State is the root state
    30  }
    31  
    32  func (t *AttachStateTransformer) Transform(g *Graph) error {
    33  	// If no state, then nothing to do
    34  	if t.State == nil {
    35  		log.Printf("[DEBUG] Not attaching any node states: overall state is nil")
    36  		return nil
    37  	}
    38  
    39  	for _, v := range g.Vertices() {
    40  		// Nodes implement this interface to request state attachment.
    41  		an, ok := v.(GraphNodeAttachResourceState)
    42  		if !ok {
    43  			continue
    44  		}
    45  		addr := an.ResourceInstanceAddr()
    46  
    47  		rs := t.State.Resource(addr.ContainingResource())
    48  		if rs == nil {
    49  			log.Printf("[DEBUG] Resource state not found for node %q, instance %s", dag.VertexName(v), addr)
    50  			continue
    51  		}
    52  
    53  		is := rs.Instance(addr.Resource.Key)
    54  		if is == nil {
    55  			// We don't actually need this here, since we'll attach the whole
    56  			// resource state, but we still check because it'd be weird
    57  			// for the specific instance we're attaching to not to exist.
    58  			log.Printf("[DEBUG] Resource instance state not found for node %q, instance %s", dag.VertexName(v), addr)
    59  			continue
    60  		}
    61  
    62  		// make sure to attach a copy of the state, so instances can modify the
    63  		// same ResourceState.
    64  		an.AttachResourceState(rs.DeepCopy())
    65  	}
    66  
    67  	return nil
    68  }