Skip to content

Commit

Permalink
Node Level Critical Events filter
Browse files Browse the repository at this point in the history
This Commit
- adds `NodeEventsChecker` filter to send notifs on node level critical events like `NodeNotReady` and `NodeReady`
  • Loading branch information
codenio committed Aug 18, 2019
1 parent 1f9efd6 commit ff21d65
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 0 deletions.
19 changes: 19 additions & 0 deletions pkg/controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,25 @@ func RegisterInformers(c *config.Config) {
sendEvent(obj, nil, c, kind, config.ErrorEvent)
}
},
UpdateFunc: func(old, new interface{}) {
_, err := cache.MetaNamespaceKeyFunc(new)
if err != nil {
log.Logger.Errorf("Failed to get MetaNamespaceKey from event resource")
return
}
eventObj, ok := new.(*apiV1.Event)
if !ok {
return
}

// Kind of involved object
kind := strings.ToLower(eventObj.InvolvedObject.Kind)

// Send events update notifs if InvolvedObject is node
if kind == "node" {
sendEvent(new, old, c, kind, config.ErrorEvent)
}
},
})

stopCh := make(chan struct{})
Expand Down
65 changes: 65 additions & 0 deletions pkg/filterengine/filters/node_event_checker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
// NodeEventsChecker filter to send notifications on critical node events

package filters

import (
"fmt"

"github.com/infracloudio/botkube/pkg/events"
"github.com/infracloudio/botkube/pkg/filterengine"
apiV1 "k8s.io/api/core/v1"

log "github.com/infracloudio/botkube/pkg/logging"
)

const (
// NodeNotReady reason indicates Node is NotReady state
NodeNotReady string = "NodeNotReady"
// NodeReady reason indicates Node is Ready state
NodeReady string = "NodeReady"
)

// NodeEventsChecker checks job status and adds message in the events structure
type NodeEventsChecker struct {
Description string
}

// Register filter
func init() {
filterengine.DefaultFilterEngine.Register(NodeEventsChecker{
Description: "Sends notifications on node level critical events.",
})
}

// Run filers and modifies event struct
func (f NodeEventsChecker) Run(object interface{}, event *events.Event) {

// Run filter only on Node events
if event.Kind != "Node" {
return
}

eventObj, ok := object.(*apiV1.Event)
if !ok {
return
}

// update event details
switch event.Reason {
case NodeNotReady:
event.Level = events.Critical
case NodeReady:
event.Level = events.Info
event.Messages = []string{fmt.Sprintf("%s\n", eventObj.Message)}
default:
// skip events with least significant reasons
event.Skip = true
}

log.Logger.Debug("Node Critical Event filter successful!")
}

// Describe filter
func (f NodeEventsChecker) Describe() string {
return f.Description
}

0 comments on commit ff21d65

Please sign in to comment.