diff --git a/pkg/registry/discovery/endpointslice/strategy.go b/pkg/registry/discovery/endpointslice/strategy.go index 92cb2e65e063..7fc26e2cd4ba 100644 --- a/pkg/registry/discovery/endpointslice/strategy.go +++ b/pkg/registry/discovery/endpointslice/strategy.go @@ -65,7 +65,7 @@ func (endpointSliceStrategy) PrepareForUpdate(ctx context.Context, obj, old runt newEPS.ObjectMeta = v1.ObjectMeta{} oldEPS.ObjectMeta = v1.ObjectMeta{} - if !apiequality.Semantic.DeepEqual(newEPS, oldEPS) { + if !apiequality.Semantic.DeepEqual(newEPS, oldEPS) || !apiequality.Semantic.DeepEqual(ogNewMeta.Labels, ogOldMeta.Labels) { ogNewMeta.Generation = ogOldMeta.Generation + 1 } diff --git a/pkg/registry/discovery/endpointslice/strategy_test.go b/pkg/registry/discovery/endpointslice/strategy_test.go index 443686558372..e1e5eccebbc1 100644 --- a/pkg/registry/discovery/endpointslice/strategy_test.go +++ b/pkg/registry/discovery/endpointslice/strategy_test.go @@ -17,9 +17,11 @@ limitations under the License. package endpointslice import ( + "context" "testing" apiequality "k8s.io/apimachinery/pkg/api/equality" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" utilfeature "k8s.io/apiserver/pkg/util/feature" featuregatetesting "k8s.io/component-base/featuregate/testing" "k8s.io/kubernetes/pkg/apis/discovery" @@ -535,3 +537,94 @@ func Test_dropDisabledFieldsOnUpdate(t *testing.T) { }) } } + +func TestPrepareForUpdate(t *testing.T) { + testCases := []struct { + name string + oldEPS *discovery.EndpointSlice + newEPS *discovery.EndpointSlice + expectedEPS *discovery.EndpointSlice + }{ + { + name: "unchanged EPS should not increment generation", + oldEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 1}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + newEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 1}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + expectedEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 1}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + }, + { + name: "changed endpoints should increment generation", + oldEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 1}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + newEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 1}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.5"}, + }}, + }, + expectedEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{Generation: 2}, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.5"}, + }}, + }, + }, + { + name: "changed labels should increment generation", + oldEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Generation: 1, + Labels: map[string]string{"example": "one"}, + }, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + newEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Generation: 1, + Labels: map[string]string{"example": "two"}, + }, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + expectedEPS: &discovery.EndpointSlice{ + ObjectMeta: metav1.ObjectMeta{ + Generation: 2, + Labels: map[string]string{"example": "two"}, + }, + Endpoints: []discovery.Endpoint{{ + Addresses: []string{"1.2.3.4"}, + }}, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + Strategy.PrepareForUpdate(context.TODO(), tc.newEPS, tc.oldEPS) + if !apiequality.Semantic.DeepEqual(tc.newEPS, tc.expectedEPS) { + t.Errorf("Expected %+v\nGot: %+v", tc.expectedEPS, tc.newEPS) + } + }) + } +}