From 5ddf5e1f7d1bf57e4314c38837469982786128e9 Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Wed, 24 Nov 2021 15:23:20 -0500 Subject: [PATCH] core: Fix schema loading for deleted resources Resource instances removed from the configuration would previously use the implied provider address. This is correct for default providers, but incorrect for those from other namespaces or hosts. The fix here is to use the stored provider config if it is present. --- .../node_resource_abstract_instance.go | 3 ++ .../node_resource_abstract_instance_test.go | 30 +++++++++++++++++-- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/internal/terraform/node_resource_abstract_instance.go b/internal/terraform/node_resource_abstract_instance.go index d2b6489be..91b24cd66 100644 --- a/internal/terraform/node_resource_abstract_instance.go +++ b/internal/terraform/node_resource_abstract_instance.go @@ -136,6 +136,9 @@ func (n *NodeAbstractResourceInstance) Provider() addrs.Provider { if n.Config != nil { return n.Config.Provider } + if n.storedProviderConfig.Provider.Type != "" { + return n.storedProviderConfig.Provider + } return addrs.ImpliedProviderForUnqualifiedType(n.Addr.Resource.ContainingResource().ImpliedProvider()) } diff --git a/internal/terraform/node_resource_abstract_instance_test.go b/internal/terraform/node_resource_abstract_instance_test.go index 0d4c23fc9..dca1cb52f 100644 --- a/internal/terraform/node_resource_abstract_instance_test.go +++ b/internal/terraform/node_resource_abstract_instance_test.go @@ -13,9 +13,10 @@ import ( func TestNodeAbstractResourceInstanceProvider(t *testing.T) { tests := []struct { - Addr addrs.AbsResourceInstance - Config *configs.Resource - Want addrs.Provider + Addr addrs.AbsResourceInstance + Config *configs.Resource + StoredProviderConfig addrs.AbsProviderConfig + Want addrs.Provider }{ { Addr: addrs.Resource{ @@ -87,6 +88,28 @@ func TestNodeAbstractResourceInstanceProvider(t *testing.T) { Type: "happycloud", }, }, + { + Addr: addrs.Resource{ + Mode: addrs.DataResourceMode, + Type: "null_resource", + Name: "baz", + }.Instance(addrs.NoKey).Absolute(addrs.RootModuleInstance), + Config: nil, + StoredProviderConfig: addrs.AbsProviderConfig{ + Module: addrs.RootModule, + Provider: addrs.Provider{ + Hostname: addrs.DefaultProviderRegistryHost, + Namespace: "awesomecorp", + Type: "null", + }, + }, + // The stored provider config overrides the default behavior. + Want: addrs.Provider{ + Hostname: addrs.DefaultProviderRegistryHost, + Namespace: "awesomecorp", + Type: "null", + }, + }, } for _, test := range tests { @@ -104,6 +127,7 @@ func TestNodeAbstractResourceInstanceProvider(t *testing.T) { NodeAbstractResource: NodeAbstractResource{ Config: test.Config, }, + storedProviderConfig: test.StoredProviderConfig, } got := node.Provider() if got != test.Want {