diff --git a/terraform/context_test.go b/terraform/context_test.go index beb257e3c..ea1690c54 100644 --- a/terraform/context_test.go +++ b/terraform/context_test.go @@ -2927,6 +2927,35 @@ func TestContext2Input_providerVars(t *testing.T) { } } +func TestContext2Input_providerVarsModuleInherit(t *testing.T) { + input := new(MockUIInput) + m := testModule(t, "input-provider-with-vars-and-module") + p := testProvider("aws") + p.ApplyFn = testApplyFn + p.DiffFn = testDiffFn + ctx := testContext2(t, &ContextOpts{ + Module: m, + Providers: map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + UIInput: input, + }) + + p.InputFn = func(i UIInput, c *ResourceConfig) (*ResourceConfig, error) { + if errs := c.CheckSet([]string{"access_key"}); len(errs) > 0 { + return c, errs[0] + } + return c, nil + } + p.ConfigureFn = func(c *ResourceConfig) error { + return nil + } + + if err := ctx.Input(InputModeStd); err != nil { + t.Fatalf("err: %s", err) + } +} + func TestContext2Input_varOnly(t *testing.T) { input := new(MockUIInput) m := testModule(t, "input-provider-vars") diff --git a/terraform/eval_provider.go b/terraform/eval_provider.go index 56bbf94a9..e5205a556 100644 --- a/terraform/eval_provider.go +++ b/terraform/eval_provider.go @@ -96,7 +96,7 @@ func (n *EvalGetProvider) Eval(ctx EvalContext) (interface{}, error) { type EvalInputProvider struct { Name string Provider *ResourceProvider - Config *config.RawConfig + Config **ResourceConfig } func (n *EvalInputProvider) Eval(ctx EvalContext) (interface{}, error) { @@ -105,8 +105,7 @@ func (n *EvalInputProvider) Eval(ctx EvalContext) (interface{}, error) { return nil, nil } - rc := NewResourceConfig(n.Config) - rc.Config = make(map[string]interface{}) + rc := *n.Config // Wrap the input into a namespace input := &PrefixUIInput{ diff --git a/terraform/evaltree_provider.go b/terraform/evaltree_provider.go index e2f51f06b..59916d9b5 100644 --- a/terraform/evaltree_provider.go +++ b/terraform/evaltree_provider.go @@ -22,10 +22,19 @@ func ProviderEvalTree(n string, config *config.RawConfig) EvalNode { Name: n, Output: &provider, }, + &EvalInterpolate{ + Config: config, + Output: &resourceConfig, + }, + &EvalBuildProviderConfig{ + Provider: n, + Config: &resourceConfig, + Output: &resourceConfig, + }, &EvalInputProvider{ Name: n, Provider: &provider, - Config: config, + Config: &resourceConfig, }, }, }, diff --git a/terraform/test-fixtures/input-provider-with-vars-and-module/child/main.tf b/terraform/test-fixtures/input-provider-with-vars-and-module/child/main.tf new file mode 100644 index 000000000..7ec25bda0 --- /dev/null +++ b/terraform/test-fixtures/input-provider-with-vars-and-module/child/main.tf @@ -0,0 +1 @@ +resource "aws_instance" "foo" { } diff --git a/terraform/test-fixtures/input-provider-with-vars-and-module/main.tf b/terraform/test-fixtures/input-provider-with-vars-and-module/main.tf new file mode 100644 index 000000000..c5112dca0 --- /dev/null +++ b/terraform/test-fixtures/input-provider-with-vars-and-module/main.tf @@ -0,0 +1,7 @@ +provider "aws" { + access_key = "abc123" +} + +module "child" { + source = "./child" +} diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index f319c745b..351e8eb12 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -151,7 +151,7 @@ func (n *graphNodeDisabledProvider) EvalTree() EvalNode { var resourceConfig *ResourceConfig return &EvalOpFilter{ - Ops: []walkOperation{walkValidate, walkRefresh, walkPlan, walkApply}, + Ops: []walkOperation{walkInput, walkValidate, walkRefresh, walkPlan, walkApply}, Node: &EvalSequence{ Nodes: []EvalNode{ &EvalInterpolate{