]>
Commit | Line | Data |
---|---|---|
bae9f6d2 JC |
1 | package terraform |
2 | ||
3 | import ( | |
107c1cdb ND |
4 | "github.com/hashicorp/terraform/configs" |
5 | "github.com/hashicorp/terraform/configs/configschema" | |
6 | "github.com/hashicorp/terraform/providers" | |
7 | "github.com/hashicorp/terraform/provisioners" | |
8 | "github.com/zclconf/go-cty/cty" | |
bae9f6d2 JC |
9 | ) |
10 | ||
11 | // NodeValidatableResource represents a resource that is used for validation | |
12 | // only. | |
13 | type NodeValidatableResource struct { | |
bae9f6d2 JC |
14 | *NodeAbstractResource |
15 | } | |
16 | ||
107c1cdb ND |
17 | var ( |
18 | _ GraphNodeSubPath = (*NodeValidatableResource)(nil) | |
19 | _ GraphNodeEvalable = (*NodeValidatableResource)(nil) | |
20 | _ GraphNodeReferenceable = (*NodeValidatableResource)(nil) | |
21 | _ GraphNodeReferencer = (*NodeValidatableResource)(nil) | |
22 | _ GraphNodeResource = (*NodeValidatableResource)(nil) | |
23 | _ GraphNodeAttachResourceConfig = (*NodeValidatableResource)(nil) | |
24 | ) | |
bae9f6d2 | 25 | |
107c1cdb ND |
26 | // GraphNodeEvalable |
27 | func (n *NodeValidatableResource) EvalTree() EvalNode { | |
28 | addr := n.ResourceAddr() | |
29 | config := n.Config | |
bae9f6d2 | 30 | |
107c1cdb ND |
31 | // Declare the variables will be used are used to pass values along |
32 | // the evaluation sequence below. These are written to via pointers | |
33 | // passed to the EvalNodes. | |
34 | var provider providers.Interface | |
35 | var providerSchema *ProviderSchema | |
36 | var configVal cty.Value | |
bae9f6d2 JC |
37 | |
38 | seq := &EvalSequence{ | |
39 | Nodes: []EvalNode{ | |
bae9f6d2 | 40 | &EvalGetProvider{ |
107c1cdb | 41 | Addr: n.ResolvedProvider, |
bae9f6d2 | 42 | Output: &provider, |
107c1cdb | 43 | Schema: &providerSchema, |
bae9f6d2 JC |
44 | }, |
45 | &EvalValidateResource{ | |
107c1cdb ND |
46 | Addr: addr.Resource, |
47 | Provider: &provider, | |
48 | ProviderSchema: &providerSchema, | |
49 | Config: config, | |
50 | ConfigVal: &configVal, | |
bae9f6d2 JC |
51 | }, |
52 | }, | |
53 | } | |
54 | ||
107c1cdb ND |
55 | if managed := n.Config.Managed; managed != nil { |
56 | hasCount := n.Config.Count != nil | |
57 | ||
58 | // Validate all the provisioners | |
59 | for _, p := range managed.Provisioners { | |
60 | var provisioner provisioners.Interface | |
61 | var provisionerSchema *configschema.Block | |
62 | ||
63 | if p.Connection == nil { | |
64 | p.Connection = config.Managed.Connection | |
65 | } else if config.Managed.Connection != nil { | |
66 | p.Connection.Config = configs.MergeBodies(config.Managed.Connection.Config, p.Connection.Config) | |
67 | } | |
68 | ||
69 | seq.Nodes = append( | |
70 | seq.Nodes, | |
71 | &EvalGetProvisioner{ | |
72 | Name: p.Type, | |
73 | Output: &provisioner, | |
74 | Schema: &provisionerSchema, | |
75 | }, | |
76 | &EvalValidateProvisioner{ | |
77 | ResourceAddr: addr.Resource, | |
78 | Provisioner: &provisioner, | |
79 | Schema: &provisionerSchema, | |
80 | Config: p, | |
81 | ResourceHasCount: hasCount, | |
82 | }, | |
83 | ) | |
84 | } | |
bae9f6d2 JC |
85 | } |
86 | ||
87 | return seq | |
88 | } |