| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package tfexec |
| |
| import ( |
| "context" |
| "os/exec" |
| "strconv" |
| ) |
| |
| type importConfig struct { |
| addr string |
| id string |
| backup string |
| config string |
| allowMissingConfig bool |
| lock bool |
| lockTimeout string |
| reattachInfo ReattachInfo |
| state string |
| stateOut string |
| vars []string |
| varFiles []string |
| } |
| |
| var defaultImportOptions = importConfig{ |
| allowMissingConfig: false, |
| lock: true, |
| lockTimeout: "0s", |
| } |
| |
| // ImportOption represents options used in the Import method. |
| type ImportOption interface { |
| configureImport(*importConfig) |
| } |
| |
| func (opt *BackupOption) configureImport(conf *importConfig) { |
| conf.backup = opt.path |
| } |
| |
| func (opt *ConfigOption) configureImport(conf *importConfig) { |
| conf.config = opt.path |
| } |
| |
| func (opt *AllowMissingConfigOption) configureImport(conf *importConfig) { |
| conf.allowMissingConfig = opt.allowMissingConfig |
| } |
| |
| func (opt *LockOption) configureImport(conf *importConfig) { |
| conf.lock = opt.lock |
| } |
| |
| func (opt *LockTimeoutOption) configureImport(conf *importConfig) { |
| conf.lockTimeout = opt.timeout |
| } |
| |
| func (opt *ReattachOption) configureImport(conf *importConfig) { |
| conf.reattachInfo = opt.info |
| } |
| |
| func (opt *StateOption) configureImport(conf *importConfig) { |
| conf.state = opt.path |
| } |
| |
| func (opt *StateOutOption) configureImport(conf *importConfig) { |
| conf.stateOut = opt.path |
| } |
| |
| func (opt *VarOption) configureImport(conf *importConfig) { |
| conf.vars = append(conf.vars, opt.assignment) |
| } |
| |
| func (opt *VarFileOption) configureImport(conf *importConfig) { |
| conf.varFiles = append(conf.varFiles, opt.path) |
| } |
| |
| // Import represents the terraform import subcommand. |
| func (tf *Terraform) Import(ctx context.Context, address, id string, opts ...ImportOption) error { |
| cmd, err := tf.importCmd(ctx, address, id, opts...) |
| if err != nil { |
| return err |
| } |
| return tf.runTerraformCmd(ctx, cmd) |
| } |
| |
| func (tf *Terraform) importCmd(ctx context.Context, address, id string, opts ...ImportOption) (*exec.Cmd, error) { |
| c := defaultImportOptions |
| |
| for _, o := range opts { |
| o.configureImport(&c) |
| } |
| |
| args := []string{"import", "-no-color", "-input=false"} |
| |
| // string opts: only pass if set |
| if c.backup != "" { |
| args = append(args, "-backup="+c.backup) |
| } |
| if c.config != "" { |
| args = append(args, "-config="+c.config) |
| } |
| if c.lockTimeout != "" { |
| args = append(args, "-lock-timeout="+c.lockTimeout) |
| } |
| if c.state != "" { |
| args = append(args, "-state="+c.state) |
| } |
| if c.stateOut != "" { |
| args = append(args, "-state-out="+c.stateOut) |
| } |
| for _, vf := range c.varFiles { |
| args = append(args, "-var-file="+vf) |
| } |
| |
| // boolean and numerical opts: always pass |
| args = append(args, "-lock="+strconv.FormatBool(c.lock)) |
| |
| // unary flags: pass if true |
| if c.allowMissingConfig { |
| args = append(args, "-allow-missing-config") |
| } |
| |
| // string slice opts: split into separate args |
| if c.vars != nil { |
| for _, v := range c.vars { |
| args = append(args, "-var", v) |
| } |
| } |
| |
| // required args, always pass |
| args = append(args, address, id) |
| |
| mergeEnv := map[string]string{} |
| if c.reattachInfo != nil { |
| reattachStr, err := c.reattachInfo.marshalString() |
| if err != nil { |
| return nil, err |
| } |
| mergeEnv[reattachEnvVar] = reattachStr |
| } |
| |
| return tf.buildTerraformCmd(ctx, mergeEnv, args...), nil |
| } |