opentofu/command
Alisdair McDiarmid c5c1f31db3 backend: Validate remote backend Terraform version
When using the enhanced remote backend, a subset of all Terraform
operations are supported. Of these, only plan and apply can be executed
on the remote infrastructure (e.g. Terraform Cloud). Other operations
run locally and use the remote backend for state storage.

This causes problems when the local version of Terraform does not match
the configured version from the remote workspace. If the two versions
are incompatible, an `import` or `state mv` operation can cause the
remote workspace to be unusable until a manual fix is applied.

To prevent this from happening accidentally, this commit introduces a
check that the local Terraform version and the configured remote
workspace Terraform version are compatible. This check is skipped for
commands which do not write state, and can also be disabled by the use
of a new command-line flag, `-ignore-remote-version`.

Terraform version compatibility is defined as:

- For all releases before 0.14.0, local must exactly equal remote, as
  two different versions cannot share state;
- 0.14.0 to 1.0.x are compatible, as we will not change the state
  version number until at least Terraform 1.1.0;
- Versions after 1.1.0 must have the same major and minor versions, as
  we will not change the state version number in a patch release.

If the two versions are incompatible, a diagnostic is displayed,
advising that the error can be suppressed with `-ignore-remote-version`.
When this flag is used, the diagnostic is still displayed, but as a
warning instead of an error.

Commands which will not write state can assert this fact by calling the
helper `meta.ignoreRemoteBackendVersionConflict`, which will disable the
checks. Those which can write state should instead call the helper
`meta.remoteBackendVersionCheck`, which will return diagnostics for
display.

In addition to these explicit paths for managing the version check, we
have an implicit check in the remote backend's state manager
initialization method. Both of the above helpers will disable this
check. This fallback is in place to ensure that future code paths which
access state cannot accidentally skip the remote version check.
2020-11-19 13:19:40 -05:00
..
cliconfig command/cliconfig: Allow development overrides for providers 2020-10-16 14:31:15 -07:00
clistate command/clistate: Return an error on unlock failure (#25729) 2020-09-03 16:05:16 -04:00
e2etest Merge pull request #26665 from hashicorp/jbardin/logging 2020-10-22 10:34:51 -04:00
format command/format: Include unknown values in diagnostics 2020-10-29 09:07:48 -07:00
jsonconfig Ensure depends_on is in module calls for config 2020-08-20 07:49:03 +10:00
jsonplan command/jsonconfig: Use correct provider address to access schema 2020-04-06 09:24:23 -07:00
jsonprovider remove LegacyProvider (#26433) 2020-10-05 08:33:49 -04:00
jsonstate Unmark values before showing in JSON 2020-10-28 15:30:04 -04:00
testdata command: Fix fmt to preserve blank block labels 2020-11-18 11:59:10 -05:00
webbrowser command/login: Fix browser launcher for WSL users 2020-02-13 15:02:40 -05:00
012_config_upgrade_test.go command/0.13upgrade: Remove this subcommand 2020-09-29 10:00:35 -07:00
012_config_upgrade.go command/0.13upgrade: Remove this subcommand 2020-09-29 10:00:35 -07:00
013_config_upgrade_test.go command/0.13upgrade: Remove this subcommand 2020-09-29 10:00:35 -07:00
013_config_upgrade.go command/0.13upgrade: Remove this subcommand 2020-09-29 10:00:35 -07:00
apply_destroy_test.go command: apply and most of import tests passing 2020-04-06 09:24:23 -07:00
apply_test.go Use prepared config in provider.Configure 2020-11-04 12:53:00 -05:00
apply.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
autocomplete_test.go command: use newer version of "complete" library 2017-12-05 10:24:04 -08:00
autocomplete.go terraform: Ugly huge change to weave in new State and Plan types 2018-10-16 19:11:09 -07:00
cli_ui_test.go command/*: colors on error messages (red) 2014-07-12 20:59:16 -07:00
cli_ui.go adding new AskSecret to ColorizeUi 2015-04-29 13:07:13 -05:00
command_test.go use a single log writer 2020-10-19 14:29:54 -04:00
command.go Implement the Enterprise enhanced remote backend 2018-08-03 22:22:55 +02:00
console_interactive_solaris.go command: split out and tag code so compilation works on Solaris 2016-11-14 00:32:01 -08:00
console_interactive.go command: update "terraform console" for HCL2 2018-10-16 18:46:46 -07:00
console_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
console.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
flag_kv_test.go command: use helper/variables for flags and parsing 2016-12-10 14:30:40 -05:00
flag_kv.go vendor: switch to HCL 2.0 in the HCL repository 2019-10-02 15:10:21 -07:00
fmt_test.go command: remove unused method on pluginSHA256LockFile (#26402) 2020-09-29 08:46:51 -04:00
fmt.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
get_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
get.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
graph_test.go remove LegacyProvider (#26433) 2020-10-05 08:33:49 -04:00
graph.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
hook_module_install.go Move module install functionality over to internal/initwd 2019-01-14 11:33:21 -08:00
hook_ui_test.go Merge pull request #18823 from minamijoyo/fix-multibyte-trucate 2019-08-06 14:24:24 -04:00
hook_ui.go command: Remove stubbed-out apply diff output code 2020-07-22 14:19:00 -04:00
import_test.go Merge pull request #26519 from hashicorp/jbardin/FIXME 2020-10-08 14:54:40 -04:00
import.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
init_test.go states: Disable Terraform version check 2020-10-28 16:52:35 -04:00
init.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
internal_plugin_list.go provisioner: new Puppet provisioner (#18851) 2019-06-10 15:31:21 -04:00
internal_plugin_test.go command: Make the tests compile again 2020-04-06 09:24:23 -07:00
internal_plugin.go command/internal-plugin: Strip off TF_CLI_ARGS arguments 2019-12-05 15:00:51 -08:00
login_test.go Add command/login test for scopes 2020-09-15 19:30:48 -04:00
login.go Add scopes support to password grant type 2020-09-15 19:32:41 -04:00
logout_test.go command/logout: Add terraform logout command 2020-02-06 15:00:55 -05:00
logout.go command: Simplify Meta.process helper method 2020-04-01 15:01:08 -04:00
meta_backend_migrate.go command: Always validate workspace name 2020-08-11 12:33:12 -04:00
meta_backend_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
meta_backend.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
meta_config.go remove unused code (#26503) 2020-10-07 11:00:06 -04:00
meta_dependencies.go command/init: Read, respect, and update provider dependency locks 2020-10-09 09:26:23 -07:00
meta_new.go prune dead code from command/meta 2019-07-18 16:11:41 -04:00
meta_providers.go separate core and provider loggers 2020-10-23 12:46:32 -04:00
meta_test.go Merge pull request #25847 from zachwhaley/fix-tf-cli-args-no-color 2020-08-24 10:13:59 -04:00
meta_vars.go vendor: switch to HCL 2.0 in the HCL repository 2019-10-02 15:10:21 -07:00
meta.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
output_test.go repl: Improved value renderer for console outputs 2020-09-14 09:47:12 -04:00
output.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
plan_test.go interrupted execution now exits with an error 2020-10-28 14:40:30 -04:00
plan.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
plugins_lock_test.go command: remove unused method on pluginSHA256LockFile (#26402) 2020-09-29 08:46:51 -04:00
plugins_lock.go command: remove unused method on pluginSHA256LockFile (#26402) 2020-09-29 08:46:51 -04:00
plugins_test.go command: Make the tests compile again 2020-04-06 09:24:23 -07:00
plugins.go separate core and provider loggers 2020-10-23 12:46:32 -04:00
providers_lock.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
providers_mirror.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
providers_schema_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
providers_schema.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
providers_test.go internal: Fix lockfile constraint output for 1.2.* 2020-10-20 10:14:03 -04:00
providers.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
push.go command: remove "terraform push" 2018-10-16 18:24:47 -07:00
refresh_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
refresh.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
show_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
show.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_command.go Thread the environment through all commands 2017-02-28 16:35:46 -05:00
state_list_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
state_list.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_meta.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_mv_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
state_mv.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_pull_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
state_pull.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_push_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
state_push.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_replace_provider_test.go vendor: Upgrade mitchellh/cli 2020-09-10 15:23:02 -04:00
state_replace_provider.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_rm_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
state_rm.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_show_test.go Mildwonkey/command tests (#24535) 2020-04-06 09:24:23 -07:00
state_show.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
state_test.go command: Allow tests to run to completion without panics or hangs 2018-10-16 19:14:11 -07:00
taint_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
taint.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
ui_input_test.go Exit with error if UI input scan fails (#26509) 2020-10-21 14:10:06 -04:00
ui_input.go Exit with error if UI input scan fails (#26509) 2020-10-21 14:10:06 -04:00
unlock_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
unlock.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
untaint_test.go remove LegacyProvider (#26433) 2020-10-05 08:33:49 -04:00
untaint.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
validate_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
validate.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
version_test.go command/init: Read, respect, and update provider dependency locks 2020-10-09 09:26:23 -07:00
version.go command: Improve consistency of the command short descriptions 2020-10-26 09:55:21 -07:00
workspace_command_test.go deprecate helper/copy 2020-10-08 08:42:16 -04:00
workspace_command.go remove unused code (#26503) 2020-10-07 11:00:06 -04:00
workspace_delete.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
workspace_list.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
workspace_new.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
workspace_select.go backend: Validate remote backend Terraform version 2020-11-19 13:19:40 -05:00
workspace_show.go command: Always validate workspace name 2020-08-11 12:33:12 -04:00