pkg/k8s/events/events.go (83 lines of code) (raw):
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
package events
import (
"context"
"github.com/azure/peerd/pkg/k8s"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes/scheme"
typedv1core "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/tools/record"
)
type eventsRecorderCtxKeyType struct{}
var (
eventsRecorderCtxKey = eventsRecorderCtxKeyType{}
)
// NewRecorder creates a new event recorder.
func NewRecorder(ctx context.Context, k *k8s.ClientSet) (EventRecorder, error) {
clientset := k.Interface
inPod := k.InPod
var objRef *v1.ObjectReference
if !inPod {
node, err := clientset.CoreV1().Nodes().Get(ctx, k.Name, metav1.GetOptions{})
if err != nil {
return nil, err
}
objRef = &v1.ObjectReference{
Kind: "Node",
Name: node.Name,
UID: node.UID,
APIVersion: node.APIVersion,
}
} else {
pod, err := clientset.CoreV1().Pods(k.Namespace).Get(ctx, k.Name, metav1.GetOptions{})
if err != nil {
return nil, err
}
objRef = &v1.ObjectReference{
Kind: "Pod",
Name: pod.Name,
Namespace: pod.Namespace,
UID: pod.UID,
APIVersion: pod.APIVersion,
}
}
broadcaster := record.NewBroadcaster()
broadcaster.StartStructuredLogging(4)
broadcaster.StartRecordingToSink(&typedv1core.EventSinkImpl{Interface: clientset.CoreV1().Events(k.Namespace)})
return &eventRecorder{
recorder: broadcaster.NewRecorder(
scheme.Scheme,
v1.EventSource{},
),
objRef: objRef,
}, nil
}
// WithContext returns a new context with an event recorder.
func WithContext(ctx context.Context, clientset *k8s.ClientSet) (context.Context, error) {
er, err := NewRecorder(ctx, clientset)
if err != nil {
return nil, err
}
return context.WithValue(ctx, eventsRecorderCtxKey, er), nil
}
// FromContext returns the event recorder from the context.
func FromContext(ctx context.Context) EventRecorder {
return ctx.Value(eventsRecorderCtxKey).(EventRecorder)
}
type eventRecorder struct {
recorder record.EventRecorder
objRef *v1.ObjectReference
}
// Active should be called to indicate that the instance is active in the cluster.
func (er *eventRecorder) Active() {
er.recorder.Eventf(er.objRef, v1.EventTypeNormal, "P2PActive", "P2P proxy is active on instance %s", er.objRef.Name)
}
// Connected should be called to indicate that the instance is connected to the cluster.
func (er *eventRecorder) Connected() {
er.recorder.Eventf(er.objRef, v1.EventTypeNormal, "P2PConnected", "P2P proxy is connected to cluster on instance %s", er.objRef.Name)
}
// Disconnected should be called to indicate that the instance is disconnected from the cluster.
func (er *eventRecorder) Disconnected() {
er.recorder.Eventf(er.objRef, v1.EventTypeWarning, "P2PDisconnected", "P2P proxy is disconnected from cluster on instance %s", er.objRef.Name)
}
// Failed should be called to indicate that the instance has failed.
func (er *eventRecorder) Failed() {
er.recorder.Eventf(er.objRef, v1.EventTypeWarning, "P2PFailed", "P2P proxy failed on instance %s", er.objRef.Name)
}
// Initializing should be called to indicate that the instance is initializing.
func (er *eventRecorder) Initializing() {
er.recorder.Eventf(er.objRef, v1.EventTypeNormal, "P2PInitializing", "P2P proxy is initializing on instance %s", er.objRef.Name)
}
var _ EventRecorder = &eventRecorder{}