command: destroy should ask for confirmation always

This commit is contained in:
Mitchell Hashimoto 2014-10-03 16:08:50 -07:00
parent 94f43ff145
commit a5f70ead2d
2 changed files with 22 additions and 19 deletions

View File

@ -26,7 +26,7 @@ type ApplyCommand struct {
} }
func (c *ApplyCommand) Run(args []string) int { func (c *ApplyCommand) Run(args []string) int {
var refresh bool var destroyForce, refresh bool
var statePath, stateOutPath, backupPath string var statePath, stateOutPath, backupPath string
args = c.Meta.process(args, true) args = c.Meta.process(args, true)
@ -37,6 +37,9 @@ func (c *ApplyCommand) Run(args []string) int {
} }
cmdFlags := c.Meta.flagSet(cmdName) cmdFlags := c.Meta.flagSet(cmdName)
if c.Destroy {
cmdFlags.BoolVar(&destroyForce, "force", false, "force")
}
cmdFlags.BoolVar(&refresh, "refresh", true, "refresh") cmdFlags.BoolVar(&refresh, "refresh", true, "refresh")
cmdFlags.StringVar(&statePath, "state", DefaultStateFilename, "path") cmdFlags.StringVar(&statePath, "state", DefaultStateFilename, "path")
cmdFlags.StringVar(&stateOutPath, "state-out", "", "path") cmdFlags.StringVar(&stateOutPath, "state-out", "", "path")
@ -114,24 +117,23 @@ func (c *ApplyCommand) Run(args []string) int {
"Destroy can't be called with a plan file.")) "Destroy can't be called with a plan file."))
return 1 return 1
} }
if c.InputEnabled() { if !destroyForce && c.Destroy {
if c.Destroy { v, err := c.UIInput().Input(&terraform.InputOpts{
v, err := c.UIInput().Input(&terraform.InputOpts{ Id: "destroy",
Id: "destroy", Query: "Do you really want to destroy?",
Query: "Do you really want to destroy?", Description: "Terraform will delete all your manage infrastructure.\n" +
Description: "Terraform will delete all your manage infrastructure.\n" + "There is no undo. Only 'yes' will be accepted to confirm.",
"There is no undo. Only 'yes' will be accepted to confirm.", })
}) if err != nil {
if err != nil { c.Ui.Error(fmt.Sprintf("Error asking for confirmation: %s", err))
c.Ui.Error(fmt.Sprintf("Error asking for confirmation: %s", err)) return 1
return 1
}
if v != "yes" {
c.Ui.Output("Destroy cancelled.")
return 1
}
} }
if v != "yes" {
c.Ui.Output("Destroy cancelled.")
return 1
}
}
if c.InputEnabled() {
if !planned { if !planned {
if err := ctx.Input(); err != nil { if err := ctx.Input(); err != nil {
c.Ui.Error(fmt.Sprintf("Error configuring: %s", err)) c.Ui.Error(fmt.Sprintf("Error configuring: %s", err))
@ -362,7 +364,7 @@ Options:
modifying. Defaults to the "-state-out" path with modifying. Defaults to the "-state-out" path with
".backup" extension. Set to "-" to disable backup. ".backup" extension. Set to "-" to disable backup.
-input=true Ask for input for destroy confirmation. -force Don't ask for input for destroy confirmation.
-no-color If specified, output won't contain any color. -no-color If specified, output won't contain any color.

View File

@ -40,6 +40,7 @@ func TestApply_destroy(t *testing.T) {
// Run the apply command pointing to our existing state // Run the apply command pointing to our existing state
args := []string{ args := []string{
"-force",
"-state", statePath, "-state", statePath,
testFixturePath("apply"), testFixturePath("apply"),
} }