From 6b035f4deb65280a0ce9059622dff37e6ea0d06a Mon Sep 17 00:00:00 2001 From: Bastien Riviere Date: Sun, 3 Sep 2023 13:44:16 +0200 Subject: [PATCH] feat: notify ReconciliationSucceeded only after modification --- bridge/flux.go | 57 +++++++++++++++++++++++++++++++++----------------- 1 file changed, 38 insertions(+), 19 deletions(-) diff --git a/bridge/flux.go b/bridge/flux.go index f66287f..e82f632 100644 --- a/bridge/flux.go +++ b/bridge/flux.go @@ -9,20 +9,26 @@ import ( "time" ) +type fluxInvolvedObject struct { + Kind string `json:"kind"` + Namespace string `json:"namespace"` + Name string `json:"name"` + UID string `json:"uid"` + APIVersion string `json:"apiVersion"` + ResourceVersion string `json:"resourceVersion"` +} + +func (f fluxInvolvedObject) String() string { + return strings.ToLower(f.Kind) + "/" + f.Namespace + "." + f.Name +} + type FluxNotification struct { - InvolvedObject struct { - Kind string `json:"kind"` - Namespace string `json:"namespace"` - Name string `json:"name"` - UID string `json:"uid"` - APIVersion string `json:"apiVersion"` - ResourceVersion string `json:"resourceVersion"` - } `json:"involvedObject"` - Severity string `json:"severity"` - Timestamp time.Time `json:"timestamp"` - Message string `json:"message"` - Reason string `json:"reason"` - Metadata struct { + InvolvedObject fluxInvolvedObject `json:"involvedObject"` + Severity string `json:"severity"` + Timestamp time.Time `json:"timestamp"` + Message string `json:"message"` + Reason string `json:"reason"` + Metadata struct { CommitStatus string `json:"commit_status"` Revision string `json:"revision"` Summary string `json:"summary"` @@ -31,10 +37,15 @@ type FluxNotification struct { ReportingInstance string `json:"reportingInstance"` } -type FluxHandler struct{} +type FluxHandler struct { + // Register all modifications of reconciliations + reconciliations map[string]bool +} func NewFluxHandler() FluxHandler { - return FluxHandler{} + return FluxHandler{ + reconciliations: make(map[string]bool), + } } func (f FluxHandler) FormatNotification(r io.Reader) (Notification, error) { @@ -47,13 +58,21 @@ func (f FluxHandler) FormatNotification(r io.Reader) (Notification, error) { return Notification{}, err } + obj := not.InvolvedObject.String() if not.Reason == "ReconciliationSucceeded" { - // Filter out spammy ReconciliationSucceeded notification - return Notification{}, nil + if ok := f.reconciliations[obj]; !ok { + // Filter out spammy ReconciliationSucceeded notification + return Notification{}, nil + } + + // we will print the object so skip it next time it spam + f.reconciliations[obj] = false + } else { + // object has been modified, we can print it next time + f.reconciliations[obj] = true } - title := fmt.Sprintf("[%s] %s %s/%s.%s", not.Severity, not.Reason, - strings.ToLower(not.InvolvedObject.Kind), not.InvolvedObject.Namespace, not.InvolvedObject.Name) + title := fmt.Sprintf("[%s] %s %s", not.Severity, not.Reason, obj) body := not.Message + "\n\n**revision**\n" + not.Metadata.Revision l.Debug("flux notification", slog.Group("notification",