github.com/gerbenjacobs/terraform@v0.9.5-0.20170630130047-e6ddd62583d8/command/workspace_select.go (about) 1 package command 2 3 import ( 4 "fmt" 5 "strings" 6 7 "github.com/mitchellh/cli" 8 ) 9 10 type WorkspaceSelectCommand struct { 11 Meta 12 LegacyName bool 13 } 14 15 func (c *WorkspaceSelectCommand) Run(args []string) int { 16 args = c.Meta.process(args, true) 17 18 envCommandShowWarning(c.Ui, c.LegacyName) 19 20 cmdFlags := c.Meta.flagSet("workspace select") 21 cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } 22 if err := cmdFlags.Parse(args); err != nil { 23 return 1 24 } 25 args = cmdFlags.Args() 26 if len(args) == 0 { 27 c.Ui.Error("Expected a single argument: NAME.\n") 28 return cli.RunResultHelp 29 } 30 31 configPath, err := ModulePath(args[1:]) 32 if err != nil { 33 c.Ui.Error(err.Error()) 34 return 1 35 } 36 37 conf, err := c.Config(configPath) 38 if err != nil { 39 c.Ui.Error(fmt.Sprintf("Failed to load root config module: %s", err)) 40 } 41 42 current, isOverridden := c.WorkspaceOverridden() 43 if isOverridden { 44 c.Ui.Error(envIsOverriddenSelectError) 45 return 1 46 } 47 48 // Load the backend 49 b, err := c.Backend(&BackendOpts{ 50 Config: conf, 51 }) 52 53 if err != nil { 54 c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err)) 55 return 1 56 } 57 58 name := args[0] 59 if !validWorkspaceName(name) { 60 c.Ui.Error(fmt.Sprintf(envInvalidName, name)) 61 return 1 62 } 63 64 states, err := b.States() 65 if err != nil { 66 c.Ui.Error(err.Error()) 67 return 1 68 } 69 70 if name == current { 71 // already using this workspace 72 return 0 73 } 74 75 found := false 76 for _, s := range states { 77 if name == s { 78 found = true 79 break 80 } 81 } 82 83 if !found { 84 c.Ui.Error(fmt.Sprintf(envDoesNotExist, name)) 85 return 1 86 } 87 88 err = c.SetWorkspace(name) 89 if err != nil { 90 c.Ui.Error(err.Error()) 91 return 1 92 } 93 94 c.Ui.Output( 95 c.Colorize().Color( 96 fmt.Sprintf(envChanged, name), 97 ), 98 ) 99 100 return 0 101 } 102 103 func (c *WorkspaceSelectCommand) Help() string { 104 helpText := ` 105 Usage: terraform workspace select NAME [DIR] 106 107 Select a different Terraform workspace. 108 ` 109 return strings.TrimSpace(helpText) 110 } 111 112 func (c *WorkspaceSelectCommand) Synopsis() string { 113 return "Select a workspace" 114 }