mirror of
https://github.com/opentofu/opentofu.git
synced 2025-02-25 18:45:20 -06:00
During import we constrain provider configuration to allow only references to variables, but since provider configurations in child modules might refer to variables from the parent, we still need to include the module variables, outputs and locals in the graph here and attach the provider schemas. In future a better check would be that the provider configuration doesn't refer to anything that is currently unknown, but we'll save that for another day.
94 lines
2.7 KiB
Go
94 lines
2.7 KiB
Go
package terraform
|
|
|
|
import (
|
|
"github.com/hashicorp/terraform/addrs"
|
|
"github.com/hashicorp/terraform/configs"
|
|
"github.com/hashicorp/terraform/dag"
|
|
"github.com/hashicorp/terraform/tfdiags"
|
|
)
|
|
|
|
// ImportGraphBuilder implements GraphBuilder and is responsible for building
|
|
// a graph for importing resources into Terraform. This is a much, much
|
|
// simpler graph than a normal configuration graph.
|
|
type ImportGraphBuilder struct {
|
|
// ImportTargets are the list of resources to import.
|
|
ImportTargets []*ImportTarget
|
|
|
|
// Module is a configuration to build the graph from. See ImportOpts.Config.
|
|
Config *configs.Config
|
|
|
|
// Components is the factory for our available plugin components.
|
|
Components contextComponentFactory
|
|
}
|
|
|
|
// Build builds the graph according to the steps returned by Steps.
|
|
func (b *ImportGraphBuilder) Build(path addrs.ModuleInstance) (*Graph, tfdiags.Diagnostics) {
|
|
return (&BasicGraphBuilder{
|
|
Steps: b.Steps(),
|
|
Validate: true,
|
|
Name: "ImportGraphBuilder",
|
|
}).Build(path)
|
|
}
|
|
|
|
// Steps returns the ordered list of GraphTransformers that must be executed
|
|
// to build a complete graph.
|
|
func (b *ImportGraphBuilder) Steps() []GraphTransformer {
|
|
// Get the module. If we don't have one, we just use an empty tree
|
|
// so that the transform still works but does nothing.
|
|
config := b.Config
|
|
if config == nil {
|
|
config = configs.NewEmptyConfig()
|
|
}
|
|
|
|
// Custom factory for creating providers.
|
|
concreteProvider := func(a *NodeAbstractProvider) dag.Vertex {
|
|
return &NodeApplyableProvider{
|
|
NodeAbstractProvider: a,
|
|
}
|
|
}
|
|
|
|
steps := []GraphTransformer{
|
|
// Create all our resources from the configuration and state
|
|
&ConfigTransformer{Config: config},
|
|
|
|
// Add the import steps
|
|
&ImportStateTransformer{Targets: b.ImportTargets},
|
|
|
|
// Add root variables
|
|
&RootVariableTransformer{Config: b.Config},
|
|
|
|
// Must be before TransformProviders and ReferenceTransformer, since
|
|
// schema is required to extract references from config.
|
|
&AttachSchemaTransformer{Components: b.Components},
|
|
|
|
TransformProviders(b.Components.ResourceProviders(), concreteProvider, config),
|
|
|
|
// This validates that the providers only depend on variables
|
|
&ImportProviderValidateTransformer{},
|
|
|
|
// Add the local values
|
|
&LocalTransformer{Config: b.Config},
|
|
|
|
// Add the outputs
|
|
&OutputTransformer{Config: b.Config},
|
|
|
|
// Add module variables
|
|
&ModuleVariableTransformer{Config: b.Config},
|
|
|
|
// Connect so that the references are ready for targeting. We'll
|
|
// have to connect again later for providers and so on.
|
|
&ReferenceTransformer{},
|
|
|
|
// Close opened plugin connections
|
|
&CloseProviderTransformer{},
|
|
|
|
// Single root
|
|
&RootTransformer{},
|
|
|
|
// Optimize
|
|
&TransitiveReductionTransformer{},
|
|
}
|
|
|
|
return steps
|
|
}
|