github.com/spirius/terraform@v0.10.0-beta2.0.20170714185654-87b2c0cf8fea/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  }