@@ -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
// used later to filter the served resource by those that have expired.
@@ -618,6 +622,18 @@ func (s *APIAggregator) AddAPIService(apiService *v1.APIService) error {
618
622
return nil
619
623
}
620
624
625
+ // For some resources we always want to delegate to local API server.
626
+ // These resources have to exists as CRD to be served locally.
627
+ for _ , alwaysLocalDelegatePath := range alwaysLocalDelegatePathPrefixes .List () {
628
+ if s .handledAlwaysLocalDelegatePaths .Has (alwaysLocalDelegatePath ) {
629
+ continue
630
+ }
631
+ s .GenericAPIServer .Handler .NonGoRestfulMux .Handle (alwaysLocalDelegatePath , proxyHandler .localDelegate )
632
+ // Always use local delegate for this prefix
633
+ s .GenericAPIServer .Handler .NonGoRestfulMux .UnlistedHandlePrefix (alwaysLocalDelegatePath + "/" , proxyHandler .localDelegate )
634
+ s .handledAlwaysLocalDelegatePaths .Insert (alwaysLocalDelegatePath )
635
+ }
636
+
621
637
// it's time to register the group aggregation endpoint
622
638
groupPath := "/apis/" + apiService .Spec .Group
623
639
groupDiscoveryHandler := & apiGroupHandler {
0 commit comments