@@ -137,6 +137,9 @@ type APIAggregator struct {
137
137
// handledGroups are the groups that already have routes
138
138
handledGroups sets.String
139
139
140
+ // handledAlwaysLocalDelegatePaths are the URL paths that already have routes registered
141
+ handledAlwaysLocalDelegatePaths sets.String
142
+
140
143
// lister is used to add group handling for /apis/<group> aggregator lookups based on
141
144
// controller state
142
145
lister listers.APIServiceLister
@@ -204,18 +207,19 @@ func (c completedConfig) NewWithDelegate(delegationTarget genericapiserver.Deleg
204
207
}
205
208
206
209
s := & APIAggregator {
207
- GenericAPIServer : genericServer ,
208
- delegateHandler : delegationTarget .UnprotectedHandler (),
209
- proxyTransport : c .ExtraConfig .ProxyTransport ,
210
- proxyHandlers : map [string ]* proxyHandler {},
211
- handledGroups : sets.String {},
212
- lister : informerFactory .Apiregistration ().V1 ().APIServices ().Lister (),
213
- APIRegistrationInformers : informerFactory ,
214
- serviceResolver : c .ExtraConfig .ServiceResolver ,
215
- openAPIConfig : c .GenericConfig .OpenAPIConfig ,
216
- openAPIV3Config : c .GenericConfig .OpenAPIV3Config ,
217
- egressSelector : c .GenericConfig .EgressSelector ,
218
- proxyCurrentCertKeyContent : func () (bytes []byte , bytes2 []byte ) { return nil , nil },
210
+ GenericAPIServer : genericServer ,
211
+ delegateHandler : delegationTarget .UnprotectedHandler (),
212
+ proxyTransport : c .ExtraConfig .ProxyTransport ,
213
+ proxyHandlers : map [string ]* proxyHandler {},
214
+ handledGroups : sets.String {},
215
+ handledAlwaysLocalDelegatePaths : sets.String {},
216
+ lister : informerFactory .Apiregistration ().V1 ().APIServices ().Lister (),
217
+ APIRegistrationInformers : informerFactory ,
218
+ serviceResolver : c .ExtraConfig .ServiceResolver ,
219
+ openAPIConfig : c .GenericConfig .OpenAPIConfig ,
220
+ openAPIV3Config : c .GenericConfig .OpenAPIV3Config ,
221
+ egressSelector : c .GenericConfig .EgressSelector ,
222
+ proxyCurrentCertKeyContent : func () (bytes []byte , bytes2 []byte ) { return nil , nil },
219
223
}
220
224
221
225
// used later to filter the served resource by those that have expired.
@@ -502,6 +506,18 @@ func (s *APIAggregator) AddAPIService(apiService *v1.APIService) error {
502
506
return nil
503
507
}
504
508
509
+ // For some resources we always want to delegate to local API server.
510
+ // These resources have to exists as CRD to be served locally.
511
+ for _ , alwaysLocalDelegatePath := range alwaysLocalDelegatePathPrefixes .List () {
512
+ if s .handledAlwaysLocalDelegatePaths .Has (alwaysLocalDelegatePath ) {
513
+ continue
514
+ }
515
+ s .GenericAPIServer .Handler .NonGoRestfulMux .Handle (alwaysLocalDelegatePath , proxyHandler .localDelegate )
516
+ // Always use local delegate for this prefix
517
+ s .GenericAPIServer .Handler .NonGoRestfulMux .UnlistedHandlePrefix (alwaysLocalDelegatePath + "/" , proxyHandler .localDelegate )
518
+ s .handledAlwaysLocalDelegatePaths .Insert (alwaysLocalDelegatePath )
519
+ }
520
+
505
521
// it's time to register the group aggregation endpoint
506
522
groupPath := "/apis/" + apiService .Spec .Group
507
523
groupDiscoveryHandler := & apiGroupHandler {
0 commit comments