add observedGeneration to pod's dropDisabledStatusFields

This commit is contained in:
Natasha Sarkar 2025-03-06 20:14:32 +00:00
parent 6edd921746
commit 12d34624ba
2 changed files with 123 additions and 7 deletions

View File

@ -854,6 +854,13 @@ func dropDisabledPodStatusFields(podStatus, oldPodStatus *api.PodStatus, podSpec
dropUserField(podStatus.ContainerStatuses) dropUserField(podStatus.ContainerStatuses)
dropUserField(podStatus.EphemeralContainerStatuses) dropUserField(podStatus.EphemeralContainerStatuses)
} }
if !utilfeature.DefaultFeatureGate.Enabled(features.PodObservedGenerationTracking) && !podObservedGenerationTrackingInUse(oldPodStatus) {
podStatus.ObservedGeneration = 0
for i := range podStatus.Conditions {
podStatus.Conditions[i].ObservedGeneration = 0
}
}
} }
// dropDisabledDynamicResourceAllocationFields removes pod claim references from // dropDisabledDynamicResourceAllocationFields removes pod claim references from
@ -1050,18 +1057,28 @@ func nodeTaintsPolicyInUse(podSpec *api.PodSpec) bool {
// hostUsersInUse returns true if the pod spec has spec.hostUsers field set. // hostUsersInUse returns true if the pod spec has spec.hostUsers field set.
func hostUsersInUse(podSpec *api.PodSpec) bool { func hostUsersInUse(podSpec *api.PodSpec) bool {
if podSpec != nil && podSpec.SecurityContext != nil && podSpec.SecurityContext.HostUsers != nil { return podSpec != nil && podSpec.SecurityContext != nil && podSpec.SecurityContext.HostUsers != nil
return true
}
return false
} }
func supplementalGroupsPolicyInUse(podSpec *api.PodSpec) bool { func supplementalGroupsPolicyInUse(podSpec *api.PodSpec) bool {
if podSpec != nil && podSpec.SecurityContext != nil && podSpec.SecurityContext.SupplementalGroupsPolicy != nil { return podSpec != nil && podSpec.SecurityContext != nil && podSpec.SecurityContext.SupplementalGroupsPolicy != nil
}
func podObservedGenerationTrackingInUse(podStatus *api.PodStatus) bool {
if podStatus == nil {
return false
}
if podStatus.ObservedGeneration != 0 {
return true return true
} }
for _, condition := range podStatus.Conditions {
if condition.ObservedGeneration != 0 {
return true
}
}
return false return false
} }

View File

@ -21,6 +21,7 @@ import (
"reflect" "reflect"
"strings" "strings"
"testing" "testing"
"time"
"github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -1016,7 +1017,7 @@ func TestValidatePodDeletionCostOption(t *testing.T) {
} }
} }
func TestDropDisabledPodStatusFields(t *testing.T) { func TestDropDisabledPodStatusFields_HostIPs(t *testing.T) {
podWithHostIPs := func() *api.PodStatus { podWithHostIPs := func() *api.PodStatus {
return &api.PodStatus{ return &api.PodStatus{
HostIPs: makeHostIPs("10.0.0.1", "fd00:10::1"), HostIPs: makeHostIPs("10.0.0.1", "fd00:10::1"),
@ -1083,6 +1084,104 @@ func makeHostIPs(ips ...string) []api.HostIP {
return ret return ret
} }
func TestDropDisabledPodStatusFields_ObservedGeneration(t *testing.T) {
now := metav1.NewTime(time.Now())
podWithObservedGen := func() *api.PodStatus {
return &api.PodStatus{
ObservedGeneration: 1,
Conditions: []api.PodCondition{{
LastProbeTime: now,
LastTransitionTime: now,
}},
}
}
podWithObservedGenInConditions := func() *api.PodStatus {
return &api.PodStatus{
Conditions: []api.PodCondition{{
LastProbeTime: now,
LastTransitionTime: now,
ObservedGeneration: 1,
}},
}
}
podWithoutObservedGen := func() *api.PodStatus {
return &api.PodStatus{
Conditions: []api.PodCondition{{
LastProbeTime: now,
LastTransitionTime: now,
}},
}
}
tests := []struct {
name string
podStatus *api.PodStatus
oldPodStatus *api.PodStatus
wantPodStatus *api.PodStatus
}{
{
name: "old=without, new=without",
oldPodStatus: podWithoutObservedGen(),
podStatus: podWithoutObservedGen(),
wantPodStatus: podWithoutObservedGen(),
},
{
name: "old=without, new=with",
oldPodStatus: podWithoutObservedGen(),
podStatus: podWithObservedGen(),
wantPodStatus: podWithoutObservedGen(),
},
{
name: "old=with, new=without",
oldPodStatus: podWithObservedGen(),
podStatus: podWithoutObservedGen(),
wantPodStatus: podWithoutObservedGen(),
},
{
name: "old=with, new=with",
oldPodStatus: podWithObservedGen(),
podStatus: podWithObservedGen(),
wantPodStatus: podWithObservedGen(),
},
{
name: "old=without, new=withInConditions",
oldPodStatus: podWithoutObservedGen(),
podStatus: podWithObservedGenInConditions(),
wantPodStatus: podWithoutObservedGen(),
},
{
name: "old=withInConditions, new=without",
oldPodStatus: podWithObservedGenInConditions(),
podStatus: podWithoutObservedGen(),
wantPodStatus: podWithoutObservedGen(),
},
{
name: "old=withInConditions, new=withInCondtions",
oldPodStatus: podWithObservedGenInConditions(),
podStatus: podWithObservedGenInConditions(),
wantPodStatus: podWithObservedGenInConditions(),
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
dropDisabledPodStatusFields(tt.podStatus, tt.oldPodStatus, &api.PodSpec{}, &api.PodSpec{})
if !reflect.DeepEqual(tt.podStatus, tt.wantPodStatus) {
t.Errorf("dropDisabledStatusFields() = %v, want %v", tt.podStatus, tt.wantPodStatus)
}
})
}
}
func TestDropNodeInclusionPolicyFields(t *testing.T) { func TestDropNodeInclusionPolicyFields(t *testing.T) {
ignore := api.NodeInclusionPolicyIgnore ignore := api.NodeInclusionPolicyIgnore
honor := api.NodeInclusionPolicyHonor honor := api.NodeInclusionPolicyHonor