Support using self in the provisioner of resources that use for_each

This commit is contained in:
Thayne McCombs 2019-07-29 01:18:33 -06:00
parent 112b7755c0
commit b9af3cd86b
2 changed files with 26 additions and 10 deletions

View File

@ -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)

View File

@ -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,
}, },
) )
} }