4 "github.com/hashicorp/terraform/dag"
7 // NodePlannableResource represents a resource that is "plannable":
8 // it is ready to be planned in order to create a diff.
9 type NodePlannableResource struct {
10 *NodeAbstractCountResource
13 // GraphNodeDynamicExpandable
14 func (n *NodePlannableResource) DynamicExpand(ctx EvalContext) (*Graph, error) {
15 // Grab the state which we read
16 state, lock := ctx.State()
20 // Expand the resource count which must be available by now from EvalTree
21 count, err := n.Config.Count()
26 // The concrete resource factory we'll use
27 concreteResource := func(a *NodeAbstractResource) dag.Vertex {
28 // Add the config and state since we don't do that via transforms
30 a.ResolvedProvider = n.ResolvedProvider
32 return &NodePlannableResourceInstance{
33 NodeAbstractResource: a,
37 // The concrete resource factory we'll use for oprhans
38 concreteResourceOrphan := func(a *NodeAbstractResource) dag.Vertex {
39 // Add the config and state since we don't do that via transforms
41 a.ResolvedProvider = n.ResolvedProvider
43 return &NodePlannableResourceOrphan{
44 NodeAbstractResource: a,
48 // Start creating the steps
49 steps := []GraphTransformer{
51 &ResourceCountTransformer{
52 Concrete: concreteResource,
54 Addr: n.ResourceAddr(),
57 // Add the count orphans
58 &OrphanResourceCountTransformer{
59 Concrete: concreteResourceOrphan,
61 Addr: n.ResourceAddr(),
66 &AttachStateTransformer{State: state},
69 &TargetsTransformer{ParsedTargets: n.Targets},
71 // Connect references so ordering is correct
72 &ReferenceTransformer{},
74 // Make sure there is a single root
79 b := &BasicGraphBuilder{
82 Name: "NodePlannableResource",
84 return b.Build(ctx.Path())