diff options
Diffstat (limited to 'vendor/github.com/hashicorp/terraform/terraform/node_module_variable.go')
-rw-r--r-- | vendor/github.com/hashicorp/terraform/terraform/node_module_variable.go | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/vendor/github.com/hashicorp/terraform/terraform/node_module_variable.go b/vendor/github.com/hashicorp/terraform/terraform/node_module_variable.go new file mode 100644 index 0000000..13fe8fc --- /dev/null +++ b/vendor/github.com/hashicorp/terraform/terraform/node_module_variable.go | |||
@@ -0,0 +1,125 @@ | |||
1 | package terraform | ||
2 | |||
3 | import ( | ||
4 | "fmt" | ||
5 | |||
6 | "github.com/hashicorp/terraform/config" | ||
7 | "github.com/hashicorp/terraform/config/module" | ||
8 | ) | ||
9 | |||
10 | // NodeApplyableModuleVariable represents a module variable input during | ||
11 | // the apply step. | ||
12 | type NodeApplyableModuleVariable struct { | ||
13 | PathValue []string | ||
14 | Config *config.Variable // Config is the var in the config | ||
15 | Value *config.RawConfig // Value is the value that is set | ||
16 | |||
17 | Module *module.Tree // Antiquated, want to remove | ||
18 | } | ||
19 | |||
20 | func (n *NodeApplyableModuleVariable) Name() string { | ||
21 | result := fmt.Sprintf("var.%s", n.Config.Name) | ||
22 | if len(n.PathValue) > 1 { | ||
23 | result = fmt.Sprintf("%s.%s", modulePrefixStr(n.PathValue), result) | ||
24 | } | ||
25 | |||
26 | return result | ||
27 | } | ||
28 | |||
29 | // GraphNodeSubPath | ||
30 | func (n *NodeApplyableModuleVariable) Path() []string { | ||
31 | // We execute in the parent scope (above our own module) so that | ||
32 | // we can access the proper interpolations. | ||
33 | if len(n.PathValue) > 2 { | ||
34 | return n.PathValue[:len(n.PathValue)-1] | ||
35 | } | ||
36 | |||
37 | return rootModulePath | ||
38 | } | ||
39 | |||
40 | // RemovableIfNotTargeted | ||
41 | func (n *NodeApplyableModuleVariable) RemoveIfNotTargeted() bool { | ||
42 | // We need to add this so that this node will be removed if | ||
43 | // it isn't targeted or a dependency of a target. | ||
44 | return true | ||
45 | } | ||
46 | |||
47 | // GraphNodeReferenceGlobal | ||
48 | func (n *NodeApplyableModuleVariable) ReferenceGlobal() bool { | ||
49 | // We have to create fully qualified references because we cross | ||
50 | // boundaries here: our ReferenceableName is in one path and our | ||
51 | // References are from another path. | ||
52 | return true | ||
53 | } | ||
54 | |||
55 | // GraphNodeReferenceable | ||
56 | func (n *NodeApplyableModuleVariable) ReferenceableName() []string { | ||
57 | return []string{n.Name()} | ||
58 | } | ||
59 | |||
60 | // GraphNodeReferencer | ||
61 | func (n *NodeApplyableModuleVariable) References() []string { | ||
62 | // If we have no value set, we depend on nothing | ||
63 | if n.Value == nil { | ||
64 | return nil | ||
65 | } | ||
66 | |||
67 | // Can't depend on anything if we're in the root | ||
68 | if len(n.PathValue) < 2 { | ||
69 | return nil | ||
70 | } | ||
71 | |||
72 | // Otherwise, we depend on anything that is in our value, but | ||
73 | // specifically in the namespace of the parent path. | ||
74 | // Create the prefix based on the path | ||
75 | var prefix string | ||
76 | if p := n.Path(); len(p) > 0 { | ||
77 | prefix = modulePrefixStr(p) | ||
78 | } | ||
79 | |||
80 | result := ReferencesFromConfig(n.Value) | ||
81 | return modulePrefixList(result, prefix) | ||
82 | } | ||
83 | |||
84 | // GraphNodeEvalable | ||
85 | func (n *NodeApplyableModuleVariable) EvalTree() EvalNode { | ||
86 | // If we have no value, do nothing | ||
87 | if n.Value == nil { | ||
88 | return &EvalNoop{} | ||
89 | } | ||
90 | |||
91 | // Otherwise, interpolate the value of this variable and set it | ||
92 | // within the variables mapping. | ||
93 | var config *ResourceConfig | ||
94 | variables := make(map[string]interface{}) | ||
95 | return &EvalSequence{ | ||
96 | Nodes: []EvalNode{ | ||
97 | &EvalInterpolate{ | ||
98 | Config: n.Value, | ||
99 | Output: &config, | ||
100 | }, | ||
101 | |||
102 | &EvalVariableBlock{ | ||
103 | Config: &config, | ||
104 | VariableValues: variables, | ||
105 | }, | ||
106 | |||
107 | &EvalCoerceMapVariable{ | ||
108 | Variables: variables, | ||
109 | ModulePath: n.PathValue, | ||
110 | ModuleTree: n.Module, | ||
111 | }, | ||
112 | |||
113 | &EvalTypeCheckVariable{ | ||
114 | Variables: variables, | ||
115 | ModulePath: n.PathValue, | ||
116 | ModuleTree: n.Module, | ||
117 | }, | ||
118 | |||
119 | &EvalSetVariables{ | ||
120 | Module: &n.PathValue[len(n.PathValue)-1], | ||
121 | Variables: variables, | ||
122 | }, | ||
123 | }, | ||
124 | } | ||
125 | } | ||