mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 01:41:48 -06:00
0b00bbde4e
This is necessary so that the shadow version can actually keep track of what provider is used for what. Before, providers for different alises were just initialized but the factory had no idea. Arguably this is fine but when trying to build a shadow graph this presents challenges. With these changes, we now pass an opaque "uid" through that is used to keep track of the providers and what real maps to what shadow.
69 lines
1.8 KiB
Go
69 lines
1.8 KiB
Go
package terraform
|
|
|
|
import (
|
|
"github.com/hashicorp/terraform/config/module"
|
|
)
|
|
|
|
// ImportOpts are used as the configuration for Import.
|
|
type ImportOpts struct {
|
|
// Targets are the targets to import
|
|
Targets []*ImportTarget
|
|
|
|
// Module is optional, and specifies a config module that is loaded
|
|
// into the graph and evaluated. The use case for this is to provide
|
|
// provider configuration.
|
|
Module *module.Tree
|
|
}
|
|
|
|
// ImportTarget is a single resource to import.
|
|
type ImportTarget struct {
|
|
// Addr is the full resource address of the resource to import.
|
|
// Example: "module.foo.aws_instance.bar"
|
|
Addr string
|
|
|
|
// ID is the ID of the resource to import. This is resource-specific.
|
|
ID string
|
|
}
|
|
|
|
// Import takes already-created external resources and brings them
|
|
// under Terraform management. Import requires the exact type, name, and ID
|
|
// of the resources to import.
|
|
//
|
|
// This operation is idempotent. If the requested resource is already
|
|
// imported, no changes are made to the state.
|
|
//
|
|
// Further, this operation also gracefully handles partial state. If during
|
|
// an import there is a failure, all previously imported resources remain
|
|
// imported.
|
|
func (c *Context) Import(opts *ImportOpts) (*State, error) {
|
|
// Hold a lock since we can modify our own state here
|
|
v := c.acquireRun()
|
|
defer c.releaseRun(v)
|
|
|
|
// Copy our own state
|
|
c.state = c.state.DeepCopy()
|
|
|
|
// Initialize our graph builder
|
|
builder := &ImportGraphBuilder{
|
|
ImportTargets: opts.Targets,
|
|
Module: opts.Module,
|
|
Providers: c.components.ResourceProviders(),
|
|
}
|
|
|
|
// Build the graph!
|
|
graph, err := builder.Build(RootModulePath)
|
|
if err != nil {
|
|
return c.state, err
|
|
}
|
|
|
|
// Walk it
|
|
if _, err := c.walk(graph, nil, walkImport); err != nil {
|
|
return c.state, err
|
|
}
|
|
|
|
// Clean the state
|
|
c.state.prune()
|
|
|
|
return c.state, nil
|
|
}
|