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 }