@@ -160,6 +160,9 @@ type APIAggregator struct {
160
160
// is the versions for the group.
161
161
handledGroupVersions map [string ]sets.Set [string ]
162
162
163
+ // handledAlwaysLocalDelegatePaths are the URL paths that already have routes registered
164
+ handledAlwaysLocalDelegatePaths sets.String
165
+
163
166
// lister is used to add group handling for /apis/<group> aggregator lookups based on
164
167
// controller state
165
168
lister listers.APIServiceLister
@@ -245,19 +248,20 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg
245
248
}
246
249
247
250
s := & APIAggregator {
248
- GenericAPIServer : genericServer ,
249
- delegateHandler : delegationTarget .UnprotectedHandler (),
250
- proxyTransportDial : proxyTransportDial ,
251
- proxyHandlers : map [string ]* proxyHandler {},
252
- handledGroupVersions : map [string ]sets.Set [string ]{},
253
- lister : informerFactory .Apiregistration ().V1 ().APIServices ().Lister (),
254
- APIRegistrationInformers : informerFactory ,
255
- serviceResolver : c .ExtraConfig .ServiceResolver ,
256
- openAPIConfig : c .GenericConfig .OpenAPIConfig ,
257
- openAPIV3Config : c .GenericConfig .OpenAPIV3Config ,
258
- proxyCurrentCertKeyContent : func () (bytes []byte , bytes2 []byte ) { return nil , nil },
259
- rejectForwardingRedirects : c .ExtraConfig .RejectForwardingRedirects ,
260
- tracerProvider : c .GenericConfig .TracerProvider ,
251
+ GenericAPIServer : genericServer ,
252
+ delegateHandler : delegationTarget .UnprotectedHandler (),
253
+ proxyTransportDial : proxyTransportDial ,
254
+ proxyHandlers : map [string ]* proxyHandler {},
255
+ handledGroupVersions : map [string ]sets.Set [string ]{},
256
+ handledAlwaysLocalDelegatePaths : sets.String {},
257
+ lister : informerFactory .Apiregistration ().V1 ().APIServices ().Lister (),
258
+ APIRegistrationInformers : informerFactory ,
259
+ serviceResolver : c .ExtraConfig .ServiceResolver ,
260
+ openAPIConfig : c .GenericConfig .OpenAPIConfig ,
261
+ openAPIV3Config : c .GenericConfig .OpenAPIV3Config ,
262
+ proxyCurrentCertKeyContent : func () (bytes []byte , bytes2 []byte ) { return nil , nil },
263
+ rejectForwardingRedirects : c .ExtraConfig .RejectForwardingRedirects ,
264
+ tracerProvider : c .GenericConfig .TracerProvider ,
261
265
}
262
266
263
267
apiGroupInfo := apiservicerest .NewRESTStorage (c .GenericConfig .MergedResourceConfig , c .GenericConfig .RESTOptionsGetter , false )
@@ -606,6 +610,18 @@ func (s *APIAggregator) AddAPIService(apiService *v1.APIService) error {
606
610
return nil
607
611
}
608
612
613
+ // For some resources we always want to delegate to local API server.
614
+ // These resources have to exists as CRD to be served locally.
615
+ for _ , alwaysLocalDelegatePath := range alwaysLocalDelegatePathPrefixes .List () {
616
+ if s .handledAlwaysLocalDelegatePaths .Has (alwaysLocalDelegatePath ) {
617
+ continue
618
+ }
619
+ s .GenericAPIServer .Handler .NonGoRestfulMux .Handle (alwaysLocalDelegatePath , proxyHandler .localDelegate )
620
+ // Always use local delegate for this prefix
621
+ s .GenericAPIServer .Handler .NonGoRestfulMux .UnlistedHandlePrefix (alwaysLocalDelegatePath + "/" , proxyHandler .localDelegate )
622
+ s .handledAlwaysLocalDelegatePaths .Insert (alwaysLocalDelegatePath )
623
+ }
624
+
609
625
// it's time to register the group aggregation endpoint
610
626
groupPath := "/apis/" + apiService .Spec .Group
611
627
groupDiscoveryHandler := & apiGroupHandler {
0 commit comments