/
recorder.go
52 lines (45 loc) · 1.46 KB
/
recorder.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
package recorder
import (
"context"
"unicode"
"github.com/giantswarm/k8sclient/v7/pkg/k8sclient"
"github.com/giantswarm/k8sclient/v7/pkg/k8sclienttest"
clientv1 "k8s.io/api/core/v1"
corev1 "k8s.io/api/core/v1"
pkgruntime "k8s.io/apimachinery/pkg/runtime"
typedcorev1 "k8s.io/client-go/kubernetes/typed/core/v1"
"k8s.io/client-go/tools/record"
)
type Config struct {
Component string
K8sClient k8sclient.Interface
}
type Recorder struct {
record.EventRecorder
}
// New creates an event recorder to send custom events to Kubernetes to be recorded for targeted Kubernetes objects.
func New(c Config) Interface {
eventBroadcaster := record.NewBroadcaster()
_, isfake := c.K8sClient.(*k8sclienttest.Clients)
if !isfake {
eventBroadcaster.StartRecordingToSink(
&typedcorev1.EventSinkImpl{
Interface: c.K8sClient.K8sClient().CoreV1().Events(""),
},
)
}
return &Recorder{
eventBroadcaster.NewRecorder(c.K8sClient.Scheme(), clientv1.EventSource{Component: c.Component}),
}
}
// Emit writes only informative events like status of creation or updates.
// Error events will be handled by operatorkit when using microerror.
func (r *Recorder) Emit(ctx context.Context, obj pkgruntime.Object, reason, message string) {
r.Event(obj, corev1.EventTypeNormal, reason, upper(message))
}
// upper is a helper function to uppercase first letter of the event message
func upper(in string) string {
out := []rune(in)
out[0] = unicode.ToUpper(out[0])
return string(out)
}