Skip to content

Commit f741257

Browse files
authored
Merge pull request #61 from dgrisonnet/filtering-e2e-tests
Add namespace and event type filters e2e tests
2 parents e1a459c + 2bb0f79 commit f741257

File tree

8 files changed

+227
-217
lines changed

8 files changed

+227
-217
lines changed

test/e2e/event_test.go

Lines changed: 33 additions & 213 deletions
Original file line numberDiff line numberDiff line change
@@ -20,264 +20,84 @@ import (
2020
"testing"
2121
"time"
2222

23-
dto "github.com/prometheus/client_model/go"
24-
v1 "k8s.io/api/core/v1"
25-
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
26-
)
27-
28-
const (
29-
eventsTotal = "kube_events_total"
23+
"github.com/rhobs/kube-events-exporter/test/framework"
3024
)
3125

3226
func TestEventCreation(t *testing.T) {
33-
exporter := framework.CreateKubeEventsExporter(t)
34-
35-
event := &v1.Event{
36-
ObjectMeta: metav1.ObjectMeta{
37-
Name: "test",
38-
},
39-
InvolvedObject: v1.ObjectReference{
40-
Kind: "Pod",
41-
Namespace: "default",
42-
},
43-
Count: 1,
44-
Reason: "test-creation",
45-
Type: v1.EventTypeNormal,
46-
}
47-
event = framework.CreateEvent(t, event, event.InvolvedObject.Namespace)
27+
exporter := f.CreateKubeEventsExporter(t)
28+
event := f.CreateBasicEvent(t)
4829

49-
expectedMetric := &dto.Metric{
50-
Label: []*dto.LabelPair{
51-
{Name: stringPtr("involved_object_kind"), Value: &event.InvolvedObject.Kind},
52-
{Name: stringPtr("involved_object_namespace"), Value: &event.InvolvedObject.Namespace},
53-
{Name: stringPtr("reason"), Value: &event.Reason},
54-
{Name: stringPtr("type"), Value: &event.Type},
55-
},
56-
Counter: &dto.Counter{Value: float64Ptr(1)},
57-
}
58-
59-
err := framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
60-
if err != nil {
61-
t.Fatal(err)
62-
}
30+
f.AssertEventsTotalPresent(t, exporter, event, 1)
6331
}
6432

6533
func TestEventUpdate(t *testing.T) {
66-
exporter := framework.CreateKubeEventsExporter(t)
67-
68-
event := &v1.Event{
69-
ObjectMeta: metav1.ObjectMeta{
70-
Name: "test",
71-
},
72-
InvolvedObject: v1.ObjectReference{
73-
Kind: "Pod",
74-
Namespace: "default",
75-
},
76-
Count: 1,
77-
Reason: "test-update",
78-
Type: v1.EventTypeNormal,
79-
}
80-
event = framework.CreateEvent(t, event, event.InvolvedObject.Namespace)
34+
exporter := f.CreateKubeEventsExporter(t)
35+
event := f.CreateBasicEvent(t)
8136

82-
event.Count++
83-
event.LastTimestamp = metav1.Now()
84-
event, err := framework.UpdateEvent(event, event.InvolvedObject.Namespace)
37+
event, err := f.UpdateEvent(event, event.InvolvedObject.Namespace)
8538
if err != nil {
8639
t.Fatal(err)
8740
}
8841

89-
expectedMetric := &dto.Metric{
90-
Label: []*dto.LabelPair{
91-
{Name: stringPtr("involved_object_kind"), Value: &event.InvolvedObject.Kind},
92-
{Name: stringPtr("involved_object_namespace"), Value: &event.InvolvedObject.Namespace},
93-
{Name: stringPtr("reason"), Value: &event.Reason},
94-
{Name: stringPtr("type"), Value: &event.Type},
95-
},
96-
Counter: &dto.Counter{Value: float64Ptr(2)},
97-
}
98-
99-
err = framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
100-
if err != nil {
101-
t.Fatal(err)
102-
}
42+
f.AssertEventsTotalPresent(t, exporter, event, 2)
10343
}
10444

10545
func TestUpdateExistingEvent(t *testing.T) {
106-
event := &v1.Event{
107-
ObjectMeta: metav1.ObjectMeta{
108-
Name: "test",
109-
},
110-
InvolvedObject: v1.ObjectReference{
111-
Kind: "Pod",
112-
Namespace: "default",
113-
},
114-
Count: 1,
115-
Reason: "test-update-existing",
116-
Type: v1.EventTypeNormal,
117-
}
118-
event = framework.CreateEvent(t, event, event.InvolvedObject.Namespace)
119-
// The exporter reconciles Events created during the same second as itself.
46+
event := f.CreateBasicEvent(t)
47+
// The exporter reconcile Events created during the same second as itself.
12048
// Thus, to ensure that this Event is not reconciled, we sleep one second.
12149
time.Sleep(time.Second)
12250

123-
exporter := framework.CreateKubeEventsExporter(t)
51+
exporter := f.CreateKubeEventsExporter(t)
12452

125-
event.Count++
126-
event.LastTimestamp = metav1.Now()
127-
event, err := framework.UpdateEvent(event, event.Namespace)
53+
event, err := f.UpdateEvent(event, event.Namespace)
12854
if err != nil {
12955
t.Fatal(err)
13056
}
13157

132-
expectedMetric := &dto.Metric{
133-
Label: []*dto.LabelPair{
134-
{Name: stringPtr("involved_object_kind"), Value: &event.InvolvedObject.Kind},
135-
{Name: stringPtr("involved_object_namespace"), Value: &event.InvolvedObject.Namespace},
136-
{Name: stringPtr("reason"), Value: &event.Reason},
137-
{Name: stringPtr("type"), Value: &event.Type},
138-
},
139-
Counter: &dto.Counter{Value: float64Ptr(1)},
140-
}
141-
142-
err = framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
143-
if err != nil {
144-
t.Fatal(err)
145-
}
58+
f.AssertEventsTotalPresent(t, exporter, event, 1)
14659
}
14760

14861
func TestNotReconciling(t *testing.T) {
149-
event := &v1.Event{
150-
ObjectMeta: metav1.ObjectMeta{
151-
Name: "test",
152-
},
153-
InvolvedObject: v1.ObjectReference{
154-
Kind: "Pod",
155-
Namespace: "default",
156-
},
157-
Count: 1,
158-
Reason: "test",
159-
Type: v1.EventTypeNormal,
160-
}
161-
event = framework.CreateEvent(t, event, event.InvolvedObject.Namespace)
162-
// The exporter reconciles Events created during the same second as itself.
62+
event := f.CreateBasicEvent(t)
63+
// The exporter reconcile Events created during the same second as itself.
16364
// Thus, to ensure that this Event is not reconciled, we sleep one second.
16465
time.Sleep(time.Second)
16566

166-
exporter := framework.CreateKubeEventsExporter(t)
67+
exporter := f.CreateKubeEventsExporter(t)
16768

168-
unexpectedMetric := &dto.Metric{
169-
Label: []*dto.LabelPair{
170-
{Name: stringPtr("involved_object_kind"), Value: &event.InvolvedObject.Kind},
171-
{Name: stringPtr("involved_object_namespace"), Value: &event.InvolvedObject.Namespace},
172-
{Name: stringPtr("reason"), Value: &event.Reason},
173-
{Name: stringPtr("type"), Value: &event.Type},
174-
},
175-
Counter: &dto.Counter{Value: float64Ptr(1)},
176-
}
177-
178-
err := framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, unexpectedMetric)
179-
if err == nil {
180-
t.Fatal("kube-events-exporter should not reconcile existing Events")
181-
}
69+
f.AssertEventsTotalAbsent(t, exporter, event, 1)
18270
}
18371

18472
func TestRecordEventRecorderCreate(t *testing.T) {
185-
exporter := framework.CreateKubeEventsExporter(t)
186-
recorder := framework.NewRecordEventRecorder()
73+
exporter := f.CreateKubeEventsExporter(t)
74+
recorder := f.NewRecordEventRecorder()
18775

188-
involvedObject := &v1.ObjectReference{
189-
Kind: "Pod",
190-
Namespace: "default",
191-
Name: "foo",
192-
}
193-
eventType := v1.EventTypeNormal
194-
reason := "test-recorder-create"
195-
196-
recorder.Eventf(involvedObject, eventType, reason, "")
197-
198-
expectedMetric := &dto.Metric{
199-
Label: []*dto.LabelPair{
200-
{Name: stringPtr("involved_object_kind"), Value: &involvedObject.Kind},
201-
{Name: stringPtr("involved_object_namespace"), Value: &involvedObject.Namespace},
202-
{Name: stringPtr("reason"), Value: &reason},
203-
{Name: stringPtr("type"), Value: &eventType},
204-
},
205-
Counter: &dto.Counter{Value: float64Ptr(1)},
206-
}
76+
event := framework.NewBasicEvent()
77+
recorder.Eventf(&event.InvolvedObject, event.Type, event.Reason, event.Message)
20778

208-
err := framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
209-
if err != nil {
210-
t.Fatal(err)
211-
}
79+
f.AssertEventsTotalPresent(t, exporter, event, 1)
21280
}
21381

21482
func TestRecordEventRecorderUpdate(t *testing.T) {
215-
exporter := framework.CreateKubeEventsExporter(t)
216-
recorder := framework.NewRecordEventRecorder()
83+
exporter := f.CreateKubeEventsExporter(t)
84+
recorder := f.NewRecordEventRecorder()
21785

218-
involvedObject := &v1.ObjectReference{
219-
Kind: "Pod",
220-
Namespace: "default",
221-
Name: "foo",
222-
}
223-
eventType := v1.EventTypeNormal
224-
reason := "test-recorder-update"
225-
226-
recorder.Eventf(involvedObject, eventType, reason, "")
227-
recorder.Eventf(involvedObject, eventType, reason, "")
228-
229-
expectedMetric := &dto.Metric{
230-
Label: []*dto.LabelPair{
231-
{Name: stringPtr("involved_object_kind"), Value: &involvedObject.Kind},
232-
{Name: stringPtr("involved_object_namespace"), Value: &involvedObject.Namespace},
233-
{Name: stringPtr("reason"), Value: &reason},
234-
{Name: stringPtr("type"), Value: &eventType},
235-
},
236-
Counter: &dto.Counter{Value: float64Ptr(2)},
237-
}
86+
event := framework.NewBasicEvent()
87+
recorder.Eventf(&event.InvolvedObject, event.Type, event.Reason, event.Message)
88+
recorder.Eventf(&event.InvolvedObject, event.Type, event.Reason, event.Message)
23889

239-
err := framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
240-
if err != nil {
241-
t.Fatal(err)
242-
}
90+
f.AssertEventsTotalPresent(t, exporter, event, 2)
24391
}
24492

24593
func TestEventsEventRecorderCreate(t *testing.T) {
246-
exporter := framework.CreateKubeEventsExporter(t)
94+
exporter := f.CreateKubeEventsExporter(t)
24795

24896
stopCh := make(chan struct{})
249-
recorder := framework.NewEventsEventRecorder(stopCh)
250-
251-
involvedObject := &v1.ObjectReference{
252-
Kind: "Pod",
253-
Namespace: "default",
254-
Name: "foo",
255-
}
256-
eventType := v1.EventTypeNormal
257-
reason := "test-recorder-create"
258-
259-
recorder.Eventf(involvedObject, nil, eventType, reason, "action", "")
260-
261-
expectedMetric := &dto.Metric{
262-
Label: []*dto.LabelPair{
263-
{Name: stringPtr("involved_object_kind"), Value: &involvedObject.Kind},
264-
{Name: stringPtr("involved_object_namespace"), Value: &involvedObject.Namespace},
265-
{Name: stringPtr("reason"), Value: &reason},
266-
{Name: stringPtr("type"), Value: &eventType},
267-
},
268-
Counter: &dto.Counter{Value: float64Ptr(1)},
269-
}
97+
recorder := f.NewEventsEventRecorder(stopCh)
27098

271-
err := framework.PollMetric(exporter.GetEventMetricFamilies, eventsTotal, expectedMetric)
272-
if err != nil {
273-
t.Fatal(err)
274-
}
275-
}
276-
277-
func stringPtr(s string) *string {
278-
return &s
279-
}
99+
event := framework.NewBasicEvent()
100+
recorder.Eventf(&event.InvolvedObject, nil, event.Type, event.Reason, event.Action, event.Message)
280101

281-
func float64Ptr(f float64) *float64 {
282-
return &f
102+
f.AssertEventsTotalPresent(t, exporter, event, 1)
283103
}

test/e2e/exporter_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
)
2323

2424
func TestExporterRequestsTotal(t *testing.T) {
25-
exporter := framework.CreateKubeEventsExporter(t)
25+
exporter := f.CreateKubeEventsExporter(t)
2626
nbRequests := 10
2727

2828
for i := 0; i < nbRequests; i++ {

test/e2e/filter_test.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
Copyright 2020 Red Hat, Inc. All rights reserved.
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package e2e
18+
19+
import (
20+
"fmt"
21+
"testing"
22+
23+
"github.com/rhobs/kube-events-exporter/test/framework"
24+
)
25+
26+
func TestNamespaceFilter(t *testing.T) {
27+
namespace := framework.NewBasicEvent().InvolvedObject.Namespace
28+
29+
testCases := []struct {
30+
name string
31+
namespace string
32+
assert framework.AssertEventsTotalFunc
33+
}{
34+
{
35+
name: "Included",
36+
namespace: namespace,
37+
assert: f.AssertEventsTotalPresent,
38+
},
39+
{
40+
name: "Excluded",
41+
namespace: fmt.Sprintf("not-%s", namespace),
42+
assert: f.AssertEventsTotalAbsent,
43+
},
44+
}
45+
46+
for _, tc := range testCases {
47+
tc := tc
48+
t.Run(tc.name, func(t *testing.T) {
49+
f := *f
50+
f.ExporterArgs = []string{fmt.Sprintf("--involved-object-namespaces=%s", tc.namespace)}
51+
exporter := f.CreateKubeEventsExporter(t)
52+
event := f.CreateBasicEvent(t)
53+
tc.assert(t, exporter, event, 1)
54+
})
55+
}
56+
}
57+
58+
func TestEventTypeFilter(t *testing.T) {
59+
eventType := framework.NewBasicEvent().Type
60+
61+
testCases := []struct {
62+
name string
63+
eventType string
64+
assert framework.AssertEventsTotalFunc
65+
}{
66+
{
67+
name: "Included",
68+
eventType: eventType,
69+
assert: f.AssertEventsTotalPresent,
70+
},
71+
{
72+
name: "Excluded",
73+
eventType: fmt.Sprintf("not-%s", eventType),
74+
assert: f.AssertEventsTotalAbsent,
75+
},
76+
}
77+
78+
for _, tc := range testCases {
79+
tc := tc
80+
t.Run(tc.name, func(t *testing.T) {
81+
f := *f
82+
f.ExporterArgs = []string{fmt.Sprintf("--event-types=%s", tc.eventType)}
83+
exporter := f.CreateKubeEventsExporter(t)
84+
event := f.CreateBasicEvent(t)
85+
tc.assert(t, exporter, event, 1)
86+
})
87+
}
88+
}

0 commit comments

Comments
 (0)