mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 18:01:01 -06:00
bee7403f3e
Previously we would reject attempts to delete a workspace if its state contained any resources at all, even if none of the resources had any resource instance objects associated with it. Nowadays there isn't any situation where the normal Terraform workflow will leave behind resource husks, and so this isn't as problematic as it might've been in the v0.12 era, but nonetheless what we actually care about for this check is whether there might be any remote objects that this state is tracking, and for that it's more precise to look for non-nil resource instance objects, rather than whole resources. This also includes some adjustments to our error messaging to give more information about the problem and to use terminology more consistent with how we currently talk about this situation in our documentation and elsewhere in the UI. We were also using the old State.HasResources method as part of some of our tests. I considered preserving it to avoid changing the behavior of those tests, but the new check seemed close enough to the intent of those tests that it wasn't worth maintaining this method that wouldn't be used in any main code anymore. I've therefore updated those tests to use the new HasResourceInstanceObjects method instead.
126 lines
3.2 KiB
Go
126 lines
3.2 KiB
Go
package command
|
|
|
|
import (
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/mitchellh/cli"
|
|
)
|
|
|
|
// WorkspaceCommand is a Command Implementation that manipulates workspaces,
|
|
// which allow multiple distinct states and variables from a single config.
|
|
type WorkspaceCommand struct {
|
|
Meta
|
|
LegacyName bool
|
|
}
|
|
|
|
func (c *WorkspaceCommand) Run(args []string) int {
|
|
c.Meta.process(args)
|
|
envCommandShowWarning(c.Ui, c.LegacyName)
|
|
|
|
cmdFlags := c.Meta.extendedFlagSet("workspace")
|
|
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
|
|
|
|
c.Ui.Output(c.Help())
|
|
return 0
|
|
}
|
|
|
|
func (c *WorkspaceCommand) Help() string {
|
|
helpText := `
|
|
Usage: terraform [global options] workspace
|
|
|
|
new, list, show, select and delete Terraform workspaces.
|
|
|
|
`
|
|
return strings.TrimSpace(helpText)
|
|
}
|
|
|
|
func (c *WorkspaceCommand) Synopsis() string {
|
|
return "Workspace management"
|
|
}
|
|
|
|
// validWorkspaceName returns true is this name is valid to use as a workspace name.
|
|
// Since most named states are accessed via a filesystem path or URL, check if
|
|
// escaping the name would be required.
|
|
func validWorkspaceName(name string) bool {
|
|
return name == url.PathEscape(name)
|
|
}
|
|
|
|
func envCommandShowWarning(ui cli.Ui, show bool) {
|
|
if !show {
|
|
return
|
|
}
|
|
|
|
ui.Warn(`Warning: the "terraform env" family of commands is deprecated.
|
|
|
|
"Workspace" is now the preferred term for what earlier Terraform versions
|
|
called "environment", to reduce ambiguity caused by the latter term colliding
|
|
with other concepts.
|
|
|
|
The "terraform workspace" commands should be used instead. "terraform env"
|
|
will be removed in a future Terraform version.
|
|
`)
|
|
}
|
|
|
|
const (
|
|
envExists = `Workspace %q already exists`
|
|
|
|
envDoesNotExist = `
|
|
Workspace %q doesn't exist.
|
|
|
|
You can create this workspace with the "new" subcommand.`
|
|
|
|
envChanged = `[reset][green]Switched to workspace %q.`
|
|
|
|
envCreated = `
|
|
[reset][green][bold]Created and switched to workspace %q![reset][green]
|
|
|
|
You're now on a new, empty workspace. Workspaces isolate their state,
|
|
so if you run "terraform plan" Terraform will not see any existing state
|
|
for this configuration.
|
|
`
|
|
|
|
envDeleted = `[reset][green]Deleted workspace %q!`
|
|
|
|
envWarnNotEmpty = `[reset][yellow]WARNING: %q was non-empty.
|
|
The resources managed by the deleted workspace may still exist,
|
|
but are no longer manageable by Terraform since the state has
|
|
been deleted.
|
|
`
|
|
|
|
envDelCurrent = `
|
|
Workspace %[1]q is your active workspace.
|
|
|
|
You cannot delete the currently active workspace. Please switch
|
|
to another workspace and try again.
|
|
`
|
|
|
|
envInvalidName = `
|
|
The workspace name %q is not allowed. The name must contain only URL safe
|
|
characters, and no path separators.
|
|
`
|
|
|
|
envIsOverriddenNote = `
|
|
|
|
The active workspace is being overridden using the TF_WORKSPACE environment
|
|
variable.
|
|
`
|
|
|
|
envIsOverriddenSelectError = `
|
|
The selected workspace is currently overridden using the TF_WORKSPACE
|
|
environment variable.
|
|
|
|
To select a new workspace, either update this environment variable or unset
|
|
it and then run this command again.
|
|
`
|
|
|
|
envIsOverriddenNewError = `
|
|
The workspace is currently overridden using the TF_WORKSPACE environment
|
|
variable. You cannot create a new workspace when using this setting.
|
|
|
|
To create a new workspace, either unset this environment variable or update it
|
|
to match the workspace name you are trying to create, and then run this command
|
|
again.
|
|
`
|
|
)
|