opentofu/terraform/context_import.go
Mitchell Hashimoto f8c7b639c9
terraform: switch to Context for stop, Stoppable provisioners
This switches to the Go "context" package for cancellation and threads
the context through all the way to evaluation to allow behavior based on
stopping deep within graph execution.

This also adds the Stop API to provisioners so they can quickly exit
when stop is called.
2017-01-26 15:03:27 -08:00

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
}