github.com/rliebz/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 }