Check for wholly known for forEach evaluation, add some tests
This commit is contained in:
parent
c93b0199f3
commit
0eb7cfd0d9
|
@ -2562,6 +2562,41 @@ func TestContext2Apply_provisionerInterpCount(t *testing.T) {
|
|||
}
|
||||
}
|
||||
|
||||
func TestContext2Apply_foreachVariable(t *testing.T) {
|
||||
m := testModule(t, "plan-for-each-expression")
|
||||
p := testProvider("aws")
|
||||
p.ApplyFn = testApplyFn
|
||||
p.DiffFn = testDiffFn
|
||||
ctx := testContext2(t, &ContextOpts{
|
||||
Config: m,
|
||||
ProviderResolver: providers.ResolverFixed(
|
||||
map[string]providers.Factory{
|
||||
"aws": testProviderFuncFixed(p),
|
||||
},
|
||||
),
|
||||
Variables: InputValues{
|
||||
"foo": &InputValue{
|
||||
Value: cty.StringVal("hello"),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
||||
if _, diags := ctx.Plan(); diags.HasErrors() {
|
||||
t.Fatalf("plan errors: %s", diags.Err())
|
||||
}
|
||||
|
||||
state, diags := ctx.Apply()
|
||||
if diags.HasErrors() {
|
||||
t.Fatalf("diags: %s", diags.Err())
|
||||
}
|
||||
|
||||
actual := strings.TrimSpace(state.String())
|
||||
expected := strings.TrimSpace(testTerraformApplyForEachVariableStr)
|
||||
if actual != expected {
|
||||
t.Fatalf("wrong result\n\ngot:\n%s\n\nwant:\n%s", actual, expected)
|
||||
}
|
||||
}
|
||||
|
||||
func TestContext2Apply_moduleBasic(t *testing.T) {
|
||||
m := testModule(t, "apply-module")
|
||||
p := testProvider("aws")
|
||||
|
|
|
@ -3385,7 +3385,42 @@ func TestContext2Plan_forEach(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestContext2Plan_forEachExpression(t *testing.T) {
|
||||
m := testModule(t, "plan-for-each-expression")
|
||||
p := testProvider("aws")
|
||||
p.DiffFn = testDiffFn
|
||||
ctx := testContext2(t, &ContextOpts{
|
||||
Config: m,
|
||||
ProviderResolver: providers.ResolverFixed(
|
||||
map[string]providers.Factory{
|
||||
"aws": testProviderFuncFixed(p),
|
||||
},
|
||||
),
|
||||
})
|
||||
|
||||
plan, diags := ctx.Plan()
|
||||
if diags.HasErrors() {
|
||||
t.Fatalf("unexpected errors: %s", diags.Err())
|
||||
}
|
||||
|
||||
schema := p.GetSchemaReturn.ResourceTypes["aws_instance"]
|
||||
ty := schema.ImpliedType()
|
||||
|
||||
if len(plan.Changes.Resources) != 3 {
|
||||
t.Fatal("expected 3 changes, got", len(plan.Changes.Resources))
|
||||
}
|
||||
|
||||
for _, res := range plan.Changes.Resources {
|
||||
if res.Action != plans.Create {
|
||||
t.Fatalf("expected resource creation, got %s", res.Action)
|
||||
}
|
||||
_, err := res.Decode(ty)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestContext2Plan_destroy(t *testing.T) {
|
||||
|
|
|
@ -50,7 +50,7 @@ func evaluateResourceForEachExpressionKnown(expr hcl.Expression, ctx EvalContext
|
|||
Subject: expr.Range().Ptr(),
|
||||
})
|
||||
return nil, true, diags
|
||||
case !forEachVal.IsKnown():
|
||||
case !forEachVal.IsWhollyKnown():
|
||||
return map[string]cty.Value{}, false, diags
|
||||
}
|
||||
|
||||
|
|
|
@ -39,6 +39,7 @@ func (n *NodeRefreshableDataResource) DynamicExpand(ctx EvalContext) (*Graph, er
|
|||
}
|
||||
|
||||
forEachMap, forEachKnown, forEachDiags := evaluateResourceForEachExpressionKnown(n.Config.ForEach, ctx)
|
||||
diags = diags.Append(forEachDiags)
|
||||
if forEachDiags.HasErrors() {
|
||||
return nil, diags.Err()
|
||||
}
|
||||
|
|
|
@ -538,7 +538,22 @@ aws_instance.foo.1:
|
|||
ID = foo
|
||||
provider = provider.aws
|
||||
`
|
||||
|
||||
const testTerraformApplyForEachVariableStr = `
|
||||
aws_instance.foo["b15c6d616d6143248c575900dff57325eb1de498"]:
|
||||
ID = foo
|
||||
provider = provider.aws
|
||||
foo = foo
|
||||
type = aws_instance
|
||||
aws_instance.foo["c3de47d34b0a9f13918dd705c141d579dd6555fd"]:
|
||||
ID = foo
|
||||
provider = provider.aws
|
||||
foo = foo
|
||||
type = aws_instance
|
||||
aws_instance.foo["e30a7edcc42a846684f2a4eea5f3cd261d33c46d"]:
|
||||
ID = foo
|
||||
provider = provider.aws
|
||||
foo = foo
|
||||
type = aws_instance`
|
||||
const testTerraformApplyMinimalStr = `
|
||||
aws_instance.bar:
|
||||
ID = foo
|
||||
|
|
|
@ -0,0 +1,11 @@
|
|||
# expressions with variable reference
|
||||
variable "foo" {
|
||||
type = string
|
||||
}
|
||||
|
||||
resource "aws_instance" "foo" {
|
||||
for_each = toset(
|
||||
[for i in range(0,3) : sha1("${i}${var.foo}")]
|
||||
)
|
||||
foo = "foo"
|
||||
}
|
Loading…
Reference in New Issue