Skip to content

Commit a0e5e24

Browse files
authored
Merge pull request kubernetes#126875 from serathius/watchcache-test-indexers
Adding tests for using indexers in tests
2 parents 6737352 + 711772a commit a0e5e24

File tree

6 files changed

+600
-41
lines changed

6 files changed

+600
-41
lines changed

staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_test.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,12 @@ func TestListResourceVersionMatch(t *testing.T) {
256256
// TODO(#109831): Enable use of this test and run it.
257257
}
258258

259+
func TestNamespaceScopedList(t *testing.T) {
260+
ctx, cacher, terminate := testSetup(t, withSpecNodeNameIndexerFuncs)
261+
t.Cleanup(terminate)
262+
storagetesting.RunTestNamespaceScopedList(ctx, t, cacher)
263+
}
264+
259265
func TestGuaranteedUpdate(t *testing.T) {
260266
// TODO(#109831): Enable use of this test and run it.
261267
}

staging/src/k8s.io/apiserver/pkg/storage/cacher/cacher_whitebox_test.go

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2943,3 +2943,149 @@ func forceRequestWatchProgressSupport(t *testing.T) {
29432943
t.Fatalf("failed to wait for required %v storage feature to initialize", storage.RequestWatchProgress)
29442944
}
29452945
}
2946+
2947+
func TestListIndexer(t *testing.T) {
2948+
ctx, cacher, terminate := testSetup(t, withSpecNodeNameIndexerFuncs)
2949+
t.Cleanup(terminate)
2950+
tests := []struct {
2951+
name string
2952+
requestedNamespace string
2953+
recursive bool
2954+
fieldSelector fields.Selector
2955+
indexFields []string
2956+
expectIndex string
2957+
}{
2958+
{
2959+
name: "request without namespace, without field selector",
2960+
recursive: true,
2961+
fieldSelector: fields.Everything(),
2962+
},
2963+
{
2964+
name: "request without namespace, field selector with metadata.namespace",
2965+
recursive: true,
2966+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2967+
},
2968+
{
2969+
name: "request without namespace, field selector with spec.nodename",
2970+
recursive: true,
2971+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=node"),
2972+
indexFields: []string{"spec.nodeName"},
2973+
expectIndex: "f:spec.nodeName",
2974+
},
2975+
{
2976+
name: "request without namespace, field selector with spec.nodename to filter out",
2977+
recursive: true,
2978+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName!=node"),
2979+
indexFields: []string{"spec.nodeName"},
2980+
},
2981+
{
2982+
name: "request with namespace, without field selector",
2983+
requestedNamespace: "namespace",
2984+
recursive: true,
2985+
fieldSelector: fields.Everything(),
2986+
},
2987+
{
2988+
name: "request with namespace, field selector with matched metadata.namespace",
2989+
requestedNamespace: "namespace",
2990+
recursive: true,
2991+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2992+
},
2993+
{
2994+
name: "request with namespace, field selector with non-matched metadata.namespace",
2995+
requestedNamespace: "namespace",
2996+
recursive: true,
2997+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2998+
},
2999+
{
3000+
name: "request with namespace, field selector with spec.nodename",
3001+
requestedNamespace: "namespace",
3002+
recursive: true,
3003+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=node"),
3004+
indexFields: []string{"spec.nodeName"},
3005+
expectIndex: "f:spec.nodeName",
3006+
},
3007+
{
3008+
name: "request with namespace, field selector with spec.nodename to filter out",
3009+
requestedNamespace: "namespace",
3010+
recursive: true,
3011+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName!=node"),
3012+
indexFields: []string{"spec.nodeName"},
3013+
},
3014+
{
3015+
name: "request without namespace, field selector with metadata.name",
3016+
recursive: true,
3017+
fieldSelector: fields.ParseSelectorOrDie("metadata.name=name"),
3018+
},
3019+
{
3020+
name: "request without namespace, field selector with metadata.name and metadata.namespace",
3021+
recursive: true,
3022+
fieldSelector: fields.SelectorFromSet(fields.Set{
3023+
"metadata.name": "name",
3024+
"metadata.namespace": "namespace",
3025+
}),
3026+
},
3027+
{
3028+
name: "request without namespace, field selector with metadata.name and spec.nodeName",
3029+
recursive: true,
3030+
fieldSelector: fields.SelectorFromSet(fields.Set{
3031+
"metadata.name": "name",
3032+
"spec.nodeName": "node",
3033+
}),
3034+
indexFields: []string{"spec.nodeName"},
3035+
expectIndex: "f:spec.nodeName",
3036+
},
3037+
{
3038+
name: "request without namespace, field selector with metadata.name, and with spec.nodeName to filter out watch",
3039+
recursive: true,
3040+
fieldSelector: fields.AndSelectors(
3041+
fields.ParseSelectorOrDie("spec.nodeName!=node"),
3042+
fields.SelectorFromSet(fields.Set{"metadata.name": "name"}),
3043+
),
3044+
indexFields: []string{"spec.nodeName"},
3045+
},
3046+
{
3047+
name: "request with namespace, with field selector metadata.name",
3048+
requestedNamespace: "namespace",
3049+
fieldSelector: fields.ParseSelectorOrDie("metadata.name=name"),
3050+
},
3051+
{
3052+
name: "request with namespace, with field selector metadata.name and metadata.namespace",
3053+
requestedNamespace: "namespace",
3054+
fieldSelector: fields.SelectorFromSet(fields.Set{
3055+
"metadata.name": "name",
3056+
"metadata.namespace": "namespace",
3057+
}),
3058+
},
3059+
{
3060+
name: "request with namespace, with field selector metadata.name, metadata.namespace and spec.nodename",
3061+
requestedNamespace: "namespace",
3062+
fieldSelector: fields.SelectorFromSet(fields.Set{
3063+
"metadata.name": "name",
3064+
"metadata.namespace": "namespace",
3065+
"spec.nodeName": "node",
3066+
}),
3067+
indexFields: []string{"spec.nodeName"},
3068+
},
3069+
{
3070+
name: "request with namespace, with field selector metadata.name, metadata.namespace, and with spec.nodename to filter out",
3071+
requestedNamespace: "namespace",
3072+
fieldSelector: fields.AndSelectors(
3073+
fields.ParseSelectorOrDie("spec.nodeName!=node"),
3074+
fields.SelectorFromSet(fields.Set{"metadata.name": "name", "metadata.namespace": "namespace"}),
3075+
),
3076+
indexFields: []string{"spec.nodeName"},
3077+
},
3078+
}
3079+
for _, tt := range tests {
3080+
t.Run(tt.name, func(t *testing.T) {
3081+
pred := storagetesting.CreatePodPredicate(tt.fieldSelector, true, tt.indexFields)
3082+
_, _, usedIndex, err := cacher.listItems(ctx, 0, "/pods/"+tt.requestedNamespace, pred, tt.recursive)
3083+
if err != nil {
3084+
t.Errorf("Unexpected error: %v", err)
3085+
}
3086+
if usedIndex != tt.expectIndex {
3087+
t.Errorf("Index doesn't match, expected: %q, got: %q", tt.expectIndex, usedIndex)
3088+
}
3089+
})
3090+
}
3091+
}

staging/src/k8s.io/apiserver/pkg/storage/etcd3/store_test.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,11 @@ func TestListContinuationWithFilter(t *testing.T) {
285285
storagetesting.RunTestListContinuationWithFilter(ctx, t, store, validation)
286286
}
287287

288+
func TestNamespaceScopedList(t *testing.T) {
289+
ctx, store, _ := testSetup(t)
290+
storagetesting.RunTestNamespaceScopedList(ctx, t, store)
291+
}
292+
288293
func compactStorage(etcdClient *clientv3.Client) storagetesting.Compaction {
289294
return func(ctx context.Context, t *testing.T, resourceVersion string) {
290295
versioner := storage.APIObjectVersioner{}

0 commit comments

Comments
 (0)