mirror of https://github.com/hashicorp/terraform
Merge pull request #31163 from hashicorp/jbardin/plan-destroy
Use plan graph builder for destroypull/31178/head
commit
93ff27227a
@ -1,115 +1,17 @@
|
||||
package terraform
|
||||
|
||||
import (
|
||||
"github.com/hashicorp/terraform/internal/addrs"
|
||||
"github.com/hashicorp/terraform/internal/configs"
|
||||
"github.com/hashicorp/terraform/internal/dag"
|
||||
"github.com/hashicorp/terraform/internal/states"
|
||||
"github.com/hashicorp/terraform/internal/tfdiags"
|
||||
)
|
||||
|
||||
// DestroyPlanGraphBuilder implements GraphBuilder and is responsible for
|
||||
// planning a pure-destroy.
|
||||
//
|
||||
// Planning a pure destroy operation is simple because we can ignore most
|
||||
// ordering configuration and simply reverse the state. This graph mainly
|
||||
// exists for targeting, because we need to walk the destroy dependencies to
|
||||
// ensure we plan the required resources. Without the requirement for
|
||||
// targeting, the plan could theoretically be created directly from the state.
|
||||
type DestroyPlanGraphBuilder struct {
|
||||
// Config is the configuration tree to build the plan from.
|
||||
Config *configs.Config
|
||||
|
||||
// State is the current state
|
||||
State *states.State
|
||||
|
||||
// RootVariableValues are the raw input values for root input variables
|
||||
// given by the caller, which we'll resolve into final values as part
|
||||
// of the plan walk.
|
||||
RootVariableValues InputValues
|
||||
|
||||
// Plugins is a library of plug-in components (providers and
|
||||
// provisioners) available for use.
|
||||
Plugins *contextPlugins
|
||||
|
||||
// Targets are resources to target
|
||||
Targets []addrs.Targetable
|
||||
|
||||
// If set, skipRefresh will cause us stop skip refreshing any existing
|
||||
// resource instances as part of our planning. This will cause us to fail
|
||||
// to detect if an object has already been deleted outside of Terraform.
|
||||
skipRefresh bool
|
||||
}
|
||||
|
||||
// See GraphBuilder
|
||||
func (b *DestroyPlanGraphBuilder) Build(path addrs.ModuleInstance) (*Graph, tfdiags.Diagnostics) {
|
||||
return (&BasicGraphBuilder{
|
||||
Steps: b.Steps(),
|
||||
Name: "DestroyPlanGraphBuilder",
|
||||
}).Build(path)
|
||||
}
|
||||
|
||||
// See GraphBuilder
|
||||
func (b *DestroyPlanGraphBuilder) Steps() []GraphTransformer {
|
||||
concreteResourceInstance := func(a *NodeAbstractResourceInstance) dag.Vertex {
|
||||
func DestroyPlanGraphBuilder(p *PlanGraphBuilder) GraphBuilder {
|
||||
p.ConcreteResourceInstance = func(a *NodeAbstractResourceInstance) dag.Vertex {
|
||||
return &NodePlanDestroyableResourceInstance{
|
||||
NodeAbstractResourceInstance: a,
|
||||
skipRefresh: b.skipRefresh,
|
||||
}
|
||||
}
|
||||
concreteResourceInstanceDeposed := func(a *NodeAbstractResourceInstance, key states.DeposedKey) dag.Vertex {
|
||||
return &NodePlanDeposedResourceInstanceObject{
|
||||
NodeAbstractResourceInstance: a,
|
||||
DeposedKey: key,
|
||||
skipRefresh: b.skipRefresh,
|
||||
}
|
||||
}
|
||||
|
||||
concreteProvider := func(a *NodeAbstractProvider) dag.Vertex {
|
||||
return &NodeApplyableProvider{
|
||||
NodeAbstractProvider: a,
|
||||
skipRefresh: p.skipRefresh,
|
||||
}
|
||||
}
|
||||
p.destroy = true
|
||||
|
||||
steps := []GraphTransformer{
|
||||
// Creates nodes for the resource instances tracked in the state.
|
||||
&StateTransformer{
|
||||
ConcreteCurrent: concreteResourceInstance,
|
||||
ConcreteDeposed: concreteResourceInstanceDeposed,
|
||||
State: b.State,
|
||||
},
|
||||
|
||||
// Create the delete changes for root module outputs.
|
||||
&OutputTransformer{
|
||||
Config: b.Config,
|
||||
Destroy: true,
|
||||
},
|
||||
|
||||
// Attach the state
|
||||
&AttachStateTransformer{State: b.State},
|
||||
|
||||
// Attach the configuration to any resources
|
||||
&AttachResourceConfigTransformer{Config: b.Config},
|
||||
|
||||
transformProviders(concreteProvider, b.Config),
|
||||
|
||||
// Destruction ordering. We require this only so that
|
||||
// targeting below will prune the correct things.
|
||||
&DestroyEdgeTransformer{
|
||||
Config: b.Config,
|
||||
State: b.State,
|
||||
},
|
||||
|
||||
&TargetsTransformer{Targets: b.Targets},
|
||||
|
||||
// Close opened plugin connections
|
||||
&CloseProviderTransformer{},
|
||||
|
||||
// Close the root module
|
||||
&CloseRootModuleTransformer{},
|
||||
|
||||
&TransitiveReductionTransformer{},
|
||||
}
|
||||
|
||||
return steps
|
||||
return p
|
||||
}
|
||||
|
||||
Loading…
Reference in new issue