mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
54661ec1df
* command/import: properly use `-provider` supplied on the command line The import command now attaches the provider configuration in the resource instance, if set. That config is attached to the NodeAbstractResource during the import graph building. This prevents errors when the implied provider is not actually in the configuration at all, which may happen when a configuration is using the `-beta` version of a provider (and only that `-beta` version). * command/import: fix variable reassignment and update docs Fixes #22564
101 lines
2.9 KiB
Go
101 lines
2.9 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
|
|
|
|
// Schemas is the repository of schemas we will draw from to analyse
|
|
// the configuration.
|
|
Schemas *Schemas
|
|
}
|
|
|
|
// 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},
|
|
|
|
// Attach the configuration to any resources
|
|
&AttachResourceConfigTransformer{Config: b.Config},
|
|
|
|
// Add the import steps
|
|
&ImportStateTransformer{Targets: b.ImportTargets},
|
|
|
|
// Add root variables
|
|
&RootVariableTransformer{Config: b.Config},
|
|
|
|
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},
|
|
|
|
// Must attach schemas before ReferenceTransformer so that we can
|
|
// analyze the configuration to find references.
|
|
&AttachSchemaTransformer{Schemas: b.Schemas},
|
|
|
|
// 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
|
|
}
|