terraform/terraform/context_import.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
}