diff --git a/internal/terraform/graph_builder_apply.go b/internal/terraform/graph_builder_apply.go index 22f1b8c3bc..29e60ff6a0 100644 --- a/internal/terraform/graph_builder_apply.go +++ b/internal/terraform/graph_builder_apply.go @@ -144,7 +144,8 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer { // Destruction ordering &DestroyEdgeTransformer{ - Changes: b.Changes, + Changes: b.Changes, + Operation: b.Operation, }, &CBDEdgeTransformer{ Config: b.Config, diff --git a/internal/terraform/transform_destroy_edge.go b/internal/terraform/transform_destroy_edge.go index aac39fd4d7..3f87e7edf3 100644 --- a/internal/terraform/transform_destroy_edge.go +++ b/internal/terraform/transform_destroy_edge.go @@ -46,6 +46,11 @@ type DestroyEdgeTransformer struct { // DiffTransformer which was intended to be the only transformer operating // from the change set. Changes *plans.Changes + + // FIXME: Operation will not be needed here one we can better track + // inter-provider dependencies and remove the cycle checks in + // tryInterProviderDestroyEdge. + Operation walkOperation } // tryInterProviderDestroyEdge checks if we're inserting a destroy edge @@ -81,6 +86,12 @@ func (t *DestroyEdgeTransformer) tryInterProviderDestroyEdge(g *Graph, from, to e := dag.BasicEdge(from, to) g.Connect(e) + // If this is a complete destroy operation, then there are no create/update + // nodes to worry about and we can accept the edge without deeper inspection. + if t.Operation == walkDestroy { + return + } + // getComparableProvider inspects the node to try and get the most precise // description of the provider being used to help determine if 2 nodes are // from the same provider instance.