opentofu/command/workspace_select.go

144 lines
2.7 KiB
Go
Raw Normal View History

2017-02-23 12:13:28 -06:00
package command
import (
"fmt"
"strings"
"github.com/hashicorp/terraform/tfdiags"
2017-02-23 12:13:28 -06:00
"github.com/mitchellh/cli"
"github.com/posener/complete"
2017-02-23 12:13:28 -06:00
)
type WorkspaceSelectCommand struct {
2017-02-23 12:13:28 -06:00
Meta
LegacyName bool
2017-02-23 12:13:28 -06:00
}
func (c *WorkspaceSelectCommand) Run(args []string) int {
args, err := c.Meta.process(args, true)
if err != nil {
return 1
}
2017-02-23 12:13:28 -06:00
envCommandShowWarning(c.Ui, c.LegacyName)
cmdFlags := c.Meta.defaultFlagSet("workspace select")
2017-02-23 12:13:28 -06:00
cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
if err := cmdFlags.Parse(args); err != nil {
c.Ui.Error(fmt.Sprintf("Error parsing command-line flags: %s\n", err.Error()))
2017-02-23 12:13:28 -06:00
return 1
}
2017-02-23 12:13:28 -06:00
args = cmdFlags.Args()
if len(args) == 0 {
c.Ui.Error("Expected a single argument: NAME.\n")
2017-02-23 12:13:28 -06:00
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
}
2017-02-23 12:13:28 -06:00
// Load the backend
b, backendDiags := c.Backend(&BackendOpts{
Config: backendConfig,
})
diags = diags.Append(backendDiags)
if backendDiags.HasErrors() {
c.showDiagnostics(diags)
return 1
}
2017-02-23 12:13:28 -06:00
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
}
2017-02-23 12:13:28 -06:00
states, err := b.Workspaces()
2017-02-23 12:13:28 -06:00
if err != nil {
c.Ui.Error(err.Error())
return 1
}
if name == current {
// already using this workspace
2017-02-23 12:13:28 -06:00
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)
2017-02-23 12:13:28 -06:00
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 {
2017-02-23 12:13:28 -06:00
helpText := `
Usage: terraform workspace select NAME [DIR]
2017-02-23 12:13:28 -06:00
Select a different Terraform workspace.
2017-02-23 12:13:28 -06:00
`
return strings.TrimSpace(helpText)
}
func (c *WorkspaceSelectCommand) Synopsis() string {
return "Select a workspace"
2017-02-23 12:13:28 -06:00
}