Skip to content

Commit

Permalink
Merge pull request #171 from SomtochiAma/observed-gen
Browse files Browse the repository at this point in the history
Add observedGeneration to status of alert and receivers
  • Loading branch information
stefanprodan authored Mar 29, 2021
2 parents 1fa3d2f + f2f9960 commit daaaf30
Show file tree
Hide file tree
Showing 8 changed files with 87 additions and 8 deletions.
4 changes: 4 additions & 0 deletions api/v1beta1/alert_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,10 @@ type AlertSpec struct {
type AlertStatus struct {
// +optional
Conditions []metav1.Condition `json:"conditions,omitempty"`

// ObservedGeneration is the last observed generation.
// +optional
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
}

// +genclient
Expand Down
4 changes: 4 additions & 0 deletions api/v1beta1/receiver_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ type ReceiverStatus struct {
// of '/hook/sha256sum(token+name+namespace)'.
// +optional
URL string `json:"url,omitempty"`

// ObservedGeneration is the last observed generation.
// +optional
ObservedGeneration int64 `json:"observedGeneration,omitempty"`
}

const (
Expand Down
4 changes: 4 additions & 0 deletions config/crd/bases/notification.toolkit.fluxcd.io_alerts.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -189,6 +189,10 @@ spec:
- type
type: object
type: array
observedGeneration:
description: ObservedGeneration is the last observed generation.
format: int64
type: integer
type: object
type: object
served: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,10 @@ spec:
- type
type: object
type: array
observedGeneration:
description: ObservedGeneration is the last observed generation.
format: int64
type: integer
url:
description: Generated webhook URL in the format of '/hook/sha256sum(token+name+namespace)'.
type: string
Expand Down
19 changes: 16 additions & 3 deletions controllers/alert_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -72,15 +72,16 @@ func (r *AlertReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl
// validate alert spec and provider
if err := r.validate(ctx, alert); err != nil {
meta.SetResourceCondition(&alert, meta.ReadyCondition, metav1.ConditionFalse, meta.ReconciliationFailedReason, err.Error())
if err := r.Status().Update(ctx, &alert); err != nil {
if err := r.patchStatus(ctx, req, alert.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}
return ctrl.Result{Requeue: true}, err
}

if !apimeta.IsStatusConditionTrue(alert.Status.Conditions, meta.ReadyCondition) {
if !apimeta.IsStatusConditionTrue(alert.Status.Conditions, meta.ReadyCondition) || alert.Status.ObservedGeneration != alert.Generation {
meta.SetResourceCondition(&alert, meta.ReadyCondition, metav1.ConditionTrue, v1beta1.InitializedReason, v1beta1.InitializedReason)
if err := r.Status().Update(ctx, &alert); err != nil {
alert.Status.ObservedGeneration = alert.Generation
if err := r.patchStatus(ctx, req, alert.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}
log.Info("Alert initialised")
Expand Down Expand Up @@ -151,3 +152,15 @@ func (r *AlertReconciler) recordReadiness(ctx context.Context, alert v1beta1.Ale
}, !alert.DeletionTimestamp.IsZero())
}
}

func (r *AlertReconciler) patchStatus(ctx context.Context, req ctrl.Request, newStatus v1beta1.AlertStatus) error {
var alert v1beta1.Alert
if err := r.Get(ctx, req.NamespacedName, &alert); err != nil {
return err
}

patch := client.MergeFrom(alert.DeepCopy())
alert.Status = newStatus

return r.Status().Patch(ctx, &alert, patch)
}
16 changes: 14 additions & 2 deletions controllers/provider_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -71,15 +71,15 @@ func (r *ProviderReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
// validate provider spec and credentials
if err := r.validate(ctx, provider); err != nil {
meta.SetResourceCondition(&provider, meta.ReadyCondition, metav1.ConditionFalse, meta.ReconciliationFailedReason, err.Error())
if err := r.Status().Update(ctx, &provider); err != nil {
if err := r.patchStatus(ctx, req, provider.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}
return ctrl.Result{Requeue: true}, err
}

if !apimeta.IsStatusConditionTrue(provider.Status.Conditions, meta.ReadyCondition) {
meta.SetResourceCondition(&provider, meta.ReadyCondition, metav1.ConditionTrue, v1beta1.InitializedReason, v1beta1.InitializedReason)
if err := r.Status().Update(ctx, &provider); err != nil {
if err := r.patchStatus(ctx, req, provider.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}
log.Info("Provider initialised")
Expand Down Expand Up @@ -149,3 +149,15 @@ func (r *ProviderReconciler) recordReadiness(ctx context.Context, provider v1bet
}, !provider.DeletionTimestamp.IsZero())
}
}

func (r *ProviderReconciler) patchStatus(ctx context.Context, req ctrl.Request, newStatus v1beta1.ProviderStatus) error {
var provider v1beta1.Provider
if err := r.Get(ctx, req.NamespacedName, &provider); err != nil {
return err
}

patch := client.MergeFrom(provider.DeepCopy())
provider.Status = newStatus

return r.Status().Patch(ctx, &provider, patch)
}
20 changes: 17 additions & 3 deletions controllers/receiver_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -69,22 +69,24 @@ func (r *ReceiverReconciler) Reconcile(ctx context.Context, req ctrl.Request) (c
token, err := r.token(ctx, receiver)
if err != nil {
receiver = v1beta1.ReceiverNotReady(receiver, v1beta1.TokenNotFoundReason, err.Error())
if err := r.Status().Update(ctx, &receiver); err != nil {
if err := r.patchStatus(ctx, req, receiver.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}
return ctrl.Result{}, err
}

isReady := apimeta.IsStatusConditionTrue(receiver.Status.Conditions, meta.ReadyCondition)
receiverURL := fmt.Sprintf("/hook/%s", sha256sum(token+receiver.Name+receiver.Namespace))
if receiver.Status.URL == receiverURL && isReady {
if receiver.Status.URL == receiverURL && isReady && receiver.Status.ObservedGeneration == receiver.Generation {
return ctrl.Result{}, nil
}

receiver = v1beta1.ReceiverReady(receiver,
v1beta1.InitializedReason,
"Receiver initialised with URL: "+receiverURL,
receiverURL)
if err := r.Status().Update(ctx, &receiver); err != nil {
receiver.Status.ObservedGeneration = receiver.Generation
if err := r.patchStatus(ctx, req, receiver.Status); err != nil {
return ctrl.Result{Requeue: true}, err
}

Expand Down Expand Up @@ -145,3 +147,15 @@ func sha256sum(val string) string {
digest := sha256.Sum256([]byte(val))
return fmt.Sprintf("%x", digest)
}

func (r *ReceiverReconciler) patchStatus(ctx context.Context, req ctrl.Request, newStatus v1beta1.ReceiverStatus) error {
var receiver v1beta1.Receiver
if err := r.Get(ctx, req.NamespacedName, &receiver); err != nil {
return err
}

patch := client.MergeFrom(receiver.DeepCopy())
receiver.Status = newStatus

return r.Status().Patch(ctx, &receiver, patch)
}
24 changes: 24 additions & 0 deletions docs/api/notification.md
Original file line number Diff line number Diff line change
Expand Up @@ -585,6 +585,18 @@ Defaults to false.</p>
<em>(Optional)</em>
</td>
</tr>
<tr>
<td>
<code>observedGeneration</code><br>
<em>
int64
</em>
</td>
<td>
<em>(Optional)</em>
<p>ObservedGeneration is the last observed generation.</p>
</td>
</tr>
</tbody>
</table>
</div>
Expand Down Expand Up @@ -916,6 +928,18 @@ string
of &lsquo;/hook/sha256sum(token+name+namespace)&rsquo;.</p>
</td>
</tr>
<tr>
<td>
<code>observedGeneration</code><br>
<em>
int64
</em>
</td>
<td>
<em>(Optional)</em>
<p>ObservedGeneration is the last observed generation.</p>
</td>
</tr>
</tbody>
</table>
</div>
Expand Down

0 comments on commit daaaf30

Please sign in to comment.