| // Copyright IBM Corp. 2020, 2026 | |
| // SPDX-License-Identifier: MPL-2.0 | |
| package tfexec | |
| import ( | |
| "context" | |
| "fmt" | |
| "os/exec" | |
| ) | |
| type providersLockConfig struct { | |
| fsMirror string | |
| netMirror string | |
| platforms []string | |
| providers []string | |
| } | |
| var defaultProvidersLockOptions = providersLockConfig{} | |
| type ProvidersLockOption interface { | |
| configureProvidersLock(*providersLockConfig) | |
| } | |
| func (opt *FSMirrorOption) configureProvidersLock(conf *providersLockConfig) { | |
| conf.fsMirror = opt.fsMirror | |
| } | |
| func (opt *NetMirrorOption) configureProvidersLock(conf *providersLockConfig) { | |
| conf.netMirror = opt.netMirror | |
| } | |
| func (opt *PlatformOption) configureProvidersLock(conf *providersLockConfig) { | |
| conf.platforms = append(conf.platforms, opt.platform) | |
| } | |
| func (opt *ProviderOption) configureProvidersLock(conf *providersLockConfig) { | |
| conf.providers = append(conf.providers, opt.provider) | |
| } | |
| // ProvidersLock represents the `terraform providers lock` command | |
| func (tf *Terraform) ProvidersLock(ctx context.Context, opts ...ProvidersLockOption) error { | |
| err := tf.compatible(ctx, tf0_14_0, nil) | |
| if err != nil { | |
| return fmt.Errorf("terraform providers lock was added in 0.14.0: %w", err) | |
| } | |
| lockCmd := tf.providersLockCmd(ctx, opts...) | |
| err = tf.runTerraformCmd(ctx, lockCmd) | |
| if err != nil { | |
| return err | |
| } | |
| return err | |
| } | |
| func (tf *Terraform) providersLockCmd(ctx context.Context, opts ...ProvidersLockOption) *exec.Cmd { | |
| c := defaultProvidersLockOptions | |
| for _, o := range opts { | |
| o.configureProvidersLock(&c) | |
| } | |
| args := []string{"providers", "lock"} | |
| // string options, only pass if set | |
| if c.fsMirror != "" { | |
| args = append(args, "-fs-mirror="+c.fsMirror) | |
| } | |
| if c.netMirror != "" { | |
| args = append(args, "-net-mirror="+c.netMirror) | |
| } | |
| for _, p := range c.platforms { | |
| args = append(args, "-platform="+p) | |
| } | |
| // positional providers argument | |
| for _, p := range c.providers { | |
| args = append(args, p) | |
| } | |
| return tf.buildTerraformCmd(ctx, nil, args...) | |
| } |