github.com/vtorhonen/terraform@v0.9.0-beta2.0.20170307220345-5d894e4ffda7/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  	configPath, err := ModulePath(args[1:])
    36  	if err != nil {
    37  		c.Ui.Error(err.Error())
    38  		return 1
    39  	}
    40  
    41  	// Load the backend
    42  	b, err := c.Backend(&BackendOpts{ConfigPath: configPath})
    43  	if err != nil {
    44  		c.Ui.Error(fmt.Sprintf("Failed to load backend: %s", err))
    45  		return 1
    46  	}
    47  
    48  	states, err := b.States()
    49  	if err != nil {
    50  		c.Ui.Error(err.Error())
    51  		return 1
    52  	}
    53  
    54  	exists := false
    55  	for _, s := range states {
    56  		if delEnv == s {
    57  			exists = true
    58  			break
    59  		}
    60  	}
    61  
    62  	if !exists {
    63  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envDoesNotExist), delEnv))
    64  		return 1
    65  	}
    66  
    67  	if delEnv == c.Env() {
    68  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envDelCurrent), delEnv))
    69  		return 1
    70  	}
    71  
    72  	// we need the actual state to see if it's empty
    73  	sMgr, err := b.State(delEnv)
    74  	if err != nil {
    75  		c.Ui.Error(err.Error())
    76  		return 1
    77  	}
    78  
    79  	if err := sMgr.RefreshState(); err != nil {
    80  		c.Ui.Error(err.Error())
    81  		return 1
    82  	}
    83  
    84  	hasResources := sMgr.State().HasResources()
    85  
    86  	if hasResources && !force {
    87  		c.Ui.Error(fmt.Sprintf(strings.TrimSpace(envNotEmpty), delEnv))
    88  		return 1
    89  	}
    90  
    91  	// Lock the state if we can
    92  	lockInfo := state.NewLockInfo()
    93  	lockInfo.Operation = "env delete"
    94  	lockID, err := clistate.Lock(sMgr, lockInfo, c.Ui, c.Colorize())
    95  	if err != nil {
    96  		c.Ui.Error(fmt.Sprintf("Error locking state: %s", err))
    97  		return 1
    98  	}
    99  	defer clistate.Unlock(sMgr, lockID, c.Ui, c.Colorize())
   100  
   101  	err = b.DeleteState(delEnv)
   102  	if err != nil {
   103  		c.Ui.Error(err.Error())
   104  		return 1
   105  	}
   106  
   107  	c.Ui.Output(
   108  		c.Colorize().Color(
   109  			fmt.Sprintf(envDeleted, delEnv),
   110  		),
   111  	)
   112  
   113  	if hasResources {
   114  		c.Ui.Output(
   115  			c.Colorize().Color(
   116  				fmt.Sprintf(envWarnNotEmpty, delEnv),
   117  			),
   118  		)
   119  	}
   120  
   121  	return 0
   122  }
   123  func (c *EnvDeleteCommand) Help() string {
   124  	helpText := `
   125  Usage: terraform env delete [OPTIONS] NAME [DIR]
   126  
   127    Delete a Terraform environment
   128  
   129  
   130  Options:
   131  
   132      -force    remove a non-empty environment.
   133  `
   134  	return strings.TrimSpace(helpText)
   135  }
   136  
   137  func (c *EnvDeleteCommand) Synopsis() string {
   138  	return "Delete an environment"
   139  }