Skip to content

Commit 96815d6

Browse files
authored
Merge pull request kubernetes#125379 from p0lyn0mial/upstream-unstructured-testdataconsistencychecker
client-go/consistencydetector: refactor TestDataConsistencyChecker to work with unstructured data
2 parents 169a952 + c8971c4 commit 96815d6

File tree

1 file changed

+69
-20
lines changed

1 file changed

+69
-20
lines changed

staging/src/k8s.io/client-go/util/consistencydetector/data_consistency_detector_test.go

Lines changed: 69 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import (
2525

2626
v1 "k8s.io/api/core/v1"
2727
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
28+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
2829
"k8s.io/apimachinery/pkg/runtime"
2930
"k8s.io/apimachinery/pkg/types"
3031
"k8s.io/utils/ptr"
@@ -34,22 +35,24 @@ func TestDataConsistencyChecker(t *testing.T) {
3435
scenarios := []struct {
3536
name string
3637

37-
listResponse *v1.PodList
38-
retrievedItems []*v1.Pod
39-
requestOptions metav1.ListOptions
38+
lastSyncedResourceVersion string
39+
listResponse runtime.Object
40+
retrievedItems []runtime.Object
41+
requestOptions metav1.ListOptions
4042

4143
expectedRequestOptions []metav1.ListOptions
4244
expectedListRequests int
4345
expectPanic bool
4446
}{
4547
{
46-
name: "data consistency check won't panic when data is consistent",
48+
name: "data consistency check won't panic when data is consistent",
49+
lastSyncedResourceVersion: "2",
4750
listResponse: &v1.PodList{
4851
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
4952
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2")},
5053
},
5154
requestOptions: metav1.ListOptions{TimeoutSeconds: ptr.To(int64(39))},
52-
retrievedItems: []*v1.Pod{makePod("p1", "1"), makePod("p2", "2")},
55+
retrievedItems: []runtime.Object{makePod("p1", "1"), makePod("p2", "2")},
5356
expectedListRequests: 1,
5457
expectedRequestOptions: []metav1.ListOptions{
5558
{
@@ -61,13 +64,42 @@ func TestDataConsistencyChecker(t *testing.T) {
6164
},
6265

6366
{
64-
name: "legacy, the limit is removed from the list options when it wasn't honored by the watch cache",
67+
name: "data consistency check works with unstructured data (dynamic client)",
68+
lastSyncedResourceVersion: "2",
69+
listResponse: &unstructured.UnstructuredList{
70+
Object: map[string]interface{}{
71+
"apiVersion": "vTest",
72+
"kind": "rTestList",
73+
},
74+
Items: []unstructured.Unstructured{
75+
*makeUnstructuredObject("vTest", "rTest", "item1"),
76+
*makeUnstructuredObject("vTest", "rTest", "item2"),
77+
},
78+
},
79+
requestOptions: metav1.ListOptions{TimeoutSeconds: ptr.To(int64(39))},
80+
retrievedItems: []runtime.Object{
81+
makeUnstructuredObject("vTest", "rTest", "item1"),
82+
makeUnstructuredObject("vTest", "rTest", "item2"),
83+
},
84+
expectedListRequests: 1,
85+
expectedRequestOptions: []metav1.ListOptions{
86+
{
87+
ResourceVersion: "2",
88+
ResourceVersionMatch: metav1.ResourceVersionMatchExact,
89+
TimeoutSeconds: ptr.To(int64(39)),
90+
},
91+
},
92+
},
93+
94+
{
95+
name: "legacy, the limit is removed from the list options when it wasn't honored by the watch cache",
96+
lastSyncedResourceVersion: "2",
6597
listResponse: &v1.PodList{
6698
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
6799
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2"), *makePod("p3", "3")},
68100
},
69101
requestOptions: metav1.ListOptions{ResourceVersion: "0", Limit: 2},
70-
retrievedItems: []*v1.Pod{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
102+
retrievedItems: []runtime.Object{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
71103
expectedListRequests: 1,
72104
expectedRequestOptions: []metav1.ListOptions{
73105
{
@@ -78,13 +110,14 @@ func TestDataConsistencyChecker(t *testing.T) {
78110
},
79111

80112
{
81-
name: "the limit is NOT removed from the list options for non-legacy request",
113+
name: "the limit is NOT removed from the list options for non-legacy request",
114+
lastSyncedResourceVersion: "2",
82115
listResponse: &v1.PodList{
83116
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
84117
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2"), *makePod("p3", "3")},
85118
},
86119
requestOptions: metav1.ListOptions{ResourceVersion: "2", Limit: 2},
87-
retrievedItems: []*v1.Pod{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
120+
retrievedItems: []runtime.Object{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
88121
expectedListRequests: 1,
89122
expectedRequestOptions: []metav1.ListOptions{
90123
{
@@ -96,13 +129,14 @@ func TestDataConsistencyChecker(t *testing.T) {
96129
},
97130

98131
{
99-
name: "legacy, the limit is NOT removed from the list options when the watch cache is disabled",
132+
name: "legacy, the limit is NOT removed from the list options when the watch cache is disabled",
133+
lastSyncedResourceVersion: "2",
100134
listResponse: &v1.PodList{
101135
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
102136
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2"), *makePod("p3", "3")},
103137
},
104138
requestOptions: metav1.ListOptions{ResourceVersion: "0", Limit: 5},
105-
retrievedItems: []*v1.Pod{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
139+
retrievedItems: []runtime.Object{makePod("p1", "1"), makePod("p2", "2"), makePod("p3", "3")},
106140
expectedListRequests: 1,
107141
expectedRequestOptions: []metav1.ListOptions{
108142
{
@@ -114,7 +148,8 @@ func TestDataConsistencyChecker(t *testing.T) {
114148
},
115149

116150
{
117-
name: "data consistency check won't panic when there is no data",
151+
name: "data consistency check won't panic when there is no data",
152+
lastSyncedResourceVersion: "2",
118153
listResponse: &v1.PodList{
119154
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
120155
},
@@ -136,7 +171,8 @@ func TestDataConsistencyChecker(t *testing.T) {
136171
},
137172

138173
{
139-
name: "data consistency check won't be performed when ResourceVersion was set to 0",
174+
name: "data consistency check won't be performed when ResourceVersion was set to 0",
175+
lastSyncedResourceVersion: "0",
140176
listResponse: &v1.PodList{
141177
ListMeta: metav1.ListMeta{ResourceVersion: "0"},
142178
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2")},
@@ -146,13 +182,14 @@ func TestDataConsistencyChecker(t *testing.T) {
146182
},
147183

148184
{
149-
name: "data consistency panics when data is inconsistent",
185+
name: "data consistency panics when data is inconsistent",
186+
lastSyncedResourceVersion: "2",
150187
listResponse: &v1.PodList{
151188
ListMeta: metav1.ListMeta{ResourceVersion: "2"},
152189
Items: []v1.Pod{*makePod("p1", "1"), *makePod("p2", "2"), *makePod("p3", "3")},
153190
},
154191
requestOptions: metav1.ListOptions{TimeoutSeconds: ptr.To(int64(39))},
155-
retrievedItems: []*v1.Pod{makePod("p1", "1"), makePod("p2", "2")},
192+
retrievedItems: []runtime.Object{makePod("p1", "1"), makePod("p2", "2")},
156193
expectedListRequests: 1,
157194
expectedRequestOptions: []metav1.ListOptions{
158195
{
@@ -172,16 +209,16 @@ func TestDataConsistencyChecker(t *testing.T) {
172209
scenario.listResponse = &v1.PodList{}
173210
}
174211
fakeLister := &listWrapper{response: scenario.listResponse}
175-
retrievedItemsFunc := func() []*v1.Pod {
212+
retrievedItemsFunc := func() []runtime.Object {
176213
return scenario.retrievedItems
177214
}
178215

179216
if scenario.expectPanic {
180217
require.Panics(t, func() {
181-
CheckDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
218+
CheckDataConsistency(ctx, "", scenario.lastSyncedResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
182219
})
183220
} else {
184-
CheckDataConsistency(ctx, "", scenario.listResponse.ResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
221+
CheckDataConsistency(ctx, "", scenario.lastSyncedResourceVersion, fakeLister.List, scenario.requestOptions, retrievedItemsFunc)
185222
}
186223

187224
require.Equal(t, fakeLister.counter, scenario.expectedListRequests)
@@ -218,10 +255,10 @@ func (lw *errorLister) List(_ context.Context, _ metav1.ListOptions) (runtime.Ob
218255
type listWrapper struct {
219256
counter int
220257
requestOptions []metav1.ListOptions
221-
response *v1.PodList
258+
response runtime.Object
222259
}
223260

224-
func (lw *listWrapper) List(_ context.Context, opts metav1.ListOptions) (*v1.PodList, error) {
261+
func (lw *listWrapper) List(_ context.Context, opts metav1.ListOptions) (runtime.Object, error) {
225262
lw.counter++
226263
lw.requestOptions = append(lw.requestOptions, opts)
227264
return lw.response, nil
@@ -230,3 +267,15 @@ func (lw *listWrapper) List(_ context.Context, opts metav1.ListOptions) (*v1.Pod
230267
func makePod(name, rv string) *v1.Pod {
231268
return &v1.Pod{ObjectMeta: metav1.ObjectMeta{Name: name, ResourceVersion: rv, UID: types.UID(name)}}
232269
}
270+
271+
func makeUnstructuredObject(version, kind, name string) *unstructured.Unstructured {
272+
return &unstructured.Unstructured{
273+
Object: map[string]interface{}{
274+
"apiVersion": version,
275+
"kind": kind,
276+
"metadata": map[string]interface{}{
277+
"name": name,
278+
},
279+
},
280+
}
281+
}

0 commit comments

Comments
 (0)