mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-30 10:47:14 -06:00
1da54955c6
The shadow graph was incredibly useful during the 0.7 cycle but these days it is idle, since we're not planning any significant graph-related changes for the forseeable future. The shadow graph infrastructure is somewhat burdensome since any change to the ResourceProvider interface must have shims written. Since we _are_ expecting changes to the ResourceProvider interface in the next few releases, I'm calling "YAGNI" on the shadow graph support to reduce our maintenence burden. If we do end up wanting to use shadow graph again in future, we'll always be able to pull it out of version control and then make whatever changes we skipped making in the mean time, but we can avoid that cost in the mean time while we don't have any evidence that we'll need to pay it.
78 lines
1.9 KiB
Go
78 lines
1.9 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
|
|
|
|
// Provider string
|
|
Provider 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
|
|
defer c.acquireRun("import")()
|
|
|
|
// Copy our own state
|
|
c.state = c.state.DeepCopy()
|
|
|
|
// If no module is given, default to the module configured with
|
|
// the Context.
|
|
module := opts.Module
|
|
if module == nil {
|
|
module = c.module
|
|
}
|
|
|
|
// Initialize our graph builder
|
|
builder := &ImportGraphBuilder{
|
|
ImportTargets: opts.Targets,
|
|
Module: 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, walkImport); err != nil {
|
|
return c.state, err
|
|
}
|
|
|
|
// Clean the state
|
|
c.state.prune()
|
|
|
|
return c.state, nil
|
|
}
|