@@ -22,6 +22,7 @@ import (
2222 ctrl "sigs.k8s.io/controller-runtime"
2323 "sigs.k8s.io/controller-runtime/pkg/certwatcher"
2424 "sigs.k8s.io/controller-runtime/pkg/client"
25+ "sigs.k8s.io/controller-runtime/pkg/cluster"
2526 "sigs.k8s.io/controller-runtime/pkg/healthz"
2627 "sigs.k8s.io/controller-runtime/pkg/log/zap"
2728 "sigs.k8s.io/controller-runtime/pkg/metrics"
@@ -54,6 +55,7 @@ import (
5455 "github.com/cobaltcore-dev/cortex/pkg/conf"
5556 "github.com/cobaltcore-dev/cortex/pkg/db"
5657 "github.com/cobaltcore-dev/cortex/pkg/monitoring"
58+ "github.com/cobaltcore-dev/cortex/pkg/multicluster"
5759 "github.com/sapcc/go-bits/httpext"
5860 "github.com/sapcc/go-bits/must"
5961 corev1 "k8s.io/api/core/v1"
@@ -243,6 +245,33 @@ func main() {
243245 os .Exit (1 )
244246 }
245247
248+ homeCluster , err := cluster .New (restConfig , func (o * cluster.Options ) { o .Scheme = scheme })
249+ if err != nil {
250+ setupLog .Error (err , "unable to create home cluster" )
251+ os .Exit (1 )
252+ }
253+ if err := mgr .Add (homeCluster ); err != nil {
254+ setupLog .Error (err , "unable to add home cluster" )
255+ os .Exit (1 )
256+ }
257+ multiclusterClient := & multicluster.Client {
258+ HomeCluster : homeCluster ,
259+ HomeRestConfig : restConfig ,
260+ HomeScheme : scheme ,
261+ }
262+ for _ , override := range config .APIServerOverrides {
263+ cluster , err := multiclusterClient .AddRemote (override .Resource , override .Host , override .CACert )
264+ if err != nil {
265+ setupLog .Error (err , "unable to create cluster for apiserver override" , "apiserver" , override .Host )
266+ os .Exit (1 )
267+ }
268+ // Also tell the manager about this cluster so that controllers can use it.
269+ if err := mgr .Add (cluster ); err != nil {
270+ setupLog .Error (err , "unable to add cluster for apiserver override" , "apiserver" , override .Host )
271+ os .Exit (1 )
272+ }
273+ }
274+
246275 // Our custom monitoring registry can add prometheus labels to all metrics.
247276 // This is useful to distinguish metrics from different deployments.
248277 metrics .Registry = monitoring .WrapRegistry (metrics .Registry , config .Monitoring )
@@ -265,14 +294,14 @@ func main() {
265294 Conf : config ,
266295 }
267296 // Inferred through the base controller.
268- decisionController .Client = mgr . GetClient ()
297+ decisionController .Client = multiclusterClient
269298 decisionController .OperatorName = config .Operator
270- if err := (decisionController ).SetupWithManager (mgr ); err != nil {
299+ if err := (decisionController ).SetupWithManager (mgr , multiclusterClient ); err != nil {
271300 setupLog .Error (err , "unable to create controller" , "controller" , "DecisionReconciler" )
272301 os .Exit (1 )
273302 }
274303 novashims .NewAPI (config , decisionController ).Init (mux )
275- go decisionsnova .CleanupNovaDecisionsRegularly (ctx , mgr . GetClient () , config )
304+ go decisionsnova .CleanupNovaDecisionsRegularly (ctx , multiclusterClient , config )
276305 }
277306 if slices .Contains (config .EnabledControllers , "nova-deschedulings-pipeline-controller" ) {
278307 // Deschedulings controller
@@ -284,18 +313,18 @@ func main() {
284313 CycleDetector : deschedulingnova .NewCycleDetector (),
285314 }
286315 // Inferred through the base controller.
287- deschedulingsController .Client = mgr . GetClient ()
316+ deschedulingsController .Client = multiclusterClient
288317 deschedulingsController .OperatorName = config .Operator
289- if err := (deschedulingsController ).SetupWithManager (mgr ); err != nil {
318+ if err := (deschedulingsController ).SetupWithManager (mgr , multiclusterClient ); err != nil {
290319 setupLog .Error (err , "unable to create controller" , "controller" , "DeschedulingsReconciler" )
291320 os .Exit (1 )
292321 }
293322 go deschedulingsController .CreateDeschedulingsPeriodically (ctx )
294323 // Deschedulings cleanup on startup
295324 if err := (& deschedulingnova.Cleanup {
296- Client : mgr . GetClient () ,
325+ Client : multiclusterClient ,
297326 Scheme : mgr .GetScheme (),
298- }).SetupWithManager (mgr ); err != nil {
327+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
299328 setupLog .Error (err , "unable to create controller" , "controller" , "Cleanup" )
300329 os .Exit (1 )
301330 }
@@ -306,39 +335,39 @@ func main() {
306335 Conf : config ,
307336 }
308337 // Inferred through the base controller.
309- controller .Client = mgr . GetClient ()
338+ controller .Client = multiclusterClient
310339 controller .OperatorName = config .Operator
311- if err := (controller ).SetupWithManager (mgr ); err != nil {
340+ if err := (controller ).SetupWithManager (mgr , multiclusterClient ); err != nil {
312341 setupLog .Error (err , "unable to create controller" , "controller" , "DecisionReconciler" )
313342 os .Exit (1 )
314343 }
315344 manilashims .NewAPI (config , controller ).Init (mux )
316- go decisionsmanila .CleanupManilaDecisionsRegularly (ctx , mgr . GetClient () , config )
345+ go decisionsmanila .CleanupManilaDecisionsRegularly (ctx , multiclusterClient , config )
317346 }
318347 if slices .Contains (config .EnabledControllers , "cinder-decisions-pipeline-controller" ) {
319348 controller := & decisionscinder.DecisionPipelineController {
320349 Monitor : pipelineMonitor ,
321350 Conf : config ,
322351 }
323352 // Inferred through the base controller.
324- controller .Client = mgr . GetClient ()
353+ controller .Client = multiclusterClient
325354 controller .OperatorName = config .Operator
326- if err := (controller ).SetupWithManager (mgr ); err != nil {
355+ if err := (controller ).SetupWithManager (mgr , multiclusterClient ); err != nil {
327356 setupLog .Error (err , "unable to create controller" , "controller" , "DecisionReconciler" )
328357 os .Exit (1 )
329358 }
330359 cindershims .NewAPI (config , controller ).Init (mux )
331- go decisionscinder .CleanupCinderDecisionsRegularly (ctx , mgr . GetClient () , config )
360+ go decisionscinder .CleanupCinderDecisionsRegularly (ctx , multiclusterClient , config )
332361 }
333362 if slices .Contains (config .EnabledControllers , "ironcore-decisions-pipeline-controller" ) {
334363 controller := & decisionsmachines.DecisionPipelineController {
335364 Monitor : pipelineMonitor ,
336365 Conf : config ,
337366 }
338367 // Inferred through the base controller.
339- controller .Client = mgr . GetClient ()
368+ controller .Client = multiclusterClient
340369 controller .OperatorName = config .Operator
341- if err := (controller ).SetupWithManager (mgr ); err != nil {
370+ if err := (controller ).SetupWithManager (mgr , multiclusterClient ); err != nil {
342371 setupLog .Error (err , "unable to create controller" , "controller" , "DecisionReconciler" )
343372 os .Exit (1 )
344373 }
@@ -347,23 +376,23 @@ func main() {
347376 // Setup a controller which will reconcile the history and explanation for
348377 // decision resources.
349378 explanationController := & explanation.Controller {
350- Client : mgr . GetClient () ,
379+ Client : multiclusterClient ,
351380 OperatorName : config .Operator ,
352381 }
353- if err := explanationController .SetupWithManager (mgr ); err != nil {
382+ if err := explanationController .SetupWithManager (mgr , multiclusterClient ); err != nil {
354383 setupLog .Error (err , "unable to create controller" , "controller" , "ExplanationController" )
355384 os .Exit (1 )
356385 }
357386 }
358387 if slices .Contains (config .EnabledControllers , "reservations-controller" ) {
359- monitor := reservationscontroller .NewControllerMonitor (mgr . GetClient () )
388+ monitor := reservationscontroller .NewControllerMonitor (multiclusterClient )
360389 metrics .Registry .MustRegister (& monitor )
361390 if err := (& reservationscontroller.ReservationReconciler {
362- Client : mgr . GetClient () ,
391+ Client : multiclusterClient ,
363392 Scheme : mgr .GetScheme (),
364393 Conf : config ,
365394 HypervisorClient : reservationscontroller .NewHypervisorClient (),
366- }).SetupWithManager (mgr ); err != nil {
395+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
367396 setupLog .Error (err , "unable to create controller" , "controller" , "Reservation" )
368397 os .Exit (1 )
369398 }
@@ -372,20 +401,20 @@ func main() {
372401 monitor := datasources .NewMonitor ()
373402 metrics .Registry .MustRegister (& monitor )
374403 if err := (& openstack.OpenStackDatasourceReconciler {
375- Client : mgr . GetClient () ,
404+ Client : multiclusterClient ,
376405 Scheme : mgr .GetScheme (),
377406 Monitor : monitor ,
378407 Conf : config ,
379- }).SetupWithManager (mgr ); err != nil {
408+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
380409 setupLog .Error (err , "unable to create controller" , "controller" , "OpenStackDatasourceReconciler" )
381410 os .Exit (1 )
382411 }
383412 if err := (& prometheus.PrometheusDatasourceReconciler {
384- Client : mgr . GetClient () ,
413+ Client : multiclusterClient ,
385414 Scheme : mgr .GetScheme (),
386415 Monitor : monitor ,
387416 Conf : config ,
388- }).SetupWithManager (mgr ); err != nil {
417+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
389418 setupLog .Error (err , "unable to create controller" , "controller" , "PrometheusDatasourceReconciler" )
390419 os .Exit (1 )
391420 }
@@ -394,29 +423,29 @@ func main() {
394423 monitor := extractor .NewMonitor ()
395424 metrics .Registry .MustRegister (& monitor )
396425 if err := (& extractor.KnowledgeReconciler {
397- Client : mgr . GetClient () ,
426+ Client : multiclusterClient ,
398427 Scheme : mgr .GetScheme (),
399428 Monitor : monitor ,
400429 Conf : config ,
401- }).SetupWithManager (mgr ); err != nil {
430+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
402431 setupLog .Error (err , "unable to create controller" , "controller" , "KnowledgeReconciler" )
403432 os .Exit (1 )
404433 }
405434 if err := (& extractor.TriggerReconciler {
406- Client : mgr . GetClient () ,
435+ Client : multiclusterClient ,
407436 Scheme : mgr .GetScheme (),
408437 Conf : config ,
409- }).SetupWithManager (mgr ); err != nil {
438+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
410439 setupLog .Error (err , "unable to create controller" , "controller" , "TriggerReconciler" )
411440 os .Exit (1 )
412441 }
413442 }
414443 if slices .Contains (config .EnabledControllers , "kpis-controller" ) {
415444 if err := (& kpis.Controller {
416- Client : mgr . GetClient () ,
445+ Client : multiclusterClient ,
417446 SupportedKPIsByImpl : kpis .SupportedKPIsByImpl ,
418447 OperatorName : config .Operator ,
419- }).SetupWithManager (mgr ); err != nil {
448+ }).SetupWithManager (mgr , multiclusterClient ); err != nil {
420449 setupLog .Error (err , "unable to create controller" , "controller" , "KPIController" )
421450 os .Exit (1 )
422451 }
0 commit comments