package terraform import ( "log" "github.com/hashicorp/terraform/addrs" "github.com/hashicorp/terraform/dag" "github.com/hashicorp/terraform/lang" ) // NodeApplyableResource represents a resource that is "applyable": // it may need to have its record in the state adjusted to match configuration. // // Unlike in the plan walk, this resource node does not DynamicExpand. Instead, // it should be inserted into the same graph as any instances of the nodes // with dependency edges ensuring that the resource is evaluated before any // of its instances, which will turn ensure that the whole-resource record // in the state is suitably prepared to receive any updates to instances. type NodeApplyableResource struct { *NodeAbstractResource } var ( _ GraphNodeResource = (*NodeApplyableResource)(nil) _ GraphNodeEvalable = (*NodeApplyableResource)(nil) _ GraphNodeProviderConsumer = (*NodeApplyableResource)(nil) _ GraphNodeAttachResourceConfig = (*NodeApplyableResource)(nil) _ GraphNodeReferencer = (*NodeApplyableResource)(nil) ) func (n *NodeApplyableResource) Name() string { return n.NodeAbstractResource.Name() + " (prepare state)" } func (n *NodeApplyableResource) References() []*addrs.Reference { if n.Config == nil { log.Printf("[WARN] NodeApplyableResource %q: no configuration, so can't determine References", dag.VertexName(n)) return nil } var result []*addrs.Reference // Since this node type only updates resource-level metadata, we only // need to worry about the parts of the configuration that affect // our "each mode": the count and for_each meta-arguments. refs, _ := lang.ReferencesInExpr(n.Config.Count) result = append(result, refs...) refs, _ = lang.ReferencesInExpr(n.Config.ForEach) result = append(result, refs...) return result } // GraphNodeEvalable func (n *NodeApplyableResource) EvalTree() EvalNode { addr := n.ResourceAddr() config := n.Config providerAddr := n.ResolvedProvider if config == nil { // Nothing to do, then. log.Printf("[TRACE] NodeApplyableResource: no configuration present for %s", addr) return &EvalNoop{} } return &EvalWriteResourceState{ Addr: addr.Resource, Config: config, ProviderAddr: providerAddr, } }