Skip to content

Commit 5fcbfd3

Browse files
authored
Merge pull request #202 from fluxcd/patch-status
Patch status sub-resource
2 parents d8c0923 + be81846 commit 5fcbfd3

File tree

5 files changed

+90
-39
lines changed

5 files changed

+90
-39
lines changed

.github/workflows/e2e.yaml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ jobs:
100100
kubectl -n source-system apply -f ./config/testdata/helmchart-from-bucket/source.yaml
101101
kubectl -n source-system wait bucket/charts --for=condition=ready --timeout=1m
102102
kubectl -n source-system wait helmchart/helmchart-bucket --for=condition=ready --timeout=1m
103+
- name: Logs
104+
run: |
105+
kubectl -n source-system logs deploy/source-controller
103106
- name: Debug failure
104107
if: failure()
105108
run: |

controllers/bucket_controller.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
100100
// set initial status
101101
if resetBucket, ok := r.resetStatus(bucket); ok {
102102
bucket = resetBucket
103-
if err := r.Status().Update(ctx, &bucket); err != nil {
103+
if err := r.updateStatus(ctx, req, bucket.Status); err != nil {
104104
log.Error(err, "unable to update status")
105105
return ctrl.Result{Requeue: true}, err
106106
}
107-
r.recordReadiness(bucket, false)
107+
r.recordReadiness(bucket)
108108
}
109109

110110
// purge old artifacts from storage
@@ -116,23 +116,23 @@ func (r *BucketReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
116116
reconciledBucket, reconcileErr := r.reconcile(ctx, *bucket.DeepCopy())
117117

118118
// update status with the reconciliation result
119-
if err := r.Status().Update(ctx, &reconciledBucket); err != nil {
119+
if err := r.updateStatus(ctx, req, reconciledBucket.Status); err != nil {
120120
log.Error(err, "unable to update status")
121121
return ctrl.Result{Requeue: true}, err
122122
}
123123

124124
// if reconciliation failed, record the failure and requeue immediately
125125
if reconcileErr != nil {
126126
r.event(reconciledBucket, events.EventSeverityError, reconcileErr.Error())
127-
r.recordReadiness(reconciledBucket, false)
127+
r.recordReadiness(reconciledBucket)
128128
return ctrl.Result{Requeue: true}, reconcileErr
129129
}
130130

131131
// emit revision change event
132132
if bucket.Status.Artifact == nil || reconciledBucket.Status.Artifact.Revision != bucket.Status.Artifact.Revision {
133133
r.event(reconciledBucket, events.EventSeverityInfo, sourcev1.BucketReadyMessage(reconciledBucket))
134134
}
135-
r.recordReadiness(reconciledBucket, false)
135+
r.recordReadiness(reconciledBucket)
136136

137137
log.Info(fmt.Sprintf("Reconciliation finished in %s, next run in %s",
138138
time.Now().Sub(start).String(),
@@ -259,7 +259,7 @@ func (r *BucketReconciler) reconcileDelete(ctx context.Context, bucket sourcev1.
259259
}
260260

261261
// Record deleted status
262-
r.recordReadiness(bucket, true)
262+
r.recordReadiness(bucket)
263263

264264
// Remove our finalizer from the list and update it
265265
controllerutil.RemoveFinalizer(&bucket, sourcev1.SourceFinalizer)
@@ -385,7 +385,7 @@ func (r *BucketReconciler) event(bucket sourcev1.Bucket, severity, msg string) {
385385
}
386386
}
387387

388-
func (r *BucketReconciler) recordReadiness(bucket sourcev1.Bucket, deleted bool) {
388+
func (r *BucketReconciler) recordReadiness(bucket sourcev1.Bucket) {
389389
if r.MetricsRecorder == nil {
390390
return
391391
}
@@ -399,11 +399,23 @@ func (r *BucketReconciler) recordReadiness(bucket sourcev1.Bucket, deleted bool)
399399
return
400400
}
401401
if rc := meta.GetCondition(bucket.Status.Conditions, meta.ReadyCondition); rc != nil {
402-
r.MetricsRecorder.RecordCondition(*objRef, *rc, deleted)
402+
r.MetricsRecorder.RecordCondition(*objRef, *rc, !bucket.DeletionTimestamp.IsZero())
403403
} else {
404404
r.MetricsRecorder.RecordCondition(*objRef, meta.Condition{
405405
Type: meta.ReadyCondition,
406406
Status: corev1.ConditionUnknown,
407-
}, deleted)
407+
}, !bucket.DeletionTimestamp.IsZero())
408408
}
409409
}
410+
411+
func (r *BucketReconciler) updateStatus(ctx context.Context, req ctrl.Request, newStatus sourcev1.BucketStatus) error {
412+
var bucket sourcev1.Bucket
413+
if err := r.Get(ctx, req.NamespacedName, &bucket); err != nil {
414+
return err
415+
}
416+
417+
patch := client.MergeFrom(bucket.DeepCopy())
418+
bucket.Status = newStatus
419+
420+
return r.Status().Patch(ctx, &bucket, patch)
421+
}

controllers/gitrepository_controller.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -99,11 +99,11 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
9999
// set initial status
100100
if resetRepository, ok := r.resetStatus(repository); ok {
101101
repository = resetRepository
102-
if err := r.Status().Update(ctx, &repository); err != nil {
102+
if err := r.updateStatus(ctx, req, repository.Status); err != nil {
103103
log.Error(err, "unable to update status")
104104
return ctrl.Result{Requeue: true}, err
105105
}
106-
r.recordReadiness(repository, false)
106+
r.recordReadiness(repository)
107107
}
108108

109109
// purge old artifacts from storage
@@ -115,23 +115,23 @@ func (r *GitRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, erro
115115
reconciledRepository, reconcileErr := r.reconcile(ctx, *repository.DeepCopy())
116116

117117
// update status with the reconciliation result
118-
if err := r.Status().Update(ctx, &reconciledRepository); err != nil {
118+
if err := r.updateStatus(ctx, req, reconciledRepository.Status); err != nil {
119119
log.Error(err, "unable to update status")
120120
return ctrl.Result{Requeue: true}, err
121121
}
122122

123123
// if reconciliation failed, record the failure and requeue immediately
124124
if reconcileErr != nil {
125125
r.event(reconciledRepository, events.EventSeverityError, reconcileErr.Error())
126-
r.recordReadiness(reconciledRepository, false)
126+
r.recordReadiness(reconciledRepository)
127127
return ctrl.Result{Requeue: true}, reconcileErr
128128
}
129129

130130
// emit revision change event
131131
if repository.Status.Artifact == nil || reconciledRepository.Status.Artifact.Revision != repository.Status.Artifact.Revision {
132132
r.event(reconciledRepository, events.EventSeverityInfo, sourcev1.GitRepositoryReadyMessage(reconciledRepository))
133133
}
134-
r.recordReadiness(reconciledRepository, false)
134+
r.recordReadiness(reconciledRepository)
135135

136136
log.Info(fmt.Sprintf("Reconciliation finished in %s, next run in %s",
137137
time.Now().Sub(start).String(),
@@ -257,7 +257,7 @@ func (r *GitRepositoryReconciler) reconcileDelete(ctx context.Context, repositor
257257
}
258258

259259
// Record deleted status
260-
r.recordReadiness(repository, true)
260+
r.recordReadiness(repository)
261261

262262
// Remove our finalizer from the list and update it
263263
controllerutil.RemoveFinalizer(&repository, sourcev1.SourceFinalizer)
@@ -345,7 +345,7 @@ func (r *GitRepositoryReconciler) event(repository sourcev1.GitRepository, sever
345345
}
346346
}
347347

348-
func (r *GitRepositoryReconciler) recordReadiness(repository sourcev1.GitRepository, deleted bool) {
348+
func (r *GitRepositoryReconciler) recordReadiness(repository sourcev1.GitRepository) {
349349
if r.MetricsRecorder == nil {
350350
return
351351
}
@@ -359,11 +359,23 @@ func (r *GitRepositoryReconciler) recordReadiness(repository sourcev1.GitReposit
359359
return
360360
}
361361
if rc := meta.GetCondition(repository.Status.Conditions, meta.ReadyCondition); rc != nil {
362-
r.MetricsRecorder.RecordCondition(*objRef, *rc, deleted)
362+
r.MetricsRecorder.RecordCondition(*objRef, *rc, !repository.DeletionTimestamp.IsZero())
363363
} else {
364364
r.MetricsRecorder.RecordCondition(*objRef, meta.Condition{
365365
Type: meta.ReadyCondition,
366366
Status: corev1.ConditionUnknown,
367-
}, deleted)
367+
}, !repository.DeletionTimestamp.IsZero())
368368
}
369369
}
370+
371+
func (r *GitRepositoryReconciler) updateStatus(ctx context.Context, req ctrl.Request, newStatus sourcev1.GitRepositoryStatus) error {
372+
var repository sourcev1.GitRepository
373+
if err := r.Get(ctx, req.NamespacedName, &repository); err != nil {
374+
return err
375+
}
376+
377+
patch := client.MergeFrom(repository.DeepCopy())
378+
repository.Status = newStatus
379+
380+
return r.Status().Patch(ctx, &repository, patch)
381+
}

controllers/helmchart_controller.go

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,11 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
106106
resetChart, changed := r.resetStatus(chart)
107107
if changed {
108108
chart = resetChart
109-
if err := r.Status().Update(ctx, &chart); err != nil {
109+
if err := r.updateStatus(ctx, req, chart.Status); err != nil {
110110
log.Error(err, "unable to update status")
111111
return ctrl.Result{Requeue: true}, err
112112
}
113-
r.recordReadiness(chart, false)
113+
r.recordReadiness(chart)
114114
}
115115

116116
// Purge all but current artifact from storage
@@ -122,7 +122,7 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
122122
source, err := r.getSource(ctx, chart)
123123
if err != nil {
124124
chart = sourcev1.HelmChartNotReady(*chart.DeepCopy(), sourcev1.ChartPullFailedReason, err.Error())
125-
if err := r.Status().Update(ctx, &chart); err != nil {
125+
if err := r.updateStatus(ctx, req, chart.Status); err != nil {
126126
log.Error(err, "unable to update status")
127127
}
128128
return ctrl.Result{Requeue: true}, err
@@ -133,10 +133,10 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
133133
err = fmt.Errorf("no artifact found for source `%s` kind '%s'",
134134
chart.Spec.SourceRef.Name, chart.Spec.SourceRef.Kind)
135135
chart = sourcev1.HelmChartNotReady(*chart.DeepCopy(), sourcev1.ChartPullFailedReason, err.Error())
136-
if err := r.Status().Update(ctx, &chart); err != nil {
136+
if err := r.updateStatus(ctx, req, chart.Status); err != nil {
137137
log.Error(err, "unable to update status")
138138
}
139-
r.recordReadiness(chart, false)
139+
r.recordReadiness(chart)
140140
return ctrl.Result{Requeue: true}, err
141141
}
142142

@@ -155,23 +155,23 @@ func (r *HelmChartReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
155155
}
156156

157157
// Update status with the reconciliation result
158-
if err := r.Status().Update(ctx, &reconciledChart); err != nil {
158+
if err := r.updateStatus(ctx, req, reconciledChart.Status); err != nil {
159159
log.Error(err, "unable to update status")
160160
return ctrl.Result{Requeue: true}, err
161161
}
162162

163163
// If reconciliation failed, record the failure and requeue immediately
164164
if reconcileErr != nil {
165165
r.event(reconciledChart, events.EventSeverityError, reconcileErr.Error())
166-
r.recordReadiness(reconciledChart, false)
166+
r.recordReadiness(reconciledChart)
167167
return ctrl.Result{Requeue: true}, reconcileErr
168168
}
169169

170170
// Emit an event if we did not have an artifact before, or the revision has changed
171171
if chart.Status.Artifact == nil || reconciledChart.Status.Artifact.Revision != chart.Status.Artifact.Revision {
172172
r.event(reconciledChart, events.EventSeverityInfo, sourcev1.HelmChartReadyMessage(reconciledChart))
173173
}
174-
r.recordReadiness(reconciledChart, false)
174+
r.recordReadiness(reconciledChart)
175175

176176
log.Info(fmt.Sprintf("Reconciliation finished in %s, next run in %s",
177177
time.Now().Sub(start).String(),
@@ -596,7 +596,7 @@ func (r *HelmChartReconciler) reconcileDelete(ctx context.Context, chart sourcev
596596
}
597597

598598
// Record deleted status
599-
r.recordReadiness(chart, true)
599+
r.recordReadiness(chart)
600600

601601
// Remove our finalizer from the list and update it
602602
controllerutil.RemoveFinalizer(&chart, sourcev1.SourceFinalizer)
@@ -662,7 +662,7 @@ func (r *HelmChartReconciler) event(chart sourcev1.HelmChart, severity, msg stri
662662
}
663663
}
664664

665-
func (r *HelmChartReconciler) recordReadiness(chart sourcev1.HelmChart, deleted bool) {
665+
func (r *HelmChartReconciler) recordReadiness(chart sourcev1.HelmChart) {
666666
if r.MetricsRecorder == nil {
667667
return
668668
}
@@ -676,15 +676,27 @@ func (r *HelmChartReconciler) recordReadiness(chart sourcev1.HelmChart, deleted
676676
return
677677
}
678678
if rc := meta.GetCondition(chart.Status.Conditions, meta.ReadyCondition); rc != nil {
679-
r.MetricsRecorder.RecordCondition(*objRef, *rc, deleted)
679+
r.MetricsRecorder.RecordCondition(*objRef, *rc, !chart.DeletionTimestamp.IsZero())
680680
} else {
681681
r.MetricsRecorder.RecordCondition(*objRef, meta.Condition{
682682
Type: meta.ReadyCondition,
683683
Status: corev1.ConditionUnknown,
684-
}, deleted)
684+
}, !chart.DeletionTimestamp.IsZero())
685685
}
686686
}
687687

688+
func (r *HelmChartReconciler) updateStatus(ctx context.Context, req ctrl.Request, newStatus sourcev1.HelmChartStatus) error {
689+
var chart sourcev1.HelmChart
690+
if err := r.Get(ctx, req.NamespacedName, &chart); err != nil {
691+
return err
692+
}
693+
694+
patch := client.MergeFrom(chart.DeepCopy())
695+
chart.Status = newStatus
696+
697+
return r.Status().Patch(ctx, &chart, patch)
698+
}
699+
688700
func (r *HelmChartReconciler) indexHelmRepositoryByURL(o runtime.Object) []string {
689701
repo, ok := o.(*sourcev1.HelmRepository)
690702
if !ok {

controllers/helmrepository_controller.go

Lines changed: 21 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -100,11 +100,11 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
100100
// set initial status
101101
if resetRepository, ok := r.resetStatus(repository); ok {
102102
repository = resetRepository
103-
if err := r.Status().Update(ctx, &repository); err != nil {
103+
if err := r.updateStatus(ctx, req, repository.Status); err != nil {
104104
log.Error(err, "unable to update status")
105105
return ctrl.Result{Requeue: true}, err
106106
}
107-
r.recordReadiness(repository, false)
107+
r.recordReadiness(repository)
108108
}
109109

110110
// purge old artifacts from storage
@@ -116,23 +116,23 @@ func (r *HelmRepositoryReconciler) Reconcile(req ctrl.Request) (ctrl.Result, err
116116
reconciledRepository, reconcileErr := r.reconcile(ctx, *repository.DeepCopy())
117117

118118
// update status with the reconciliation result
119-
if err := r.Status().Update(ctx, &reconciledRepository); err != nil {
119+
if err := r.updateStatus(ctx, req, reconciledRepository.Status); err != nil {
120120
log.Error(err, "unable to update status")
121121
return ctrl.Result{Requeue: true}, err
122122
}
123123

124124
// if reconciliation failed, record the failure and requeue immediately
125125
if reconcileErr != nil {
126126
r.event(reconciledRepository, events.EventSeverityError, reconcileErr.Error())
127-
r.recordReadiness(reconciledRepository, false)
127+
r.recordReadiness(reconciledRepository)
128128
return ctrl.Result{Requeue: true}, reconcileErr
129129
}
130130

131131
// emit revision change event
132132
if repository.Status.Artifact == nil || reconciledRepository.Status.Artifact.Revision != repository.Status.Artifact.Revision {
133133
r.event(reconciledRepository, events.EventSeverityInfo, sourcev1.HelmRepositoryReadyMessage(reconciledRepository))
134134
}
135-
r.recordReadiness(reconciledRepository, false)
135+
r.recordReadiness(reconciledRepository)
136136

137137
log.Info(fmt.Sprintf("Reconciliation finished in %s, next run in %s",
138138
time.Now().Sub(start).String(),
@@ -255,7 +255,7 @@ func (r *HelmRepositoryReconciler) reconcileDelete(ctx context.Context, reposito
255255
}
256256

257257
// Record deleted status
258-
r.recordReadiness(repository, true)
258+
r.recordReadiness(repository)
259259

260260
// Remove our finalizer from the list and update it
261261
controllerutil.RemoveFinalizer(&repository, sourcev1.SourceFinalizer)
@@ -319,7 +319,7 @@ func (r *HelmRepositoryReconciler) event(repository sourcev1.HelmRepository, sev
319319
}
320320
}
321321

322-
func (r *HelmRepositoryReconciler) recordReadiness(repository sourcev1.HelmRepository, deleted bool) {
322+
func (r *HelmRepositoryReconciler) recordReadiness(repository sourcev1.HelmRepository) {
323323
if r.MetricsRecorder == nil {
324324
return
325325
}
@@ -333,11 +333,23 @@ func (r *HelmRepositoryReconciler) recordReadiness(repository sourcev1.HelmRepos
333333
return
334334
}
335335
if rc := meta.GetCondition(repository.Status.Conditions, meta.ReadyCondition); rc != nil {
336-
r.MetricsRecorder.RecordCondition(*objRef, *rc, deleted)
336+
r.MetricsRecorder.RecordCondition(*objRef, *rc, !repository.DeletionTimestamp.IsZero())
337337
} else {
338338
r.MetricsRecorder.RecordCondition(*objRef, meta.Condition{
339339
Type: meta.ReadyCondition,
340340
Status: corev1.ConditionUnknown,
341-
}, deleted)
341+
}, !repository.DeletionTimestamp.IsZero())
342342
}
343343
}
344+
345+
func (r *HelmRepositoryReconciler) updateStatus(ctx context.Context, req ctrl.Request, newStatus sourcev1.HelmRepositoryStatus) error {
346+
var repository sourcev1.HelmRepository
347+
if err := r.Get(ctx, req.NamespacedName, &repository); err != nil {
348+
return err
349+
}
350+
351+
patch := client.MergeFrom(repository.DeepCopy())
352+
repository.Status = newStatus
353+
354+
return r.Status().Patch(ctx, &repository, patch)
355+
}

0 commit comments

Comments
 (0)