From 9cb6683ad48d03747463c2ac308f48624df5dff5 Mon Sep 17 00:00:00 2001 From: Prasad Ghangal Date: Thu, 20 Jun 2019 23:32:55 +0530 Subject: [PATCH 1/2] Add JobStatusChecker filter to send Job success notifications Signed-off-by: Prasad Ghangal --- helm/botkube/values.yaml | 1 + .../filters/job_status_checker.go | 51 +++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 pkg/filterengine/filters/job_status_checker.go diff --git a/helm/botkube/values.yaml b/helm/botkube/values.yaml index a53f9d1d8..326cbfa01 100644 --- a/helm/botkube/values.yaml +++ b/helm/botkube/values.yaml @@ -103,6 +103,7 @@ config: events: - create - delete + - update - error - name: roles namespaces: diff --git a/pkg/filterengine/filters/job_status_checker.go b/pkg/filterengine/filters/job_status_checker.go new file mode 100644 index 000000000..8b91f10b6 --- /dev/null +++ b/pkg/filterengine/filters/job_status_checker.go @@ -0,0 +1,51 @@ +// JobStatusChecker filter to send notifications only when job succeeds +// and ignore other update events + +package filters + +import ( + "github.com/infracloudio/botkube/pkg/config" + "github.com/infracloudio/botkube/pkg/events" + "github.com/infracloudio/botkube/pkg/filterengine" + log "github.com/infracloudio/botkube/pkg/logging" + + batchV1 "k8s.io/api/batch/v1" +) + +// JobStatusChecker checks job status and adds message in the events structure +type JobStatusChecker struct { +} + +// Register filter +func init() { + filterengine.DefaultFilterEngine.Register(JobStatusChecker{}) +} + +// Run filers and modifies event struct +func (f JobStatusChecker) Run(object interface{}, event *events.Event) { + // Run filter only on Job update event + if event.Kind != "Job" && event.Type != config.UpdateEvent { + return + } + jobObj, ok := object.(*batchV1.Job) + if !ok { + return + } + + // Check latest job conditions + jobLen := len(jobObj.Status.Conditions) + if jobLen < 1 { + event.Skip = true + return + } + c := jobObj.Status.Conditions[jobLen-1] + if c.Type == batchV1.JobComplete { + event.Messages = []string{"Job succeeded!"} + event.TimeStamp = c.LastTransitionTime.Time + } else { + event.Skip = true + return + } + event.Reason = c.Reason + log.Logger.Debug("Job status checker filter successful!") +} From 8082751656cc1fc82a174be97f1cdf1bfb34dda3 Mon Sep 17 00:00:00 2001 From: Prasad Ghangal Date: Mon, 24 Jun 2019 15:46:44 +0530 Subject: [PATCH 2/2] Add missing TimeStamp for error events Signed-off-by: Prasad Ghangal --- pkg/controller/controller.go | 28 +++++++------------ pkg/events/events.go | 1 + .../filters/job_status_checker.go | 2 +- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/pkg/controller/controller.go b/pkg/controller/controller.go index 21a0ce021..e399e5cb3 100644 --- a/pkg/controller/controller.go +++ b/pkg/controller/controller.go @@ -182,24 +182,6 @@ func sendEvent(obj interface{}, c *config.Config, kind string, eventType config. return } - // Skip older events - if eventType == config.CreateEvent { - objectMeta := utils.GetObjectMetaData(obj) - if objectMeta.CreationTimestamp.Sub(startTime).Seconds() <= 0 { - log.Logger.Debug("Skipping older events") - return - } - } - - // Skip older events - if eventType == config.DeleteEvent { - objectMeta := utils.GetObjectMetaData(obj) - if objectMeta.DeletionTimestamp != nil && objectMeta.DeletionTimestamp.Sub(startTime).Seconds() <= 0 { - log.Logger.Debug("Skipping older events") - return - } - } - // Check if Notify disabled if !config.Notify { log.Logger.Debug("Skipping notification") @@ -208,6 +190,16 @@ func sendEvent(obj interface{}, c *config.Config, kind string, eventType config. // Create new event object event := events.New(obj, eventType, kind) + + // Skip older events + if !event.TimeStamp.IsZero() { + //objectMeta := utils.GetObjectMetaData(obj) + if event.TimeStamp.Sub(startTime).Seconds() <= 0 { + log.Logger.Debug("Skipping older events") + return + } + } + event = filterengine.DefaultFilterEngine.Run(obj, event) if event.Skip { log.Logger.Debugf("Skipping event: %#v", event) diff --git a/pkg/events/events.go b/pkg/events/events.go index 1abc23fce..fa31a4036 100644 --- a/pkg/events/events.go +++ b/pkg/events/events.go @@ -100,6 +100,7 @@ func New(object interface{}, eventType config.EventType, kind string) Event { event.Level = LevelMap[config.EventType(strings.ToLower(obj.Type))] event.Count = obj.Count event.Action = obj.Action + event.TimeStamp = obj.LastTimestamp.Time case *apiV1.Pod: event.Kind = "Pod" case *apiV1.Node: diff --git a/pkg/filterengine/filters/job_status_checker.go b/pkg/filterengine/filters/job_status_checker.go index 8b91f10b6..62691a389 100644 --- a/pkg/filterengine/filters/job_status_checker.go +++ b/pkg/filterengine/filters/job_status_checker.go @@ -34,7 +34,7 @@ func (f JobStatusChecker) Run(object interface{}, event *events.Event) { // Check latest job conditions jobLen := len(jobObj.Status.Conditions) - if jobLen < 1 { + if jobLen == 0 { event.Skip = true return }