From fad305f884c439969292f003e41bfe8074c207bf Mon Sep 17 00:00:00 2001 From: Alisdair McDiarmid Date: Fri, 16 Apr 2021 08:28:33 -0400 Subject: [PATCH] cli: Fix remote backend UI issues Fix two bugs which surface when using the remote backend: - When migrating to views, we removed the call to `(*Meta).process` which initialized the color boolean. This resulted in the legacy UI calls in the remote backend stripping color codes. To fix this, we populate this boolean from the common arguments. - Remote apply will output the resource summary and output changes, and these are rendered via the remote backend streaming. We need to special case this in the apply command and prevent displaying a zero-change summary line. Neither of these are coverable by automated tests, as we don't have any command-package level testing for the remote backend. Manually verified. --- command/apply.go | 17 +++++++++++++---- command/plan.go | 5 +++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/command/apply.go b/command/apply.go index 506ffce60..6365917d4 100644 --- a/command/apply.go +++ b/command/apply.go @@ -5,6 +5,7 @@ import ( "strings" "github.com/hashicorp/terraform/backend" + remoteBackend "github.com/hashicorp/terraform/backend/remote" "github.com/hashicorp/terraform/command/arguments" "github.com/hashicorp/terraform/command/views" "github.com/hashicorp/terraform/plans/planfile" @@ -26,6 +27,11 @@ func (c *ApplyCommand) Run(rawArgs []string) int { common, rawArgs := arguments.ParseView(rawArgs) c.View.Configure(common) + // Propagate -no-color for the remote backend's legacy use of Ui. This + // should be removed when the remote backend is migrated to views. + c.Meta.color = !common.NoColor + c.Meta.Color = c.Meta.color + // Parse and validate flags args, diags := arguments.ParseApply(rawArgs) @@ -116,10 +122,13 @@ func (c *ApplyCommand) Run(rawArgs []string) int { return op.Result.ExitStatus() } - // // Render the resource count and outputs - view.ResourceCount(args.State.StateOutPath) - if !c.Destroy && op.State != nil { - view.Outputs(op.State.RootModule().OutputValues) + // Render the resource count and outputs, unless we're using the remote + // backend, in which case these are rendered remotely + if _, isRemoteBackend := be.(*remoteBackend.Remote); !isRemoteBackend { + view.ResourceCount(args.State.StateOutPath) + if !c.Destroy && op.State != nil { + view.Outputs(op.State.RootModule().OutputValues) + } } view.Diagnostics(diags) diff --git a/command/plan.go b/command/plan.go index bf4304816..4d408fcbb 100644 --- a/command/plan.go +++ b/command/plan.go @@ -21,6 +21,11 @@ func (c *PlanCommand) Run(rawArgs []string) int { common, rawArgs := arguments.ParseView(rawArgs) c.View.Configure(common) + // Propagate -no-color for the remote backend's legacy use of Ui. This + // should be removed when the remote backend is migrated to views. + c.Meta.color = !common.NoColor + c.Meta.Color = c.Meta.color + // Parse and validate flags args, diags := arguments.ParsePlan(rawArgs)