Support using self in the provisioner of resources that use for_each
This commit is contained in:
parent
112b7755c0
commit
b9af3cd86b
|
@ -112,11 +112,12 @@ func (n *EvalValidateProvider) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
// the configuration of a provisioner belonging to a resource. The provisioner
|
// the configuration of a provisioner belonging to a resource. The provisioner
|
||||||
// config is expected to contain the merged connection configurations.
|
// config is expected to contain the merged connection configurations.
|
||||||
type EvalValidateProvisioner struct {
|
type EvalValidateProvisioner struct {
|
||||||
ResourceAddr addrs.Resource
|
ResourceAddr addrs.Resource
|
||||||
Provisioner *provisioners.Interface
|
Provisioner *provisioners.Interface
|
||||||
Schema **configschema.Block
|
Schema **configschema.Block
|
||||||
Config *configs.Provisioner
|
Config *configs.Provisioner
|
||||||
ResourceHasCount bool
|
ResourceHasCount bool
|
||||||
|
ResourceHasForEach bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func (n *EvalValidateProvisioner) Eval(ctx EvalContext) (interface{}, error) {
|
func (n *EvalValidateProvisioner) Eval(ctx EvalContext) (interface{}, error) {
|
||||||
|
@ -198,6 +199,19 @@ func (n *EvalValidateProvisioner) evaluateBlock(ctx EvalContext, body hcl.Body,
|
||||||
// expected type since none of these elements are known at this
|
// expected type since none of these elements are known at this
|
||||||
// point anyway.
|
// point anyway.
|
||||||
selfAddr = n.ResourceAddr.Instance(addrs.IntKey(0))
|
selfAddr = n.ResourceAddr.Instance(addrs.IntKey(0))
|
||||||
|
} else if n.ResourceHasForEach {
|
||||||
|
// For a resource that has for_each, we allow each.value and each.key
|
||||||
|
// but don't know at this stage what it will return.
|
||||||
|
keyData = InstanceKeyEvalData{
|
||||||
|
EachKey: cty.UnknownVal(cty.String),
|
||||||
|
EachValue: cty.DynamicVal,
|
||||||
|
}
|
||||||
|
|
||||||
|
// "self" can't point to an unknown key, but we'll force it to be
|
||||||
|
// key "" here, which should return an unknown value of the
|
||||||
|
// expected type since none of these elements are known at
|
||||||
|
// this point anyway.
|
||||||
|
selfAddr = n.ResourceAddr.Instance(addrs.StringKey(""))
|
||||||
}
|
}
|
||||||
|
|
||||||
return ctx.EvaluateBlock(body, schema, selfAddr, keyData)
|
return ctx.EvaluateBlock(body, schema, selfAddr, keyData)
|
||||||
|
|
|
@ -54,6 +54,7 @@ func (n *NodeValidatableResource) EvalTree() EvalNode {
|
||||||
|
|
||||||
if managed := n.Config.Managed; managed != nil {
|
if managed := n.Config.Managed; managed != nil {
|
||||||
hasCount := n.Config.Count != nil
|
hasCount := n.Config.Count != nil
|
||||||
|
hasForEach := n.Config.ForEach != nil
|
||||||
|
|
||||||
// Validate all the provisioners
|
// Validate all the provisioners
|
||||||
for _, p := range managed.Provisioners {
|
for _, p := range managed.Provisioners {
|
||||||
|
@ -74,11 +75,12 @@ func (n *NodeValidatableResource) EvalTree() EvalNode {
|
||||||
Schema: &provisionerSchema,
|
Schema: &provisionerSchema,
|
||||||
},
|
},
|
||||||
&EvalValidateProvisioner{
|
&EvalValidateProvisioner{
|
||||||
ResourceAddr: addr.Resource,
|
ResourceAddr: addr.Resource,
|
||||||
Provisioner: &provisioner,
|
Provisioner: &provisioner,
|
||||||
Schema: &provisionerSchema,
|
Schema: &provisionerSchema,
|
||||||
Config: p,
|
Config: p,
|
||||||
ResourceHasCount: hasCount,
|
ResourceHasCount: hasCount,
|
||||||
|
ResourceHasForEach: hasForEach,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue