core: Re-fix edge case with missing module state during evaluation
In #14526 we fixed a sticky edge-case where a resource with count = 0 set won't create its containing module state on apply, and thus when another expression refers to it we need to deal with that absense. The original bug fixed by #14526 was actually a nil dereference panic in this case. Our new HCL2-oriented expression evaluation codepath was, on the other hand, correctly checking for the nil, but was not taking the correct action in response to it, leading to the result being an unexpected unknown value. Here we replicate the fix to #14526 by behaving as if there are just no instances present in this case. We achieve this in a slightly different way here by just creating an empty ModuleState, but the effect is the same as #14526. This fixes TestContext2Apply_multiVarMissingState.
This commit is contained in:
parent
26f76dd222
commit
da2d91c0e4
|
@ -452,8 +452,16 @@ func (d *evaluationStateData) GetResourceInstance(addr addrs.ResourceInstance, r
|
|||
|
||||
ms := d.Evaluator.State.ModuleByPath(d.ModulePath)
|
||||
if ms == nil {
|
||||
// Not evaluated yet?
|
||||
return cty.DynamicVal, diags
|
||||
// If we have no module state in the apply walk, that suggests we've hit
|
||||
// a rather awkward edge-case: the resource this variable refers to
|
||||
// has count = 0 and is the only resource processed so far on this walk,
|
||||
// and so we've ended up not creating any resource states yet. We don't
|
||||
// create a module state until the first resource is written into it,
|
||||
// so the module state doesn't exist when we get here.
|
||||
//
|
||||
// In this case we act as we would if we had been passed a module
|
||||
// with an empty resource state map.
|
||||
ms = &ModuleState{}
|
||||
}
|
||||
|
||||
// Note that the state structs currently have confusing legacy names:
|
||||
|
|
Loading…
Reference in New Issue