From 61e70f4643fea64fa29fefb9d387de234c29b921 Mon Sep 17 00:00:00 2001 From: Tiger Kaovilai Date: Fri, 27 Mar 2026 09:41:51 -0400 Subject: [PATCH] Pass --log-level to NodeAgent DaemonSet container args The DPA LogLevel field was only passed to the Velero server deployment but not to the NodeAgent DaemonSet. This meant data mover pods spawned by the exposer could not inherit the log level from the node-agent, since the exposer reads --log-level from the node-agent container args. Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude Co-Authored-By: Happy Signed-off-by: Tiger Kaovilai --- internal/controller/nodeagent.go | 4 ++++ internal/controller/nodeagent_test.go | 24 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/internal/controller/nodeagent.go b/internal/controller/nodeagent.go index 32a60dc8e11..5572fa378cd 100644 --- a/internal/controller/nodeagent.go +++ b/internal/controller/nodeagent.go @@ -694,6 +694,10 @@ func (r *DataProtectionApplicationReconciler) customizeNodeAgentDaemonset(ds *ap nodeAgentContainer.Args = append(nodeAgentContainer.Args, fmt.Sprintf("--log-format=%s", dpa.Spec.LogFormat)) } + if dpa.Spec.Configuration.Velero.LogLevel != "" { + nodeAgentContainer.Args = append(nodeAgentContainer.Args, fmt.Sprintf("--log-level=%s", dpa.Spec.Configuration.Velero.LogLevel)) + } + // Apply unsupported server args from the specified ConfigMap. // This will completely override any previously set args for the node-agent server. // If the ConfigMap exists and is not empty, its key-value pairs will be used as the new CLI arguments. diff --git a/internal/controller/nodeagent_test.go b/internal/controller/nodeagent_test.go index 92aa9c8df6f..6c8cb40fe2c 100644 --- a/internal/controller/nodeagent_test.go +++ b/internal/controller/nodeagent_test.go @@ -253,6 +253,7 @@ type TestBuiltNodeAgentDaemonSetOptions struct { dataMoverPrepareTimeout *string resourceTimeout *string logFormat *string + logLevel *string toleration []corev1.Toleration nodeSelector map[string]string disableFsBackup *bool @@ -568,6 +569,10 @@ func createTestBuiltNodeAgentDaemonSet(options TestBuiltNodeAgentDaemonSetOption testBuiltNodeAgentDaemonSet.Spec.Template.Spec.Containers[0].Args = append(testBuiltNodeAgentDaemonSet.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--log-format=%s", *options.logFormat)) } + if options.logLevel != nil { + testBuiltNodeAgentDaemonSet.Spec.Template.Spec.Containers[0].Args = append(testBuiltNodeAgentDaemonSet.Spec.Template.Spec.Containers[0].Args, fmt.Sprintf("--log-level=%s", *options.logLevel)) + } + return testBuiltNodeAgentDaemonSet } @@ -783,6 +788,25 @@ func TestDPAReconciler_buildNodeAgentDaemonset(t *testing.T) { logFormat: ptr.To("text"), }), }, + { + name: "valid DPA CR with LogLevel set to debug, NodeAgent DaemonSet is built with LogLevel set to debug", + dpa: createTestDpaWith( + nil, + oadpv1alpha1.DataProtectionApplicationSpec{ + Configuration: &oadpv1alpha1.ApplicationConfig{ + Velero: &oadpv1alpha1.VeleroConfig{ + LogLevel: "debug", + }, + NodeAgent: &oadpv1alpha1.NodeAgentConfig{}, + }, + }, + ), + clientObjects: []client.Object{testGenericInfrastructure}, + nodeAgentDaemonSet: testNodeAgentDaemonSet.DeepCopy(), + wantNodeAgentDaemonSet: createTestBuiltNodeAgentDaemonSet(TestBuiltNodeAgentDaemonSetOptions{ + logLevel: ptr.To("debug"), + }), + }, { name: "valid DPA CR with DataMoverPrepareTimeout and ResourceTimeout, NodeAgent DaemonSet is built with DataMoverPrepareTimeout and ResourceTimeout", dpa: createTestDpaWith(