mirror of
https://github.com/hashicorp/terraform.git
synced 2026-02-18 18:29:44 -05:00
159 lines
5.2 KiB
Go
159 lines
5.2 KiB
Go
// Copyright (c) HashiCorp, Inc.
|
|
// SPDX-License-Identifier: BUSL-1.1
|
|
|
|
package arguments
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/hashicorp/terraform/internal/tfdiags"
|
|
)
|
|
|
|
// Init represents the command-line arguments for the init command.
|
|
type Init struct {
|
|
// FromModule identifies the module to copy into the target directory before init.
|
|
FromModule string
|
|
|
|
// Lockfile specifies a dependency lockfile mode.
|
|
Lockfile string
|
|
|
|
// TestDirectory is the directory containing any test files that should be
|
|
// validated alongside the main configuration. Should be relative to the
|
|
// Path.
|
|
TestsDirectory string
|
|
|
|
// ViewType specifies which init format to use: human or JSON.
|
|
ViewType ViewType
|
|
|
|
// Backend specifies whether to disable backend or HCP Terraform initialization.
|
|
Backend bool
|
|
|
|
// Cloud specifies whether to disable backend or HCP Terraform initialization.
|
|
Cloud bool
|
|
|
|
// Get specifies whether to disable downloading modules for this configuration
|
|
Get bool
|
|
|
|
// ForceInitCopy specifies whether to suppress prompts about copying state data.
|
|
ForceInitCopy bool
|
|
|
|
// StateLock specifies whether hold a state lock during backend migration.
|
|
StateLock bool
|
|
|
|
// StateLockTimeout specifies the duration to wait for a state lock.
|
|
StateLockTimeout time.Duration
|
|
|
|
// Reconfigure specifies whether to disregard any existing configuration, preventing migration of any existing state
|
|
Reconfigure bool
|
|
|
|
// MigrateState specifies whether to attempt to copy existing state to the new backend
|
|
MigrateState bool
|
|
|
|
// Upgrade specifies whether to upgrade modules and plugins as part of their respective installation steps
|
|
Upgrade bool
|
|
|
|
// Json specifies whether to output in JSON format
|
|
Json bool
|
|
|
|
// IgnoreRemoteVersion specifies whether to ignore remote and local Terraform versions compatibility
|
|
IgnoreRemoteVersion bool
|
|
|
|
BackendConfig FlagNameValueSlice
|
|
|
|
Vars *Vars
|
|
|
|
// InputEnabled is used to disable interactive input for unspecified
|
|
// variable and backend config values. Default is true.
|
|
InputEnabled bool
|
|
|
|
TargetFlags []string
|
|
|
|
CompactWarnings bool
|
|
|
|
PluginPath FlagStringSlice
|
|
|
|
Args []string
|
|
}
|
|
|
|
// ParseInit processes CLI arguments, returning an Init value and errors.
|
|
// If errors are encountered, an Init value is still returned representing
|
|
// the best effort interpretation of the arguments.
|
|
func ParseInit(args []string) (*Init, tfdiags.Diagnostics) {
|
|
var diags tfdiags.Diagnostics
|
|
init := &Init{
|
|
Vars: &Vars{},
|
|
}
|
|
init.BackendConfig = NewFlagNameValueSlice("-backend-config")
|
|
|
|
cmdFlags := extendedFlagSet("init", nil, nil, init.Vars)
|
|
|
|
cmdFlags.Var((*FlagStringSlice)(&init.TargetFlags), "target", "resource to target")
|
|
cmdFlags.BoolVar(&init.InputEnabled, "input", true, "input")
|
|
cmdFlags.BoolVar(&init.CompactWarnings, "compact-warnings", false, "use compact warnings")
|
|
cmdFlags.BoolVar(&init.Backend, "backend", true, "")
|
|
cmdFlags.BoolVar(&init.Cloud, "cloud", true, "")
|
|
cmdFlags.StringVar(&init.FromModule, "from-module", "", "copy the source of the given module into the directory before init")
|
|
cmdFlags.BoolVar(&init.Get, "get", true, "")
|
|
cmdFlags.BoolVar(&init.ForceInitCopy, "force-copy", false, "suppress prompts about copying state data")
|
|
cmdFlags.BoolVar(&init.StateLock, "lock", true, "lock state")
|
|
cmdFlags.DurationVar(&init.StateLockTimeout, "lock-timeout", 0, "lock timeout")
|
|
cmdFlags.BoolVar(&init.Reconfigure, "reconfigure", false, "reconfigure")
|
|
cmdFlags.BoolVar(&init.MigrateState, "migrate-state", false, "migrate state")
|
|
cmdFlags.BoolVar(&init.Upgrade, "upgrade", false, "")
|
|
cmdFlags.StringVar(&init.Lockfile, "lockfile", "", "Set a dependency lockfile mode")
|
|
cmdFlags.BoolVar(&init.IgnoreRemoteVersion, "ignore-remote-version", false, "continue even if remote and local Terraform versions are incompatible")
|
|
cmdFlags.StringVar(&init.TestsDirectory, "test-directory", "tests", "test-directory")
|
|
cmdFlags.BoolVar(&init.Json, "json", false, "json")
|
|
cmdFlags.Var(&init.BackendConfig, "backend-config", "")
|
|
cmdFlags.Var(&init.PluginPath, "plugin-dir", "plugin directory")
|
|
|
|
if err := cmdFlags.Parse(args); err != nil {
|
|
diags = diags.Append(tfdiags.Sourceless(
|
|
tfdiags.Error,
|
|
"Failed to parse command-line flags",
|
|
err.Error(),
|
|
))
|
|
}
|
|
|
|
if init.MigrateState && init.Json {
|
|
diags = diags.Append(tfdiags.Sourceless(
|
|
tfdiags.Error,
|
|
"The -migrate-state and -json options are mutually-exclusive",
|
|
"Terraform cannot ask for interactive approval when -json is set. To use the -migrate-state option, disable the -json option.",
|
|
))
|
|
}
|
|
|
|
if init.MigrateState && init.Reconfigure {
|
|
diags = diags.Append(tfdiags.Sourceless(
|
|
tfdiags.Error,
|
|
"Invalid init options",
|
|
"The -migrate-state and -reconfigure options are mutually-exclusive.",
|
|
))
|
|
}
|
|
|
|
init.Args = cmdFlags.Args()
|
|
|
|
backendFlagSet := FlagIsSet(cmdFlags, "backend")
|
|
cloudFlagSet := FlagIsSet(cmdFlags, "cloud")
|
|
|
|
if backendFlagSet && cloudFlagSet {
|
|
diags = diags.Append(tfdiags.Sourceless(
|
|
tfdiags.Error,
|
|
"Invalid init options",
|
|
"The -backend and -cloud options are aliases of one another and mutually-exclusive in their use",
|
|
))
|
|
} else if backendFlagSet {
|
|
init.Cloud = init.Backend
|
|
} else if cloudFlagSet {
|
|
init.Backend = init.Cloud
|
|
}
|
|
|
|
switch {
|
|
case init.Json:
|
|
init.ViewType = ViewJSON
|
|
default:
|
|
init.ViewType = ViewHuman
|
|
}
|
|
|
|
return init, diags
|
|
}
|