101 lines
3.6 KiB
Go
101 lines
3.6 KiB
Go
// Licensed to Elasticsearch B.V. under one or more contributor
|
|
// license agreements. See the NOTICE file distributed with
|
|
// this work for additional information regarding copyright
|
|
// ownership. Elasticsearch B.V. licenses this file to you under
|
|
// the Apache License, Version 2.0 (the "License"); you may
|
|
// not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing,
|
|
// software distributed under the License is distributed on an
|
|
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
// KIND, either express or implied. See the License for the
|
|
// specific language governing permissions and limitations
|
|
// under the License.
|
|
|
|
package kubernetes
|
|
|
|
// ResourceEventHandler can handle notifications for events that happen to a
|
|
// resource. The events are informational only, so you can't return an
|
|
// error.
|
|
// * OnAdd is called when an object is added.
|
|
// * OnUpdate is called when an object is modified. Note that oldObj is the
|
|
// last known state of the object-- it is possible that several changes
|
|
// were combined together, so you can't use this to see every single
|
|
// change. OnUpdate is also called when a re-list happens, and it will
|
|
// get called even if nothing changed. This is useful for periodically
|
|
// evaluating or syncing something.
|
|
// * OnDelete will get the final state of the item if it is known, otherwise
|
|
// it will get an object of type DeletedFinalStateUnknown. This can
|
|
// happen if the watch is closed and misses the delete event and we don't
|
|
// notice the deletion until the subsequent re-list.
|
|
type ResourceEventHandler interface {
|
|
OnAdd(obj Resource)
|
|
OnUpdate(obj Resource)
|
|
OnDelete(obj Resource)
|
|
}
|
|
|
|
// ResourceEventHandlerFuncs is an adaptor to let you easily specify as many or
|
|
// as few of the notification functions as you want while still implementing
|
|
// ResourceEventHandler.
|
|
type ResourceEventHandlerFuncs struct {
|
|
AddFunc func(obj Resource)
|
|
UpdateFunc func(obj Resource)
|
|
DeleteFunc func(obj Resource)
|
|
}
|
|
|
|
// OnAdd calls AddFunc if it's not nil.
|
|
func (r ResourceEventHandlerFuncs) OnAdd(obj Resource) {
|
|
if r.AddFunc != nil {
|
|
r.AddFunc(obj)
|
|
}
|
|
}
|
|
|
|
// OnUpdate calls UpdateFunc if it's not nil.
|
|
func (r ResourceEventHandlerFuncs) OnUpdate(obj Resource) {
|
|
if r.UpdateFunc != nil {
|
|
r.UpdateFunc(obj)
|
|
}
|
|
}
|
|
|
|
// OnDelete calls DeleteFunc if it's not nil.
|
|
func (r ResourceEventHandlerFuncs) OnDelete(obj Resource) {
|
|
if r.DeleteFunc != nil {
|
|
r.DeleteFunc(obj)
|
|
}
|
|
}
|
|
|
|
// FilteringResourceEventHandler applies the provided filter to all events coming
|
|
// in, ensuring the appropriate nested handler method is invoked. An object
|
|
// that starts passing the filter after an update is considered an add, and an
|
|
// object that stops passing the filter after an update is considered a delete.
|
|
type FilteringResourceEventHandler struct {
|
|
FilterFunc func(obj Resource) bool
|
|
Handler ResourceEventHandler
|
|
}
|
|
|
|
// OnAdd calls the nested handler only if the filter succeeds
|
|
func (r FilteringResourceEventHandler) OnAdd(obj Resource) {
|
|
if !r.FilterFunc(obj) {
|
|
return
|
|
}
|
|
r.Handler.OnAdd(obj)
|
|
}
|
|
|
|
// OnUpdate ensures the proper handler is called depending on whether the filter matches
|
|
func (r FilteringResourceEventHandler) OnUpdate(obj Resource) {
|
|
if !r.FilterFunc(obj) {
|
|
return
|
|
}
|
|
r.Handler.OnUpdate(obj)
|
|
}
|
|
|
|
// OnDelete calls the nested handler only if the filter succeeds
|
|
func (r FilteringResourceEventHandler) OnDelete(obj Resource) {
|
|
if !r.FilterFunc(obj) {
|
|
return
|
|
}
|
|
r.Handler.OnDelete(obj)
|
|
}
|