diff --git a/addrs/provider_config.go b/addrs/provider_config.go index 912254a34..aba6afceb 100644 --- a/addrs/provider_config.go +++ b/addrs/provider_config.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/hashicorp/terraform/tfdiags" + "github.com/zclconf/go-cty/cty" "github.com/hashicorp/hcl/v2" "github.com/hashicorp/hcl/v2/hclsyntax" @@ -96,11 +97,11 @@ var _ ProviderConfig = AbsProviderConfig{} // address. The following are examples of traversals that can be successfully // parsed as absolute provider configuration addresses: // -// provider.["registry.terraform.io/hashicorp/aws"] -// provider.["registry.terraform.io/hashicorp/aws"].foo -// module.bar.provider.["registry.terraform.io/hashicorp/aws"] -// module.bar.module.baz.provider.["registry.terraform.io/hashicorp/aws"].foo -// module.foo[1].provider.["registry.terraform.io/hashicorp/aws"].foo +// provider["registry.terraform.io/hashicorp/aws"] +// provider["registry.terraform.io/hashicorp/aws"].foo +// module.bar.provider["registry.terraform.io/hashicorp/aws"] +// module.bar.module.baz.provider["registry.terraform.io/hashicorp/aws"].foo +// module.foo[1].provider["registry.terraform.io/hashicorp/aws"].foo // // This type of address is used, for example, to record the relationships // between resources and provider configurations in the state structure. @@ -131,6 +132,15 @@ func ParseAbsProviderConfig(traversal hcl.Traversal) (AbsProviderConfig, tfdiags } if tt, ok := remain[1].(hcl.TraverseIndex); ok { + if !tt.Key.Type().Equals(cty.String) { + diags = diags.Append(&hcl.Diagnostic{ + Severity: hcl.DiagError, + Summary: "Invalid provider configuration address", + Detail: "The prefix \"provider.\" must be followed by a provider type name.", + Subject: remain[1].SourceRange().Ptr(), + }) + return ret, diags + } p, sourceDiags := ParseProviderSourceString(tt.Key.AsString()) ret.Provider = p if sourceDiags.HasErrors() { @@ -273,29 +283,21 @@ func ParseLegacyAbsProviderConfig(traversal hcl.Traversal) (AbsProviderConfig, t return ret, diags } -// ProviderConfigDefault returns the address of the default provider config -// of the given type inside the recieving module instance. -// -// TODO: The signature of this should change to accept a Provider address -// instead of a bare name once AbsProviderConfig starts having its own Provider -// and Alias fields rather than embedding LocalProviderConfig. -func (m ModuleInstance) ProviderConfigDefault(name string) AbsProviderConfig { +// ProviderConfigDefault returns the address of the default provider config of +// the given type inside the recieving module instance. +func (m ModuleInstance) ProviderConfigDefault(provider Provider) AbsProviderConfig { return AbsProviderConfig{ Module: m, - Provider: NewLegacyProvider(name), + Provider: provider, } } -// ProviderConfigAliased returns the address of an aliased provider config -// of with given type and alias inside the recieving module instance. -// -// TODO: The signature of this should change to accept a Provider address -// instead of a bare name once AbsProviderConfig starts having its own Provider -// and Alias fields rather than embedding LocalProviderConfig. -func (m ModuleInstance) ProviderConfigAliased(name, alias string) AbsProviderConfig { +// ProviderConfigAliased returns the address of an aliased provider config of +// the given type and alias inside the recieving module instance. +func (m ModuleInstance) ProviderConfigAliased(provider Provider, alias string) AbsProviderConfig { return AbsProviderConfig{ Module: m, - Provider: NewLegacyProvider(name), + Provider: provider, Alias: alias, } } @@ -311,9 +313,9 @@ func (pc AbsProviderConfig) providerConfig() {} // other than the root module. Even if a valid address is returned, inheritence // may not be performed for other reasons, such as if the calling module // provided explicit provider configurations within the call for this module. -// The ProviderTransformer graph transform in the main terraform module has -// the authoritative logic for provider inheritance, and this method is here -// mainly just for its benefit. +// The ProviderTransformer graph transform in the main terraform module has the +// authoritative logic for provider inheritance, and this method is here mainly +// just for its benefit. func (pc AbsProviderConfig) Inherited() (AbsProviderConfig, bool) { // Can't inherit if we're already in the root. if len(pc.Module) == 0 { diff --git a/addrs/provider_config_test.go b/addrs/provider_config_test.go index b277050f2..a48129e57 100644 --- a/addrs/provider_config_test.go +++ b/addrs/provider_config_test.go @@ -157,6 +157,11 @@ func TestParseAbsProviderConfig(t *testing.T) { AbsProviderConfig{}, `Provider address must begin with "provider.", followed by a provider type name.`, }, + { + `provider[0]`, + AbsProviderConfig{}, + `The prefix "provider." must be followed by a provider type name.`, + }, } for _, test := range tests { diff --git a/command/show_test.go b/command/show_test.go index 4595f5d82..86a4a790c 100644 --- a/command/show_test.go +++ b/command/show_test.go @@ -85,7 +85,7 @@ func TestShow_aliasedProvider(t *testing.T) { Dependencies: []addrs.AbsResource{}, DependsOn: []addrs.Referenceable{}, }, - addrs.RootModuleInstance.ProviderConfigAliased("test", "alias"), + addrs.RootModuleInstance.ProviderConfigAliased(addrs.NewLegacyProvider("test"), "alias"), ) }) diff --git a/terraform/context_import_test.go b/terraform/context_import_test.go index 704d508eb..d16a36371 100644 --- a/terraform/context_import_test.go +++ b/terraform/context_import_test.go @@ -392,7 +392,7 @@ func TestContextImport_providerNonVarConfig(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -436,7 +436,7 @@ func TestContextImport_refresh(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -483,7 +483,7 @@ func TestContextImport_refreshNil(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -524,7 +524,7 @@ func TestContextImport_module(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -565,7 +565,7 @@ func TestContextImport_moduleDepth2(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -626,7 +626,7 @@ func TestContextImport_moduleDiff(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -687,7 +687,7 @@ func TestContextImport_moduleExisting(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -753,7 +753,7 @@ func TestContextImport_multiState(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -823,7 +823,7 @@ func TestContextImport_multiStateSame(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), }, }, }) @@ -865,7 +865,7 @@ func TestContextImport_customProviderMissing(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigAliased("aws", "alias"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigAliased(addrs.NewLegacyProvider("aws"), "alias"), }, }, }) @@ -900,7 +900,7 @@ func TestContextImport_customProvider(t *testing.T) { addrs.ManagedResourceMode, "aws_instance", "foo", addrs.NoKey, ), ID: "bar", - ProviderAddr: addrs.RootModuleInstance.ProviderConfigAliased("aws", "alias"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigAliased(addrs.NewLegacyProvider("aws"), "alias"), }, }, }) diff --git a/terraform/eval_provider_test.go b/terraform/eval_provider_test.go index 7c351ac8b..23b94c537 100644 --- a/terraform/eval_provider_test.go +++ b/terraform/eval_provider_test.go @@ -152,7 +152,7 @@ func TestEvalGetProvider_impl(t *testing.T) { func TestEvalGetProvider(t *testing.T) { var actual providers.Interface n := &EvalGetProvider{ - Addr: addrs.RootModuleInstance.ProviderConfigDefault("foo"), + Addr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("foo")), Output: &actual, } provider := &MockProvider{} diff --git a/terraform/eval_state_test.go b/terraform/eval_state_test.go index 6e068f156..45dc4b13c 100644 --- a/terraform/eval_state_test.go +++ b/terraform/eval_state_test.go @@ -214,7 +214,7 @@ func TestEvalWriteState(t *testing.T) { State: &obj, ProviderSchema: &providerSchema, - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), } _, err := node.Eval(ctx) if err != nil { @@ -261,7 +261,7 @@ func TestEvalWriteStateDeposed(t *testing.T) { State: &obj, ProviderSchema: &providerSchema, - ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault("aws"), + ProviderAddr: addrs.RootModuleInstance.ProviderConfigDefault(addrs.NewLegacyProvider("aws")), } _, err := node.Eval(ctx) if err != nil { diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index 7dcbdb5b2..f1f6f3d3c 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -312,7 +312,7 @@ func (t *MissingProviderTransformer) Transform(g *Graph) error { // We're going to create an implicit _default_ configuration for the // referenced provider type in the _root_ module, ignoring all other // aspects of the resource's declared provider address. - defaultAddr := addrs.RootModuleInstance.ProviderConfigDefault(p.Provider.LegacyString()) + defaultAddr := addrs.RootModuleInstance.ProviderConfigDefault(p.Provider) key := defaultAddr.String() provider := m[key] diff --git a/terraform/transform_provider_test.go b/terraform/transform_provider_test.go index 5b167125a..197e51bcb 100644 --- a/terraform/transform_provider_test.go +++ b/terraform/transform_provider_test.go @@ -62,7 +62,7 @@ func TestProviderTransformer_moduleChild(t *testing.T) { ), ProviderAddr: addrs.RootModuleInstance. Child("moo", addrs.NoKey). - ProviderConfigDefault("foo"), + ProviderConfigDefault(addrs.NewLegacyProvider("foo")), ID: "bar", }, }, @@ -279,7 +279,7 @@ func TestMissingProviderTransformer_moduleChild(t *testing.T) { ), ProviderAddr: addrs.RootModuleInstance. Child("moo", addrs.NoKey). - ProviderConfigDefault("foo"), + ProviderConfigDefault(addrs.NewLegacyProvider("foo")), ID: "bar", }, }, @@ -324,7 +324,7 @@ func TestMissingProviderTransformer_moduleGrandchild(t *testing.T) { ), ProviderAddr: addrs.RootModuleInstance. Child("moo", addrs.NoKey). - ProviderConfigDefault("foo"), + ProviderConfigDefault(addrs.NewLegacyProvider("foo")), ID: "bar", }, }, @@ -366,7 +366,7 @@ func TestParentProviderTransformer(t *testing.T) { ), ProviderAddr: addrs.RootModuleInstance. Child("moo", addrs.NoKey). - ProviderConfigDefault("foo"), + ProviderConfigDefault(addrs.NewLegacyProvider("foo")), ID: "bar", }, }, @@ -420,7 +420,7 @@ func TestParentProviderTransformer_moduleGrandchild(t *testing.T) { ), ProviderAddr: addrs.RootModuleInstance. Child("moo", addrs.NoKey). - ProviderConfigDefault("foo"), + ProviderConfigDefault(addrs.NewLegacyProvider("foo")), ID: "bar", }, },