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
3 changes: 3 additions & 0 deletions pkg/controller/common/constants.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion pkg/controller/kubelet-config/helpers.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
58 changes: 58 additions & 0 deletions pkg/controller/template/template_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package template
import (
"fmt"
"reflect"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -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)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ mode: 0644
path: "/etc/node-sizing-enabled.env"
contents:
inline: |
NODE_SIZING_ENABLED=false
NODE_SIZING_ENABLED=true
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm
Thanks @ngopalak-redhat

SYSTEM_RESERVED_MEMORY=1Gi
SYSTEM_RESERVED_CPU=500m
SYSTEM_RESERVED_ES=1Gi
91 changes: 91 additions & 0 deletions test/e2e-bootstrap/bootstrap_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down