From a3b1c013efc2c570a565c9661e7f73562ba7f308 Mon Sep 17 00:00:00 2001 From: Neeraj Krishna Gopalakrishna Date: Tue, 4 Nov 2025 08:18:42 +0530 Subject: [PATCH] OCPNODE-3719:From 4.21 AutoSizingReserved set to true for new clusters --- pkg/controller/common/constants.go | 3 + pkg/controller/kubelet-config/helpers.go | 2 +- .../template/template_controller_test.go | 58 ++++++++++++ .../kubelet-auto-node-sizing-enabled.yaml | 2 +- test/e2e-bootstrap/bootstrap_test.go | 91 +++++++++++++++++++ 5 files changed, 154 insertions(+), 2 deletions(-) diff --git a/pkg/controller/common/constants.go b/pkg/controller/common/constants.go index 7e5011d33f..a9f76eb232 100644 --- a/pkg/controller/common/constants.go +++ b/pkg/controller/common/constants.go @@ -140,6 +140,9 @@ const ( // Stub Ignition upgrade related annotation keys StubIgnitionVersionAnnotation = "machineconfiguration.openshift.io/stub-ignition-upgraded-to" StubIgnitionTimestampAnnotation = "machineconfiguration.openshift.io/stub-ignition-upgraded-at" + + // NodeSizingEnabledEnvPath is the file path for the node sizing enabled environment file + NodeSizingEnabledEnvPath = "/etc/node-sizing-enabled.env" ) // Commonly-used MCO ConfigMap names diff --git a/pkg/controller/kubelet-config/helpers.go b/pkg/controller/kubelet-config/helpers.go index 50c0c597ab..37506fef42 100644 --- a/pkg/controller/kubelet-config/helpers.go +++ b/pkg/controller/kubelet-config/helpers.go @@ -68,7 +68,7 @@ func createNewKubeletDynamicSystemReservedIgnition(autoSystemReserved *bool, use config := fmt.Sprintf("NODE_SIZING_ENABLED=%s\nSYSTEM_RESERVED_MEMORY=%s\nSYSTEM_RESERVED_CPU=%s\nSYSTEM_RESERVED_ES=%s\n", autoNodeSizing, systemReservedMemory, systemReservedCPU, systemReservedEphemeralStorage) - r := ctrlcommon.NewIgnFileBytesOverwriting("/etc/node-sizing-enabled.env", []byte(config)) + r := ctrlcommon.NewIgnFileBytesOverwriting(ctrlcommon.NodeSizingEnabledEnvPath, []byte(config)) return &r } diff --git a/pkg/controller/template/template_controller_test.go b/pkg/controller/template/template_controller_test.go index d48e459da0..1e0a0df2ea 100644 --- a/pkg/controller/template/template_controller_test.go +++ b/pkg/controller/template/template_controller_test.go @@ -3,6 +3,7 @@ package template import ( "fmt" "reflect" + "strings" "testing" "time" @@ -448,3 +449,60 @@ func getKey(config *mcfgv1.ControllerConfig, t *testing.T) string { } return key } + +func TestKubeletAutoNodeSizingEnabled(t *testing.T) { + cc := newControllerConfig("test-cluster") + ps := []byte(`{"dummy": "dummy"}`) + + mcs, err := getMachineConfigsForControllerConfig(templateDir, cc, ps, nil) + if err != nil { + t.Fatal(err) + } + + // Find machine configs that should contain the auto-node-sizing file + // The file should be in all role-based machine configs (master, worker) + autoSizingFileFound := false + for _, mc := range mcs { + ignCfg, err := ctrlcommon.ParseAndConvertConfig(mc.Spec.Config.Raw) + if err != nil { + t.Fatalf("Failed to parse ignition config for %s: %v", mc.Name, err) + } + + // Look for the auto-node-sizing file + for _, file := range ignCfg.Storage.Files { + if file.Path == ctrlcommon.NodeSizingEnabledEnvPath { + autoSizingFileFound = true + + // Decode the file contents + contents, err := ctrlcommon.DecodeIgnitionFileContents(file.Contents.Source, file.Contents.Compression) + if err != nil { + t.Fatalf("Failed to decode auto-node-sizing file contents: %v", err) + } + + contentsStr := string(contents) + + // Verify NODE_SIZING_ENABLED=true is present + if !strings.Contains(contentsStr, "NODE_SIZING_ENABLED=true") { + t.Errorf("Expected NODE_SIZING_ENABLED=true in %s, got: %s", mc.Name, contentsStr) + } + + // Verify other expected values + if !strings.Contains(contentsStr, "SYSTEM_RESERVED_MEMORY=1Gi") { + t.Errorf("Expected SYSTEM_RESERVED_MEMORY=1Gi in %s, got: %s", mc.Name, contentsStr) + } + + if !strings.Contains(contentsStr, "SYSTEM_RESERVED_CPU=500m") { + t.Errorf("Expected SYSTEM_RESERVED_CPU=500m in %s, got: %s", mc.Name, contentsStr) + } + + if !strings.Contains(contentsStr, "SYSTEM_RESERVED_ES=1Gi") { + t.Errorf("Expected SYSTEM_RESERVED_ES=1Gi in %s, got: %s", mc.Name, contentsStr) + } + } + } + } + + if !autoSizingFileFound { + t.Errorf("Expected to find %s file in at least one machine config", ctrlcommon.NodeSizingEnabledEnvPath) + } +} diff --git a/templates/common/_base/files/kubelet-auto-node-sizing-enabled.yaml b/templates/common/_base/files/kubelet-auto-node-sizing-enabled.yaml index d1c72a540f..1dc4c3ed61 100644 --- a/templates/common/_base/files/kubelet-auto-node-sizing-enabled.yaml +++ b/templates/common/_base/files/kubelet-auto-node-sizing-enabled.yaml @@ -2,7 +2,7 @@ mode: 0644 path: "/etc/node-sizing-enabled.env" contents: inline: | - NODE_SIZING_ENABLED=false + NODE_SIZING_ENABLED=true SYSTEM_RESERVED_MEMORY=1Gi SYSTEM_RESERVED_CPU=500m SYSTEM_RESERVED_ES=1Gi \ No newline at end of file diff --git a/test/e2e-bootstrap/bootstrap_test.go b/test/e2e-bootstrap/bootstrap_test.go index 1e90d421ca..8412dd05e9 100644 --- a/test/e2e-bootstrap/bootstrap_test.go +++ b/test/e2e-bootstrap/bootstrap_test.go @@ -389,6 +389,97 @@ metadata: } } +func TestNodeSizingEnabled(t *testing.T) { + ctx := context.Background() + + testEnv := framework.NewTestEnv(t) + + configv1.Install(scheme.Scheme) + configv1alpha1.Install(scheme.Scheme) + mcfgv1.Install(scheme.Scheme) + apioperatorsv1alpha1.Install(scheme.Scheme) + + baseTestManifests := loadBaseTestManifests(t) + + cfg, err := testEnv.Start() + require.NoError(t, err) + defer func() { + assert.NoError(t, testEnv.Stop()) + }() + + clientSet := framework.NewClientSetFromConfig(cfg) + + _, err = clientSet.Namespaces().Create(ctx, &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: framework.OpenshiftConfigNamespace, + }, + }, metav1.CreateOptions{}) + require.NoError(t, err) + + _, err = clientSet.Namespaces().Create(ctx, &corev1.Namespace{ + ObjectMeta: metav1.ObjectMeta{ + Name: bootstrapTestName, + }, + }, metav1.CreateOptions{}) + require.NoError(t, err) + + objs := append([]runtime.Object{}, baseTestManifests...) + + // Add node config + nodeConfigManifest := [][]byte{ + []byte(`apiVersion: config.openshift.io/v1 +kind: Node +metadata: + name: cluster`), + } + objs = append(objs, loadRawManifests(t, nodeConfigManifest)...) + + fixture := newTestFixture(t, cfg, objs) + defer framework.CleanEnvironment(t, clientSet) + defer fixture.stop() + + // Fetch the controller rendered configurations + controllerRenderedMasterConfigName, err := helpers.WaitForRenderedConfigs(t, clientSet, "master", []string{"99-master-ssh", "99-master-generated-registries"}...) + require.NoError(t, err) + t.Logf("Controller rendered master config as %q", controllerRenderedMasterConfigName) + + controllerRenderedWorkerConfigName, err := helpers.WaitForRenderedConfigs(t, clientSet, "worker", []string{"99-worker-ssh", "99-worker-generated-registries"}...) + require.NoError(t, err) + t.Logf("Controller rendered worker config as %q", controllerRenderedWorkerConfigName) + + // Verify node sizing enabled file for master + verifyNodeSizingEnabled(t, clientSet, controllerRenderedMasterConfigName) + + // Verify node sizing enabled file for worker + verifyNodeSizingEnabled(t, clientSet, controllerRenderedWorkerConfigName) +} + +func verifyNodeSizingEnabled(t *testing.T, clientSet *framework.ClientSet, renderedConfigName string) { + controllerMC, err := clientSet.MachineConfigs().Get(context.Background(), renderedConfigName, metav1.GetOptions{}) + require.NoError(t, err) + + ignCfg, err := ctrlcommon.ParseAndConvertConfig(controllerMC.Spec.Config.Raw) + require.NoError(t, err) + + // Find the node sizing enabled file + var foundFile bool + for _, file := range ignCfg.Storage.Files { + if file.Path == "/etc/node-sizing-enabled.env" { + foundFile = true + + // Decode the file contents + contents, err := ctrlcommon.DecodeIgnitionFileContents(file.Contents.Source, file.Contents.Compression) + require.NoError(t, err, "Failed to decode node-sizing-enabled.env file contents") + + contentsStr := string(contents) + require.Contains(t, contentsStr, "NODE_SIZING_ENABLED=true", "Expected /etc/node-sizing-enabled.env to contain NODE_SIZING_ENABLED=true in machine config %s", renderedConfigName) + break + } + } + + require.True(t, foundFile, "Expected to find /etc/node-sizing-enabled.env in machine config %s", renderedConfigName) +} + func compareRenderedConfigPool(t *testing.T, clientSet *framework.ClientSet, destDir, poolName, controllerRenderedConfigName string) { paths, err := filepath.Glob(filepath.Join(destDir, "machine-configs", fmt.Sprintf("rendered-%s-*.yaml", poolName))) require.NoError(t, err)