-
Notifications
You must be signed in to change notification settings - Fork 9.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #34886 from hashicorp/tf-init-json
terraform init -json
- Loading branch information
Showing
31 changed files
with
1,785 additions
and
548 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,159 @@ | ||
// 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 Terraform Cloud initialization. | ||
Backend bool | ||
|
||
// Cloud specifies whether to disable backend or Terraform Cloud 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 | ||
} |
Oops, something went wrong.