Skip to content

Commit 15f7720

Browse files
Merge pull request #16215 from deads2k/gc-01-restmapper
Automatic merge from submit-queue add dynamic rest mapper to the admission plugin initializer fixes #16141 picks the dynamic memcache discovery for the RESTMapper and wires it for admission. There's a post-start hook that starts it refreshing.
2 parents 0b29c3f + 2ffa593 commit 15f7720

File tree

7 files changed

+381
-3
lines changed

7 files changed

+381
-3
lines changed

pkg/cmd/server/origin/master.go

+10
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"github.com/golang/glog"
1212

1313
apiextensionsinformers "k8s.io/apiextensions-apiserver/pkg/client/informers/internalversion"
14+
"k8s.io/apimachinery/pkg/util/wait"
1415
apiserver "k8s.io/apiserver/pkg/server"
1516
aggregatorapiserver "k8s.io/kube-aggregator/pkg/apiserver"
1617
kubeapiserver "k8s.io/kubernetes/pkg/master"
@@ -249,6 +250,15 @@ func (c *MasterConfig) Run(kubeAPIServerConfig *kubeapiserver.Config, controller
249250
// add post-start hooks
250251
aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("template.openshift.io-sharednamespace", c.ensureOpenShiftSharedResourcesNamespace)
251252
aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("authorization.openshift.io-bootstrapclusterroles", bootstrappolicy.Policy().EnsureRBACPolicy())
253+
aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie("admission.openshift.io-RefreshRESTMapper", func(context apiserver.PostStartHookContext) error {
254+
c.RESTMapper.Reset()
255+
go func() {
256+
wait.Until(func() {
257+
c.RESTMapper.Reset()
258+
}, 10*time.Second, context.StopCh)
259+
}()
260+
return nil
261+
})
252262
for name, fn := range extraPostStartHooks {
253263
aggregatedAPIServer.GenericAPIServer.AddPostStartHookOrDie(name, fn)
254264
}

pkg/cmd/server/origin/master_config.go

+12-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/golang/glog"
1313

1414
kapierrors "k8s.io/apimachinery/pkg/api/errors"
15+
"k8s.io/apimachinery/pkg/api/meta"
1516
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
1617
"k8s.io/apimachinery/pkg/labels"
1718
"k8s.io/apimachinery/pkg/runtime/schema"
@@ -35,6 +36,8 @@ import (
3536
"k8s.io/apiserver/pkg/authorization/authorizerfactory"
3637
authorizerunion "k8s.io/apiserver/pkg/authorization/union"
3738
apirequest "k8s.io/apiserver/pkg/endpoints/request"
39+
"k8s.io/client-go/discovery"
40+
cacheddiscovery "k8s.io/client-go/discovery/cached"
3841
kubeclientgoinformers "k8s.io/client-go/informers"
3942
kubeclientgoclient "k8s.io/client-go/kubernetes"
4043
restclient "k8s.io/client-go/rest"
@@ -95,6 +98,8 @@ import (
9598
type MasterConfig struct {
9699
Options configapi.MasterConfig
97100

101+
RESTMapper *discovery.DeferredDiscoveryRESTMapper
102+
98103
// RESTOptionsGetter provides access to storage and RESTOptions for a particular resource
99104
RESTOptionsGetter restoptions.Getter
100105

@@ -225,6 +230,10 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess)
225230
options.ProjectConfig.ProjectRequestMessage,
226231
)
227232

233+
// Use a discovery client capable of being refreshed.
234+
discoveryClient := cacheddiscovery.NewMemCacheClient(privilegedLoopbackKubeClientsetInternal.Discovery())
235+
restMapper := discovery.NewDeferredDiscoveryRESTMapper(discoveryClient, meta.InterfacesForUnstructured)
236+
228237
// punch through layers to build this in order to get a string for a cloud provider file
229238
// TODO refactor us into a forward building flow with a side channel like this
230239
kubeOptions, err := kubernetes.BuildKubeAPIserverOptions(options)
@@ -251,8 +260,7 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess)
251260
informers.GetInternalKubeInformers(),
252261
authorizer,
253262
cloudConfig,
254-
// TODO: use a dynamic restmapper. See https://github.com/kubernetes/kubernetes/pull/42615.
255-
kapi.Registry.RESTMapper(),
263+
restMapper,
256264
quotaRegistry)
257265
openshiftPluginInitializer := &oadmission.PluginInitializer{
258266
OpenshiftClient: privilegedLoopbackOpenShiftClient,
@@ -298,6 +306,8 @@ func BuildMasterConfig(options configapi.MasterConfig, informers InformerAccess)
298306
config := &MasterConfig{
299307
Options: options,
300308

309+
RESTMapper: restMapper,
310+
301311
RESTOptionsGetter: restOptsGetter,
302312

303313
RuleResolver: ruleResolver,

test/integration/master_routes_test.go

+1
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ var expectedIndex = []string{
8989
"/healthz",
9090
"/healthz/autoregister-completion",
9191
"/healthz/ping",
92+
"/healthz/poststarthook/admission.openshift.io-RefreshRESTMapper",
9293
"/healthz/poststarthook/apiservice-registration-controller",
9394
"/healthz/poststarthook/apiservice-status-available-controller",
9495
"/healthz/poststarthook/authorization.openshift.io-bootstrapclusterroles",

vendor/k8s.io/kubernetes/staging/src/k8s.io/client-go/discovery/cached/BUILD

+36
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/k8s.io/kubernetes/staging/src/k8s.io/client-go/discovery/cached/memcache.go

+185
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)