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"
11 // NodeValidatableResource represents a resource that is used for validation
13 type NodeValidatableResource struct {
18 _ GraphNodeSubPath = (*NodeValidatableResource)(nil)
19 _ GraphNodeEvalable = (*NodeValidatableResource)(nil)
20 _ GraphNodeReferenceable = (*NodeValidatableResource)(nil)
21 _ GraphNodeReferencer = (*NodeValidatableResource)(nil)
22 _ GraphNodeResource = (*NodeValidatableResource)(nil)
23 _ GraphNodeAttachResourceConfig = (*NodeValidatableResource)(nil)
27 func (n *NodeValidatableResource) EvalTree() EvalNode {
28 addr := n.ResourceAddr()
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
41 Addr: n.ResolvedProvider,
43 Schema: &providerSchema,
45 &EvalValidateResource{
48 ProviderSchema: &providerSchema,
50 ConfigVal: &configVal,
55 if managed := n.Config.Managed; managed != nil {
56 hasCount := n.Config.Count != nil
58 // Validate all the provisioners
59 for _, p := range managed.Provisioners {
60 var provisioner provisioners.Interface
61 var provisionerSchema *configschema.Block
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)
74 Schema: &provisionerSchema,
76 &EvalValidateProvisioner{
77 ResourceAddr: addr.Resource,
78 Provisioner: &provisioner,
79 Schema: &provisionerSchema,
81 ResourceHasCount: hasCount,