package tfexec import ( "context" "fmt" "os/exec" ) type upgrade013Config struct { dir string reattachInfo ReattachInfo } var defaultUpgrade013Options = upgrade013Config{} // Upgrade013Option represents options used in the Destroy method. type Upgrade013Option interface { configureUpgrade013(*upgrade013Config) } func (opt *DirOption) configureUpgrade013(conf *upgrade013Config) { conf.dir = opt.path } func (opt *ReattachOption) configureUpgrade013(conf *upgrade013Config) { conf.reattachInfo = opt.info } // Upgrade013 represents the terraform 0.13upgrade subcommand. func (tf *Terraform) Upgrade013(ctx context.Context, opts ...Upgrade013Option) error { cmd, err := tf.upgrade013Cmd(ctx, opts...) if err != nil { return err } return tf.runTerraformCmd(ctx, cmd) } func (tf *Terraform) upgrade013Cmd(ctx context.Context, opts ...Upgrade013Option) (*exec.Cmd, error) { err := tf.compatible(ctx, tf0_13_0, tf0_14_0) if err != nil { return nil, fmt.Errorf("terraform 0.13upgrade is only supported in 0.13 releases: %w", err) } c := defaultUpgrade013Options for _, o := range opts { o.configureUpgrade013(&c) } args := []string{"0.13upgrade", "-no-color", "-yes"} // optional positional argument if c.dir != "" { args = append(args, c.dir) } 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 }