Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add JobStatusChecker filter and fix timestamp for error events #108

Merged
merged 2 commits into from Jun 25, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions helm/botkube/values.yaml
Expand Up @@ -103,6 +103,7 @@ config:
events:
- create
- delete
- update
- error
- name: roles
namespaces:
Expand Down
28 changes: 10 additions & 18 deletions pkg/controller/controller.go
Expand Up @@ -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")
Expand All @@ -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)
Expand Down
1 change: 1 addition & 0 deletions pkg/events/events.go
Expand Up @@ -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:
Expand Down
51 changes: 51 additions & 0 deletions 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 == 0 {
event.Skip = true
return
}
c := jobObj.Status.Conditions[jobLen-1]
if c.Type == batchV1.JobComplete {
event.Messages = []string{"Job succeeded!"}
sanketsudake marked this conversation as resolved.
Show resolved Hide resolved
event.TimeStamp = c.LastTransitionTime.Time
} else {
event.Skip = true
return
}
event.Reason = c.Reason
log.Logger.Debug("Job status checker filter successful!")
}