diff --git a/cmd/talosctl/cmd/talos/reboot.go b/cmd/talosctl/cmd/talos/reboot.go index 10af104c6c..d45207b344 100644 --- a/cmd/talosctl/cmd/talos/reboot.go +++ b/cmd/talosctl/cmd/talos/reboot.go @@ -10,7 +10,6 @@ import ( "github.com/spf13/cobra" - "github.com/siderolabs/talos/cmd/talosctl/cmd/common" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/action" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/helpers" "github.com/siderolabs/talos/pkg/machinery/client" @@ -57,8 +56,6 @@ var rebootCmd = &cobra.Command{ }) } - common.SuppressErrors = true - return action.NewTracker( &GlobalArgs, action.MachineReadyEventFn, diff --git a/cmd/talosctl/cmd/talos/reset.go b/cmd/talosctl/cmd/talos/reset.go index 8c1e0ca862..e76a7699f2 100644 --- a/cmd/talosctl/cmd/talos/reset.go +++ b/cmd/talosctl/cmd/talos/reset.go @@ -13,7 +13,6 @@ import ( "github.com/siderolabs/gen/maps" "github.com/spf13/cobra" - "github.com/siderolabs/talos/cmd/talosctl/cmd/common" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/action" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/helpers" machineapi "github.com/siderolabs/talos/pkg/machinery/api/machine" @@ -140,8 +139,6 @@ var resetCmd = &cobra.Command{ } } - common.SuppressErrors = true - return action.NewTracker( &GlobalArgs, action.StopAllServicesEventFn, diff --git a/cmd/talosctl/cmd/talos/shutdown.go b/cmd/talosctl/cmd/talos/shutdown.go index 4027edbc32..bbbc1ee05f 100644 --- a/cmd/talosctl/cmd/talos/shutdown.go +++ b/cmd/talosctl/cmd/talos/shutdown.go @@ -10,7 +10,6 @@ import ( "github.com/spf13/cobra" - "github.com/siderolabs/talos/cmd/talosctl/cmd/common" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/action" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/helpers" "github.com/siderolabs/talos/pkg/machinery/client" @@ -50,8 +49,6 @@ var shutdownCmd = &cobra.Command{ }) } - common.SuppressErrors = true - return action.NewTracker( &GlobalArgs, action.StopAllServicesEventFn, diff --git a/cmd/talosctl/cmd/talos/upgrade.go b/cmd/talosctl/cmd/talos/upgrade.go index 454819db13..79785f7604 100644 --- a/cmd/talosctl/cmd/talos/upgrade.go +++ b/cmd/talosctl/cmd/talos/upgrade.go @@ -19,7 +19,6 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/peer" - "github.com/siderolabs/talos/cmd/talosctl/cmd/common" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/action" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/helpers" "github.com/siderolabs/talos/pkg/cli" @@ -73,8 +72,6 @@ var upgradeCmd = &cobra.Command{ return runUpgradeNoWait(opts) } - common.SuppressErrors = true - return action.NewTracker( &GlobalArgs, action.MachineReadyEventFn, diff --git a/cmd/talosctl/pkg/talos/action/tracker.go b/cmd/talosctl/pkg/talos/action/tracker.go index 47d6c02fba..4be1f71a8c 100644 --- a/cmd/talosctl/pkg/talos/action/tracker.go +++ b/cmd/talosctl/pkg/talos/action/tracker.go @@ -23,6 +23,7 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/backoff" + "github.com/siderolabs/talos/cmd/talosctl/cmd/common" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/global" "github.com/siderolabs/talos/cmd/talosctl/pkg/talos/helpers" machineapi "github.com/siderolabs/talos/pkg/machinery/api/machine" @@ -155,6 +156,10 @@ func (a *Tracker) Run() error { return a.runReporter(ctx) }) + // Reporter is started, it will print the errors if there is any. + // So from here on we can suppress the command error to be printed to avoid it being printed twice. + common.SuppressErrors = true + var trackEg errgroup.Group for _, node := range a.cliContext.Nodes { diff --git a/internal/integration/cli/reboot.go b/internal/integration/cli/reboot.go index a48d7951bc..1581f92c6f 100644 --- a/internal/integration/cli/reboot.go +++ b/internal/integration/cli/reboot.go @@ -9,6 +9,7 @@ package cli import ( "fmt" + "path/filepath" "strings" "testing" @@ -82,6 +83,32 @@ func (suite *RebootSuite) TestReboot() { ) } +// 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)) }