diff --git a/pkg/kubelet/apis/config/validation/validation.go b/pkg/kubelet/apis/config/validation/validation.go index 34de5dd02cf..40c2a16de7d 100644 --- a/pkg/kubelet/apis/config/validation/validation.go +++ b/pkg/kubelet/apis/config/validation/validation.go @@ -155,6 +155,11 @@ func ValidateKubeletConfiguration(kc *kubeletconfig.KubeletConfiguration) error if (kc.ShutdownGracePeriod.Duration > 0 || kc.ShutdownGracePeriodCriticalPods.Duration > 0) && !localFeatureGate.Enabled(features.GracefulNodeShutdown) { allErrors = append(allErrors, fmt.Errorf("invalid configuration: Specifying ShutdownGracePeriod or ShutdownGracePeriodCriticalPods requires feature gate GracefulNodeShutdown")) } + if localFeatureGate.Enabled(features.NodeSwapEnabled) { + if kc.MemorySwap.SwapBehavior != "" && kc.MemorySwap.SwapBehavior != "NoSwap" && kc.MemorySwap.SwapBehavior != "UnlimitedSwap" { + allErrors = append(allErrors, fmt.Errorf("invalid configuration: MemorySwap.SwapBehavior %v must be one of: NoSwap, UnlimitedSwap", kc.MemorySwap.SwapBehavior)) + } + } for _, val := range kc.EnforceNodeAllocatable { switch val { diff --git a/pkg/kubelet/apis/config/validation/validation_test.go b/pkg/kubelet/apis/config/validation/validation_test.go index 7b65714e7b6..87c7924d541 100644 --- a/pkg/kubelet/apis/config/validation/validation_test.go +++ b/pkg/kubelet/apis/config/validation/validation_test.go @@ -145,9 +145,11 @@ func TestValidateKubeletConfiguration(t *testing.T) { TopologyManagerPolicy: kubeletconfig.NoneTopologyManagerPolicy, ShutdownGracePeriod: metav1.Duration{Duration: 10 * time.Minute}, ShutdownGracePeriodCriticalPods: metav1.Duration{Duration: 0}, + MemorySwap: kubeletconfig.MemorySwapConfiguration{SwapBehavior: "UnlimitedSwap"}, FeatureGates: map[string]bool{ "CustomCPUCFSQuotaPeriod": true, "GracefulNodeShutdown": true, + "NodeSwapEnabled": true, }, Logging: componentbaseconfig.LoggingConfiguration{ Format: "text", @@ -225,15 +227,17 @@ func TestValidateKubeletConfiguration(t *testing.T) { TopologyManagerPolicy: "invalid", ShutdownGracePeriod: metav1.Duration{Duration: 40 * time.Second}, ShutdownGracePeriodCriticalPods: metav1.Duration{Duration: 10 * time.Second}, + MemorySwap: kubeletconfig.MemorySwapConfiguration{SwapBehavior: "invalid"}, FeatureGates: map[string]bool{ "CustomCPUCFSQuotaPeriod": true, "GracefulNodeShutdown": true, + "NodeSwapEnabled": true, }, Logging: componentbaseconfig.LoggingConfiguration{ Format: "text", }, } - const numErrsErrorCase2 = 3 + const numErrsErrorCase2 = 4 if allErrors := ValidateKubeletConfiguration(errorCase2); len(allErrors.(utilerrors.Aggregate).Errors()) != numErrsErrorCase2 { t.Errorf("expect %d errors, got %v", numErrsErrorCase2, len(allErrors.(utilerrors.Aggregate).Errors())) }