From 2ffa593ad69becef5917ead8089c528d198665c4 Mon Sep 17 00:00:00 2001 From: David Eads Date: Thu, 7 Sep 2017 14:58:14 -0400 Subject: [PATCH] add dynamic rest mapper to the admission plugin initializer --- pkg/cmd/server/origin/master.go | 10 ++++++++++ pkg/cmd/server/origin/master_config.go | 14 ++++++++++++-- test/integration/master_routes_test.go | 1 + 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/pkg/cmd/server/origin/master.go b/pkg/cmd/server/origin/master.go index 8a4f99a4d966..0000b15f3264 100644 --- a/pkg/cmd/server/origin/master.go +++ b/pkg/cmd/server/origin/master.go @@ -11,6 +11,7 @@ import ( "github.com/golang/glog" apiextensionsinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion" + "k8s.io/apimachinery/pkg/util/wait" apiserver "k8s.io/apiserver/pkg/server" aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver" kubeapiserver "k8s.io/kubernetes/pkg/master" @@ -249,6 +250,15 @@ func (c *MasterConfig) Run(kubeAPIServerConfig *kubeapiserver.Config, controller // add post-start hooks aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("template.openshift.io-sharednamespace", c.ensureOpenShiftSharedResourcesNamespace) aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("authorization.openshift.io-bootstrapclusterroles", bootstrappolicy.Policy().EnsureRBACPolicy()) + aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("admission.openshift.io-RefreshRESTMapper", func(context apiserver.PostStartHookContext) error { + c.RESTMapper.Reset() + go func() { + wait.Until(func() { + c.RESTMapper.Reset() + }, 10*time.Second, context.StopCh) + }() + return nil + }) for name, fn := range extraPostStartHooks { aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie(name, fn) } diff --git a/pkg/cmd/server/origin/master_config.go b/pkg/cmd/server/origin/master_config.go index c093244b8edf..8b33f5a0cbd1 100644 --- a/pkg/cmd/server/origin/master_config.go +++ b/pkg/cmd/server/origin/master_config.go @@ -11,6 +11,7 @@ import ( "github.com/golang/glog" kapierrors "k8s.io/apimachinery/pkg/api/errors" + "k8s.io/apimachinery/pkg/api/meta" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/runtime/schema" @@ -32,6 +33,8 @@ import ( "k8s.io/apiserver/pkg/authorization/authorizerfactory" authorizerunion "k8s.io/apiserver/pkg/authorization/union" apirequest "k8s.io/apiserver/pkg/endpoints/request" + "k8s.io/client-go/discovery" + cacheddiscovery "k8s.io/client-go/discovery/cached" kubeclientgoinformers "k8s.io/client-go/informers" kubeclientgoclient "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" @@ -92,6 +95,8 @@ import ( type MasterConfig struct { Options configapi.MasterConfig + RESTMapper *discovery.DeferredDiscoveryRESTMapper + // RESTOptionsGetter provides access to storage and RESTOptions for a particular resource RESTOptionsGetter restoptions.Getter @@ -222,6 +227,10 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess) options.ProjectConfig.ProjectRequestMessage, ) + // Use a discovery client capable of being refreshed. + discoveryClient := cacheddiscovery.NewMemCacheClient(privilegedLoopbackKubeClientsetInternal.Discovery()) + restMapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.InterfacesForUnstructured) + // punch through layers to build this in order to get a string for a cloud provider file // TODO refactor us into a forward building flow with a side channel like this kubeOptions, err := kubernetes.BuildKubeAPIserverOptions(options) @@ -248,8 +257,7 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess) informers.GetInternalKubeInformers(), authorizer, cloudConfig, - // TODO: use a dynamic restmapper. See https://github.com/kubernetes/kubernetes/pull/42615. - kapi.Registry.RESTMapper(), + restMapper, quotaRegistry) openshiftPluginInitializer := &oadmission.PluginInitializer{ OpenshiftClient: privilegedLoopbackOpenShiftClient, @@ -295,6 +303,8 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess) config := &MasterConfig{ Options: options, + RESTMapper: restMapper, + RESTOptionsGetter: restOptsGetter, RuleResolver: ruleResolver, diff --git a/test/integration/master_routes_test.go b/test/integration/master_routes_test.go index 95403a00e85d..5675027c138c 100644 --- a/test/integration/master_routes_test.go +++ b/test/integration/master_routes_test.go @@ -89,6 +89,7 @@ var expectedIndex = []string{ "/healthz", "/healthz/autoregister-completion", "/healthz/ping", + "/healthz/poststarthook/admission.openshift.io-RefreshRESTMapper", "/healthz/poststarthook/apiservice-registration-controller", "/healthz/poststarthook/apiservice-status-available-controller", "/healthz/poststarthook/authorization.openshift.io-bootstrapclusterroles",