github.com/ticketmaster/terraform@v0.10.0-beta2.0.20170711045249-a12daf5aba4f/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, err := c.Meta.process(args, true) 17 if err != nil { 18 return 1 19 } 20 21 envCommandShowWarning(c.Ui, c.LegacyName) 22 23 cmdFlags := c.Meta.flagSet("workspace select") 24 cmdFlags.Usage = func() { c.Ui.Error(c.Help()) } 25 if err := cmdFlags.Parse(args); err != nil { 26 return 1 27 } 28 args = cmdFlags.Args() 29 if len(args) == 0 { 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 conf, err := c.Config(configPath) 41 if err != nil { 42 c.Ui.Error(fmt.Sprintf("Failed to load root config module: %s", err)) 43 } 44 45 current, isOverridden := c.WorkspaceOverridden() 46 if isOverridden { 47 c.Ui.Error(envIsOverriddenSelectError) 48 return 1 49 } 50 51 // Load the backend 52 b, err := c.Backend(&BackendOpts{ 53 Config: conf, 54 }) 55 56 if err != nil { 57 c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err)) 58 return 1 59 } 60 61 name := args[0] 62 if !validWorkspaceName(name) { 63 c.Ui.Error(fmt.Sprintf(envInvalidName, name)) 64 return 1 65 } 66 67 states, err := b.States() 68 if err != nil { 69 c.Ui.Error(err.Error()) 70 return 1 71 } 72 73 if name == current { 74 // already using this workspace 75 return 0 76 } 77 78 found := false 79 for _, s := range states { 80 if name == s { 81 found = true 82 break 83 } 84 } 85 86 if !found { 87 c.Ui.Error(fmt.Sprintf(envDoesNotExist, name)) 88 return 1 89 } 90 91 err = c.SetWorkspace(name) 92 if err != nil { 93 c.Ui.Error(err.Error()) 94 return 1 95 } 96 97 c.Ui.Output( 98 c.Colorize().Color( 99 fmt.Sprintf(envChanged, name), 100 ), 101 ) 102 103 return 0 104 } 105 106 func (c *WorkspaceSelectCommand) Help() string { 107 helpText := ` 108 Usage: terraform workspace select NAME [DIR] 109 110 Select a different Terraform workspace. 111 ` 112 return strings.TrimSpace(helpText) 113 } 114 115 func (c *WorkspaceSelectCommand) Synopsis() string { 116 return "Select a workspace" 117 }