]> git.immae.eu Git - github/fretlink/terraform-provider-statuscake.git/blame - vendor/github.com/hashicorp/terraform/terraform/node_resource_plan.go
deps: github.com/hashicorp/terraform@sdk-v0.11-with-go-modules
[github/fretlink/terraform-provider-statuscake.git] / vendor / github.com / hashicorp / terraform / terraform / node_resource_plan.go
CommitLineData
bae9f6d2
JC
1package terraform
2
3import (
4 "github.com/hashicorp/terraform/dag"
5)
6
7// NodePlannableResource represents a resource that is "plannable":
8// it is ready to be planned in order to create a diff.
9type NodePlannableResource struct {
10 *NodeAbstractCountResource
11}
12
13// GraphNodeDynamicExpandable
14func (n *NodePlannableResource) DynamicExpand(ctx EvalContext) (*Graph, error) {
15 // Grab the state which we read
16 state, lock := ctx.State()
17 lock.RLock()
18 defer lock.RUnlock()
19
20 // Expand the resource count which must be available by now from EvalTree
21 count, err := n.Config.Count()
22 if err != nil {
23 return nil, err
24 }
25
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
29 a.Config = n.Config
15c0b25d 30 a.ResolvedProvider = n.ResolvedProvider
bae9f6d2
JC
31
32 return &NodePlannableResourceInstance{
33 NodeAbstractResource: a,
34 }
35 }
36
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
40 a.Config = n.Config
15c0b25d 41 a.ResolvedProvider = n.ResolvedProvider
bae9f6d2
JC
42
43 return &NodePlannableResourceOrphan{
44 NodeAbstractResource: a,
45 }
46 }
47
48 // Start creating the steps
49 steps := []GraphTransformer{
50 // Expand the count.
51 &ResourceCountTransformer{
52 Concrete: concreteResource,
53 Count: count,
54 Addr: n.ResourceAddr(),
55 },
56
57 // Add the count orphans
58 &OrphanResourceCountTransformer{
59 Concrete: concreteResourceOrphan,
60 Count: count,
61 Addr: n.ResourceAddr(),
62 State: state,
63 },
64
65 // Attach the state
66 &AttachStateTransformer{State: state},
67
68 // Targeting
69 &TargetsTransformer{ParsedTargets: n.Targets},
70
71 // Connect references so ordering is correct
72 &ReferenceTransformer{},
73
74 // Make sure there is a single root
75 &RootTransformer{},
76 }
77
78 // Build the graph
79 b := &BasicGraphBuilder{
80 Steps: steps,
81 Validate: true,
82 Name: "NodePlannableResource",
83 }
84 return b.Build(ctx.Path())
85}