diff --git a/pkg/nodeagent/node_agent.go b/pkg/nodeagent/node_agent.go index 755a56d85..6dcdbf89b 100644 --- a/pkg/nodeagent/node_agent.go +++ b/pkg/nodeagent/node_agent.go @@ -100,9 +100,7 @@ func IsReady(ctx context.Context, namespace string, crClient ctrlclient.Client) if err := crClient.Get(ctx, ctrlclient.ObjectKey{Namespace: namespace, Name: daemonsetWindows}, dsWindows); err != nil { dsWindows = nil if !apierrors.IsNotFound(err) { - if lookupErr == nil { - lookupErr = errors.Wrap(err, "failed to get windows node-agent daemonset") - } + lookupErr = errors.CombineErrors(lookupErr, errors.Wrap(err, "failed to get windows node-agent daemonset")) } } diff --git a/pkg/nodeagent/node_agent_test.go b/pkg/nodeagent/node_agent_test.go index 24e1471d9..40e0d3fd8 100644 --- a/pkg/nodeagent/node_agent_test.go +++ b/pkg/nodeagent/node_agent_test.go @@ -18,6 +18,7 @@ package nodeagent import ( "context" + "fmt" "testing" "github.com/cockroachdb/errors" @@ -408,6 +409,35 @@ func TestIsReady(t *testing.T) { } } +// TestIsReadyBothDaemonsetsGetError ensures that when both daemonset lookups +// return a non-NotFound error, the linux error is returned as the primary +// error while the windows error is retained as a secondary/attached error +// rather than being silently discarded. +func TestIsReadyBothDaemonsetsGetError(t *testing.T) { + scheme := runtime.NewScheme() + appsv1api.AddToScheme(scheme) + + fakeClient := clientFake.NewClientBuilder(). + WithScheme(scheme). + WithInterceptorFuncs(interceptor.Funcs{ + Get: func(ctx context.Context, c ctrlclient.WithWatch, key ctrlclient.ObjectKey, obj ctrlclient.Object, opts ...ctrlclient.GetOption) error { + if key.Name == "node-agent" { + return errors.New("fake-linux-get-error") + } + if key.Name == "node-agent-windows" { + return errors.New("fake-windows-get-error") + } + return c.Get(ctx, key, obj, opts...) + }, + }). + Build() + + err := IsReady(t.Context(), "fake-ns", fakeClient) + require.Error(t, err) + assert.EqualError(t, err, "failed to get linux node-agent daemonset: fake-linux-get-error") + assert.Contains(t, fmt.Sprintf("%+v", err), "failed to get windows node-agent daemonset: fake-windows-get-error") +} + func TestGetPodSpec(t *testing.T) { podSpec := corev1api.PodSpec{ NodeName: "fake-node",