addrs: ProviderConfig fixups (#24115)
* fix outdated syntax in comments * test for non-strings in ParseAbsProviderConfig * ProviderConfigDefault and ProviderConfigAliased now take Providers instead of strings
This commit is contained in:
parent
72ec579807
commit
add134298a
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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"),
|
||||
)
|
||||
})
|
||||
|
||||
|
|
|
@ -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"),
|
||||
},
|
||||
},
|
||||
})
|
||||
|
|
|
@ -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{}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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]
|
||||
|
||||
|
|
|
@ -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",
|
||||
},
|
||||
},
|
||||
|
|
Loading…
Reference in New Issue