@@ -21,6 +21,7 @@ import (
2121 "crypto/tls"
2222 "errors"
2323 "flag"
24+ "fmt"
2425 "net/http"
2526 "os"
2627 "path/filepath"
@@ -232,22 +233,43 @@ func main() {
232233 }
233234 debugger .NewDumper (cCache , queues ).ListenForSignal (ctx )
234235
235- serverVersionFetcher := setupServerVersionFetcher (mgr , kubeConfig )
236+ serverVersionFetcher , err := setupServerVersionFetcher (mgr , kubeConfig )
237+ if err != nil {
238+ setupLog .Error (err , "Unable to setup server version fetcher" )
239+ os .Exit (1 )
240+ }
241+
242+ if err := setupProbeEndpoints (mgr , certsReady ); err != nil {
243+ setupLog .Error (err , "Unable to setup probe endpoints" )
244+ os .Exit (1 )
245+ }
236246
237- setupProbeEndpoints (mgr , certsReady )
238247 // Cert won't be ready until manager starts, so start a goroutine here which
239248 // will block until the cert is ready before setting up the controllers.
240249 // Controllers who register after manager starts will start directly.
241- go setupControllers (ctx , mgr , cCache , queues , certsReady , & cfg , serverVersionFetcher )
250+ go func () {
251+ if err := setupControllers (ctx , mgr , cCache , queues , certsReady , & cfg , serverVersionFetcher ); err != nil {
252+ setupLog .Error (err , "Unable to setup controllers" )
253+ os .Exit (1 )
254+ }
255+ }()
242256
243257 go queues .CleanUpOnContext (ctx )
244258 go cCache .CleanUpOnContext (ctx )
245259
246260 if features .Enabled (features .VisibilityOnDemand ) {
247- go visibility .CreateAndStartVisibilityServer (ctx , queues )
261+ go func () {
262+ if err := visibility .CreateAndStartVisibilityServer (ctx , queues ); err != nil {
263+ setupLog .Error (err , "Unable to create and start visibility server" )
264+ os .Exit (1 )
265+ }
266+ }()
248267 }
249268
250- setupScheduler (mgr , cCache , queues , & cfg )
269+ if err := setupScheduler (mgr , cCache , queues , & cfg ); err != nil {
270+ setupLog .Error (err , "Could not setup scheduler" )
271+ os .Exit (1 )
272+ }
251273
252274 setupLog .Info ("Starting manager" )
253275 if err := mgr .Start (ctx ); err != nil {
@@ -267,22 +289,19 @@ func setupIndexes(ctx context.Context, mgr ctrl.Manager, cfg *configapi.Configur
267289 if err := provisioning .ServerSupportsProvisioningRequest (mgr ); err != nil {
268290 setupLog .Error (err , "Skipping admission check controller setup: Provisioning Requests not supported (Possible cause: missing or unsupported cluster-autoscaler)" )
269291 } else if err := provisioning .SetupIndexer (ctx , mgr .GetFieldIndexer ()); err != nil {
270- setupLog .Error (err , "Could not setup provisioning indexer" )
271- os .Exit (1 )
292+ return fmt .Errorf ("could not setup provisioning indexer: %w" , err )
272293 }
273294 }
274295
275296 if features .Enabled (features .TopologyAwareScheduling ) {
276297 if err := tasindexer .SetupIndexes (ctx , mgr .GetFieldIndexer ()); err != nil {
277- setupLog .Error (err , "Could not setup TAS indexer" )
278- os .Exit (1 )
298+ return fmt .Errorf ("could not setup TAX indexer: %w" , err )
279299 }
280300 }
281301
282302 if features .Enabled (features .MultiKueue ) {
283303 if err := multikueue .SetupIndexer (ctx , mgr .GetFieldIndexer (), * cfg .Namespace ); err != nil {
284- setupLog .Error (err , "Could not setup multikueue indexer" )
285- os .Exit (1 )
304+ return fmt .Errorf ("could not setup multikueue indexer: %w" , err )
286305 }
287306 }
288307
@@ -292,14 +311,13 @@ func setupIndexes(ctx context.Context, mgr ctrl.Manager, cfg *configapi.Configur
292311 return jobframework .SetupIndexes (ctx , mgr .GetFieldIndexer (), opts ... )
293312}
294313
295- func setupControllers (ctx context.Context , mgr ctrl.Manager , cCache * cache.Cache , queues * queue.Manager , certsReady chan struct {}, cfg * configapi.Configuration , serverVersionFetcher * kubeversion.ServerVersionFetcher ) {
314+ func setupControllers (ctx context.Context , mgr ctrl.Manager , cCache * cache.Cache , queues * queue.Manager , certsReady chan struct {}, cfg * configapi.Configuration , serverVersionFetcher * kubeversion.ServerVersionFetcher ) error {
296315 // The controllers won't work until the webhooks are operating, and the webhook won't work until the
297316 // certs are all in place.
298317 cert .WaitForCertsReady (setupLog , certsReady )
299318
300319 if failedCtrl , err := core .SetupControllers (mgr , queues , cCache , cfg ); err != nil {
301- setupLog .Error (err , "Unable to create controller" , "controller" , failedCtrl )
302- os .Exit (1 )
320+ return fmt .Errorf ("unable to create controller %s: %w" , failedCtrl , err )
303321 }
304322
305323 // setup provision admission check controller
@@ -309,44 +327,38 @@ func setupControllers(ctx context.Context, mgr ctrl.Manager, cCache *cache.Cache
309327 } else {
310328 ctrl , err := provisioning .NewController (mgr .GetClient (), mgr .GetEventRecorderFor ("kueue-provisioning-request-controller" ))
311329 if err != nil {
312- setupLog .Error (err , "Could not create the provisioning controller" )
313- os .Exit (1 )
330+ return fmt .Errorf ("could not create the provisioning controller: %w" , err )
314331 }
315332
316333 if err := ctrl .SetupWithManager (mgr ); err != nil {
317- setupLog .Error (err , "Could not setup provisioning controller" )
318- os .Exit (1 )
334+ return fmt .Errorf ("could not setup provisioning controller: %w" , err )
319335 }
320336 }
321337 }
322338
323339 if features .Enabled (features .MultiKueue ) {
324340 adapters , err := jobframework .GetMultiKueueAdapters (sets .New (cfg .Integrations .Frameworks ... ))
325341 if err != nil {
326- setupLog .Error (err , "Could not get the enabled multikueue adapters" )
327- os .Exit (1 )
342+ return fmt .Errorf ("could not get the enabled multikueue adapters: %w" , err )
328343 }
329344 if err := multikueue .SetupControllers (mgr , * cfg .Namespace ,
330345 multikueue .WithGCInterval (cfg .MultiKueue .GCInterval .Duration ),
331346 multikueue .WithOrigin (ptr .Deref (cfg .MultiKueue .Origin , configapi .DefaultMultiKueueOrigin )),
332347 multikueue .WithWorkerLostTimeout (cfg .MultiKueue .WorkerLostTimeout .Duration ),
333348 multikueue .WithAdapters (adapters ),
334349 ); err != nil {
335- setupLog .Error (err , "Could not setup MultiKueue controller" )
336- os .Exit (1 )
350+ return fmt .Errorf ("could not setup MultiKueue controller: %w" , err )
337351 }
338352 }
339353
340354 if features .Enabled (features .TopologyAwareScheduling ) {
341355 if failedCtrl , err := tas .SetupControllers (mgr , queues , cCache , cfg ); err != nil {
342- setupLog .Error (err , "Could not setup TAS controller" , "controller" , failedCtrl )
343- os .Exit (1 )
356+ return fmt .Errorf ("could not setup TAS controller %s: %w" , failedCtrl , err )
344357 }
345358 }
346359
347360 if failedWebhook , err := webhooks .Setup (mgr ); err != nil {
348- setupLog .Error (err , "Unable to create webhook" , "webhook" , failedWebhook )
349- os .Exit (1 )
361+ return fmt .Errorf ("unable to create webhook %s: %w" , failedWebhook , err )
350362 }
351363
352364 opts := []jobframework.Option {
@@ -366,24 +378,23 @@ func setupControllers(ctx context.Context, mgr ctrl.Manager, cCache *cache.Cache
366378 }
367379 nsSelector , err := metav1 .LabelSelectorAsSelector (cfg .ManagedJobsNamespaceSelector )
368380 if err != nil {
369- setupLog .Error (err , "Failed to parse managedJobsNamespaceSelector" )
370- os .Exit (1 )
381+ return fmt .Errorf ("failed to parse managedJobsNamespaceSelector: %w" , err )
371382 }
372383 opts = append (opts , jobframework .WithManagedJobsNamespaceSelector (nsSelector ))
373384
374385 if err := jobframework .SetupControllers (ctx , mgr , setupLog , opts ... ); err != nil {
375- setupLog .Error (err , "Unable to create controller or webhook" , "kubernetesVersion" , serverVersionFetcher .GetServerVersion ())
376- os .Exit (1 )
386+ return fmt .Errorf ("unable to create controller or webhook for kubernetesVersion %v: %w" , serverVersionFetcher .GetServerVersion (), err )
377387 }
388+
389+ return nil
378390}
379391
380392// setupProbeEndpoints registers the health endpoints
381- func setupProbeEndpoints (mgr ctrl.Manager , certsReady <- chan struct {}) {
393+ func setupProbeEndpoints (mgr ctrl.Manager , certsReady <- chan struct {}) error {
382394 defer setupLog .Info ("Probe endpoints are configured on healthz and readyz" )
383395
384396 if err := mgr .AddHealthzCheck ("healthz" , healthz .Ping ); err != nil {
385- setupLog .Error (err , "unable to set up health check" )
386- os .Exit (1 )
397+ return fmt .Errorf ("unable to set up health check: %w" , err )
387398 }
388399
389400 // Wait for the webhook server to be listening before advertising the
@@ -401,12 +412,13 @@ func setupProbeEndpoints(mgr ctrl.Manager, certsReady <-chan struct{}) {
401412 return errors .New ("certificates are not ready" )
402413 }
403414 }); err != nil {
404- setupLog .Error (err , "unable to set up ready check" )
405- os .Exit (1 )
415+ return fmt .Errorf ("unable to set up ready check: %w" , err )
406416 }
417+
418+ return nil
407419}
408420
409- func setupScheduler (mgr ctrl.Manager , cCache * cache.Cache , queues * queue.Manager , cfg * configapi.Configuration ) {
421+ func setupScheduler (mgr ctrl.Manager , cCache * cache.Cache , queues * queue.Manager , cfg * configapi.Configuration ) error {
410422 sched := scheduler .New (
411423 queues ,
412424 cCache ,
@@ -416,31 +428,28 @@ func setupScheduler(mgr ctrl.Manager, cCache *cache.Cache, queues *queue.Manager
416428 scheduler .WithFairSharing (cfg .FairSharing ),
417429 )
418430 if err := mgr .Add (sched ); err != nil {
419- setupLog .Error (err , "Unable to add scheduler to manager" )
420- os .Exit (1 )
431+ return fmt .Errorf ("unable to add scheduler to manager: %w" , err )
421432 }
433+ return nil
422434}
423435
424- func setupServerVersionFetcher (mgr ctrl.Manager , kubeConfig * rest.Config ) * kubeversion.ServerVersionFetcher {
436+ func setupServerVersionFetcher (mgr ctrl.Manager , kubeConfig * rest.Config ) ( * kubeversion.ServerVersionFetcher , error ) {
425437 discoveryClient , err := discovery .NewDiscoveryClientForConfig (kubeConfig )
426438 if err != nil {
427- setupLog .Error (err , "Unable to create the discovery client" )
428- os .Exit (1 )
439+ return nil , fmt .Errorf ("unable to create the discovery client: %w" , err )
429440 }
430441
431442 serverVersionFetcher := kubeversion .NewServerVersionFetcher (discoveryClient )
432443
433444 if err := mgr .Add (serverVersionFetcher ); err != nil {
434- setupLog .Error (err , "Unable to add server version fetcher to manager" )
435- os .Exit (1 )
445+ return nil , fmt .Errorf ("unable to add server version fetcher to manager: %w" , err )
436446 }
437447
438448 if err := serverVersionFetcher .FetchServerVersion (); err != nil {
439- setupLog .Error (err , "failed to fetch kubernetes server version" )
440- os .Exit (1 )
449+ return nil , fmt .Errorf ("failed to fetch kubernetes server version: %w" , err )
441450 }
442451
443- return serverVersionFetcher
452+ return serverVersionFetcher , nil
444453}
445454
446455func blockForPodsReady (cfg * configapi.Configuration ) bool {
0 commit comments