talos/internal/integration/cli/reboot.go
Utku Ozdemir 5dff164f1c
fix: fix error output of cli action tracker
Before we started a reboot/shutdown/reset/upgrade action with the action tracker (`--wait`), we were setting a flag to prevent cobra from printing the returned error from the command.

This was to prevent the error from being printed twice, as the reporter of the action tracker already prints any errors occurred during the action execution.

But if the error happens too early - i.e. before we even started the status printer goroutine, then that error wouldn't be printed at all, as we have suppressed the errors.

This PR moves the suppression flag to be set after the status printer is started - so we still do not double-print the errors, but neither do we suppress any early-stage error from being printed.

Closes siderolabs/talos#7900.

Signed-off-by: Utku Ozdemir <utku.ozdemir@siderolabs.com>
2023-10-27 21:16:54 +02:00

115 lines
3.3 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/.
//go:build integration_cli
// +build integration_cli
package cli
import (
"fmt"
"path/filepath"
"strings"
"testing"
"github.com/hashicorp/go-multierror"
"github.com/siderolabs/talos/internal/integration/base"
"github.com/siderolabs/talos/pkg/machinery/config/machine"
)
// RebootSuite tests reboot command.
type RebootSuite struct {
base.CLISuite
}
// SuiteName ...
func (suite *RebootSuite) SuiteName() string {
return "cli.RebootSuite"
}
// TestReboot tests rebooting nodes.
func (suite *RebootSuite) TestReboot() {
if testing.Short() {
suite.T().Skip("skipping in short mode")
}
controlPlaneNode := suite.RandomDiscoveredNodeInternalIP(machine.TypeControlPlane)
workerNode := suite.RandomDiscoveredNodeInternalIP(machine.TypeWorker)
nodes := fmt.Sprintf(
"%s,%s",
controlPlaneNode,
workerNode,
)
suite.T().Logf("rebooting nodes %s via the CLI", nodes)
suite.RunCLI([]string{"reboot", "-n", nodes, "--debug"},
base.StdoutEmpty(),
base.StderrNotEmpty(),
base.StderrMatchFunc(func(stdout string) error {
if strings.Contains(stdout, "method is not supported") {
suite.T().Skip("reboot is not supported")
}
var err error
for _, node := range []string{controlPlaneNode, workerNode} {
if !strings.Contains(stdout, fmt.Sprintf("%q: events check condition met", node)) {
err = multierror.Append(err, fmt.Errorf("events check condition not met on %v", node))
}
if !strings.Contains(stdout, fmt.Sprintf("%q: post check passed", node)) {
err = multierror.Append(err, fmt.Errorf("post check not passed on %v", node))
}
}
return err
}))
suite.T().Logf("running the cluster health check")
// run the health check to make sure cluster is fully healthy after a node reboot
args := []string{"--server=false"}
if suite.K8sEndpoint != "" {
args = append(args, "--k8s-endpoint", strings.Split(suite.K8sEndpoint, ":")[0])
}
suite.RunCLI(append([]string{"health"}, args...),
base.StdoutEmpty(),
base.StderrNotEmpty(),
)
}
// TestRebootEarlyFailPrintsOutput tests the action tracker used by reboot command to track reboot status
// does not suppress the stderr output if there is an error occurring at an early stage, i.e. before the
// action status reporting starts.
func (suite *RebootSuite) TestRebootEarlyFailPrintsOutput() {
controlPlaneNode := suite.RandomDiscoveredNodeInternalIP(machine.TypeControlPlane)
invalidTalosconfig := filepath.Join(suite.T().TempDir(), "talosconfig.yaml")
suite.T().Logf("attempting to reboot node %q using talosconfig %q", controlPlaneNode, invalidTalosconfig)
suite.RunCLI([]string{"--talosconfig", invalidTalosconfig, "reboot", "-n", controlPlaneNode},
base.ShouldFail(),
base.StdoutEmpty(),
base.StderrNotEmpty(),
base.StderrMatchFunc(func(stdout string) error {
if strings.Contains(stdout, "method is not supported") {
suite.T().Skip("reboot is not supported")
}
if !strings.Contains(stdout, "failed to determine endpoints") {
return fmt.Errorf("expected to find 'failed to determine endpoints' in stderr")
}
return nil
}))
}
func init() {
allSuites = append(allSuites, new(RebootSuite))
}