From 44ea61ef3a0dd4019da8b1c6ccff05b41acecfc1 Mon Sep 17 00:00:00 2001 From: Mahmood Ali Date: Fri, 23 Jul 2021 11:27:47 -0400 Subject: [PATCH] cli: Use glint to determine if os.Stdout is tty (#10926) Use glint to determine if os.Stdout is a terminal. glint Terminal renderer expects os.Stdout [not only to be a terminal, but also to have non-zero size](https://github.com/mitchellh/go-glint/blob/b492b545f6208fc979e7ee498d55599b8107e770/renderer_term.go#L39-L46). It's unclear how this condition arises, but this additional check causes Nomad to render deployments progress through glint when glint cannot support it. By using golint to perform the check, we eliminate the risk of mis-judgement. --- .changelog/10926.txt | 3 +++ command/deployment_status.go | 21 +++++++++++++++++---- go.mod | 2 +- go.sum | 4 ++-- 4 files changed, 23 insertions(+), 7 deletions(-) create mode 100644 .changelog/10926.txt diff --git a/.changelog/10926.txt b/.changelog/10926.txt new file mode 100644 index 000000000000..e0a19617db80 --- /dev/null +++ b/.changelog/10926.txt @@ -0,0 +1,3 @@ +```release-note:bug +cli: Fixed a panic when deployment monitor is invoked in some CI environments +``` diff --git a/command/deployment_status.go b/command/deployment_status.go index 8f59b267b1cb..18de5e218ce0 100644 --- a/command/deployment_status.go +++ b/command/deployment_status.go @@ -182,15 +182,28 @@ func (c *DeploymentStatusCommand) Run(args []string) int { } func (c *DeploymentStatusCommand) monitor(client *api.Client, deployID string, index uint64, verbose bool) { - _, isStdoutTerminal := term.GetFdInfo(os.Stdout) - // TODO if/when glint offers full Windows support take out the runtime check - if isStdoutTerminal && runtime.GOOS != "windows" { + if isStdoutTerminal() { c.ttyMonitor(client, deployID, index, verbose) } else { c.defaultMonitor(client, deployID, index, verbose) } } +func isStdoutTerminal() bool { + // TODO if/when glint offers full Windows support take out the runtime check + if runtime.GOOS == "windows" { + return false + } + + // glint checks if the writer is a tty with additional + // checks (e.g. terminal has non-0 size) + r := &glint.TerminalRenderer{ + Output: os.Stdout, + } + + return r.LayoutRoot() != nil +} + // Uses glint for printing in place. Same logic as the defaultMonitor function // but only used for tty and non-Windows machines since glint doesn't work with // cmd/PowerShell and non-interactive interfaces @@ -214,9 +227,9 @@ func (c *DeploymentStatusCommand) ttyMonitor(client *api.Client, deployID string d.Set(spinner) ctx, cancel := context.WithCancel(context.Background()) + defer cancel() go d.Render(ctx) - defer cancel() q := api.QueryOptions{ AllowStale: true, diff --git a/go.mod b/go.mod index 71f832d3ef19..86e7abc35741 100644 --- a/go.mod +++ b/go.mod @@ -97,7 +97,7 @@ require ( github.com/mitchellh/cli v1.1.0 github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286 github.com/mitchellh/copystructure v1.0.0 - github.com/mitchellh/go-glint v0.0.0-20201119015200-53f6eb3bf4d2 + github.com/mitchellh/go-glint v0.0.0-20210722152315-6515ceb4a127 github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b github.com/mitchellh/go-testing-interface v1.14.1 github.com/mitchellh/hashstructure v1.0.0 diff --git a/go.sum b/go.sum index 887d8a375d67..26fd001ef3a3 100644 --- a/go.sum +++ b/go.sum @@ -545,8 +545,8 @@ github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286 h1:KHyL+3mQO github.com/mitchellh/colorstring v0.0.0-20150917214807-8631ce90f286/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= github.com/mitchellh/copystructure v1.0.0 h1:Laisrj+bAB6b/yJwB5Bt3ITZhGJdqmxquMKeZ+mmkFQ= github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw= -github.com/mitchellh/go-glint v0.0.0-20201119015200-53f6eb3bf4d2 h1:p6jvEJYVtY05cbttwUhvxzV1j/e/40musLqs18vkv+E= -github.com/mitchellh/go-glint v0.0.0-20201119015200-53f6eb3bf4d2/go.mod h1:9X3rpO+I3yuihb6p8ktF8qWxROGwij9DBW/czUsMlhk= +github.com/mitchellh/go-glint v0.0.0-20210722152315-6515ceb4a127 h1:/EdGXMUGYFdp0+cmGjVLl/Qbx3G10csqgj22ZkrPFEA= +github.com/mitchellh/go-glint v0.0.0-20210722152315-6515ceb4a127/go.mod h1:9X3rpO+I3yuihb6p8ktF8qWxROGwij9DBW/czUsMlhk= github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=