github.com/skyscape-cloud-services/terraform@v0.9.2-0.20170609144644-7ece028a1747/command/env_select.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/mitchellh/cli"
     8  )
     9  
    10  type EnvSelectCommand struct {
    11  	Meta
    12  }
    13  
    14  func (c *EnvSelectCommand) Run(args []string) int {
    15  	args = c.Meta.process(args, true)
    16  
    17  	cmdFlags := c.Meta.flagSet("env select")
    18  	cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
    19  	if err := cmdFlags.Parse(args); err != nil {
    20  		return 1
    21  	}
    22  	args = cmdFlags.Args()
    23  	if len(args) == 0 {
    24  		c.Ui.Error("Expected a single argument: NAME.\n")
    25  		return cli.RunResultHelp
    26  	}
    27  
    28  	configPath, err := ModulePath(args[1:])
    29  	if err != nil {
    30  		c.Ui.Error(err.Error())
    31  		return 1
    32  	}
    33  
    34  	// Load the backend
    35  	b, err := c.Backend(&BackendOpts{ConfigPath: configPath})
    36  	if err != nil {
    37  		c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
    38  		return 1
    39  	}
    40  
    41  	name := args[0]
    42  	if !validEnvName(name) {
    43  		c.Ui.Error(fmt.Sprintf(envInvalidName, name))
    44  		return 1
    45  	}
    46  
    47  	states, err := b.States()
    48  	if err != nil {
    49  		c.Ui.Error(err.Error())
    50  		return 1
    51  	}
    52  
    53  	if name == c.Env() {
    54  		// already using this env
    55  		return 0
    56  	}
    57  
    58  	found := false
    59  	for _, s := range states {
    60  		if name == s {
    61  			found = true
    62  			break
    63  		}
    64  	}
    65  
    66  	if !found {
    67  		c.Ui.Error(fmt.Sprintf(envDoesNotExist, name))
    68  		return 1
    69  	}
    70  
    71  	err = c.SetEnv(name)
    72  	if err != nil {
    73  		c.Ui.Error(err.Error())
    74  		return 1
    75  	}
    76  
    77  	c.Ui.Output(
    78  		c.Colorize().Color(
    79  			fmt.Sprintf(envChanged, name),
    80  		),
    81  	)
    82  
    83  	return 0
    84  }
    85  
    86  func (c *EnvSelectCommand) Help() string {
    87  	helpText := `
    88  Usage: terraform env select NAME [DIR]
    89  
    90    Change Terraform environment.
    91  `
    92  	return strings.TrimSpace(helpText)
    93  }
    94  
    95  func (c *EnvSelectCommand) Synopsis() string {
    96  	return "Change environments"
    97  }