Skip to content

Commit a0ae14f

Browse files
authored
cleanup + restructure of config and setup logic (#102)
Rework APIs and basic units to simplify codeflare operator integration.
1 parent 2213dec commit a0ae14f

File tree

9 files changed

+44
-39
lines changed

9 files changed

+44
-39
lines changed

cmd/main.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -135,20 +135,27 @@ func main() {
135135

136136
certsReady := make(chan struct{})
137137

138-
if *cfg.WebhooksEnabled {
138+
if ptr.Deref(cfg.WebhooksEnabled, false) {
139139
exitOnError(controller.SetupCertManagement(mgr, cfg.CertManagement, certsReady), "Unable to set up cert rotation")
140140
} else {
141141
close(certsReady)
142142
}
143143

144-
// Ascynchronous because controllers need to wait for certificate to be ready for webhooks to work
145-
go controller.SetupControllers(ctx, mgr, cfg.AppWrapper, *cfg.WebhooksEnabled, certsReady, setupLog)
144+
go func() {
145+
setupLog.Info("Waiting for certificates to be generated")
146+
<-certsReady
147+
setupLog.Info("Certs ready")
148+
if ptr.Deref(cfg.WebhooksEnabled, false) {
149+
exitOnError(controller.SetupWebhooks(ctx, mgr, cfg.AppWrapper), "unable to configure webhook")
150+
}
151+
exitOnError(controller.SetupControllers(ctx, mgr, cfg.AppWrapper), "unable to start controllers")
152+
}()
146153

147154
exitOnError(controller.SetupIndexers(ctx, mgr, cfg.AppWrapper), "unable to setup indexers")
148155
exitOnError(controller.SetupProbeEndpoints(mgr, certsReady), "unable to setup probe endpoints")
149156

150157
setupLog.Info("starting manager")
151-
exitOnError(mgr.Start(ctx), "problem running manager")
158+
exitOnError(mgr.Start(ctx), "problem starting manager")
152159
}
153160

154161
func getNamespace() (string, error) {

config/default/config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ metadata:
44
name: operator-config
55
data:
66
config.yaml: |
7+
appwrapper:
8+
enableKueueIntegrations: true
9+
manageJobsWithoutQueueName: true
710
controllerManager:
811
health:
912
bindAddress: ":8081"

config/dev/config.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ metadata:
44
name: operator-config
55
data:
66
config.yaml: |
7+
appwrapper:
8+
enableKueueIntegrations: true
9+
manageJobsWithoutQueueName: true
710
controllerManager:
811
health:
912
bindAddress: "localhost:0"

config/standalone/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ metadata:
55
data:
66
config.yaml: |
77
appwrapper:
8-
standaloneMode: true
8+
enableKueueIntegrations: false
99
manageJobsWithoutQueueName: false
1010
controllerManager:
1111
health:

go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ module github.com/project-codeflare/appwrapper
33
go 1.21
44

55
require (
6-
github.com/go-logr/logr v1.4.1
76
github.com/onsi/ginkgo/v2 v2.16.0
87
github.com/onsi/gomega v1.31.1
98
github.com/open-policy-agent/cert-controller v0.10.1
@@ -24,6 +23,7 @@ require (
2423
github.com/emicklei/go-restful/v3 v3.11.0 // indirect
2524
github.com/evanphx/json-patch/v5 v5.8.0 // indirect
2625
github.com/fsnotify/fsnotify v1.7.0 // indirect
26+
github.com/go-logr/logr v1.4.1 // indirect
2727
github.com/go-logr/zapr v1.3.0 // indirect
2828
github.com/go-openapi/jsonpointer v0.20.0 // indirect
2929
github.com/go-openapi/jsonreference v0.20.2 // indirect

internal/controller/appwrapper/resource_management.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,16 @@ func (r *AppWrapperReconciler) createComponent(ctx context.Context, aw *workload
8080
if err != nil {
8181
return nil, err, true
8282
}
83-
if r.Config.StandaloneMode {
84-
obj.SetLabels(utilmaps.MergeKeepFirst(obj.GetLabels(), map[string]string{AppWrapperLabel: aw.Name}))
85-
} else {
83+
if r.Config.EnableKueueIntegrations {
8684
obj.SetLabels(utilmaps.MergeKeepFirst(obj.GetLabels(), map[string]string{AppWrapperLabel: aw.Name, constants.QueueLabel: childJobQueueName}))
85+
} else {
86+
obj.SetLabels(utilmaps.MergeKeepFirst(obj.GetLabels(), map[string]string{AppWrapperLabel: aw.Name}))
8787
}
8888

8989
awLabels := map[string]string{AppWrapperLabel: aw.Name}
9090
for podSetsIdx, podSet := range component.PodSets {
9191
toInject := &workloadv1beta2.AppWrapperPodSetInfo{}
92-
if !r.Config.StandaloneMode {
92+
if r.Config.EnableKueueIntegrations {
9393
if podSetsIdx < len(component.PodSetInfos) {
9494
toInject = &component.PodSetInfos[podSetsIdx]
9595
} else {

internal/webhook/appwrapper_webhook.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ var _ webhook.CustomDefaulter = &AppWrapperWebhook{}
5959
func (w *AppWrapperWebhook) Default(ctx context.Context, obj runtime.Object) error {
6060
aw := obj.(*workloadv1beta2.AppWrapper)
6161
log.FromContext(ctx).Info("Applying defaults", "job", aw)
62-
if !w.Config.StandaloneMode {
62+
if w.Config.EnableKueueIntegrations {
6363
jobframework.ApplyDefaultForSuspend((*wlc.AppWrapper)(aw), w.Config.ManageJobsWithoutQueueName)
6464
}
6565
if err := expandPodSets(ctx, aw); err != nil {
@@ -78,7 +78,7 @@ func (w *AppWrapperWebhook) ValidateCreate(ctx context.Context, obj runtime.Obje
7878
aw := obj.(*workloadv1beta2.AppWrapper)
7979
log.FromContext(ctx).Info("Validating create", "job", aw)
8080
allErrors := w.validateAppWrapperCreate(ctx, aw)
81-
if !w.Config.StandaloneMode {
81+
if w.Config.EnableKueueIntegrations {
8282
allErrors = append(allErrors, jobframework.ValidateCreateForQueueName((*wlc.AppWrapper)(aw))...)
8383
}
8484
return nil, allErrors.ToAggregate()
@@ -90,7 +90,7 @@ func (w *AppWrapperWebhook) ValidateUpdate(ctx context.Context, oldObj, newObj r
9090
newAW := newObj.(*workloadv1beta2.AppWrapper)
9191
log.FromContext(ctx).Info("Validating update", "job", newAW)
9292
allErrors := w.validateAppWrapperUpdate(oldAW, newAW)
93-
if !w.Config.StandaloneMode {
93+
if w.Config.EnableKueueIntegrations {
9494
allErrors = append(allErrors, jobframework.ValidateUpdateForQueueName((*wlc.AppWrapper)(oldAW), (*wlc.AppWrapper)(newAW))...)
9595
allErrors = append(allErrors, jobframework.ValidateUpdateForWorkloadPriorityClassName((*wlc.AppWrapper)(oldAW), (*wlc.AppWrapper)(newAW))...)
9696
}

pkg/config/config.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ type OperatorConfig struct {
3030

3131
type AppWrapperConfig struct {
3232
ManageJobsWithoutQueueName bool `json:"manageJobsWithoutQueueName,omitempty"`
33-
StandaloneMode bool `json:"standaloneMode,omitempty"`
33+
EnableKueueIntegrations bool `json:"enableKueueIntegrations,omitempty"`
3434
FaultTolerance *FaultToleranceConfig `json:"faultTolerance,omitempty"`
3535
}
3636

@@ -74,7 +74,7 @@ type HealthConfiguration struct {
7474
func NewAppWrapperConfig() *AppWrapperConfig {
7575
return &AppWrapperConfig{
7676
ManageJobsWithoutQueueName: true,
77-
StandaloneMode: false,
77+
EnableKueueIntegrations: true,
7878
FaultTolerance: &FaultToleranceConfig{
7979
WarmupGracePeriod: 5 * time.Minute,
8080
FailureGracePeriod: 1 * time.Minute,

pkg/controller/setup.go

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,13 +21,11 @@ import (
2121
"errors"
2222
"fmt"
2323
"net/http"
24-
"os"
2524

2625
"k8s.io/apimachinery/pkg/types"
2726
ctrl "sigs.k8s.io/controller-runtime"
2827
"sigs.k8s.io/controller-runtime/pkg/healthz"
2928

30-
"github.com/go-logr/logr"
3129
cert "github.com/open-policy-agent/cert-controller/pkg/rotator"
3230

3331
"github.com/project-codeflare/appwrapper/internal/controller/appwrapper"
@@ -39,29 +37,21 @@ import (
3937
)
4038

4139
// SetupControllers creates and configures all components of the AppWrapper controller
42-
func SetupControllers(ctx context.Context, mgr ctrl.Manager, awConfig *config.AppWrapperConfig,
43-
webhooksEnabled bool, certsReady chan struct{}, log logr.Logger) {
44-
45-
log.Info("Waiting for certificates to be generated")
46-
<-certsReady
47-
log.Info("Certs ready")
48-
49-
if !awConfig.StandaloneMode {
40+
func SetupControllers(ctx context.Context, mgr ctrl.Manager, awConfig *config.AppWrapperConfig) error {
41+
if awConfig.EnableKueueIntegrations {
5042
if err := workload.WorkloadReconciler(
5143
mgr.GetClient(),
5244
mgr.GetEventRecorderFor("kueue"),
5345
jobframework.WithManageJobsWithoutQueueName(awConfig.ManageJobsWithoutQueueName),
5446
).SetupWithManager(mgr); err != nil {
55-
log.Error(err, "Failed to create workload controller")
56-
os.Exit(1)
47+
return fmt.Errorf("workload controller: %w", err)
5748
}
5849

5950
if err := (&workload.ChildWorkloadReconciler{
6051
Client: mgr.GetClient(),
6152
Scheme: mgr.GetScheme(),
6253
}).SetupWithManager(mgr); err != nil {
63-
log.Error(err, "Failed to create child admission controller")
64-
os.Exit(1)
54+
return fmt.Errorf("child admission controller: %w", err)
6555
}
6656
}
6757

@@ -70,22 +60,24 @@ func SetupControllers(ctx context.Context, mgr ctrl.Manager, awConfig *config.Ap
7060
Scheme: mgr.GetScheme(),
7161
Config: awConfig,
7262
}).SetupWithManager(mgr); err != nil {
73-
log.Error(err, "Failed to create appwrapper controller")
74-
os.Exit(1)
63+
return fmt.Errorf("appwrapper controller: %w", err)
7564
}
7665

77-
if webhooksEnabled {
78-
if err := (&webhook.AppWrapperWebhook{
79-
Config: awConfig,
80-
}).SetupWebhookWithManager(mgr); err != nil {
81-
log.Error(err, "Failed to create webhook")
82-
os.Exit(1)
83-
}
66+
return nil
67+
}
68+
69+
// SetupWebhooks creates and configures the AppWrapper controller's Webhooks
70+
func SetupWebhooks(ctx context.Context, mgr ctrl.Manager, awConfig *config.AppWrapperConfig) error {
71+
if err := (&webhook.AppWrapperWebhook{
72+
Config: awConfig,
73+
}).SetupWebhookWithManager(mgr); err != nil {
74+
return fmt.Errorf("webhook: %w", err)
8475
}
76+
return nil
8577
}
8678

8779
func SetupIndexers(ctx context.Context, mgr ctrl.Manager, awConfig *config.AppWrapperConfig) error {
88-
if !awConfig.StandaloneMode {
80+
if awConfig.EnableKueueIntegrations {
8981
if err := jobframework.SetupWorkloadOwnerIndex(ctx, mgr.GetFieldIndexer(), workload.GVK); err != nil {
9082
return fmt.Errorf("workload indexer: %w", err)
9183
}

0 commit comments

Comments
 (0)