From 63d1f5438709a9e541e0136ce6193c87b0acf59c Mon Sep 17 00:00:00 2001 From: Neeraj Krishna Gopalakrishna Date: Wed, 11 Mar 2026 08:38:12 +0530 Subject: [PATCH] NO-ISSUE: Allow setting kubeletconfig log level to zero --- pkg/controller/kubelet-config/helpers.go | 4 +- .../kubelet_config_controller_test.go | 82 +++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/pkg/controller/kubelet-config/helpers.go b/pkg/controller/kubelet-config/helpers.go index 25f158a02f..b190b48a0d 100644 --- a/pkg/controller/kubelet-config/helpers.go +++ b/pkg/controller/kubelet-config/helpers.go @@ -349,8 +349,8 @@ func getManagedKubeletConfigKeyDeprecated(pool *mcfgv1.MachineConfigPool) string // validates a KubeletConfig and returns an error if invalid // nolint:gocyclo func validateUserKubeletConfig(cfg *mcfgv1.KubeletConfig) error { - if cfg.Spec.LogLevel != nil && (*cfg.Spec.LogLevel < 1 || *cfg.Spec.LogLevel > 10) { - return fmt.Errorf("KubeletConfig's LogLevel is not valid [1,10]: %v", cfg.Spec.LogLevel) + if cfg.Spec.LogLevel != nil && (*cfg.Spec.LogLevel < 0 || *cfg.Spec.LogLevel > 10) { + return fmt.Errorf("KubeletConfig's LogLevel is not valid [0,10]: %d", *cfg.Spec.LogLevel) } if cfg.Spec.KubeletConfig == nil || cfg.Spec.KubeletConfig.Raw == nil { return nil diff --git a/pkg/controller/kubelet-config/kubelet_config_controller_test.go b/pkg/controller/kubelet-config/kubelet_config_controller_test.go index e1b6c84454..a99cf0ccda 100644 --- a/pkg/controller/kubelet-config/kubelet_config_controller_test.go +++ b/pkg/controller/kubelet-config/kubelet_config_controller_test.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "reflect" + "strings" "testing" ign3types "github.com/coreos/ignition/v2/config/v3_5/types" @@ -973,6 +974,87 @@ func TestKubeletConfigDenylistedOptions(t *testing.T) { } } +func TestKubeletConfigLogLevel(t *testing.T) { + // Test cases for valid LogLevel values + validLogLevels := []struct { + name string + logLevel *int32 + }{ + { + name: "LogLevel 0 - minimal logging", + logLevel: pointer.Int32Ptr(0), + }, + { + name: "LogLevel 2 - default", + logLevel: pointer.Int32Ptr(2), + }, + { + name: "LogLevel 10 - max verbosity", + logLevel: pointer.Int32Ptr(10), + }, + { + name: "LogLevel nil - unset", + logLevel: nil, + }, + } + + // Test cases for invalid LogLevel values + invalidLogLevels := []struct { + name string + logLevel *int32 + }{ + { + name: "LogLevel -1 - negative", + logLevel: pointer.Int32Ptr(-1), + }, + { + name: "LogLevel 11 - above max", + logLevel: pointer.Int32Ptr(11), + }, + } + + // Test valid LogLevel values + for _, test := range validLogLevels { + t.Run(test.name, func(t *testing.T) { + kc := &mcfgv1.KubeletConfig{ + TypeMeta: metav1.TypeMeta{APIVersion: mcfgv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{Name: "test-loglevel", UID: types.UID(utilrand.String(5))}, + Spec: mcfgv1.KubeletConfigSpec{ + LogLevel: test.logLevel, + MachineConfigPoolSelector: metav1.AddLabelToSelector(&metav1.LabelSelector{}, "", ""), + }, + } + err := validateUserKubeletConfig(kc) + if err != nil { + t.Errorf("%s: validation failed with error: %v, but should have succeeded", test.name, err) + } + }) + } + + // Test invalid LogLevel values + for _, test := range invalidLogLevels { + t.Run(test.name, func(t *testing.T) { + kc := &mcfgv1.KubeletConfig{ + TypeMeta: metav1.TypeMeta{APIVersion: mcfgv1.SchemeGroupVersion.String()}, + ObjectMeta: metav1.ObjectMeta{Name: "test-loglevel", UID: types.UID(utilrand.String(5))}, + Spec: mcfgv1.KubeletConfigSpec{ + LogLevel: test.logLevel, + MachineConfigPoolSelector: metav1.AddLabelToSelector(&metav1.LabelSelector{}, "", ""), + }, + } + err := validateUserKubeletConfig(kc) + if err == nil { + t.Errorf("%s: validation succeeded but should have failed for LogLevel %d", test.name, *test.logLevel) + } else { + expectedErrMsg := fmt.Sprintf("KubeletConfig's LogLevel is not valid [0,10]: %d", *test.logLevel) + if !strings.Contains(err.Error(), expectedErrMsg) { + t.Errorf("%s: expected error message containing '%s', got '%s'", test.name, expectedErrMsg, err.Error()) + } + } + }) + } +} + func TestKubeletFeatureExists(t *testing.T) { for _, platform := range []osev1.PlatformType{osev1.AWSPlatformType, osev1.NonePlatformType, "Unrecognized"} { t.Run(string(platform), func(t *testing.T) {