moira
569 строк · 22.1 Кб
1package controller
2
3import (
4"fmt"
5"testing"
6"time"
7
8"github.com/golang/mock/gomock"
9"github.com/satori/go.uuid"
10. "github.com/smartystreets/goconvey/convey"
11
12"go.avito.ru/DO/moira"
13"go.avito.ru/DO/moira/api"
14"go.avito.ru/DO/moira/api/dto"
15"go.avito.ru/DO/moira/database"
16"go.avito.ru/DO/moira/mock/moira-alert"
17)
18
19func TestUpdateTrigger(t *testing.T) {
20mockCtrl := gomock.NewController(t)
21defer mockCtrl.Finish()
22
23dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
24
25Convey("Success update", t, func() {
26triggerModel := dto.TriggerModel{ID: uuid.NewV4().String()}
27trigger := triggerModel.ToMoiraTrigger()
28dataBase.EXPECT().GetTrigger(triggerModel.ID).Return(trigger, nil)
29dataBase.EXPECT().AcquireTriggerCheckLock(gomock.Any())
30dataBase.EXPECT().DeleteTriggerCheckLock(gomock.Any())
31dataBase.EXPECT().GetOrCreateTriggerLastCheck(gomock.Any()).Return(&moira.CheckData{
32Metrics: make(map[string]*moira.MetricState),
33}, nil)
34dataBase.EXPECT().SaveTrigger(gomock.Any(), trigger).Return(nil)
35dataBase.EXPECT().SetTriggerLastCheck(gomock.Any(), gomock.Any()).Return(nil)
36resp, err := UpdateTrigger(dataBase, nil, &triggerModel, triggerModel.ID, make(map[string]bool))
37So(err, ShouldBeNil)
38So(resp.Message, ShouldResemble, "trigger updated")
39})
40
41Convey("Trigger does not exists", t, func() {
42trigger := dto.TriggerModel{ID: uuid.NewV4().String()}
43dataBase.EXPECT().GetTrigger(trigger.ID).Return(nil, database.ErrNil)
44resp, err := UpdateTrigger(dataBase, nil, &trigger, trigger.ID, make(map[string]bool))
45So(err, ShouldResemble, api.ErrorNotFound(fmt.Sprintf("Trigger with ID = '%s' does not exists", trigger.ID)))
46So(resp, ShouldBeNil)
47})
48
49Convey("Get trigger error", t, func() {
50trigger := dto.TriggerModel{ID: uuid.NewV4().String()}
51expected := fmt.Errorf("Soo bad trigger")
52dataBase.EXPECT().GetTrigger(trigger.ID).Return(nil, expected)
53resp, err := UpdateTrigger(dataBase, nil, &trigger, trigger.ID, make(map[string]bool))
54So(err, ShouldResemble, api.ErrorInternalServer(expected))
55So(resp, ShouldBeNil)
56})
57}
58
59func TestSaveTrigger(t *testing.T) {
60mockCtrl := gomock.NewController(t)
61defer mockCtrl.Finish()
62
63dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
64triggerID := uuid.NewV4().String()
65trigger := moira.Trigger{ID: triggerID}
66lastCheck := &moira.CheckData{
67Metrics: map[string]*moira.MetricState{
68"super.metric1": {},
69"super.metric2": {},
70},
71}
72emptyLastCheck := &moira.CheckData{
73Metrics: make(map[string]*moira.MetricState),
74}
75
76Convey("No timeSeries", t, func() {
77Convey("No last check", func() {
78dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
79dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
80dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(&moira.CheckData{
81Metrics: make(map[string]*moira.MetricState),
82}, nil)
83dataBase.EXPECT().SaveTrigger(triggerID, &trigger).Return(nil)
84dataBase.EXPECT().SetTriggerLastCheck(triggerID, gomock.Any()).Return(nil)
85resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
86So(err, ShouldBeNil)
87So(resp, ShouldResemble, &dto.SaveTriggerResponse{ID: triggerID, Message: "trigger updated"})
88})
89Convey("Has last check", func() {
90actualLastCheck := lastCheck
91dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
92dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
93dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(actualLastCheck, nil)
94dataBase.EXPECT().SaveTrigger(triggerID, &trigger).Return(nil)
95dataBase.EXPECT().SetTriggerLastCheck(triggerID, actualLastCheck).Return(nil)
96resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
97So(err, ShouldBeNil)
98So(resp, ShouldResemble, &dto.SaveTriggerResponse{ID: triggerID, Message: "trigger updated"})
99So(actualLastCheck, ShouldResemble, emptyLastCheck)
100})
101})
102
103Convey("Has timeSeries", t, func() {
104actualLastCheck := lastCheck
105dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
106dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
107dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(&moira.CheckData{
108Metrics: make(map[string]*moira.MetricState),
109}, nil)
110dataBase.EXPECT().SaveTrigger(triggerID, &trigger).Return(nil)
111dataBase.EXPECT().SetTriggerLastCheck(triggerID, gomock.Any()).Return(nil)
112resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, map[string]bool{"super.metric1": true, "super.metric2": true})
113So(err, ShouldBeNil)
114So(resp, ShouldResemble, &dto.SaveTriggerResponse{ID: triggerID, Message: "trigger updated"})
115So(actualLastCheck, ShouldResemble, lastCheck)
116})
117
118Convey("Errors", t, func() {
119Convey("AcquireTriggerCheckLock error", func() {
120expected := fmt.Errorf("AcquireTriggerCheckLock error")
121dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(expected)
122resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
123So(err, ShouldResemble, api.ErrorInternalServer(expected))
124So(resp, ShouldBeNil)
125})
126
127Convey("GetTriggerLastCheck error", func() {
128expected := fmt.Errorf("GetTriggerLastCheck error")
129dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
130dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
131dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(nil, expected)
132resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
133So(err, ShouldResemble, api.ErrorInternalServer(expected))
134So(resp, ShouldBeNil)
135})
136
137Convey("SetTriggerLastCheck error", func() {
138expected := fmt.Errorf("SetTriggerLastCheck error")
139dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
140dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
141dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(&moira.CheckData{
142Metrics: make(map[string]*moira.MetricState),
143}, nil)
144dataBase.EXPECT().SaveTrigger(triggerID, &trigger)
145dataBase.EXPECT().SetTriggerLastCheck(triggerID, gomock.Any()).Return(expected)
146resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
147So(err, ShouldResemble, api.ErrorInternalServer(expected))
148So(resp, ShouldBeNil)
149})
150
151Convey("saveTrigger error", func() {
152expected := fmt.Errorf("saveTrigger error")
153dataBase.EXPECT().AcquireTriggerCheckLock(triggerID)
154dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
155dataBase.EXPECT().GetOrCreateTriggerLastCheck(triggerID).Return(&moira.CheckData{
156Metrics: make(map[string]*moira.MetricState),
157}, nil)
158dataBase.EXPECT().SaveTrigger(triggerID, &trigger).Return(expected)
159resp, err := saveTrigger(dataBase, nil, &trigger, triggerID, make(map[string]bool))
160So(err, ShouldResemble, api.ErrorInternalServer(expected))
161So(resp, ShouldBeNil)
162})
163})
164}
165
166func TestGetTrigger(t *testing.T) {
167mockCtrl := gomock.NewController(t)
168defer mockCtrl.Finish()
169dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
170triggerID := uuid.NewV4().String()
171triggerModel := dto.TriggerModel{ID: triggerID}
172trigger := triggerModel.ToMoiraTrigger()
173begging := time.Unix(0, 0)
174now := time.Now()
175tomorrow := now.Add(time.Hour * 24)
176yesterday := now.Add(-time.Hour * 24)
177
178Convey("Has trigger no throttling", t, func() {
179dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
180dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(begging, begging)
181dataBase.EXPECT().TriggerHasPendingEscalations(triggerID, false).Return(false, nil)
182dataBase.EXPECT().GetTriggers(trigger.Parents).Return(nil, nil)
183actual, err := GetTrigger(dataBase, triggerID)
184So(err, ShouldBeNil)
185So(actual, ShouldResemble, &dto.Trigger{
186ParentTriggers: make([]*dto.Trigger, 0),
187TriggerModel: triggerModel,
188Throttling: 0,
189})
190})
191
192Convey("Has trigger has throttling", t, func() {
193dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
194dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(tomorrow, begging)
195dataBase.EXPECT().TriggerHasPendingEscalations(triggerID, false).Return(false, nil)
196dataBase.EXPECT().GetTriggers(trigger.Parents).Return(nil, nil)
197actual, err := GetTrigger(dataBase, triggerID)
198So(err, ShouldBeNil)
199So(actual, ShouldResemble, &dto.Trigger{
200ParentTriggers: make([]*dto.Trigger, 0),
201TriggerModel: triggerModel,
202Throttling: tomorrow.Unix(),
203})
204})
205
206Convey("Has trigger has old throttling", t, func() {
207dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
208dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(yesterday, begging)
209dataBase.EXPECT().TriggerHasPendingEscalations(triggerID, false).Return(false, nil)
210dataBase.EXPECT().GetTriggers(trigger.Parents).Return(nil, nil)
211actual, err := GetTrigger(dataBase, triggerID)
212So(err, ShouldBeNil)
213So(actual, ShouldResemble, &dto.Trigger{
214ParentTriggers: make([]*dto.Trigger, 0),
215TriggerModel: triggerModel,
216Throttling: 0,
217})
218})
219
220Convey("GetTrigger error", t, func() {
221expected := fmt.Errorf("GetTrigger error")
222dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, expected)
223actual, err := GetTrigger(dataBase, triggerID)
224So(err, ShouldResemble, api.ErrorInternalServer(expected))
225So(actual, ShouldBeNil)
226})
227
228Convey("No trigger", t, func() {
229dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, database.ErrNil)
230actual, err := GetTrigger(dataBase, triggerID)
231So(err, ShouldResemble, api.ErrorNotFound("Trigger not found"))
232So(actual, ShouldBeNil)
233})
234}
235
236func TestRemoveTrigger(t *testing.T) {
237mockCtrl := gomock.NewController(t)
238defer mockCtrl.Finish()
239
240dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
241triggerID := uuid.NewV4().String()
242
243Convey("Success", t, func() {
244dataBase.EXPECT().GetTrigger(triggerID).Return(nil, nil)
245dataBase.EXPECT().RemoveTrigger(triggerID).Return(nil)
246dataBase.EXPECT().RemoveTriggerLastCheck(triggerID).Return(nil)
247err := RemoveTrigger(dataBase, triggerID)
248So(err, ShouldBeNil)
249})
250
251Convey("Error remove trigger", t, func() {
252expected := fmt.Errorf("Oooops! Error delete")
253dataBase.EXPECT().GetTrigger(triggerID).Return(nil, nil)
254dataBase.EXPECT().RemoveTrigger(triggerID).Return(expected)
255err := RemoveTrigger(dataBase, triggerID)
256So(err, ShouldResemble, api.ErrorInternalServer(expected))
257})
258
259Convey("Error remove last check", t, func() {
260expected := fmt.Errorf("Oooops! Error delete")
261dataBase.EXPECT().GetTrigger(triggerID).Return(nil, nil)
262dataBase.EXPECT().RemoveTrigger(triggerID).Return(nil)
263dataBase.EXPECT().RemoveTriggerLastCheck(triggerID).Return(expected)
264err := RemoveTrigger(dataBase, triggerID)
265So(err, ShouldResemble, api.ErrorInternalServer(expected))
266})
267}
268
269func TestGetTriggerThrottling(t *testing.T) {
270mockCtrl := gomock.NewController(t)
271defer mockCtrl.Finish()
272dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
273triggerID := uuid.NewV4().String()
274begging := time.Unix(0, 0)
275now := time.Now()
276tomorrow := now.Add(time.Hour * 24)
277yesterday := now.Add(-time.Hour * 24)
278
279Convey("no throttling", t, func() {
280dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(begging, begging)
281actual, err := GetTriggerThrottling(dataBase, triggerID)
282So(err, ShouldBeNil)
283So(actual, ShouldResemble, &dto.ThrottlingResponse{Throttling: 0})
284})
285
286Convey("has throttling", t, func() {
287dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(tomorrow, begging)
288actual, err := GetTriggerThrottling(dataBase, triggerID)
289So(err, ShouldBeNil)
290So(actual, ShouldResemble, &dto.ThrottlingResponse{Throttling: tomorrow.Unix()})
291})
292
293Convey("has old throttling", t, func() {
294dataBase.EXPECT().GetTriggerThrottling(triggerID).Return(yesterday, begging)
295actual, err := GetTriggerThrottling(dataBase, triggerID)
296So(err, ShouldBeNil)
297So(actual, ShouldResemble, &dto.ThrottlingResponse{Throttling: 0})
298})
299}
300
301func TestGetTriggerLastCheck(t *testing.T) {
302mockCtrl := gomock.NewController(t)
303defer mockCtrl.Finish()
304
305dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
306triggerID := uuid.NewV4().String()
307lastCheck := &moira.CheckData{}
308
309Convey("Success", t, func() {
310dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(lastCheck, nil)
311dataBase.EXPECT().GetMaintenanceTrigger(triggerID).Return(moira.NewMaintenance(), nil)
312
313check, err := GetTriggerLastCheck(dataBase, triggerID)
314So(err, ShouldBeNil)
315So(check, ShouldResemble, &dto.TriggerCheck{
316TriggerID: triggerID,
317CheckData: lastCheck,
318})
319})
320
321Convey("Error", t, func() {
322expected := fmt.Errorf("Oooops! Error get")
323dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(&moira.CheckData{}, expected)
324check, err := GetTriggerLastCheck(dataBase, triggerID)
325So(err, ShouldResemble, api.ErrorInternalServer(expected))
326So(check, ShouldBeNil)
327})
328}
329
330func TestDeleteTriggerThrottling(t *testing.T) {
331mockCtrl := gomock.NewController(t)
332defer mockCtrl.Finish()
333dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
334triggerID := uuid.NewV4().String()
335
336Convey("Success", t, func() {
337dataBase.EXPECT().DeleteTriggerThrottling(triggerID).Return(nil)
338var total int64
339var to int64 = -1
340dataBase.EXPECT().GetNotifications(total, to).Return(make([]*moira.ScheduledNotification, 0), total, nil)
341dataBase.EXPECT().AddNotifications(make([]*moira.ScheduledNotification, 0), gomock.Any()).Return(nil)
342err := DeleteTriggerThrottling(dataBase, triggerID)
343So(err, ShouldBeNil)
344})
345
346Convey("Error", t, func() {
347expected := fmt.Errorf("Oooops! Error delete")
348dataBase.EXPECT().DeleteTriggerThrottling(triggerID).Return(expected)
349err := DeleteTriggerThrottling(dataBase, triggerID)
350So(err, ShouldResemble, api.ErrorInternalServer(expected))
351})
352}
353
354func TestDeleteTriggerMetric(t *testing.T) {
355mockCtrl := gomock.NewController(t)
356defer mockCtrl.Finish()
357dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
358triggerID := uuid.NewV4().String()
359trigger := &moira.Trigger{ID: triggerID}
360lastCheck := moira.CheckData{
361Metrics: map[string]*moira.MetricState{
362"super.metric1": {},
363},
364}
365emptyLastCheck := &moira.CheckData{
366Metrics: make(map[string]*moira.MetricState),
367}
368
369Convey("Success delete from last check", t, func() {
370expectedLastCheck := &lastCheck
371dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
372dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
373dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
374dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(expectedLastCheck, nil)
375dataBase.EXPECT().RemovePatternsMetrics(trigger.Patterns).Return(nil)
376dataBase.EXPECT().SetTriggerLastCheck(triggerID, expectedLastCheck)
377err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
378So(err, ShouldBeNil)
379So(expectedLastCheck, ShouldResemble, emptyLastCheck)
380})
381
382Convey("Success delete nothing to delete", t, func() {
383expectedLastCheck := emptyLastCheck
384dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
385dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
386dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
387dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(expectedLastCheck, nil)
388dataBase.EXPECT().RemovePatternsMetrics(trigger.Patterns).Return(nil)
389dataBase.EXPECT().SetTriggerLastCheck(triggerID, expectedLastCheck)
390err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
391So(err, ShouldBeNil)
392So(expectedLastCheck, ShouldResemble, emptyLastCheck)
393})
394
395Convey("No trigger", t, func() {
396dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, database.ErrNil)
397err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
398So(err, ShouldResemble, api.ErrorInvalidRequest(fmt.Errorf("Trigger not found")))
399})
400
401Convey("No last check", t, func() {
402dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
403dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
404dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
405dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(&moira.CheckData{}, database.ErrNil)
406err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
407So(err, ShouldResemble, api.ErrorInvalidRequest(fmt.Errorf("Trigger check not found")))
408})
409
410Convey("Get trigger error", t, func() {
411expected := fmt.Errorf("Get trigger error")
412dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, expected)
413err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
414So(err, ShouldResemble, api.ErrorInternalServer(expected))
415})
416
417Convey("AcquireTriggerCheckLock error", t, func() {
418expected := fmt.Errorf("Acquire error")
419dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
420dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(expected)
421err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
422So(err, ShouldResemble, api.ErrorInternalServer(expected))
423})
424
425Convey("GetTriggerLastCheck error", t, func() {
426expected := fmt.Errorf("Last check error")
427dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
428dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
429dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
430dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(&moira.CheckData{}, expected)
431err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
432So(err, ShouldResemble, api.ErrorInternalServer(expected))
433})
434
435Convey("RemovePatternsMetrics error", t, func() {
436expected := fmt.Errorf("RemovePatternsMetrics err")
437dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
438dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
439dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
440dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(&lastCheck, nil)
441dataBase.EXPECT().RemovePatternsMetrics(trigger.Patterns).Return(expected)
442err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
443So(err, ShouldResemble, api.ErrorInternalServer(expected))
444})
445
446Convey("SetTriggerLastCheck error", t, func() {
447expected := fmt.Errorf("RemovePatternsMetrics err")
448dataBase.EXPECT().GetTrigger(triggerID).Return(trigger, nil)
449dataBase.EXPECT().AcquireTriggerCheckLock(triggerID).Return(nil)
450dataBase.EXPECT().DeleteTriggerCheckLock(triggerID)
451dataBase.EXPECT().GetTriggerLastCheck(triggerID).Return(&lastCheck, nil)
452dataBase.EXPECT().RemovePatternsMetrics(trigger.Patterns).Return(nil)
453dataBase.EXPECT().SetTriggerLastCheck(triggerID, &lastCheck).Return(expected)
454err := DeleteTriggerMetric(dataBase, "super.metric1", triggerID)
455So(err, ShouldResemble, api.ErrorInternalServer(expected))
456})
457}
458
459func TestSetMetricsMaintenance(t *testing.T) {
460mockCtrl := gomock.NewController(t)
461defer mockCtrl.Finish()
462
463dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
464triggerID := uuid.NewV4().String()
465
466maintenance := moira.NewMaintenance()
467update := make(map[string]int64)
468
469Convey("Success", t, func() {
470dataBase.EXPECT().AcquireTriggerMaintenanceLock(triggerID)
471dataBase.EXPECT().GetMaintenanceTrigger(triggerID).Return(maintenance, nil)
472dataBase.EXPECT().SetMaintenanceTrigger(triggerID, maintenance).Return(nil)
473dataBase.EXPECT().DeleteTriggerMaintenanceLock(triggerID)
474
475err := SetMetricsMaintenance(dataBase, triggerID, update)
476So(err, ShouldBeNil)
477})
478
479Convey("Error", t, func() {
480expected := fmt.Errorf("Oooops! Error set")
481dataBase.EXPECT().AcquireTriggerMaintenanceLock(triggerID)
482dataBase.EXPECT().GetMaintenanceTrigger(triggerID).Return(maintenance, nil)
483dataBase.EXPECT().SetMaintenanceTrigger(triggerID, maintenance).Return(expected)
484dataBase.EXPECT().DeleteTriggerMaintenanceLock(triggerID)
485
486err := SetMetricsMaintenance(dataBase, triggerID, update)
487So(err, ShouldResemble, api.ErrorInternalServer(expected))
488})
489}
490
491func TestGetTriggerMetrics(t *testing.T) {
492mockCtrl := gomock.NewController(t)
493defer mockCtrl.Finish()
494
495dataBase := mock_moira_alert.NewMockDatabase(mockCtrl)
496triggerID := uuid.NewV4().String()
497pattern := "super.puper.pattern"
498metric := "super.puper.metric"
499dataList := map[string][]*moira.MetricValue{
500metric: {
501{
502RetentionTimestamp: 20,
503Timestamp: 23,
504Value: 0,
505},
506{
507RetentionTimestamp: 30,
508Timestamp: 33,
509Value: 1,
510},
511{
512RetentionTimestamp: 40,
513Timestamp: 43,
514Value: 2,
515},
516{
517RetentionTimestamp: 50,
518Timestamp: 53,
519Value: 3,
520},
521{
522RetentionTimestamp: 60,
523Timestamp: 63,
524Value: 4,
525},
526},
527}
528
529var from int64 = 17
530var until int64 = 67
531var retention int64 = 10
532
533Convey("Has metrics", t, func() {
534dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{ID: triggerID, Targets: []string{pattern}}, nil)
535dataBase.EXPECT().GetPatternMetrics(pattern).Return([]string{metric}, nil)
536dataBase.EXPECT().GetMetricRetention(metric).Return(retention, nil)
537dataBase.EXPECT().GetMetricsValues([]string{metric}, from, until).Return(dataList, nil)
538triggerMetrics, err := GetTriggerMetrics(dataBase, from, until, triggerID)
539So(err, ShouldBeNil)
540So(triggerMetrics, ShouldResemble, dto.TriggerMetrics(map[string][]moira.MetricValue{metric: {{Value: 0, Timestamp: 17}, {Value: 1, Timestamp: 27}, {Value: 2, Timestamp: 37}, {Value: 3, Timestamp: 47}, {Value: 4, Timestamp: 57}}}))
541})
542
543Convey("GetTrigger error", t, func() {
544expected := fmt.Errorf("Get trigger error")
545dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, expected)
546triggerMetrics, err := GetTriggerMetrics(dataBase, from, until, triggerID)
547So(err, ShouldResemble, api.ErrorInternalServer(expected))
548So(triggerMetrics, ShouldBeNil)
549})
550
551Convey("No trigger", t, func() {
552dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{}, database.ErrNil)
553triggerMetrics, err := GetTriggerMetrics(dataBase, from, until, triggerID)
554So(err, ShouldResemble, api.ErrorInvalidRequest(fmt.Errorf("Trigger not found")))
555So(triggerMetrics, ShouldBeNil)
556})
557
558Convey("GetMetricsValues error", t, func() {
559expected := fmt.Errorf("GetMetricsValues error")
560dataBase.EXPECT().GetTrigger(triggerID).Return(&moira.Trigger{ID: triggerID, Targets: []string{pattern}}, nil)
561dataBase.EXPECT().GetPatternMetrics(pattern).Return([]string{metric}, nil)
562dataBase.EXPECT().GetMetricRetention(metric).Return(retention, nil)
563dataBase.EXPECT().GetMetricsValues([]string{metric}, from, until).Return(nil, expected)
564triggerMetrics, err := GetTriggerMetrics(dataBase, from, until, triggerID)
565So(err, ShouldResemble, api.ErrorInternalServer(expected))
566So(triggerMetrics, ShouldBeNil)
567})
568
569}
570