mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
core: allow partially-unknown lists from splat syntax
This was actually redundant anyway since HIL itself applied a similar rule where any partially-unknown list would be automatically flattened to a single unknown value. However, now we're changing HIL to explicitly permit partially-unknown lists so that we can allow the index operator [...] to succeed when applied to one of the elements that _is_ known. This, in conjunction with hashicorp/hil#51 and hashicorp/hil#52, fixes #3449.
This commit is contained in:
parent
edb362cfb3
commit
b4df03bca4
@ -594,10 +594,6 @@ func (i *Interpolater) computeResourceMultiVariable(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if singleAttr, ok := r.Primary.Attributes[v.Field]; ok {
|
if singleAttr, ok := r.Primary.Attributes[v.Field]; ok {
|
||||||
if singleAttr == config.UnknownVariableValue {
|
|
||||||
return &unknownVariable, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
values = append(values, singleAttr)
|
values = append(values, singleAttr)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@ -613,10 +609,6 @@ func (i *Interpolater) computeResourceMultiVariable(
|
|||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
if multiAttr == unknownVariable {
|
|
||||||
return &unknownVariable, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
values = append(values, multiAttr)
|
values = append(values, multiAttr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -359,8 +359,81 @@ func TestInterpolater_resourceVariableMulti(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testInterpolate(t, i, scope, "aws_instance.web.*.foo", ast.Variable{
|
testInterpolate(t, i, scope, "aws_instance.web.*.foo", ast.Variable{
|
||||||
Value: config.UnknownVariableValue,
|
Type: ast.TypeList,
|
||||||
Type: ast.TypeUnknown,
|
Value: []ast.Variable{
|
||||||
|
{
|
||||||
|
Type: ast.TypeUnknown,
|
||||||
|
Value: config.UnknownVariableValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInterpolater_resourceVariableMultiPartialUnknown(t *testing.T) {
|
||||||
|
lock := new(sync.RWMutex)
|
||||||
|
state := &State{
|
||||||
|
Modules: []*ModuleState{
|
||||||
|
&ModuleState{
|
||||||
|
Path: rootModulePath,
|
||||||
|
Resources: map[string]*ResourceState{
|
||||||
|
"aws_instance.web.0": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Primary: &InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"foo": "1",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.web.1": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Primary: &InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"foo": config.UnknownVariableValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"aws_instance.web.2": &ResourceState{
|
||||||
|
Type: "aws_instance",
|
||||||
|
Primary: &InstanceState{
|
||||||
|
ID: "bar",
|
||||||
|
Attributes: map[string]string{
|
||||||
|
"foo": "2",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
i := &Interpolater{
|
||||||
|
Module: testModule(t, "interpolate-resource-variable-multi"),
|
||||||
|
State: state,
|
||||||
|
StateLock: lock,
|
||||||
|
}
|
||||||
|
|
||||||
|
scope := &InterpolationScope{
|
||||||
|
Path: rootModulePath,
|
||||||
|
}
|
||||||
|
|
||||||
|
testInterpolate(t, i, scope, "aws_instance.web.*.foo", ast.Variable{
|
||||||
|
Type: ast.TypeList,
|
||||||
|
Value: []ast.Variable{
|
||||||
|
{
|
||||||
|
Type: ast.TypeString,
|
||||||
|
Value: "1",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: ast.TypeUnknown,
|
||||||
|
Value: config.UnknownVariableValue,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Type: ast.TypeString,
|
||||||
|
Value: "2",
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -408,8 +481,13 @@ func TestInterpolater_resourceVariableMultiList(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
testInterpolate(t, i, scope, "aws_instance.web.*.ip", ast.Variable{
|
testInterpolate(t, i, scope, "aws_instance.web.*.ip", ast.Variable{
|
||||||
Value: config.UnknownVariableValue,
|
Type: ast.TypeList,
|
||||||
Type: ast.TypeUnknown,
|
Value: []ast.Variable{
|
||||||
|
{
|
||||||
|
Type: ast.TypeUnknown,
|
||||||
|
Value: config.UnknownVariableValue,
|
||||||
|
},
|
||||||
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
resource "aws_instance" "web" {
|
||||||
|
count = 3
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user