From 36ff8b3c0273b5ae7563d25da53e2fd8ec61e893 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Mon, 12 Dec 2016 10:45:26 -0800 Subject: [PATCH] command/plan: show a warning when a plan file is given --- command/plan.go | 19 +++++++++++++------ command/plan_test.go | 6 +++++- .../source/docs/commands/plan.html.markdown | 7 ++++++- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/command/plan.go b/command/plan.go index e15f11aca..09ce4778a 100644 --- a/command/plan.go +++ b/command/plan.go @@ -72,11 +72,15 @@ func (c *PlanCommand) Run(args []string) int { return 1 } if planned { - c.Ui.Error( - "The plan command cannot be called with a saved plan file.\n\n" + - "The plan command expects a configuration directory as an argument.", - ) - return 1 + c.Ui.Output(c.Colorize().Color( + "[reset][bold][yellow]" + + "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" + + "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) @@ -178,7 +182,7 @@ func (c *PlanCommand) Run(args []string) int { func (c *PlanCommand) Help() string { helpText := ` -Usage: terraform plan [options] [dir] +Usage: terraform plan [options] [DIR-OR-PLAN] 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 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: -destroy If set, a plan will be generated to destroy all resources diff --git a/command/plan_test.go b/command/plan_test.go index c3805af62..8e9537e2f 100644 --- a/command/plan_test.go +++ b/command/plan_test.go @@ -55,9 +55,13 @@ func TestPlan_plan(t *testing.T) { } 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()) } + + if p.RefreshCalled { + t.Fatal("refresh should not be called") + } } func TestPlan_destroy(t *testing.T) { diff --git a/website/source/docs/commands/plan.html.markdown b/website/source/docs/commands/plan.html.markdown index 84732a5cc..48d537473 100644 --- a/website/source/docs/commands/plan.html.markdown +++ b/website/source/docs/commands/plan.html.markdown @@ -16,11 +16,16 @@ to `terraform apply` to ensure only the pre-planned actions are executed. ## 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 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: * `-destroy` - If set, generates a plan to destroy all the known resources.