From af84bbfc3d09dfda66524872c3d25636fc775f51 Mon Sep 17 00:00:00 2001 From: nispriha Date: Wed, 15 Jul 2026 14:25:00 +0530 Subject: [PATCH] Add feature gate drop logic for emptyDir mode --- pkg/api/pod/util.go | 20 ++++++++ pkg/api/pod/util_test.go | 101 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 121 insertions(+) diff --git a/pkg/api/pod/util.go b/pkg/api/pod/util.go index 411e9c83eb1..34c621040ed 100644 --- a/pkg/api/pod/util.go +++ b/pkg/api/pod/util.go @@ -799,6 +799,14 @@ func dropDisabledFields( } } + if !utilfeature.DefaultFeatureGate.Enabled(features.EmptyDirVolumeMode) && !emptyDirVolumeModeInUse(oldPodSpec) { + for i := range podSpec.Volumes { + if podSpec.Volumes[i].EmptyDir != nil { + podSpec.Volumes[i].EmptyDir.Mode = nil + } + } + } + if !utilfeature.DefaultFeatureGate.Enabled(features.HostnameOverride) && !setHostnameOverrideInUse(oldPodSpec) { // Set HostnameOverride to nil only if feature is disabled and it is not used podSpec.HostnameOverride = nil @@ -1532,6 +1540,18 @@ func rroInUse(podSpec *api.PodSpec) bool { return inUse } +func emptyDirVolumeModeInUse(podSpec *api.PodSpec) bool { + if podSpec == nil { + return false + } + for _, vol := range podSpec.Volumes { + if vol.EmptyDir != nil && vol.EmptyDir.Mode != nil { + return true + } + } + return false +} + func dropDisabledClusterTrustBundleProjection(podSpec, oldPodSpec *api.PodSpec) { if utilfeature.DefaultFeatureGate.Enabled(features.ClusterTrustBundleProjection) { return diff --git a/pkg/api/pod/util_test.go b/pkg/api/pod/util_test.go index 8210acc549a..3eebee57239 100644 --- a/pkg/api/pod/util_test.go +++ b/pkg/api/pod/util_test.go @@ -5394,6 +5394,107 @@ func TestDropHostnameOverride(t *testing.T) { } } +func TestDropEmptyDirVolumeMode(t *testing.T) { + mode := int32(0o755) + + podWithMode := func() *api.Pod { + return &api.Pod{ + Spec: api.PodSpec{ + Volumes: []api.Volume{ + { + Name: "vol", + VolumeSource: api.VolumeSource{ + EmptyDir: &api.EmptyDirVolumeSource{Mode: &mode}, + }, + }, + }, + }, + } + } + podWithoutMode := func() *api.Pod { + return &api.Pod{ + Spec: api.PodSpec{ + Volumes: []api.Volume{ + { + Name: "vol", + VolumeSource: api.VolumeSource{ + EmptyDir: &api.EmptyDirVolumeSource{}, + }, + }, + }, + }, + } + } + + oldPodInfo := []struct { + description string + hasMode bool + pod func() *api.Pod + }{ + { + description: "old pod with mode", + hasMode: true, + pod: podWithMode, + }, + { + description: "old pod without mode", + hasMode: false, + pod: podWithoutMode, + }, + } + + newPodInfo := []struct { + description string + hasMode bool + pod func() *api.Pod + }{ + { + description: "new pod with mode", + hasMode: true, + pod: podWithMode, + }, + { + description: "new pod without mode", + hasMode: false, + pod: podWithoutMode, + }, + } + + for _, enabled := range []bool{true, false} { + for _, oldPodInfo := range oldPodInfo { + for _, newPodInfo := range newPodInfo { + oldPodHasMode, oldPod := oldPodInfo.hasMode, oldPodInfo.pod() + newPodHasMode, newPod := newPodInfo.hasMode, newPodInfo.pod() + + t.Run(fmt.Sprintf("feature enabled=%v, old pod %v, new pod %v", enabled, oldPodInfo.description, newPodInfo.description), func(t *testing.T) { + featuregatetesting.SetFeatureGateDuringTest(t, utilfeature.DefaultFeatureGate, features.EmptyDirVolumeMode, enabled) + + DropDisabledPodFields(newPod, oldPod) + + if !reflect.DeepEqual(oldPod, oldPodInfo.pod()) { + t.Errorf("old pod changed: %v", cmp.Diff(oldPod, oldPodInfo.pod())) + } + + switch { + case enabled || oldPodHasMode: + if !reflect.DeepEqual(newPod, newPodInfo.pod()) { + t.Errorf("new pod changed: %v", cmp.Diff(newPod, newPodInfo.pod())) + } + case newPodHasMode: + if exp := podWithoutMode(); !reflect.DeepEqual(newPod, exp) { + t.Errorf("new pod had EmptyDir Mode but should have been stripped: %v", cmp.Diff(newPod, exp)) + } + default: + if !reflect.DeepEqual(newPod, newPodInfo.pod()) { + t.Errorf("new pod changed: %v", cmp.Diff(newPod, newPodInfo.pod())) + } + } + }) + } + } + } +} + func TestDropFileKeyRefInUse(t *testing.T) { testCases := []struct { name string