github.com/paybyphone/terraform@v0.9.5-0.20170613192930-9706042ddd51/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  }