Incrementing EndpointSlice generation when labels change

EndpointSlice labels can be quite meaningful. They are used to indicate
the controller they are managed by and the Service they are associated
with. Changing these labels can have significant affects on how the
EndpointSlice is consumed so incrementing generation seems appropriate.
This commit is contained in:
Rob Scott 2021-03-03 19:05:23 -08:00
parent 4f9317596c
commit b1434d1ea3
No known key found for this signature in database
GPG Key ID: 90C19B2D4A99C91B
2 changed files with 94 additions and 1 deletions

View File

@ -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
}

View File

@ -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"
@ -600,3 +602,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)
}
})
}
}