func (f *endpointsInformer) Lister() v1.EndpointsLister { return v1.NewEndpointsLister(f.Informer().GetIndexer()) }
func TestAPIs(t *testing.T) { tests := []struct { name string apiservices []*apiregistration.APIService expected *metav1.APIGroupList }{ { name: "empty", apiservices: []*apiregistration.APIService{}, expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ discoveryGroup, }, }, }, { name: "simple add", apiservices: []*apiregistration.APIService{ { ObjectMeta: api.ObjectMeta{Name: "v1.foo"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "foo", Version: "v1", Priority: 10, }, }, { ObjectMeta: api.ObjectMeta{Name: "v1.bar"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "bar", Version: "v1", Priority: 11, }, }, }, expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ discoveryGroup, { Name: "foo", Versions: []metav1.GroupVersionForDiscovery{ { GroupVersion: "foo/v1", Version: "v1", }, }, PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: "foo/v1", Version: "v1", }, }, { Name: "bar", Versions: []metav1.GroupVersionForDiscovery{ { GroupVersion: "bar/v1", Version: "v1", }, }, PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: "bar/v1", Version: "v1", }, }, }, }, }, { name: "sorting", apiservices: []*apiregistration.APIService{ { ObjectMeta: api.ObjectMeta{Name: "v1.foo"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "foo", Version: "v1", Priority: 20, }, }, { ObjectMeta: api.ObjectMeta{Name: "v2.bar"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "bar", Version: "v2", Priority: 11, }, }, { ObjectMeta: api.ObjectMeta{Name: "v2.foo"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "foo", Version: "v2", Priority: 1, }, }, { ObjectMeta: api.ObjectMeta{Name: "v1.bar"}, Spec: apiregistration.APIServiceSpec{ Service: apiregistration.ServiceReference{ Namespace: "ns", Name: "api", }, Group: "bar", Version: "v1", Priority: 11, }, }, }, expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ discoveryGroup, { Name: "foo", Versions: []metav1.GroupVersionForDiscovery{ { GroupVersion: "foo/v2", Version: "v2", }, { GroupVersion: "foo/v1", Version: "v1", }, }, PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: "foo/v2", Version: "v2", }, }, { Name: "bar", Versions: []metav1.GroupVersionForDiscovery{ { GroupVersion: "bar/v1", Version: "v1", }, { GroupVersion: "bar/v2", Version: "v2", }, }, PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: "bar/v1", Version: "v1", }, }, }, }, }, } for _, tc := range tests { indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) serviceIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) endpointsIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) delegate := &delegationHTTPHandler{} handler := &apisHandler{ serviceLister: v1listers.NewServiceLister(serviceIndexer), endpointsLister: v1listers.NewEndpointsLister(endpointsIndexer), lister: listers.NewAPIServiceLister(indexer), delegate: delegate, } for _, o := range tc.apiservices { indexer.Add(o) } serviceIndexer.Add(&corev1.Service{ObjectMeta: corev1.ObjectMeta{Namespace: "ns", Name: "api"}}) endpointsIndexer.Add(&corev1.Endpoints{ ObjectMeta: corev1.ObjectMeta{Namespace: "ns", Name: "api"}, Subsets: []corev1.EndpointSubset{ {Addresses: []corev1.EndpointAddress{{}}}, }, }, ) server := httptest.NewServer(handler) defer server.Close() resp, err := http.Get(server.URL + "/apis") if err != nil { t.Errorf("%s: %v", tc.name, err) continue } bytes, err := ioutil.ReadAll(resp.Body) if err != nil { t.Errorf("%s: %v", tc.name, err) continue } actual := &metav1.APIGroupList{} if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), bytes, actual); err != nil { t.Errorf("%s: %v", tc.name, err) continue } if !api.Semantic.DeepEqual(tc.expected, actual) { t.Errorf("%s: %v", tc.name, diff.ObjectDiff(tc.expected, actual)) continue } } }