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, nil, walkImport); err != nil {
|
|
return c.state, err
|
|
}
|
|
|
|
// Clean the state
|
|
c.state.prune()
|
|
|
|
return c.state, nil
|
|
}
|