From 1dc8ae9b57e4bf3ee225c3899f2289d898fec9c9 Mon Sep 17 00:00:00 2001 From: deads2k Date: Tue, 7 Mar 2017 16:08:37 -0500 Subject: [PATCH] use separate scheme to serve the kube-aggregator --- .../apis/apiregistration/install/install.go | 5 --- .../pkg/apiserver/apiserver.go | 40 ++++++++++++++++--- .../pkg/apiserver/handler_apis.go | 11 +++-- .../pkg/apiserver/handler_apis_test.go | 9 +++-- .../kube-aggregator/pkg/cmd/server/start.go | 5 +-- .../pkg/registry/apiservice/etcd/etcd.go | 12 +++--- .../pkg/registry/apiservice/strategy.go | 5 ++- vendor/BUILD | 12 +++--- 8 files changed, 63 insertions(+), 36 deletions(-) diff --git a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/install.go b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/install.go index 809259de841..d31f8a5cdd4 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/install.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/install/install.go @@ -21,15 +21,10 @@ import ( "k8s.io/apimachinery/pkg/apimachinery/registered" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/sets" - "k8s.io/client-go/pkg/api" "k8s.io/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1" ) -func init() { - Install(api.GroupFactoryRegistry, api.Registry, api.Scheme) -} - // Install registers the API group and adds types to a scheme func Install(groupFactoryRegistry announced.APIGroupFactoryRegistry, registry *registered.APIRegistrationManager, scheme *runtime.Scheme) { if err := announced.NewGroupMetaFactory( 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 142882a89e8..73e5dbd7921 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/apiserver/apiserver.go @@ -21,6 +21,12 @@ import ( "os" "time" + "k8s.io/apimachinery/pkg/apimachinery/announced" + "k8s.io/apimachinery/pkg/apimachinery/registered" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apimachinery/pkg/util/sets" genericapifilters "k8s.io/apiserver/pkg/endpoints/filters" genericapirequest "k8s.io/apiserver/pkg/endpoints/request" @@ -30,19 +36,40 @@ import ( kubeinformers "k8s.io/client-go/informers" kubeclientset "k8s.io/client-go/kubernetes" v1listers "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/pkg/api" "k8s.io/client-go/pkg/version" "k8s.io/kube-aggregator/pkg/apis/apiregistration" + "k8s.io/kube-aggregator/pkg/apis/apiregistration/install" "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1" "k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset" informers "k8s.io/kube-aggregator/pkg/client/informers/internalversion" listers "k8s.io/kube-aggregator/pkg/client/listers/apiregistration/internalversion" apiservicestorage "k8s.io/kube-aggregator/pkg/registry/apiservice/etcd" - - _ "k8s.io/client-go/pkg/api/install" ) +var ( + groupFactoryRegistry = make(announced.APIGroupFactoryRegistry) + registry = registered.NewOrDie("") + Scheme = runtime.NewScheme() + Codecs = serializer.NewCodecFactory(Scheme) +) + +func init() { + install.Install(groupFactoryRegistry, registry, Scheme) + + // we need to add the options (like ListOptions) to empty v1 + metav1.AddToGroupVersion(Scheme, schema.GroupVersion{Group: "", Version: "v1"}) + + unversioned := schema.GroupVersion{Group: "", Version: "v1"} + Scheme.AddUnversionedTypes(unversioned, + &metav1.Status{}, + &metav1.APIVersions{}, + &metav1.APIGroupList{}, + &metav1.APIGroup{}, + &metav1.APIResourceList{}, + ) +} + // legacyAPIServiceName is the fixed name of the only non-groupified API version const legacyAPIServiceName = "v1." @@ -140,10 +167,10 @@ func (c completedConfig) New(stopCh <-chan struct{}) (*APIAggregator, error) { proxyMux: proxyMux, } - apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, api.Registry, api.Scheme, api.ParameterCodec, api.Codecs) + apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(apiregistration.GroupName, registry, Scheme, metav1.ParameterCodec, Codecs) apiGroupInfo.GroupMeta.GroupVersion = v1alpha1.SchemeGroupVersion v1alpha1storage := map[string]rest.Storage{} - v1alpha1storage["apiservices"] = apiservicestorage.NewREST(c.GenericConfig.RESTOptionsGetter) + v1alpha1storage["apiservices"] = apiservicestorage.NewREST(Scheme, c.GenericConfig.RESTOptionsGetter) apiGroupInfo.VersionedResourcesStorageMap["v1alpha1"] = v1alpha1storage if err := s.GenericAPIServer.InstallAPIGroup(&apiGroupInfo); err != nil { @@ -178,7 +205,7 @@ type handlerChainConfig struct { // the endpoints differently, since we're proxying all groups except for apiregistration.k8s.io. func (h *handlerChainConfig) handlerChain(apiHandler http.Handler, c *genericapiserver.Config) (secure, insecure http.Handler) { // add this as a filter so that we never collide with "already registered" failures on `/apis` - handler := WithAPIs(apiHandler, h.informers.Apiregistration().InternalVersion().APIServices(), h.serviceLister, h.endpointsLister) + handler := WithAPIs(apiHandler, Codecs, h.informers.Apiregistration().InternalVersion().APIServices(), h.serviceLister, h.endpointsLister) handler = genericapifilters.WithAuthorization(handler, c.RequestContextMapper, c.Authorizer) @@ -244,6 +271,7 @@ func (s *APIAggregator) AddAPIService(apiService *apiregistration.APIService) { // it's time to register the group aggregation endpoint groupPath := "/apis/" + apiService.Spec.Group groupDiscoveryHandler := &apiGroupHandler{ + codecs: Codecs, groupName: apiService.Spec.Group, lister: s.lister, serviceLister: s.serviceLister, 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 fac2853f960..3b457dcd8ba 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,9 +24,9 @@ import ( metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/apiserver/pkg/endpoints/handlers/responsewriters" v1listers "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/pkg/api" apiregistrationapi "k8s.io/kube-aggregator/pkg/apis/apiregistration" apiregistrationv1alpha1api "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1" @@ -35,8 +35,9 @@ import ( ) // WithAPIs adds the handling for /apis and /apis/. -func WithAPIs(handler http.Handler, informer informers.APIServiceInformer, serviceLister v1listers.ServiceLister, endpointsLister v1listers.EndpointsLister) http.Handler { +func WithAPIs(handler http.Handler, codecs serializer.CodecFactory, informer informers.APIServiceInformer, serviceLister v1listers.ServiceLister, endpointsLister v1listers.EndpointsLister) http.Handler { apisHandler := &apisHandler{ + codecs: codecs, lister: informer.Lister(), delegate: handler, serviceLister: serviceLister, @@ -50,6 +51,7 @@ func WithAPIs(handler http.Handler, informer informers.APIServiceInformer, servi // apisHandler serves the `/apis` endpoint. // This is registered as a filter so that it never collides with any explictly registered endpoints type apisHandler struct { + codecs serializer.CodecFactory lister listers.APIServiceLister serviceLister v1listers.ServiceLister @@ -107,7 +109,7 @@ func (r *apisHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { } } - json, err := runtime.Encode(api.Codecs.LegacyCodec(), discoveryGroupList) + json, err := runtime.Encode(r.codecs.LegacyCodec(), discoveryGroupList) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return @@ -170,6 +172,7 @@ func convertToDiscoveryAPIGroup(apiServices []*apiregistrationapi.APIService, se // apiGroupHandler serves the `/apis/` endpoint. type apiGroupHandler struct { + codecs serializer.CodecFactory groupName string lister listers.APIServiceLister @@ -212,7 +215,7 @@ func (r *apiGroupHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { http.Error(w, "", http.StatusNotFound) return } - json, err := runtime.Encode(api.Codecs.LegacyCodec(), discoveryGroup) + json, err := runtime.Encode(r.codecs.LegacyCodec(), discoveryGroup) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return 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 8e06be41922..062ae30478d 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 @@ -28,7 +28,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/util/diff" v1listers "k8s.io/client-go/listers/core/v1" - "k8s.io/client-go/pkg/api" corev1 "k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/tools/cache" @@ -49,6 +48,7 @@ func TestAPIsDelegation(t *testing.T) { indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) delegate := &delegationHTTPHandler{} handler := &apisHandler{ + codecs: Codecs, lister: listers.NewAPIServiceLister(indexer), delegate: delegate, } @@ -271,6 +271,7 @@ func TestAPIs(t *testing.T) { endpointsIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) delegate := &delegationHTTPHandler{} handler := &apisHandler{ + codecs: Codecs, serviceLister: v1listers.NewServiceLister(serviceIndexer), endpointsLister: v1listers.NewEndpointsLister(endpointsIndexer), lister: listers.NewAPIServiceLister(indexer), @@ -303,7 +304,7 @@ func TestAPIs(t *testing.T) { } actual := &metav1.APIGroupList{} - if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), bytes, actual); err != nil { + if err := runtime.DecodeInto(Codecs.UniversalDecoder(), bytes, actual); err != nil { t.Errorf("%s: %v", tc.name, err) continue } @@ -317,6 +318,7 @@ func TestAPIs(t *testing.T) { func TestAPIGroupMissing(t *testing.T) { indexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) handler := &apiGroupHandler{ + codecs: Codecs, lister: listers.NewAPIServiceLister(indexer), groupName: "foo", } @@ -428,6 +430,7 @@ func TestAPIGroup(t *testing.T) { serviceIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) endpointsIndexer := cache.NewIndexer(cache.MetaNamespaceKeyFunc, cache.Indexers{cache.NamespaceIndex: cache.MetaNamespaceIndexFunc}) handler := &apiGroupHandler{ + codecs: Codecs, lister: listers.NewAPIServiceLister(indexer), serviceLister: v1listers.NewServiceLister(serviceIndexer), endpointsLister: v1listers.NewEndpointsLister(endpointsIndexer), @@ -465,7 +468,7 @@ func TestAPIGroup(t *testing.T) { } actual := &metav1.APIGroup{} - if err := runtime.DecodeInto(api.Codecs.UniversalDecoder(), bytes, actual); err != nil { + if err := runtime.DecodeInto(Codecs.UniversalDecoder(), bytes, actual); err != nil { t.Errorf("%s: %v", tc.name, err) continue } diff --git a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go index 4b04b92ac4e..d2bdf3f74a0 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/cmd/server/start.go @@ -29,7 +29,6 @@ import ( "k8s.io/apiserver/pkg/server/filters" genericoptions "k8s.io/apiserver/pkg/server/options" kubeclientset "k8s.io/client-go/kubernetes" - "k8s.io/client-go/pkg/api" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" "k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1" @@ -92,7 +91,7 @@ func (o *AggregatorOptions) AddFlags(fs *pflag.FlagSet) { // NewDefaultOptions builds a "normal" set of options. You wouldn't normally expose this, but hyperkube isn't cobra compatible func NewDefaultOptions(out, err io.Writer) *AggregatorOptions { o := &AggregatorOptions{ - RecommendedOptions: genericoptions.NewRecommendedOptions(defaultEtcdPathPrefix, api.Scheme, api.Codecs.LegacyCodec(v1alpha1.SchemeGroupVersion)), + RecommendedOptions: genericoptions.NewRecommendedOptions(defaultEtcdPathPrefix, apiserver.Scheme, apiserver.Codecs.LegacyCodec(v1alpha1.SchemeGroupVersion)), StdOut: out, StdErr: err, @@ -116,7 +115,7 @@ func (o AggregatorOptions) RunAggregator(stopCh <-chan struct{}) error { } serverConfig := genericapiserver.NewConfig(). - WithSerializer(api.Codecs) + WithSerializer(apiserver.Codecs) if err := o.RecommendedOptions.ApplyTo(serverConfig); err != nil { return err diff --git a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go index 84fcaac28e0..bbf304131b6 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/etcd/etcd.go @@ -20,7 +20,6 @@ import ( "k8s.io/apimachinery/pkg/runtime" "k8s.io/apiserver/pkg/registry/generic" genericregistry "k8s.io/apiserver/pkg/registry/generic/registry" - "k8s.io/client-go/pkg/api" "k8s.io/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kube-aggregator/pkg/registry/apiservice" ) @@ -31,9 +30,10 @@ type REST struct { } // NewREST returns a RESTStorage object that will work against API services. -func NewREST(optsGetter generic.RESTOptionsGetter) *REST { +func NewREST(scheme *runtime.Scheme, optsGetter generic.RESTOptionsGetter) *REST { + strategy := apiservice.NewStrategy(scheme) store := &genericregistry.Store{ - Copier: api.Scheme, + Copier: scheme, NewFunc: func() runtime.Object { return &apiregistration.APIService{} }, NewListFunc: func() runtime.Object { return &apiregistration.APIServiceList{} }, ObjectNameFunc: func(obj runtime.Object) (string, error) { @@ -43,9 +43,9 @@ func NewREST(optsGetter generic.RESTOptionsGetter) *REST { QualifiedResource: apiregistration.Resource("apiservices"), WatchCacheSize: 100, - CreateStrategy: apiservice.Strategy, - UpdateStrategy: apiservice.Strategy, - DeleteStrategy: apiservice.Strategy, + CreateStrategy: strategy, + UpdateStrategy: strategy, + DeleteStrategy: strategy, } options := &generic.StoreOptions{RESTOptions: optsGetter, AttrFunc: apiservice.GetAttrs} if err := store.CompleteWithOptions(options); err != nil { diff --git a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go index bf24c520b65..1689e1f6ac5 100644 --- a/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go +++ b/staging/src/k8s.io/kube-aggregator/pkg/registry/apiservice/strategy.go @@ -27,7 +27,6 @@ import ( "k8s.io/apiserver/pkg/registry/generic" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/names" - kapi "k8s.io/client-go/pkg/api" "k8s.io/kube-aggregator/pkg/apis/apiregistration" "k8s.io/kube-aggregator/pkg/apis/apiregistration/validation" @@ -38,7 +37,9 @@ type apiServerStrategy struct { names.NameGenerator } -var Strategy = apiServerStrategy{kapi.Scheme, names.SimpleNameGenerator} +func NewStrategy(typer runtime.ObjectTyper) apiServerStrategy { + return apiServerStrategy{typer, names.SimpleNameGenerator} +} func (apiServerStrategy) NamespaceScoped() bool { return false diff --git a/vendor/BUILD b/vendor/BUILD index 012a5688aaa..7f18105f6d5 100644 --- a/vendor/BUILD +++ b/vendor/BUILD @@ -15344,7 +15344,6 @@ go_library( "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apimachinery/pkg/util/sets", - "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1", ], @@ -15402,7 +15401,6 @@ go_test( "//vendor:k8s.io/apiserver/pkg/authentication/user", "//vendor:k8s.io/apiserver/pkg/endpoints/request", "//vendor:k8s.io/client-go/listers/core/v1", - "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/client-go/pkg/api/v1", "//vendor:k8s.io/client-go/tools/cache", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration", @@ -15422,9 +15420,13 @@ go_library( deps = [ "//vendor:github.com/golang/glog", "//vendor:k8s.io/apimachinery/pkg/api/errors", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/announced", + "//vendor:k8s.io/apimachinery/pkg/apimachinery/registered", "//vendor:k8s.io/apimachinery/pkg/apis/meta/v1", "//vendor:k8s.io/apimachinery/pkg/labels", "//vendor:k8s.io/apimachinery/pkg/runtime", + "//vendor:k8s.io/apimachinery/pkg/runtime/schema", + "//vendor:k8s.io/apimachinery/pkg/runtime/serializer", "//vendor:k8s.io/apimachinery/pkg/util/httpstream/spdy", "//vendor:k8s.io/apimachinery/pkg/util/runtime", "//vendor:k8s.io/apimachinery/pkg/util/sets", @@ -15439,14 +15441,13 @@ go_library( "//vendor:k8s.io/client-go/informers", "//vendor:k8s.io/client-go/kubernetes", "//vendor:k8s.io/client-go/listers/core/v1", - "//vendor:k8s.io/client-go/pkg/api", - "//vendor:k8s.io/client-go/pkg/api/install", "//vendor:k8s.io/client-go/pkg/version", "//vendor:k8s.io/client-go/rest", "//vendor:k8s.io/client-go/tools/cache", "//vendor:k8s.io/client-go/transport", "//vendor:k8s.io/client-go/util/workqueue", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration", + "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration/install", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1", "//vendor:k8s.io/kube-aggregator/pkg/client/clientset_generated/internalclientset", "//vendor:k8s.io/kube-aggregator/pkg/client/informers/internalversion", @@ -15816,7 +15817,6 @@ go_library( "//vendor:k8s.io/apiserver/pkg/server/filters", "//vendor:k8s.io/apiserver/pkg/server/options", "//vendor:k8s.io/client-go/kubernetes", - "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/client-go/rest", "//vendor:k8s.io/client-go/tools/clientcmd", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration/v1alpha1", @@ -15837,7 +15837,6 @@ go_library( "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/storage", "//vendor:k8s.io/apiserver/pkg/storage/names", - "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration/validation", ], @@ -15851,7 +15850,6 @@ go_library( "//vendor:k8s.io/apimachinery/pkg/runtime", "//vendor:k8s.io/apiserver/pkg/registry/generic", "//vendor:k8s.io/apiserver/pkg/registry/generic/registry", - "//vendor:k8s.io/client-go/pkg/api", "//vendor:k8s.io/kube-aggregator/pkg/apis/apiregistration", "//vendor:k8s.io/kube-aggregator/pkg/registry/apiservice", ],