talos/pkg/cluster/check/reporter.go
Andrey Smirnov 07f4ed7fb4 feat: upgrade etcd to 3.4.14
No major fixes, just keeping version up to date.

Signed-off-by: Andrey Smirnov <smirnov.andrey@gmail.com>
2020-11-26 09:14:41 -08:00

99 lines
2.2 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package check
import (
"fmt"
"os"
"strings"
"unicode/utf8"
"github.com/fatih/color"
"github.com/mattn/go-isatty"
"golang.org/x/term"
"github.com/talos-systems/talos/pkg/conditions"
)
type writerReporter struct {
w *os.File
lastLine string
lastLineTemporary bool
colorized bool
spinnerIdx int
}
var spinner = []string{"◰", "◳", "◲", "◱"}
//nolint: gocyclo
func (wr *writerReporter) Update(condition conditions.Condition) {
line := strings.TrimSpace(fmt.Sprintf("waiting for %s", condition))
// replace tabs with spaces to get consistent output length
line = strings.ReplaceAll(line, "\t", " ")
if !wr.colorized {
if line != wr.lastLine {
fmt.Fprintln(wr.w, line)
wr.lastLine = line
}
return
}
w, _, _ := term.GetSize(int(wr.w.Fd())) //nolint: errcheck
if w <= 0 {
w = 80
}
var coloredLine string
showSpinner := false
prevLineTemporary := wr.lastLineTemporary
switch {
case strings.HasSuffix(line, "..."):
line = fmt.Sprintf("%s %s", spinner[wr.spinnerIdx], line)
coloredLine = color.YellowString("%s", line)
wr.lastLineTemporary = true
showSpinner = true
case strings.HasSuffix(line, "OK"):
coloredLine = line
wr.lastLineTemporary = false
default:
line = fmt.Sprintf("%s %s", spinner[wr.spinnerIdx], line)
coloredLine = color.RedString("%s", line)
wr.lastLineTemporary = true
showSpinner = true
}
if line == wr.lastLine {
return
}
if showSpinner {
wr.spinnerIdx = (wr.spinnerIdx + 1) % len(spinner)
}
if prevLineTemporary {
for _, outputLine := range strings.Split(wr.lastLine, "\n") {
for i := 0; i < (utf8.RuneCountInString(outputLine)+w-1)/w; i++ {
fmt.Fprint(wr.w, "\033[A\033[K") // cursor up, clear line
}
}
}
fmt.Fprintln(wr.w, coloredLine)
wr.lastLine = line
}
// StderrReporter returns console reporter with stderr output.
func StderrReporter() Reporter {
return &writerReporter{
w: os.Stderr,
colorized: isatty.IsTerminal(os.Stderr.Fd()),
}
}