Merge pull request #33047 from hashicorp/jbardin/destroy-provider-pruning

prune unused providers within modules
This commit is contained in:
James Bardin 2023-05-10 11:54:10 -04:00 committed by GitHub
commit 2e0efe7321
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 55 additions and 4 deletions

View File

@ -2045,3 +2045,46 @@ resource "test_resource" "b" {
_, diags = ctx.Apply(plan, m)
assertNoErrors(t, diags)
}
func TestContext2Apply_destroyUnusedModuleProvider(t *testing.T) {
// an unsued provider within a module should not be called during destroy
unusedProvider := testProvider("unused")
testProvider := testProvider("test")
ctx := testContext2(t, &ContextOpts{
Providers: map[addrs.Provider]providers.Factory{
addrs.NewDefaultProvider("test"): testProviderFuncFixed(testProvider),
addrs.NewDefaultProvider("unused"): testProviderFuncFixed(unusedProvider),
},
})
unusedProvider.ConfigureProviderFn = func(req providers.ConfigureProviderRequest) (resp providers.ConfigureProviderResponse) {
resp.Diagnostics = resp.Diagnostics.Append(errors.New("configuration failed"))
return resp
}
m := testModuleInline(t, map[string]string{
"main.tf": `
module "mod" {
source = "./mod"
}
resource "test_resource" "test" {
}
`,
"mod/main.tf": `
provider "unused" {
}
resource "unused_resource" "test" {
}
`,
})
plan, diags := ctx.Plan(m, states.NewState(), &PlanOpts{
Mode: plans.DestroyMode,
})
assertNoErrors(t, diags)
_, diags = ctx.Apply(plan, m)
assertNoErrors(t, diags)
}

View File

@ -351,10 +351,18 @@ func (t *pruneUnusedNodesTransformer) Transform(g *Graph) error {
}
case GraphNodeProvider:
// Providers that may have been required by expansion nodes
// that we no longer need can also be removed.
if g.UpEdges(n).Len() > 0 {
return
// Only keep providers for evaluation if they have
// resources to handle.
// The provider transformers removed most unused providers
// earlier, however there may be more to prune now based on
// targeting or a destroy with no related instances in the
// state.
des, _ := g.Descendents(n)
for _, v := range des {
switch v.(type) {
case GraphNodeProviderConsumer:
return
}
}
default: