| // Copyright (c) HashiCorp, Inc. | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package tfexec | |
| import ( | |
| "context" | |
| "fmt" | |
| "os/exec" | |
| ) | |
| type upgrade012Config struct { | |
| dir string | |
| force bool | |
| reattachInfo ReattachInfo | |
| } | |
| var defaultUpgrade012Options = upgrade012Config{ | |
| force: false, | |
| } | |
| // Upgrade012Option represents options used in the Destroy method. | |
| type Upgrade012Option interface { | |
| configureUpgrade012(*upgrade012Config) | |
| } | |
| func (opt *DirOption) configureUpgrade012(conf *upgrade012Config) { | |
| conf.dir = opt.path | |
| } | |
| func (opt *ForceOption) configureUpgrade012(conf *upgrade012Config) { | |
| conf.force = opt.force | |
| } | |
| func (opt *ReattachOption) configureUpgrade012(conf *upgrade012Config) { | |
| conf.reattachInfo = opt.info | |
| } | |
| // Upgrade012 represents the terraform 0.12upgrade subcommand. | |
| func (tf *Terraform) Upgrade012(ctx context.Context, opts ...Upgrade012Option) error { | |
| cmd, err := tf.upgrade012Cmd(ctx, opts...) | |
| if err != nil { | |
| return err | |
| } | |
| return tf.runTerraformCmd(ctx, cmd) | |
| } | |
| func (tf *Terraform) upgrade012Cmd(ctx context.Context, opts ...Upgrade012Option) (*exec.Cmd, error) { | |
| err := tf.compatible(ctx, tf0_12_0, tf0_13_0) | |
| if err != nil { | |
| return nil, fmt.Errorf("terraform 0.12upgrade is only supported in 0.12 releases: %w", err) | |
| } | |
| c := defaultUpgrade012Options | |
| for _, o := range opts { | |
| o.configureUpgrade012(&c) | |
| } | |
| args := []string{"0.12upgrade", "-no-color", "-yes"} | |
| // boolean opts: only pass if set | |
| if c.force { | |
| args = append(args, "-force") | |
| } | |
| // 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 | |
| } |