command/plan: show a warning when a plan file is given

This commit is contained in:
Mitchell Hashimoto 2016-12-12 10:45:26 -08:00
parent 7f87a0109b
commit 36ff8b3c02
No known key found for this signature in database
GPG Key ID: 744E147AA52F5B0A
3 changed files with 24 additions and 8 deletions

View File

@ -72,11 +72,15 @@ func (c *PlanCommand) Run(args []string) int {
return 1 return 1
} }
if planned { if planned {
c.Ui.Error( c.Ui.Output(c.Colorize().Color(
"The plan command cannot be called with a saved plan file.\n\n" + "[reset][bold][yellow]" +
"The plan command expects a configuration directory as an argument.", "The plan command received a saved plan file as input. This command\n" +
) "will output the saved plan. This will not modify the already-existing\n" +
return 1 "plan. If you wish to generate a new plan, please pass in a configuration\n" +
"directory as an argument.\n\n"))
// Disable refreshing no matter what since we only want to show the plan
refresh = false
} }
err = terraform.SetDebugInfo(DefaultDataDir) err = terraform.SetDebugInfo(DefaultDataDir)
@ -178,7 +182,7 @@ func (c *PlanCommand) Run(args []string) int {
func (c *PlanCommand) Help() string { func (c *PlanCommand) Help() string {
helpText := ` helpText := `
Usage: terraform plan [options] [dir] Usage: terraform plan [options] [DIR-OR-PLAN]
Generates an execution plan for Terraform. Generates an execution plan for Terraform.
@ -187,6 +191,9 @@ Usage: terraform plan [options] [dir]
a Terraform plan file, and apply can take this plan file to execute a Terraform plan file, and apply can take this plan file to execute
this plan exactly. this plan exactly.
If a saved plan is passed as an argument, this command will output
the saved plan contents. It will not modify the given plan.
Options: Options:
-destroy If set, a plan will be generated to destroy all resources -destroy If set, a plan will be generated to destroy all resources

View File

@ -55,9 +55,13 @@ func TestPlan_plan(t *testing.T) {
} }
args := []string{planPath} args := []string{planPath}
if code := c.Run(args); code != 1 { if code := c.Run(args); code != 0 {
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String()) t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
} }
if p.RefreshCalled {
t.Fatal("refresh should not be called")
}
} }
func TestPlan_destroy(t *testing.T) { func TestPlan_destroy(t *testing.T) {

View File

@ -16,11 +16,16 @@ to `terraform apply` to ensure only the pre-planned actions are executed.
## Usage ## Usage
Usage: `terraform plan [options] [dir]` Usage: `terraform plan [options] [dir-or-plan]`
By default, `plan` requires no flags and looks in the current directory By default, `plan` requires no flags and looks in the current directory
for the configuration and state file to refresh. for the configuration and state file to refresh.
If the command is given an existing saved plan as an argument, the
command will output the contents of the saved plan. In this scenario,
the `plan` command will not modify the given plan. This can be used to
inspect a planfile.
The command-line flags are all optional. The list of available flags are: The command-line flags are all optional. The list of available flags are:
* `-destroy` - If set, generates a plan to destroy all the known resources. * `-destroy` - If set, generates a plan to destroy all the known resources.