Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions pkg/controller/kubelet-config/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
82 changes: 82 additions & 0 deletions pkg/controller/kubelet-config/kubelet_config_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"context"
"fmt"
"reflect"
"strings"
"testing"

ign3types "github.com/coreos/ignition/v2/config/v3_5/types"
Expand Down Expand Up @@ -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) {
Expand Down