...
1
16
17 package recorder_test
18
19 import (
20 "context"
21
22 appsv1 "k8s.io/api/apps/v1"
23 corev1 "k8s.io/api/core/v1"
24 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
25 "k8s.io/apimachinery/pkg/watch"
26 "k8s.io/client-go/kubernetes/scheme"
27 ref "k8s.io/client-go/tools/reference"
28 "sigs.k8s.io/controller-runtime/pkg/controller"
29 "sigs.k8s.io/controller-runtime/pkg/handler"
30 "sigs.k8s.io/controller-runtime/pkg/manager"
31 "sigs.k8s.io/controller-runtime/pkg/reconcile"
32 "sigs.k8s.io/controller-runtime/pkg/source"
33
34 . "github.com/onsi/ginkgo/v2"
35 . "github.com/onsi/gomega"
36 )
37
38 var _ = Describe("recorder", func() {
39 Describe("recorder", func() {
40 It("should publish events", func() {
41 By("Creating the Manager")
42 cm, err := manager.New(cfg, manager.Options{})
43 Expect(err).NotTo(HaveOccurred())
44
45 By("Creating the Controller")
46 recorder := cm.GetEventRecorderFor("test-recorder")
47 instance, err := controller.New("foo-controller", cm, controller.Options{
48 Reconciler: reconcile.Func(
49 func(ctx context.Context, request reconcile.Request) (reconcile.Result, error) {
50 dp, err := clientset.AppsV1().Deployments(request.Namespace).Get(ctx, request.Name, metav1.GetOptions{})
51 Expect(err).NotTo(HaveOccurred())
52 recorder.Event(dp, corev1.EventTypeNormal, "test-reason", "test-msg")
53 return reconcile.Result{}, nil
54 }),
55 })
56 Expect(err).NotTo(HaveOccurred())
57
58 By("Watching Resources")
59 err = instance.Watch(source.Kind(cm.GetCache(), &appsv1.Deployment{}, &handler.TypedEnqueueRequestForObject[*appsv1.Deployment]{}))
60 Expect(err).NotTo(HaveOccurred())
61
62 By("Starting the Manager")
63 ctx, cancel := context.WithCancel(context.Background())
64 defer cancel()
65 go func() {
66 defer GinkgoRecover()
67 Expect(cm.Start(ctx)).NotTo(HaveOccurred())
68 }()
69
70 deployment := &appsv1.Deployment{
71 ObjectMeta: metav1.ObjectMeta{Name: "deployment-name"},
72 Spec: appsv1.DeploymentSpec{
73 Selector: &metav1.LabelSelector{
74 MatchLabels: map[string]string{"foo": "bar"},
75 },
76 Template: corev1.PodTemplateSpec{
77 ObjectMeta: metav1.ObjectMeta{Labels: map[string]string{"foo": "bar"}},
78 Spec: corev1.PodSpec{
79 Containers: []corev1.Container{
80 {
81 Name: "nginx",
82 Image: "nginx",
83 },
84 },
85 },
86 },
87 },
88 }
89
90 By("Invoking Reconciling")
91 deployment, err = clientset.AppsV1().Deployments("default").Create(ctx, deployment, metav1.CreateOptions{})
92 Expect(err).NotTo(HaveOccurred())
93
94 By("Validate event is published as expected")
95 evtWatcher, err := clientset.CoreV1().Events("default").Watch(ctx, metav1.ListOptions{})
96 Expect(err).NotTo(HaveOccurred())
97
98 resultEvent := <-evtWatcher.ResultChan()
99
100 Expect(resultEvent.Type).To(Equal(watch.Added))
101 evt, isEvent := resultEvent.Object.(*corev1.Event)
102 Expect(isEvent).To(BeTrue())
103
104 dpRef, err := ref.GetReference(scheme.Scheme, deployment)
105 Expect(err).NotTo(HaveOccurred())
106
107 Expect(evt.InvolvedObject).To(Equal(*dpRef))
108 Expect(evt.Type).To(Equal(corev1.EventTypeNormal))
109 Expect(evt.Reason).To(Equal("test-reason"))
110 Expect(evt.Message).To(Equal("test-msg"))
111 })
112 })
113 })
114
View as plain text