Skip to content

Commit 79cd104

Browse files
authored
refactor: enable 'revive.deep-exit' rule (#6030)
* chore: enable 'revive.deep-exit' rule * fix deep-exit issue in pkg/controller/jobframework * fix lint issue for yaml-processor * fix lint issue for pkg/visibility * fix lint issues * fix compilation * fix tests * fix e2e
1 parent a632367 commit 79cd104

File tree

11 files changed

+103
-86
lines changed

11 files changed

+103
-86
lines changed

‎.golangci.yaml‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ linters:
6464
enable-all-rules: false
6565
rules:
6666
- name: context-as-argument
67+
- name: deep-exit
6768
- name: empty-lines
6869
- name: increment-decrement
6970
- name: var-naming

‎cmd/kueue/main.go‎

Lines changed: 55 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -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

446455
func blockForPodsReady(cfg *configapi.Configuration) bool {

‎hack/internal/tools/yaml-processor/main.go‎

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
"flag"
2222
"fmt"
2323
"log"
24-
"os"
2524
"syscall"
2625

2726
"go.uber.org/zap"
@@ -36,7 +35,10 @@ type options struct {
3635
}
3736

3837
func main() {
39-
opts := parseOptions()
38+
opts, err := parseOptions()
39+
if err != nil {
40+
log.Fatalf("Failed to parse options: %v", err)
41+
}
4042

4143
logger, err := newLogger(opts.LogLevel)
4244
if err != nil {
@@ -65,7 +67,7 @@ func main() {
6567
fileProcessor.ProcessPlan(*processingPlan)
6668
}
6769

68-
func parseOptions() *options {
70+
func parseOptions() (*options, error) {
6971
opts := &options{}
7072

7173
flag.StringVar(&opts.LogLevel, "zap-log-level", "info", "Minimum enabled logging level")
@@ -77,12 +79,12 @@ func parseOptions() *options {
7779
flag.Parse()
7880
if flag.NArg() != 1 {
7981
flag.Usage()
80-
os.Exit(1)
82+
return nil, errors.New("exactly one processing plan file argument is required")
8183
}
8284

8385
opts.ProcessingPlan = flag.Arg(0)
8486

85-
return opts
87+
return opts, nil
8688
}
8789

8890
func newLogger(logLevel string) (*zap.Logger, error) {

‎pkg/controller/jobframework/setup.go‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"errors"
2222
"fmt"
23-
"os"
2423
"time"
2524

2625
"github.com/go-logr/logr"
@@ -73,8 +72,7 @@ func (m *integrationManager) setupControllers(ctx context.Context, mgr ctrl.Mana
7372
if options.EnabledFrameworks.Has(name) {
7473
if cb.CanSupportIntegration != nil {
7574
if canSupport, err := cb.CanSupportIntegration(opts...); !canSupport || err != nil {
76-
log.Error(err, "Failed to configure reconcilers")
77-
os.Exit(1)
75+
return fmt.Errorf("failed to configure reconcilers: %w", err)
7876
}
7977
}
8078
gvk, err := apiutil.GVKForObject(cb.JobType, mgr.GetScheme())

‎pkg/visibility/server.go‎

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ import (
2020
"context"
2121
"fmt"
2222
"net"
23-
"os"
2423
"strings"
2524

2625
validatingadmissionpolicy "k8s.io/apiserver/pkg/admission/plugin/policy/validating"
@@ -32,7 +31,6 @@ import (
3231
genericoptions "k8s.io/apiserver/pkg/server/options"
3332
"k8s.io/component-base/compatibility"
3433
"k8s.io/component-base/version"
35-
ctrl "sigs.k8s.io/controller-runtime"
3634

3735
generatedopenapi "sigs.k8s.io/kueue/apis/visibility/openapi"
3836
visibilityv1beta1 "sigs.k8s.io/kueue/apis/visibility/v1beta1"
@@ -43,7 +41,6 @@ import (
4341
)
4442

4543
var (
46-
setupLog = ctrl.Log.WithName("visibility-server")
4744
// Admission plugins that are enabled by default in the kubeapi server
4845
// but are not required for the visibility server.
4946
disabledPlugins = []string{
@@ -60,28 +57,26 @@ var (
6057
// +kubebuilder:rbac:groups=flowcontrol.apiserver.k8s.io,resources=flowschemas/status,verbs=patch
6158

6259
// CreateAndStartVisibilityServer creates visibility server injecting KueueManager and starts it
63-
func CreateAndStartVisibilityServer(ctx context.Context, kueueMgr *queue.Manager) {
60+
func CreateAndStartVisibilityServer(ctx context.Context, kueueMgr *queue.Manager) error {
6461
config := newVisibilityServerConfig()
6562
if err := applyVisibilityServerOptions(config); err != nil {
66-
setupLog.Error(err, "Unable to apply VisibilityServerOptions")
67-
os.Exit(1)
63+
return fmt.Errorf("unable to apply VisibilityServerOptions: %w", err)
6864
}
6965

7066
visibilityServer, err := config.Complete().New("visibility-server", genericapiserver.NewEmptyDelegate())
7167
if err != nil {
72-
setupLog.Error(err, "Unable to create visibility server")
73-
os.Exit(1)
68+
return fmt.Errorf("unable to create visibility server: %w", err)
7469
}
7570

7671
if err := api.Install(visibilityServer, kueueMgr); err != nil {
77-
setupLog.Error(err, "Unable to install visibility.kueue.x-k8s.io API")
78-
os.Exit(1)
72+
return fmt.Errorf("unable to install visibility.kueue.x-k8s.io API: %w", err)
7973
}
8074

8175
if err := visibilityServer.PrepareRun().RunWithContext(ctx); err != nil {
82-
setupLog.Error(err, "Error running visibility server")
83-
os.Exit(1)
76+
return fmt.Errorf("running visibility server: %w", err)
8477
}
78+
79+
return nil
8580
}
8681

8782
func applyVisibilityServerOptions(config *genericapiserver.RecommendedConfig) error {

‎test/e2e/certmanager/suite_test.go‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,9 @@ func TestAPIs(t *testing.T) {
5353
var _ = ginkgo.BeforeSuite(func() {
5454
util.SetupLogger()
5555

56-
k8sClient, cfg = util.CreateClientUsingCluster("")
56+
var err error
57+
k8sClient, cfg, err = util.CreateClientUsingCluster("")
58+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
5759
restClient = util.CreateRestClient(cfg)
5860
ctx = ginkgo.GinkgoT().Context()
5961

‎test/e2e/customconfigs/suite_test.go‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,9 @@ func TestAPIs(t *testing.T) {
5656
var _ = ginkgo.BeforeSuite(func() {
5757
util.SetupLogger()
5858

59-
k8sClient, cfg = util.CreateClientUsingCluster("")
59+
var err error
60+
k8sClient, cfg, err = util.CreateClientUsingCluster("")
61+
gomega.Expect(err).NotTo(gomega.HaveOccurred())
6062
restClient = util.CreateRestClient(cfg)
6163
ctx = ginkgo.GinkgoT().Context()
6264

0 commit comments

Comments
 (0)