74 lines
2.0 KiB
Go
74 lines
2.0 KiB
Go
package event
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/pkg/errors"
|
|
v1 "k8s.io/api/core/v1"
|
|
"k8s.io/apimachinery/pkg/runtime"
|
|
"k8s.io/client-go/kubernetes"
|
|
"k8s.io/client-go/kubernetes/scheme"
|
|
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
|
|
"k8s.io/client-go/rest"
|
|
"k8s.io/client-go/tools/record"
|
|
)
|
|
|
|
const (
|
|
// TypeNormal is the information event type
|
|
TypeNormal = Type("Normal")
|
|
// TypeWarning is the warning event type, informs that something went wrong
|
|
TypeWarning = Type("Warning")
|
|
)
|
|
|
|
// Type is the type of event
|
|
type Type string
|
|
|
|
// Reason is the type of reason message, used in event
|
|
type Reason string
|
|
|
|
// Recorder is the interface used to emit events
|
|
type Recorder interface {
|
|
Emit(object runtime.Object, eventType Type, reason Reason, message string)
|
|
Emitf(object runtime.Object, eventType Type, reason Reason, format string, args ...interface{})
|
|
}
|
|
|
|
type recorder struct {
|
|
recorder record.EventRecorder
|
|
}
|
|
|
|
// New returns recorder used to emit events
|
|
func New(config *rest.Config, component string) (Recorder, error) {
|
|
eventRecorder, err := initializeEventRecorder(config, component)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &recorder{
|
|
recorder: eventRecorder,
|
|
}, nil
|
|
}
|
|
|
|
func initializeEventRecorder(config *rest.Config, component string) (record.EventRecorder, error) {
|
|
client, err := kubernetes.NewForConfig(config)
|
|
if err != nil {
|
|
return nil, errors.WithStack(err)
|
|
}
|
|
eventBroadcaster := record.NewBroadcaster()
|
|
eventBroadcaster.StartRecordingToSink(
|
|
&typedcorev1.EventSinkImpl{
|
|
Interface: client.CoreV1().Events("")})
|
|
eventRecorder := eventBroadcaster.NewRecorder(
|
|
scheme.Scheme,
|
|
v1.EventSource{Component: component},
|
|
)
|
|
return eventRecorder, nil
|
|
}
|
|
|
|
func (r recorder) Emit(object runtime.Object, eventType Type, reason Reason, message string) {
|
|
r.recorder.Event(object, string(eventType), string(reason), message)
|
|
}
|
|
|
|
func (r recorder) Emitf(object runtime.Object, eventType Type, reason Reason, format string, args ...interface{}) {
|
|
r.recorder.Event(object, string(eventType), string(reason), fmt.Sprintf(format, args...))
|
|
}
|