From edb56a7e16068fdaa968bfd87fcbaeb8c671bfdf Mon Sep 17 00:00:00 2001 From: Martin Atkins Date: Fri, 1 Jun 2018 15:08:56 -0700 Subject: [PATCH] core: Don't save provider input for non-root module We only support provider input for the root module. This is already checked in ProviderInput, but was not checked in SetProviderInput. We can't actually do anything particularly clever with an invalid call here, but we will at least generate a WARN log to help with debugging. Also need to update TestBuiltinEvalContextProviderInput to expect this new behavior of ignoring input for non-root modules. --- terraform/eval_context_builtin.go | 6 ++++++ terraform/eval_context_builtin_test.go | 10 +++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/terraform/eval_context_builtin.go b/terraform/eval_context_builtin.go index bda5676d06..af46a23bb0 100644 --- a/terraform/eval_context_builtin.go +++ b/terraform/eval_context_builtin.go @@ -198,6 +198,12 @@ func (ctx *BuiltinEvalContext) ProviderInput(pc addrs.ProviderConfig) map[string func (ctx *BuiltinEvalContext) SetProviderInput(pc addrs.ProviderConfig, c map[string]cty.Value) { absProvider := pc.Absolute(ctx.Path()) + if !ctx.Path().IsRoot() { + // Only root module provider configurations can have input. + log.Printf("[WARN] BuiltinEvalContext: attempt to SetProviderInput for non-root module") + return + } + // Save the configuration ctx.ProviderLock.Lock() ctx.ProviderInputConfig[absProvider.String()] = c diff --git a/terraform/eval_context_builtin_test.go b/terraform/eval_context_builtin_test.go index 2e2081a0ce..da1382e0fe 100644 --- a/terraform/eval_context_builtin_test.go +++ b/terraform/eval_context_builtin_test.go @@ -28,17 +28,17 @@ func TestBuiltinEvalContextProviderInput(t *testing.T) { expected1 := map[string]cty.Value{"value": cty.StringVal("foo")} ctx1.SetProviderInput(providerAddr, expected1) - expected2 := map[string]cty.Value{"value": cty.StringVal("bar")} - ctx2.SetProviderInput(providerAddr, expected2) + try2 := map[string]cty.Value{"value": cty.StringVal("bar")} + ctx2.SetProviderInput(providerAddr, try2) // ignored because not a root module actual1 := ctx1.ProviderInput(providerAddr) actual2 := ctx2.ProviderInput(providerAddr) if !reflect.DeepEqual(actual1, expected1) { - t.Fatalf("bad: %#v %#v", actual1, expected1) + t.Errorf("wrong result 1\ngot: %#v\nwant: %#v", actual1, expected1) } - if !reflect.DeepEqual(actual2, expected2) { - t.Fatalf("bad: %#v %#v", actual2, expected2) + if actual2 != nil { + t.Errorf("wrong result 2\ngot: %#v\nwant: %#v", actual2, nil) } }