github.com/ns1/terraform@v0.7.10-0.20161109153551-8949419bef40/terraform/context_import.go (about)

     1  package terraform
     2  
     3  import (
     4  	"github.com/hashicorp/terraform/config/module"
     5  )
     6  
     7  // ImportOpts are used as the configuration for Import.
     8  type ImportOpts struct {
     9  	// Targets are the targets to import
    10  	Targets []*ImportTarget
    11  
    12  	// Module is optional, and specifies a config module that is loaded
    13  	// into the graph and evaluated. The use case for this is to provide
    14  	// provider configuration.
    15  	Module *module.Tree
    16  }
    17  
    18  // ImportTarget is a single resource to import.
    19  type ImportTarget struct {
    20  	// Addr is the full resource address of the resource to import.
    21  	// Example: "module.foo.aws_instance.bar"
    22  	Addr string
    23  
    24  	// ID is the ID of the resource to import. This is resource-specific.
    25  	ID string
    26  }
    27  
    28  // Import takes already-created external resources and brings them
    29  // under Terraform management. Import requires the exact type, name, and ID
    30  // of the resources to import.
    31  //
    32  // This operation is idempotent. If the requested resource is already
    33  // imported, no changes are made to the state.
    34  //
    35  // Further, this operation also gracefully handles partial state. If during
    36  // an import there is a failure, all previously imported resources remain
    37  // imported.
    38  func (c *Context) Import(opts *ImportOpts) (*State, error) {
    39  	// Hold a lock since we can modify our own state here
    40  	v := c.acquireRun("import")
    41  	defer c.releaseRun(v)
    42  
    43  	// Copy our own state
    44  	c.state = c.state.DeepCopy()
    45  
    46  	// Initialize our graph builder
    47  	builder := &ImportGraphBuilder{
    48  		ImportTargets: opts.Targets,
    49  		Module:        opts.Module,
    50  		Providers:     c.components.ResourceProviders(),
    51  	}
    52  
    53  	// Build the graph!
    54  	graph, err := builder.Build(RootModulePath)
    55  	if err != nil {
    56  		return c.state, err
    57  	}
    58  
    59  	// Walk it
    60  	if _, err := c.walk(graph, nil, walkImport); err != nil {
    61  		return c.state, err
    62  	}
    63  
    64  	// Clean the state
    65  	c.state.prune()
    66  
    67  	return c.state, nil
    68  }