From 92a961f256e6b8191e402352faed539da10d7e12 Mon Sep 17 00:00:00 2001 From: Jordan Liggitt Date: Thu, 24 Oct 2019 00:42:13 -0400 Subject: [PATCH] Do not list apiextensions.k8s.io/v1beta1 in discovery when disabled --- .../pkg/apiserver/apiserver.go | 14 ++++++- .../pkg/apiserver/handler_apis.go | 37 ++++++++++++------- .../pkg/apiserver/handler_apis_test.go | 36 +++++++++++++----- 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go index ec233788466..1d4c6ed7703 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -17,6 +17,7 @@ limitations under the License. package apiserver import ( + "fmt" "net/http" "time" @@ -190,9 +191,18 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg return nil, err } + enabledVersions := sets.NewString() + for v := range apiGroupInfo.VersionedResourcesStorageMap { + enabledVersions.Insert(v) + } + if !enabledVersions.Has(v1.SchemeGroupVersion.Version) { + return nil, fmt.Errorf("API group/version %s must be enabled", v1.SchemeGroupVersion.String()) + } + apisHandler := &apisHandler{ - codecs: aggregatorscheme.Codecs, - lister: s.lister, + codecs: aggregatorscheme.Codecs, + lister: s.lister, + discoveryGroup: discoveryGroup(enabledVersions), } s.GenericAPIServer.Handler.NonGoRestfulMux.Handle("/apis", apisHandler) s.GenericAPIServer.Handler.NonGoRestfulMux.UnlistedHandle("/apis/", apisHandler) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis.go index 3a03960d087..e9d75806e19 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis.go @@ -24,6 +24,7 @@ import ( "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/apiserver/pkg/endpoints/handlers/negotiation" "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters" @@ -36,33 +37,41 @@ import ( // apisHandler serves the `/apis` endpoint. // This is registered as a filter so that it never collides with any explicitly registered endpoints type apisHandler struct { - codecs serializer.CodecFactory - lister listers.APIServiceLister + codecs serializer.CodecFactory + lister listers.APIServiceLister + discoveryGroup metav1.APIGroup } -var discoveryGroup = metav1.APIGroup{ - Name: apiregistrationv1api.GroupName, - Versions: []metav1.GroupVersionForDiscovery{ - { +func discoveryGroup(enabledVersions sets.String) metav1.APIGroup { + retval := metav1.APIGroup{ + Name: apiregistrationv1api.GroupName, + Versions: []metav1.GroupVersionForDiscovery{ + { + GroupVersion: apiregistrationv1api.SchemeGroupVersion.String(), + Version: apiregistrationv1api.SchemeGroupVersion.Version, + }, + }, + PreferredVersion: metav1.GroupVersionForDiscovery{ GroupVersion: apiregistrationv1api.SchemeGroupVersion.String(), Version: apiregistrationv1api.SchemeGroupVersion.Version, }, - { + } + + if enabledVersions.Has(apiregistrationv1beta1api.SchemeGroupVersion.Version) { + retval.Versions = append(retval.Versions, metav1.GroupVersionForDiscovery{ GroupVersion: apiregistrationv1beta1api.SchemeGroupVersion.String(), Version: apiregistrationv1beta1api.SchemeGroupVersion.Version, - }, - }, - PreferredVersion: metav1.GroupVersionForDiscovery{ - GroupVersion: apiregistrationv1api.SchemeGroupVersion.String(), - Version: apiregistrationv1api.SchemeGroupVersion.Version, - }, + }) + } + + return retval } func (r *apisHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { discoveryGroupList := &metav1.APIGroupList{ // always add OUR api group to the list first. Since we'll never have a registered APIService for it // and since this is the crux of the API, having this first will give our names priority. It's good to be king. - Groups: []metav1.APIGroup{discoveryGroup}, + Groups: []metav1.APIGroup{r.discoveryGroup}, } apiServices, err := r.lister.List(labels.Everything()) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis_test.go b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis_test.go index ef381d37f9a..e15e124789b 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis_test.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/handler_apis_test.go @@ -27,6 +27,7 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" + "k8s.io/apimachinery/pkg/util/sets" "k8s.io/client-go/tools/cache" apiregistration "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1" @@ -37,21 +38,35 @@ import ( func TestAPIs(t *testing.T) { tests := []struct { name string + enabled sets.String apiservices []*apiregistration.APIService expected *metav1.APIGroupList }{ { name: "empty", + enabled: sets.NewString("v1", "v1beta1"), apiservices: []*apiregistration.APIService{}, expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ - discoveryGroup, + discoveryGroup(sets.NewString("v1", "v1beta1")), }, }, }, { - name: "simple add", + name: "v1 only", + enabled: sets.NewString("v1"), + apiservices: []*apiregistration.APIService{}, + expected: &metav1.APIGroupList{ + TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, + Groups: []metav1.APIGroup{ + discoveryGroup(sets.NewString("v1")), + }, + }, + }, + { + name: "simple add", + enabled: sets.NewString("v1", "v1beta1"), apiservices: []*apiregistration.APIService{ { ObjectMeta: metav1.ObjectMeta{Name: "v1.foo"}, @@ -91,7 +106,7 @@ func TestAPIs(t *testing.T) { expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ - discoveryGroup, + discoveryGroup(sets.NewString("v1", "v1beta1")), { Name: "foo", Versions: []metav1.GroupVersionForDiscovery{ @@ -122,7 +137,8 @@ func TestAPIs(t *testing.T) { }, }, { - name: "sorting", + name: "sorting", + enabled: sets.NewString("v1", "v1beta1"), apiservices: []*apiregistration.APIService{ { ObjectMeta: metav1.ObjectMeta{Name: "v1.foo"}, @@ -198,7 +214,7 @@ func TestAPIs(t *testing.T) { expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ - discoveryGroup, + discoveryGroup(sets.NewString("v1", "v1beta1")), { Name: "foo", Versions: []metav1.GroupVersionForDiscovery{ @@ -237,7 +253,8 @@ func TestAPIs(t *testing.T) { }, }, { - name: "unavailable service", + name: "unavailable service", + enabled: sets.NewString("v1", "v1beta1"), apiservices: []*apiregistration.APIService{ { ObjectMeta: metav1.ObjectMeta{Name: "v1.foo"}, @@ -260,7 +277,7 @@ func TestAPIs(t *testing.T) { expected: &metav1.APIGroupList{ TypeMeta: metav1.TypeMeta{Kind: "APIGroupList", APIVersion: "v1"}, Groups: []metav1.APIGroup{ - discoveryGroup, + discoveryGroup(sets.NewString("v1", "v1beta1")), { Name: "foo", Versions: []metav1.GroupVersionForDiscovery{ @@ -282,8 +299,9 @@ func TestAPIs(t *testing.T) { for _, tc := range tests { indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) handler := &apisHandler{ - codecs: aggregatorscheme.Codecs, - lister: listers.NewAPIServiceLister(indexer), + codecs: aggregatorscheme.Codecs, + lister: listers.NewAPIServiceLister(indexer), + discoveryGroup: discoveryGroup(tc.enabled), } for _, o := range tc.apiservices { indexer.Add(o)