diff --git a/terraform/context_import_test.go b/terraform/context_import_test.go index 527b74e93..7a57f5a31 100644 --- a/terraform/context_import_test.go +++ b/terraform/context_import_test.go @@ -725,7 +725,8 @@ func TestContextImport_multiStateSame(t *testing.T) { } } -func TestContextImport_customProvider(t *testing.T) { +// import missing a provider alias should fail +func TestContextImport_customProviderMissing(t *testing.T) { p := testProvider("aws") m := testModule(t, "import-provider") ctx := testContext2(t, &ContextOpts{ @@ -744,6 +745,39 @@ func TestContextImport_customProvider(t *testing.T) { }, } + _, err := ctx.Import(&ImportOpts{ + Targets: []*ImportTarget{ + &ImportTarget{ + Addr: "aws_instance.foo", + ID: "bar", + Provider: "aws.alias", + }, + }, + }) + if err == nil { + t.Fatal("expected error") + } +} + +func TestContextImport_customProvider(t *testing.T) { + p := testProvider("aws") + m := testModule(t, "import-provider-alias") + ctx := testContext2(t, &ContextOpts{ + Module: m, + ProviderResolver: ResourceProviderResolverFixed( + map[string]ResourceProviderFactory{ + "aws": testProviderFuncFixed(p), + }, + ), + }) + + p.ImportStateReturn = []*InstanceState{ + &InstanceState{ + ID: "foo", + Ephemeral: EphemeralState{Type: "aws_instance"}, + }, + } + state, err := ctx.Import(&ImportOpts{ Targets: []*ImportTarget{ &ImportTarget{ diff --git a/terraform/test-fixtures/import-provider-alias/main.tf b/terraform/test-fixtures/import-provider-alias/main.tf new file mode 100644 index 000000000..d145d088e --- /dev/null +++ b/terraform/test-fixtures/import-provider-alias/main.tf @@ -0,0 +1,4 @@ +provider "aws" { + foo = "bar" + alias = "alias" +} diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index 794753f29..bc0136d39 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -19,6 +19,10 @@ func TransformProviders(providers []string, concrete ConcreteProviderNodeFunc, m Providers: providers, Concrete: concrete, }, + // Attach configuration to each provider instance + &AttachProviderConfigTransformer{ + Module: mod, + }, // Add any remaining missing providers &MissingProviderTransformer{ Providers: providers, @@ -30,10 +34,6 @@ func TransformProviders(providers []string, concrete ConcreteProviderNodeFunc, m &DisableProviderTransformer{}, // Connect provider to their parent provider nodes &ParentProviderTransformer{}, - // Attach configuration to each provider instance - &AttachProviderConfigTransformer{ - Module: mod, - }, ) } @@ -109,6 +109,7 @@ func (t *ProviderTransformer) Transform(g *Graph) error { break } + log.Printf("[DEBUG] resource %s using provider %s", dag.VertexName(pv), key) pv.SetProvider(key) g.Connect(dag.BasicEdge(v, target)) } @@ -196,6 +197,12 @@ func (t *MissingProviderTransformer) Transform(g *Graph) error { continue } + // we don't implicitly create aliased providers + if strings.Contains(p, ".") { + log.Println("[DEBUG] not adding missing provider alias", p) + continue + } + // create the misisng top-level provider provider = t.Concrete(&NodeAbstractProvider{ NameValue: p,