79 lines
1.7 KiB
Go
79 lines
1.7 KiB
Go
package tfexec
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"os/exec"
|
|
"strconv"
|
|
)
|
|
|
|
type taintConfig struct {
|
|
state string
|
|
allowMissing bool
|
|
lock bool
|
|
lockTimeout string
|
|
}
|
|
|
|
var defaultTaintOptions = taintConfig{
|
|
allowMissing: false,
|
|
lock: true,
|
|
}
|
|
|
|
// TaintOption represents options used in the Taint method.
|
|
type TaintOption interface {
|
|
configureTaint(*taintConfig)
|
|
}
|
|
|
|
func (opt *StateOption) configureTaint(conf *taintConfig) {
|
|
conf.state = opt.path
|
|
}
|
|
|
|
func (opt *AllowMissingOption) configureTaint(conf *taintConfig) {
|
|
conf.allowMissing = opt.allowMissing
|
|
}
|
|
|
|
func (opt *LockOption) configureTaint(conf *taintConfig) {
|
|
conf.lock = opt.lock
|
|
}
|
|
|
|
func (opt *LockTimeoutOption) configureTaint(conf *taintConfig) {
|
|
conf.lockTimeout = opt.timeout
|
|
}
|
|
|
|
// Taint represents the terraform taint subcommand.
|
|
func (tf *Terraform) Taint(ctx context.Context, address string, opts ...TaintOption) error {
|
|
err := tf.compatible(ctx, tf0_4_1, nil)
|
|
if err != nil {
|
|
return fmt.Errorf("taint was first introduced in Terraform 0.4.1: %w", err)
|
|
}
|
|
taintCmd := tf.taintCmd(ctx, address, opts...)
|
|
return tf.runTerraformCmd(ctx, taintCmd)
|
|
}
|
|
|
|
func (tf *Terraform) taintCmd(ctx context.Context, address string, opts ...TaintOption) *exec.Cmd {
|
|
c := defaultTaintOptions
|
|
|
|
for _, o := range opts {
|
|
o.configureTaint(&c)
|
|
}
|
|
|
|
args := []string{"taint", "-no-color"}
|
|
|
|
if c.lockTimeout != "" {
|
|
args = append(args, "-lock-timeout="+c.lockTimeout)
|
|
}
|
|
|
|
// string opts: only pass if set
|
|
if c.state != "" {
|
|
args = append(args, "-state="+c.state)
|
|
}
|
|
|
|
args = append(args, "-lock="+strconv.FormatBool(c.lock))
|
|
if c.allowMissing {
|
|
args = append(args, "-allow-missing")
|
|
}
|
|
args = append(args, address)
|
|
|
|
return tf.buildTerraformCmd(ctx, nil, args...)
|
|
}
|