@@ -23,6 +23,8 @@ import (
23
23
"github.com/google/go-cmp/cmp"
24
24
"k8s.io/apimachinery/pkg/api/errors"
25
25
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26
+ "k8s.io/apimachinery/pkg/fields"
27
+ "k8s.io/apimachinery/pkg/labels"
26
28
"k8s.io/apimachinery/pkg/util/intstr"
27
29
genericapirequest "k8s.io/apiserver/pkg/endpoints/request"
28
30
"k8s.io/apiserver/pkg/registry/rest"
@@ -785,3 +787,159 @@ func TestDropTypeDependentFields(t *testing.T) {
785
787
})
786
788
}
787
789
}
790
+
791
+ func TestMatchService (t * testing.T ) {
792
+ testCases := []struct {
793
+ name string
794
+ in * api.Service
795
+ fieldSelector fields.Selector
796
+ expectMatch bool
797
+ }{
798
+ {
799
+ name : "match on name" ,
800
+ in : & api.Service {
801
+ ObjectMeta : metav1.ObjectMeta {
802
+ Name : "test" ,
803
+ Namespace : "testns" ,
804
+ },
805
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
806
+ },
807
+ fieldSelector : fields .ParseSelectorOrDie ("metadata.name=test" ),
808
+ expectMatch : true ,
809
+ },
810
+ {
811
+ name : "match on namespace" ,
812
+ in : & api.Service {
813
+ ObjectMeta : metav1.ObjectMeta {
814
+ Name : "test" ,
815
+ Namespace : "testns" ,
816
+ },
817
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
818
+ },
819
+ fieldSelector : fields .ParseSelectorOrDie ("metadata.namespace=testns" ),
820
+ expectMatch : true ,
821
+ },
822
+ {
823
+ name : "no match on name" ,
824
+ in : & api.Service {
825
+ ObjectMeta : metav1.ObjectMeta {
826
+ Name : "test" ,
827
+ Namespace : "testns" ,
828
+ },
829
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
830
+ },
831
+ fieldSelector : fields .ParseSelectorOrDie ("metadata.name=nomatch" ),
832
+ expectMatch : false ,
833
+ },
834
+ {
835
+ name : "no match on namespace" ,
836
+ in : & api.Service {
837
+ ObjectMeta : metav1.ObjectMeta {
838
+ Name : "test" ,
839
+ Namespace : "testns" ,
840
+ },
841
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
842
+ },
843
+ fieldSelector : fields .ParseSelectorOrDie ("metadata.namespace=nomatch" ),
844
+ expectMatch : false ,
845
+ },
846
+ {
847
+ name : "match on loadbalancer type service" ,
848
+ in : & api.Service {
849
+ Spec : api.ServiceSpec {Type : api .ServiceTypeLoadBalancer },
850
+ },
851
+ fieldSelector : fields .ParseSelectorOrDie ("spec.type=LoadBalancer" ),
852
+ expectMatch : true ,
853
+ },
854
+ {
855
+ name : "no match on nodeport type service" ,
856
+ in : & api.Service {
857
+ Spec : api.ServiceSpec {Type : api .ServiceTypeNodePort },
858
+ },
859
+ fieldSelector : fields .ParseSelectorOrDie ("spec.type=LoadBalancer" ),
860
+ expectMatch : false ,
861
+ },
862
+ {
863
+ name : "match on headless service" ,
864
+ in : & api.Service {
865
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
866
+ },
867
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=None" ),
868
+ expectMatch : true ,
869
+ },
870
+ {
871
+ name : "no match on clusterIP service" ,
872
+ in : & api.Service {
873
+ Spec : api.ServiceSpec {ClusterIP : "192.168.1.1" },
874
+ },
875
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=None" ),
876
+ expectMatch : false ,
877
+ },
878
+ {
879
+ name : "match on clusterIP service" ,
880
+ in : & api.Service {
881
+ Spec : api.ServiceSpec {ClusterIP : "192.168.1.1" },
882
+ },
883
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=192.168.1.1" ),
884
+ expectMatch : true ,
885
+ },
886
+ {
887
+ name : "match on non-headless service" ,
888
+ in : & api.Service {
889
+ Spec : api.ServiceSpec {ClusterIP : "192.168.1.1" },
890
+ },
891
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP!=None" ),
892
+ expectMatch : true ,
893
+ },
894
+ {
895
+ name : "match on any ClusterIP set service" ,
896
+ in : & api.Service {
897
+ Spec : api.ServiceSpec {ClusterIP : "192.168.1.1" },
898
+ },
899
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP!=\" \" " ),
900
+ expectMatch : true ,
901
+ },
902
+ {
903
+ name : "match on clusterIP IPv6 service" ,
904
+ in : & api.Service {
905
+ Spec : api.ServiceSpec {ClusterIP : "2001:db2::1" },
906
+ },
907
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=2001:db2::1" ),
908
+ expectMatch : true ,
909
+ },
910
+ {
911
+ name : "no match on headless service" ,
912
+ in : & api.Service {
913
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
914
+ },
915
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=192.168.1.1" ),
916
+ expectMatch : false ,
917
+ },
918
+ {
919
+ name : "no match on headless service" ,
920
+ in : & api.Service {
921
+ Spec : api.ServiceSpec {ClusterIP : api .ClusterIPNone },
922
+ },
923
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=2001:db2::1" ),
924
+ expectMatch : false ,
925
+ },
926
+ {
927
+ name : "no match on empty service" ,
928
+ in : & api.Service {},
929
+ fieldSelector : fields .ParseSelectorOrDie ("spec.clusterIP=None" ),
930
+ expectMatch : false ,
931
+ },
932
+ }
933
+ for _ , testCase := range testCases {
934
+ t .Run (testCase .name , func (t * testing.T ) {
935
+ m := Matcher (labels .Everything (), testCase .fieldSelector )
936
+ result , err := m .Matches (testCase .in )
937
+ if err != nil {
938
+ t .Errorf ("Unexpected error %v" , err )
939
+ }
940
+ if result != testCase .expectMatch {
941
+ t .Errorf ("Result %v, Expected %v, Selector: %v, Service: %v" , result , testCase .expectMatch , testCase .fieldSelector .String (), testCase .in )
942
+ }
943
+ })
944
+ }
945
+ }
0 commit comments