mirror of
https://github.com/opentofu/opentofu.git
synced 2025-01-03 20:57:09 -06:00
ebafa51723
This is a rather-messy, complex change to get the "command" package building again against the new backend API that was updated for the new configuration loader. A lot of this is mechanical rewriting to the new API, but meta_config.go and meta_backend.go in particular saw some major changes to interface with the new loader APIs and to deal with the change in order of steps in the backend API.
141 lines
2.6 KiB
Go
141 lines
2.6 KiB
Go
package command
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/hashicorp/terraform/tfdiags"
|
|
"github.com/mitchellh/cli"
|
|
"github.com/posener/complete"
|
|
)
|
|
|
|
type WorkspaceSelectCommand struct {
|
|
Meta
|
|
LegacyName bool
|
|
}
|
|
|
|
func (c *WorkspaceSelectCommand) Run(args []string) int {
|
|
args, err := c.Meta.process(args, true)
|
|
if err != nil {
|
|
return 1
|
|
}
|
|
|
|
envCommandShowWarning(c.Ui, c.LegacyName)
|
|
|
|
cmdFlags := c.Meta.flagSet("workspace select")
|
|
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
|
|
if err := cmdFlags.Parse(args); err != nil {
|
|
return 1
|
|
}
|
|
args = cmdFlags.Args()
|
|
if len(args) == 0 {
|
|
c.Ui.Error("Expected a single argument: NAME.\n")
|
|
return cli.RunResultHelp
|
|
}
|
|
|
|
configPath, err := ModulePath(args[1:])
|
|
if err != nil {
|
|
c.Ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
var diags tfdiags.Diagnostics
|
|
|
|
backendConfig, backendDiags := c.loadBackendConfig(configPath)
|
|
diags = diags.Append(backendDiags)
|
|
if diags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
current, isOverridden := c.WorkspaceOverridden()
|
|
if isOverridden {
|
|
c.Ui.Error(envIsOverriddenSelectError)
|
|
return 1
|
|
}
|
|
|
|
// Load the backend
|
|
b, backendDiags := c.Backend(&BackendOpts{
|
|
Config: backendConfig,
|
|
})
|
|
diags = diags.Append(backendDiags)
|
|
if backendDiags.HasErrors() {
|
|
c.showDiagnostics(diags)
|
|
return 1
|
|
}
|
|
|
|
if err != nil {
|
|
c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
|
|
return 1
|
|
}
|
|
|
|
name := args[0]
|
|
if !validWorkspaceName(name) {
|
|
c.Ui.Error(fmt.Sprintf(envInvalidName, name))
|
|
return 1
|
|
}
|
|
|
|
states, err := b.States()
|
|
if err != nil {
|
|
c.Ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
if name == current {
|
|
// already using this workspace
|
|
return 0
|
|
}
|
|
|
|
found := false
|
|
for _, s := range states {
|
|
if name == s {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
c.Ui.Error(fmt.Sprintf(envDoesNotExist, name))
|
|
return 1
|
|
}
|
|
|
|
err = c.SetWorkspace(name)
|
|
if err != nil {
|
|
c.Ui.Error(err.Error())
|
|
return 1
|
|
}
|
|
|
|
c.Ui.Output(
|
|
c.Colorize().Color(
|
|
fmt.Sprintf(envChanged, name),
|
|
),
|
|
)
|
|
|
|
return 0
|
|
}
|
|
|
|
func (c *WorkspaceSelectCommand) AutocompleteArgs() complete.Predictor {
|
|
return completePredictSequence{
|
|
complete.PredictNothing, // the "select" subcommand itself (already matched)
|
|
c.completePredictWorkspaceName(),
|
|
complete.PredictDirs(""),
|
|
}
|
|
}
|
|
|
|
func (c *WorkspaceSelectCommand) AutocompleteFlags() complete.Flags {
|
|
return nil
|
|
}
|
|
|
|
func (c *WorkspaceSelectCommand) Help() string {
|
|
helpText := `
|
|
Usage: terraform workspace select NAME [DIR]
|
|
|
|
Select a different Terraform workspace.
|
|
`
|
|
return strings.TrimSpace(helpText)
|
|
}
|
|
|
|
func (c *WorkspaceSelectCommand) Synopsis() string {
|
|
return "Select a workspace"
|
|
}
|