@@ -49,6 +49,7 @@ import (
49
49
"k8s.io/apiserver/pkg/storage/cacher/metrics"
50
50
etcd3testing "k8s.io/apiserver/pkg/storage/etcd3/testing"
51
51
etcdfeature "k8s.io/apiserver/pkg/storage/feature"
52
+ storagetesting "k8s.io/apiserver/pkg/storage/testing"
52
53
utilfeature "k8s.io/apiserver/pkg/util/feature"
53
54
featuregatetesting "k8s.io/component-base/featuregate/testing"
54
55
k8smetrics "k8s.io/component-base/metrics"
@@ -2837,3 +2838,149 @@ func forceRequestWatchProgressSupport(t *testing.T) {
2837
2838
t .Fatalf ("failed to wait for required %v storage feature to initialize" , storage .RequestWatchProgress )
2838
2839
}
2839
2840
}
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
+ }
0 commit comments