diff --git a/terraform/graph_builder_apply.go b/terraform/graph_builder_apply.go index 1b898926e..614da2c85 100644 --- a/terraform/graph_builder_apply.go +++ b/terraform/graph_builder_apply.go @@ -87,19 +87,8 @@ func (b *ApplyGraphBuilder) Steps() []GraphTransformer { // Attach the state &AttachStateTransformer{State: b.State}, - // add configured providers - &ProviderConfigTransformer{ - Module: b.Module, - Providers: b.Providers, - Concrete: concreteProvider, - }, - - // Create all the providers - &MissingProviderTransformer{Providers: b.Providers, Concrete: concreteProvider}, - &ProviderTransformer{}, - &DisableProviderTransformer{}, - &ParentProviderTransformer{}, - &AttachProviderConfigTransformer{Module: b.Module}, + // add providers + TransformProviders(b.Providers, concreteProvider, b.Module), // Destruction ordering &DestroyEdgeTransformer{Module: b.Module, State: b.State}, diff --git a/terraform/graph_builder_import.go b/terraform/graph_builder_import.go index e064ae629..07a1eaf83 100644 --- a/terraform/graph_builder_import.go +++ b/terraform/graph_builder_import.go @@ -52,19 +52,7 @@ func (b *ImportGraphBuilder) Steps() []GraphTransformer { // Add the import steps &ImportStateTransformer{Targets: b.ImportTargets}, - // add configured providers - &ProviderConfigTransformer{ - Module: b.Module, - Providers: b.Providers, - Concrete: concreteProvider, - }, - - // Provider-related transformations - &MissingProviderTransformer{Providers: b.Providers, Concrete: concreteProvider}, - &ProviderTransformer{}, - &DisableProviderTransformer{}, - &ParentProviderTransformer{}, - &AttachProviderConfigTransformer{Module: mod}, + TransformProviders(b.Providers, concreteProvider, mod), // This validates that the providers only depend on variables &ImportProviderValidateTransformer{}, diff --git a/terraform/graph_builder_plan.go b/terraform/graph_builder_plan.go index 1b93a5ab3..5d625e051 100644 --- a/terraform/graph_builder_plan.go +++ b/terraform/graph_builder_plan.go @@ -93,19 +93,7 @@ func (b *PlanGraphBuilder) Steps() []GraphTransformer { // Add root variables &RootVariableTransformer{Module: b.Module}, - // add configured providers - &ProviderConfigTransformer{ - Module: b.Module, - Providers: b.Providers, - Concrete: b.ConcreteProvider, - }, - - // Create all the providers - &MissingProviderTransformer{Providers: b.Providers, Concrete: b.ConcreteProvider}, - &ProviderTransformer{}, - &DisableProviderTransformer{}, - &ParentProviderTransformer{}, - &AttachProviderConfigTransformer{Module: b.Module}, + TransformProviders(b.Providers, b.ConcreteProvider, b.Module), // Provisioner-related transformations. Only add these if requested. GraphTransformIf( diff --git a/terraform/graph_builder_refresh.go b/terraform/graph_builder_refresh.go index da506170b..9638d4c8f 100644 --- a/terraform/graph_builder_refresh.go +++ b/terraform/graph_builder_refresh.go @@ -126,19 +126,7 @@ func (b *RefreshGraphBuilder) Steps() []GraphTransformer { // Add root variables &RootVariableTransformer{Module: b.Module}, - // add configured providers - &ProviderConfigTransformer{ - Module: b.Module, - Providers: b.Providers, - Concrete: concreteProvider, - }, - - // Create all the providers - &MissingProviderTransformer{Providers: b.Providers, Concrete: concreteProvider}, - &ProviderTransformer{}, - &DisableProviderTransformer{}, - &ParentProviderTransformer{}, - &AttachProviderConfigTransformer{Module: b.Module}, + TransformProviders(b.Providers, concreteProvider, b.Module), // Add the local values &LocalTransformer{Module: b.Module}, diff --git a/terraform/transform_destroy_edge.go b/terraform/transform_destroy_edge.go index d9bd362f2..a06ff292e 100644 --- a/terraform/transform_destroy_edge.go +++ b/terraform/transform_destroy_edge.go @@ -127,12 +127,7 @@ func (t *DestroyEdgeTransformer) Transform(g *Graph) error { &AttachResourceConfigTransformer{Module: t.Module}, &AttachStateTransformer{State: t.State}, - // Add providers since they can affect destroy order as well - &MissingProviderTransformer{AllowAny: true, Concrete: providerFn}, - &ProviderTransformer{}, - &DisableProviderTransformer{}, - &ParentProviderTransformer{}, - &AttachProviderConfigTransformer{Module: t.Module}, + TransformProviders(nil, providerFn, t.Module), // Add all the variables. We can depend on resources through // variables due to module parameters, and we need to properly diff --git a/terraform/transform_provider.go b/terraform/transform_provider.go index 0f34dbcfb..fac7e1514 100644 --- a/terraform/transform_provider.go +++ b/terraform/transform_provider.go @@ -6,9 +6,41 @@ import ( "strings" "github.com/hashicorp/go-multierror" + "github.com/hashicorp/terraform/config/module" "github.com/hashicorp/terraform/dag" ) +func TransformProviders(providers []string, concrete ConcreteProviderNodeFunc, mod *module.Tree) GraphTransformer { + // If we have no providers, let the MissingProviderTransformer add anything required. + // This is used by the destroy edge transformer's internal dependency graph. + allowAny := providers == nil + + return GraphTransformMulti( + // Add providers from the config + &ProviderConfigTransformer{ + Module: mod, + Providers: providers, + Concrete: concrete, + }, + // Add any remaining missing providers + &MissingProviderTransformer{ + AllowAny: allowAny, + Providers: providers, + Concrete: concrete, + }, + // Connect the providers + &ProviderTransformer{}, + // Disable unused providers + &DisableProviderTransformer{}, + // Connect provider to their parent provider nodes + &ParentProviderTransformer{}, + // Attach configuration to each provider instance + &AttachProviderConfigTransformer{ + Module: mod, + }, + ) +} + // GraphNodeProvider is an interface that nodes that can be a provider // must implement. // ProviderName returns the name of the provider this satisfies.