@@ -2943,3 +2943,149 @@ func forceRequestWatchProgressSupport(t *testing.T) {
2943
2943
t .Fatalf ("failed to wait for required %v storage feature to initialize" , storage .RequestWatchProgress )
2944
2944
}
2945
2945
}
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
+ }
0 commit comments