Skip to content

Commit 711772a

Browse files
committed
Adding tests for using indexers in tests
1 parent eebc897 commit 711772a

File tree

6 files changed

+601
-41
lines changed

6 files changed

+601
-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: 147 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import (
4949
"k8s.io/apiserver/pkg/storage/cacher/metrics"
5050
etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
5151
etcdfeature "k8s.io/apiserver/pkg/storage/feature"
52+
storagetesting "k8s.io/apiserver/pkg/storage/testing"
5253
utilfeature "k8s.io/apiserver/pkg/util/feature"
5354
featuregatetesting "k8s.io/component-base/featuregate/testing"
5455
k8smetrics "k8s.io/component-base/metrics"
@@ -2837,3 +2838,149 @@ func forceRequestWatchProgressSupport(t *testing.T) {
28372838
t.Fatalf("failed to wait for required %v storage feature to initialize", storage.RequestWatchProgress)
28382839
}
28392840
}
2841+
2842+
func TestListIndexer(t *testing.T) {
2843+
ctx, cacher, terminate := testSetup(t, withSpecNodeNameIndexerFuncs)
2844+
t.Cleanup(terminate)
2845+
tests := []struct {
2846+
name string
2847+
requestedNamespace string
2848+
recursive bool
2849+
fieldSelector fields.Selector
2850+
indexFields []string
2851+
expectIndex string
2852+
}{
2853+
{
2854+
name: "request without namespace, without field selector",
2855+
recursive: true,
2856+
fieldSelector: fields.Everything(),
2857+
},
2858+
{
2859+
name: "request without namespace, field selector with metadata.namespace",
2860+
recursive: true,
2861+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2862+
},
2863+
{
2864+
name: "request without namespace, field selector with spec.nodename",
2865+
recursive: true,
2866+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=node"),
2867+
indexFields: []string{"spec.nodeName"},
2868+
expectIndex: "f:spec.nodeName",
2869+
},
2870+
{
2871+
name: "request without namespace, field selector with spec.nodename to filter out",
2872+
recursive: true,
2873+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName!=node"),
2874+
indexFields: []string{"spec.nodeName"},
2875+
},
2876+
{
2877+
name: "request with namespace, without field selector",
2878+
requestedNamespace: "namespace",
2879+
recursive: true,
2880+
fieldSelector: fields.Everything(),
2881+
},
2882+
{
2883+
name: "request with namespace, field selector with matched metadata.namespace",
2884+
requestedNamespace: "namespace",
2885+
recursive: true,
2886+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2887+
},
2888+
{
2889+
name: "request with namespace, field selector with non-matched metadata.namespace",
2890+
requestedNamespace: "namespace",
2891+
recursive: true,
2892+
fieldSelector: fields.ParseSelectorOrDie("metadata.namespace=namespace"),
2893+
},
2894+
{
2895+
name: "request with namespace, field selector with spec.nodename",
2896+
requestedNamespace: "namespace",
2897+
recursive: true,
2898+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName=node"),
2899+
indexFields: []string{"spec.nodeName"},
2900+
expectIndex: "f:spec.nodeName",
2901+
},
2902+
{
2903+
name: "request with namespace, field selector with spec.nodename to filter out",
2904+
requestedNamespace: "namespace",
2905+
recursive: true,
2906+
fieldSelector: fields.ParseSelectorOrDie("spec.nodeName!=node"),
2907+
indexFields: []string{"spec.nodeName"},
2908+
},
2909+
{
2910+
name: "request without namespace, field selector with metadata.name",
2911+
recursive: true,
2912+
fieldSelector: fields.ParseSelectorOrDie("metadata.name=name"),
2913+
},
2914+
{
2915+
name: "request without namespace, field selector with metadata.name and metadata.namespace",
2916+
recursive: true,
2917+
fieldSelector: fields.SelectorFromSet(fields.Set{
2918+
"metadata.name": "name",
2919+
"metadata.namespace": "namespace",
2920+
}),
2921+
},
2922+
{
2923+
name: "request without namespace, field selector with metadata.name and spec.nodeName",
2924+
recursive: true,
2925+
fieldSelector: fields.SelectorFromSet(fields.Set{
2926+
"metadata.name": "name",
2927+
"spec.nodeName": "node",
2928+
}),
2929+
indexFields: []string{"spec.nodeName"},
2930+
expectIndex: "f:spec.nodeName",
2931+
},
2932+
{
2933+
name: "request without namespace, field selector with metadata.name, and with spec.nodeName to filter out watch",
2934+
recursive: true,
2935+
fieldSelector: fields.AndSelectors(
2936+
fields.ParseSelectorOrDie("spec.nodeName!=node"),
2937+
fields.SelectorFromSet(fields.Set{"metadata.name": "name"}),
2938+
),
2939+
indexFields: []string{"spec.nodeName"},
2940+
},
2941+
{
2942+
name: "request with namespace, with field selector metadata.name",
2943+
requestedNamespace: "namespace",
2944+
fieldSelector: fields.ParseSelectorOrDie("metadata.name=name"),
2945+
},
2946+
{
2947+
name: "request with namespace, with field selector metadata.name and metadata.namespace",
2948+
requestedNamespace: "namespace",
2949+
fieldSelector: fields.SelectorFromSet(fields.Set{
2950+
"metadata.name": "name",
2951+
"metadata.namespace": "namespace",
2952+
}),
2953+
},
2954+
{
2955+
name: "request with namespace, with field selector metadata.name, metadata.namespace and spec.nodename",
2956+
requestedNamespace: "namespace",
2957+
fieldSelector: fields.SelectorFromSet(fields.Set{
2958+
"metadata.name": "name",
2959+
"metadata.namespace": "namespace",
2960+
"spec.nodeName": "node",
2961+
}),
2962+
indexFields: []string{"spec.nodeName"},
2963+
},
2964+
{
2965+
name: "request with namespace, with field selector metadata.name, metadata.namespace, and with spec.nodename to filter out",
2966+
requestedNamespace: "namespace",
2967+
fieldSelector: fields.AndSelectors(
2968+
fields.ParseSelectorOrDie("spec.nodeName!=node"),
2969+
fields.SelectorFromSet(fields.Set{"metadata.name": "name", "metadata.namespace": "namespace"}),
2970+
),
2971+
indexFields: []string{"spec.nodeName"},
2972+
},
2973+
}
2974+
for _, tt := range tests {
2975+
t.Run(tt.name, func(t *testing.T) {
2976+
pred := storagetesting.CreatePodPredicate(tt.fieldSelector, true, tt.indexFields)
2977+
_, _, usedIndex, err := cacher.listItems(ctx, 0, "/pods/"+tt.requestedNamespace, pred, tt.recursive)
2978+
if err != nil {
2979+
t.Errorf("Unexpected error: %v", err)
2980+
}
2981+
if usedIndex != tt.expectIndex {
2982+
t.Errorf("Index doesn't match, expected: %q, got: %q", tt.expectIndex, usedIndex)
2983+
}
2984+
})
2985+
}
2986+
}

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
@@ -284,6 +284,11 @@ func TestListContinuationWithFilter(t *testing.T) {
284284
storagetesting.RunTestListContinuationWithFilter(ctx, t, store, validation)
285285
}
286286

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

0 commit comments

Comments
 (0)