github.com/rhenning/terraform@v0.8.0-beta2/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 // If no module is given, default to the module configured with 47 // the Context. 48 module := opts.Module 49 if module == nil { 50 module = c.module 51 } 52 53 // Initialize our graph builder 54 builder := &ImportGraphBuilder{ 55 ImportTargets: opts.Targets, 56 Module: module, 57 Providers: c.components.ResourceProviders(), 58 } 59 60 // Build the graph! 61 graph, err := builder.Build(RootModulePath) 62 if err != nil { 63 return c.state, err 64 } 65 66 // Walk it 67 if _, err := c.walk(graph, nil, walkImport); err != nil { 68 return c.state, err 69 } 70 71 // Clean the state 72 c.state.prune() 73 74 return c.state, nil 75 }