github.com/dougneal/terraform@v0.6.15-0.20170330092735-b6a3840768a4/command/env_delete.go (about)

     1  package command
     2  
     3  import (
     4  	"fmt"
     5  	"strings"
     6  
     7  	"github.com/hashicorp/terraform/state"
     8  	"github.com/mitchellh/cli"
     9  
    10  	clistate "github.com/hashicorp/terraform/command/state"
    11  )
    12  
    13  type EnvDeleteCommand struct {
    14  	Meta
    15  }
    16  
    17  func (c *EnvDeleteCommand) Run(args []string) int {
    18  	args = c.Meta.process(args, true)
    19  
    20  	force := false
    21  	cmdFlags := c.Meta.flagSet("env")
    22  	cmdFlags.BoolVar(&force, "force", false, "force removal of a non-empty environment")
    23  	cmdFlags.Usage = func() { c.Ui.Error(c.Help()) }
    24  	if err := cmdFlags.Parse(args); err != nil {
    25  		return 1
    26  	}
    27  	args = cmdFlags.Args()
    28  	if len(args) == 0 {
    29  		c.Ui.Error("expected NAME.\n")
    30  		return cli.RunResultHelp
    31  	}
    32  
    33  	delEnv := args[0]
    34  
    35  	if !validEnvName(delEnv) {
    36  		c.Ui.Error(fmt.Sprintf(envInvalidName, delEnv))
    37  		return 1
    38  	}
    39  
    40  	configPath, err := ModulePath(args[1:])
    41  	if err != nil {
    42  		c.Ui.Error(err.Error())
    43  		return 1
    44  	}
    45  
    46  	// Load the backend
    47  	b, err := c.Backend(&BackendOpts{ConfigPath: configPath})
    48  	if err != nil {
    49  		c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
    50  		return 1
    51  	}
    52  
    53  	states, err := b.States()
    54  	if err != nil {
    55  		c.Ui.Error(err.Error())
    56  		return 1
    57  	}
    58  
    59  	exists := false
    60  	for _, s := range states {
    61  		if delEnv == s {
    62  			exists = true
    63  			break
    64  		}
    65  	}
    66  
    67  	if !exists {
    68  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envDoesNotExist), delEnv))
    69  		return 1
    70  	}
    71  
    72  	if delEnv == c.Env() {
    73  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envDelCurrent), delEnv))
    74  		return 1
    75  	}
    76  
    77  	// we need the actual state to see if it's empty
    78  	sMgr, err := b.State(delEnv)
    79  	if err != nil {
    80  		c.Ui.Error(err.Error())
    81  		return 1
    82  	}
    83  
    84  	if err := sMgr.RefreshState(); err != nil {
    85  		c.Ui.Error(err.Error())
    86  		return 1
    87  	}
    88  
    89  	hasResources := sMgr.State().HasResources()
    90  
    91  	if hasResources && !force {
    92  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envNotEmpty), delEnv))
    93  		return 1
    94  	}
    95  
    96  	// Lock the state if we can
    97  	lockInfo := state.NewLockInfo()
    98  	lockInfo.Operation = "env delete"
    99  	lockID, err := clistate.Lock(sMgr, lockInfo, c.Ui, c.Colorize())
   100  	if err != nil {
   101  		c.Ui.Error(fmt.Sprintf("Error locking state: %s", err))
   102  		return 1
   103  	}
   104  	defer clistate.Unlock(sMgr, lockID, c.Ui, c.Colorize())
   105  
   106  	err = b.DeleteState(delEnv)
   107  	if err != nil {
   108  		c.Ui.Error(err.Error())
   109  		return 1
   110  	}
   111  
   112  	c.Ui.Output(
   113  		c.Colorize().Color(
   114  			fmt.Sprintf(envDeleted, delEnv),
   115  		),
   116  	)
   117  
   118  	if hasResources {
   119  		c.Ui.Output(
   120  			c.Colorize().Color(
   121  				fmt.Sprintf(envWarnNotEmpty, delEnv),
   122  			),
   123  		)
   124  	}
   125  
   126  	return 0
   127  }
   128  func (c *EnvDeleteCommand) Help() string {
   129  	helpText := `
   130  Usage: terraform env delete [OPTIONS] NAME [DIR]
   131  
   132    Delete a Terraform environment
   133  
   134  
   135  Options:
   136  
   137      -force    remove a non-empty environment.
   138  `
   139  	return strings.TrimSpace(helpText)
   140  }
   141  
   142  func (c *EnvDeleteCommand) Synopsis() string {
   143  	return "Delete an environment"
   144  }