github.com/muratcelep/terraform@v1.1.0-beta2-not-internal-4/not-internal/command/workspace_select.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/muratcelep/terraform/not-internal/tfdiags" 8 "github.com/mitchellh/cli" 9 "github.com/posener/complete" 10 ) 11 12 type WorkspaceSelectCommand struct { 13 Meta 14 LegacyName bool 15 } 16 17 func (c *WorkspaceSelectCommand) Run(args []string) int { 18 args = c.Meta.process(args) 19 envCommandShowWarning(c.Ui, c.LegacyName) 20 21 cmdFlags := c.Meta.defaultFlagSet("workspace select") 22 cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } 23 if err := cmdFlags.Parse(args); err != nil { 24 c.Ui.Error(fmt.Sprintf("Error parsing command-line flags: %s\n", err.Error())) 25 return 1 26 } 27 28 args = cmdFlags.Args() 29 if len(args) != 1 { 30 c.Ui.Error("Expected a single argument: NAME.\n") 31 return cli.RunResultHelp 32 } 33 34 configPath, err := ModulePath(args[1:]) 35 if err != nil { 36 c.Ui.Error(err.Error()) 37 return 1 38 } 39 40 var diags tfdiags.Diagnostics 41 42 backendConfig, backendDiags := c.loadBackendConfig(configPath) 43 diags = diags.Append(backendDiags) 44 if diags.HasErrors() { 45 c.showDiagnostics(diags) 46 return 1 47 } 48 49 current, isOverridden := c.WorkspaceOverridden() 50 if isOverridden { 51 c.Ui.Error(envIsOverriddenSelectError) 52 return 1 53 } 54 55 // Load the backend 56 b, backendDiags := c.Backend(&BackendOpts{ 57 Config: backendConfig, 58 }) 59 diags = diags.Append(backendDiags) 60 if backendDiags.HasErrors() { 61 c.showDiagnostics(diags) 62 return 1 63 } 64 65 if err != nil { 66 c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err)) 67 return 1 68 } 69 70 // This command will not write state 71 c.ignoreRemoteVersionConflict(b) 72 73 name := args[0] 74 if !validWorkspaceName(name) { 75 c.Ui.Error(fmt.Sprintf(envInvalidName, name)) 76 return 1 77 } 78 79 states, err := b.Workspaces() 80 if err != nil { 81 c.Ui.Error(err.Error()) 82 return 1 83 } 84 85 if name == current { 86 // already using this workspace 87 return 0 88 } 89 90 found := false 91 for _, s := range states { 92 if name == s { 93 found = true 94 break 95 } 96 } 97 98 if !found { 99 c.Ui.Error(fmt.Sprintf(envDoesNotExist, name)) 100 return 1 101 } 102 103 err = c.SetWorkspace(name) 104 if err != nil { 105 c.Ui.Error(err.Error()) 106 return 1 107 } 108 109 c.Ui.Output( 110 c.Colorize().Color( 111 fmt.Sprintf(envChanged, name), 112 ), 113 ) 114 115 return 0 116 } 117 118 func (c *WorkspaceSelectCommand) AutocompleteArgs() complete.Predictor { 119 return completePredictSequence{ 120 complete.PredictNothing, // the "select" subcommand itself (already matched) 121 c.completePredictWorkspaceName(), 122 complete.PredictDirs(""), 123 } 124 } 125 126 func (c *WorkspaceSelectCommand) AutocompleteFlags() complete.Flags { 127 return nil 128 } 129 130 func (c *WorkspaceSelectCommand) Help() string { 131 helpText := ` 132 Usage: terraform [global options] workspace select NAME 133 134 Select a different Terraform workspace. 135 136 ` 137 return strings.TrimSpace(helpText) 138 } 139 140 func (c *WorkspaceSelectCommand) Synopsis() string { 141 return "Select a workspace" 142 }