@@ -18,11 +18,14 @@ package controllers
1818
1919import (
2020 "context"
21+ "reflect"
2122
2223 "k8s.io/apimachinery/pkg/runtime"
24+ "k8s.io/client-go/tools/record"
2325 ctrl "sigs.k8s.io/controller-runtime"
2426 "sigs.k8s.io/controller-runtime/pkg/builder"
2527 "sigs.k8s.io/controller-runtime/pkg/client"
28+ "sigs.k8s.io/controller-runtime/pkg/event"
2629 ctrllog "sigs.k8s.io/controller-runtime/pkg/log"
2730 "sigs.k8s.io/controller-runtime/pkg/predicate"
2831
@@ -39,7 +42,8 @@ import (
3942// WeightsAndBiasesReconciler reconciles a WeightsAndBiases object
4043type WeightsAndBiasesReconciler struct {
4144 client.Client
42- Scheme * runtime.Scheme
45+ Scheme * runtime.Scheme
46+ Recorder record.EventRecorder
4347}
4448
4549//+kubebuilder:rbac:groups=apps.wandb.com,resources=weightsandbiases,verbs=get;list;watch;create;update;patch;delete
@@ -77,7 +81,8 @@ func (r *WeightsAndBiasesReconciler) Reconcile(ctx context.Context, req ctrl.Req
7781 log .Error (err , "Failed to set status" )
7882 }
7983
80- statusManager .Set (status .Loading )
84+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "Reconciling" , "Reconciling" )
85+
8186 configManager := config .NewManager (ctx , r .Client , wandb , r .Scheme )
8287 usersConfig , err := configManager .GetDesiredState ()
8388
@@ -93,22 +98,25 @@ func (r *WeightsAndBiasesReconciler) Reconcile(ctx context.Context, req ctrl.Req
9398 license = wandb .Spec .License
9499 }
95100
101+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "LoadingConfig" , "Loading desired configuration" )
96102 // Apply configs in least to most priority order
97103 desiredState := config .Merge (
98104 usersConfig ,
99105 cdk8s .Github (),
100- cdk8s .Deployment (license ),
106+ cdk8s .Deployer (license ),
101107 cdk8s .Operator (wandb , r .Scheme ),
102108 )
103109
104110 if err != nil {
105111 if errors .IsNotFound (err ) {
112+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "CreatingConfig" , "Creating config" )
106113 log .Info ("No config found. Creating config..." , "name" , configManager .LatestConfigName ())
107114 usersConfig , err = configManager .CreateLatest (
108115 desiredState .Release ,
109116 map [string ]interface {}{},
110117 )
111118 if err != nil {
119+ statusManager .Set (status .InvalidConfig )
112120 log .Error (err , "Failed to create config" )
113121 return ctrlqueue .Requeue (err )
114122 }
@@ -118,24 +126,29 @@ func (r *WeightsAndBiasesReconciler) Reconcile(ctx context.Context, req ctrl.Req
118126 }
119127 }
120128
129+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "ConfigBackup" , "Creating a copy of config" )
121130 configManager .BackupLatest ()
122131
123132 log .Info ("Config values:" , "version" , desiredState .Release .Version (), "config" , desiredState .Config )
124133 if err != nil {
134+ statusManager .Set (status .InvalidConfig )
125135 log .Error (err , "Failed to get config" )
126136 return ctrlqueue .Requeue (err )
127137 }
128138
129139 statusManager .Set (status .Loading )
130140 log .Info ("Applying config changes..." , "version" , usersConfig .Release .Version ())
131- if err := r .applyConfig (ctx , wandb , usersConfig .Release , desiredState .Config ); err != nil {
141+ if err := r .applyConfig (ctx , wandb , statusManager , usersConfig .Release , desiredState .Config ); err != nil {
142+ statusManager .Set (status .InvalidConfig )
143+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "ApplyFailed" , "Valid to apply config changes" )
132144 // TODO: Implement rollback
133145 log .Error (err , "Failed to apply config changes." )
134146 return ctrlqueue .DoNotRequeue ()
135147 }
136148 log .Info ("Successfully applied config" , "version" , usersConfig .Release .Version ())
137149
138150 if desiredState .Release .Version () != usersConfig .Release .Version () {
151+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "VersionChangeDetected" , "Version change detected (" + usersConfig .Release .Version ()+ " -> " + desiredState .Release .Version ()+ ")" )
139152 log .Info (
140153 "Version changed. Applying..." ,
141154 "current" , usersConfig .Release .Version (),
@@ -145,13 +158,15 @@ func (r *WeightsAndBiasesReconciler) Reconcile(ctx context.Context, req ctrl.Req
145158 statusManager .Set (status .Loading )
146159 usersConfig .SetRelease (desiredState .Release )
147160
148- if err := r .applyConfig (ctx , wandb , usersConfig .Release , desiredState .Config ); err != nil {
161+ if err := r .applyConfig (ctx , wandb , statusManager , usersConfig .Release , desiredState .Config ); err != nil {
162+ statusManager .Set (status .InvalidVersion )
163+ r .Recorder .Event (wandb , corev1 .EventTypeNormal , "VersionApplyFailed" , "Valid to apply version changes" )
149164 // TODO: Implement rollback
150165 log .Error (err , "Failed to upgrade to new version." )
151166 return ctrlqueue .DoNotRequeue ()
152167 }
153168
154- // Only if succesful do we save the state to a config map.
169+ // Only if successful do we save the state to a config map.
155170 if err := configManager .SetDesiredState (usersConfig ); err != nil {
156171 log .Error (err , "Failed to set desired state" )
157172 return ctrlqueue .DoNotRequeue ()
@@ -168,9 +183,25 @@ func (r *WeightsAndBiasesReconciler) SetupWithManager(mgr ctrl.Manager) error {
168183 builder := ctrl .NewControllerManagedBy (mgr ).
169184 For (
170185 & apiv1.WeightsAndBiases {},
171- builder .WithPredicates (predicate. GenerationChangedPredicate {}),
186+ builder .WithPredicates (annotationChangedPredicate {}),
172187 ).
173188 Owns (& corev1.Secret {}).
174189 Owns (& corev1.ConfigMap {})
175190 return builder .Complete (r )
176191}
192+
193+ // annotationChangedPredicate implements the Predicate interface. It is used to
194+ // watch changes in the annotation of the Custom Resource.
195+ type annotationChangedPredicate struct {
196+ predicate.Funcs
197+ }
198+
199+ // It checks if there is an update event and only returns true if the
200+ // annotations have changed. We use annotations to trigger a reconcile
201+ // functions.
202+ func (a annotationChangedPredicate ) Update (e event.UpdateEvent ) bool {
203+ return ! reflect .DeepEqual (
204+ e .ObjectOld .GetAnnotations (),
205+ e .ObjectNew .GetAnnotations (),
206+ )
207+ }
0 commit comments