github.com/r3labs/terraform@v0.8.4/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 // Provider string 28 Provider string 29 } 30 31 // Import takes already-created external resources and brings them 32 // under Terraform management. Import requires the exact type, name, and ID 33 // of the resources to import. 34 // 35 // This operation is idempotent. If the requested resource is already 36 // imported, no changes are made to the state. 37 // 38 // Further, this operation also gracefully handles partial state. If during 39 // an import there is a failure, all previously imported resources remain 40 // imported. 41 func (c *Context) Import(opts *ImportOpts) (*State, error) { 42 // Hold a lock since we can modify our own state here 43 v := c.acquireRun("import") 44 defer c.releaseRun(v) 45 46 // Copy our own state 47 c.state = c.state.DeepCopy() 48 49 // If no module is given, default to the module configured with 50 // the Context. 51 module := opts.Module 52 if module == nil { 53 module = c.module 54 } 55 56 // Initialize our graph builder 57 builder := &ImportGraphBuilder{ 58 ImportTargets: opts.Targets, 59 Module: module, 60 Providers: c.components.ResourceProviders(), 61 } 62 63 // Build the graph! 64 graph, err := builder.Build(RootModulePath) 65 if err != nil { 66 return c.state, err 67 } 68 69 // Walk it 70 if _, err := c.walk(graph, nil, walkImport); err != nil { 71 return c.state, err 72 } 73 74 // Clean the state 75 c.state.prune() 76 77 return c.state, nil 78 }