2 * Copyright (c) 2020 AT&T Intellectual Property.
3 * Copyright (c) 2020 Nokia.
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://www.apache.org/licenses/LICENSE-2.0
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
17 * This source code is part of the near-RT RIC (RAN Intelligent Controller)
18 * platform project (RICP).
39 "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
40 "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
41 "github.com/gorilla/mux"
42 "github.com/prometheus/alertmanager/api/v2/models"
43 "github.com/stretchr/testify/assert"
46 var alarmManager *AlarmManager
47 var alarmer *alarm.RICAlarm
48 var eventChan chan string
51 func TestMain(M *testing.M) {
52 alarmManager = NewAlarmManager("localhost:9093", 500, false)
53 alarmManager.alertInterval = 20000
54 go alarmManager.Run(false, 5)
55 time.Sleep(time.Duration(10) * time.Second)
57 // Wait until RMR is up-and-running
58 for !xapp.Rmr.IsReady() {
59 time.Sleep(time.Duration(1) * time.Second)
62 alarmer, _ = alarm.InitAlarm("my-pod", "my-app")
63 alarmManager.alarmClient = alarmer
64 time.Sleep(time.Duration(5) * time.Second)
65 eventChan = make(chan string)
70 func TestGetPreDefinedAlarmDefinitions(t *testing.T) {
71 xapp.Logger.Info("TestGetPreDefinedAlarmDefinitions")
72 var alarmDefinition alarm.AlarmDefinition
73 req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
74 vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
75 req = mux.SetURLVars(req, vars)
76 handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
77 response := executeRequest(req, handleFunc)
78 checkResponseCode(t, http.StatusOK, response.Code)
79 json.NewDecoder(response.Body).Decode(&alarmDefinition)
80 xapp.Logger.Info("alarm definition = %v", alarmDefinition)
81 if alarmDefinition.AlarmId != alarm.E2_CONNECTION_PROBLEM || alarmDefinition.AlarmText != "E2 CONNECTION PROBLEM" {
82 t.Errorf("Incorrect alarm definition")
86 func TestSetAlarmDefinitions(t *testing.T) {
87 xapp.Logger.Info("TestSetAlarmDefinitions")
89 var alarm72004Definition alarm.AlarmDefinition
90 alarm72004Definition.AlarmId = alarm.E2_CONNECTION_PROBLEM
91 alarm72004Definition.AlarmText = "E2 CONNECTIVITY LOST TO E-NODEB/G-NODEB"
92 alarm72004Definition.EventType = "Communication error"
93 alarm72004Definition.OperationInstructions = "Not defined"
94 alarm72004Definition.RaiseDelay = 0
95 alarm72004Definition.ClearDelay = 0
97 var alarm72008Definition alarm.AlarmDefinition
98 alarm72008Definition.AlarmId = alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD
99 alarm72008Definition.AlarmText = "ACTIVE ALARM EXCEED MAX THRESHOLD"
100 alarm72008Definition.EventType = "storage warning"
101 alarm72008Definition.OperationInstructions = "Clear alarms or raise threshold"
102 alarm72008Definition.RaiseDelay = 0
103 alarm72008Definition.ClearDelay = 0
105 var alarm72009Definition alarm.AlarmDefinition
106 alarm72009Definition.AlarmId = alarm.ALARM_HISTORY_EXCEED_MAX_THRESHOLD
107 alarm72009Definition.AlarmText = "ALARM HISTORY EXCEED MAX THRESHOLD"
108 alarm72009Definition.EventType = "storage warning"
109 alarm72009Definition.OperationInstructions = "Clear alarms or raise threshold"
110 alarm72009Definition.RaiseDelay = 0
111 alarm72009Definition.ClearDelay = 0
113 pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm72004Definition, &alarm72008Definition, &alarm72009Definition}}
114 pbodyEn, _ := json.Marshal(pbodyParams)
115 req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
116 handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
117 response := executeRequest(req, handleFunc)
118 status := checkResponseCode(t, http.StatusOK, response.Code)
119 xapp.Logger.Info("status = %v", status)
123 func TestSetAlarmConfigDecodeError(t *testing.T) {
124 xapp.Logger.Info("TestSetAlarmConfigDecodeError")
126 var jsonStr = []byte(`{"test":"Invalid Alarm Data", "test1" 123}`)
127 req, _ := http.NewRequest("POST", "/ric/v1/alarms", bytes.NewBuffer(jsonStr))
128 handleFunc := http.HandlerFunc(alarmManager.SetAlarmConfig)
129 response := executeRequest(req, handleFunc)
130 status := checkResponseCode(t,http.StatusOK,response.Code)
131 xapp.Logger.Info("status = %v", status)
134 func TestSetAlarmDefinitionDecodeError(t *testing.T) {
135 xapp.Logger.Info("TestSetAlarmDefinitionDecodeError")
137 var jsonStr = []byte(`{"test":"Invalid Alarm Data", "test1" 123}`)
138 req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(jsonStr))
139 handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
140 response := executeRequest(req, handleFunc)
141 status := checkResponseCode(t,http.StatusBadRequest,response.Code)
142 xapp.Logger.Info("status = %v", status)
145 func TestRaiseAlarmEmptyBody(t *testing.T) {
146 xapp.Logger.Info("TestRaiseAlarmEmptyBody")
147 req, _ := http.NewRequest("POST", "/ric/v1/alarms", nil)
148 handleFunc := http.HandlerFunc(alarmManager.RaiseAlarm)
149 response := executeRequest(req, handleFunc)
150 status := checkResponseCode(t,http.StatusOK,response.Code)
151 xapp.Logger.Info("status = %v", status)
154 func TestSetAlarmDefinitionsEmptyBody(t *testing.T) {
155 xapp.Logger.Info("TestSetAlarmDefinitionsEmptyBody")
156 req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", nil)
157 handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
158 response := executeRequest(req, handleFunc)
159 status := checkResponseCode(t,http.StatusBadRequest,response.Code)
160 xapp.Logger.Info("status = %v", status)
163 func TestClearAlarmEmptyBody(t *testing.T) {
164 xapp.Logger.Info("TestClearAlarmEmptyBody")
165 req, _ := http.NewRequest("DELETE", "/ric/v1/alarms", nil)
166 handleFunc := http.HandlerFunc(alarmManager.ClearAlarm)
167 response := executeRequest(req, handleFunc)
168 status := checkResponseCode(t,http.StatusOK,response.Code)
169 xapp.Logger.Info("status = %v", status)
172 func TestGetAlarmDefinitions(t *testing.T) {
173 xapp.Logger.Info("TestGetAlarmDefinitions")
174 var alarmDefinition alarm.AlarmDefinition
175 req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
176 vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
177 req = mux.SetURLVars(req, vars)
178 handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
179 response := executeRequest(req, handleFunc)
180 checkResponseCode(t, http.StatusOK, response.Code)
181 json.NewDecoder(response.Body).Decode(&alarmDefinition)
182 xapp.Logger.Info("alarm definition = %v", alarmDefinition)
183 if alarmDefinition.AlarmId != alarm.E2_CONNECTION_PROBLEM || alarmDefinition.AlarmText != "E2 CONNECTION PROBLEM" {
184 t.Errorf("Incorrect alarm definition")
188 func TestDeleteAlarmDefinitions(t *testing.T) {
189 xapp.Logger.Info("TestDeleteAlarmDefinitions")
191 var ricAlarmDefinitions RicAlarmDefinitions
192 req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
193 req = mux.SetURLVars(req, nil)
194 handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
195 response := executeRequest(req, handleFunc)
196 checkResponseCode(t, http.StatusOK, response.Code)
197 json.NewDecoder(response.Body).Decode(&ricAlarmDefinitions)
198 for _, alarmDefinition := range ricAlarmDefinitions.AlarmDefinitions {
199 xapp.Logger.Info("alarm definition = %v", *alarmDefinition)
203 req, _ = http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
204 vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
205 req = mux.SetURLVars(req, vars)
206 handleFunc = http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
207 response = executeRequest(req, handleFunc)
208 checkResponseCode(t, http.StatusOK, response.Code)
211 req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
212 vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
213 req = mux.SetURLVars(req, vars)
214 handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
215 response = executeRequest(req, handleFunc)
216 checkResponseCode(t, http.StatusBadRequest, response.Code)
218 //Delete Alarm which doesn't present
220 var alarm72004Definition alarm.AlarmDefinition
221 alarm72004Definition.AlarmId = alarm.E2_CONNECTION_PROBLEM
222 alarm72004Definition.AlarmText = "E2 CONNECTION PROBLEM"
223 alarm72004Definition.EventType = "Processing error"
224 alarm72004Definition.OperationInstructions = "Not defined"
225 alarm72004Definition.RaiseDelay = 0
226 alarm72004Definition.ClearDelay = 0
227 pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm72004Definition}}
228 pbodyEn, _ := json.Marshal(pbodyParams)
229 req, _ = http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
230 handleFunc = http.HandlerFunc(alarmManager.SetAlarmDefinition)
231 response = executeRequest(req, handleFunc)
232 checkResponseCode(t, http.StatusOK, response.Code)
235 req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
236 vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
237 req = mux.SetURLVars(req, vars)
238 handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
239 response = executeRequest(req, handleFunc)
240 checkResponseCode(t, http.StatusOK, response.Code)
243 func TestNewAlarmStoredAndPostedSucess(t *testing.T) {
244 xapp.Logger.Info("TestNewAlarmStoredAndPostedSucess")
245 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
248 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
249 assert.Nil(t, alarmer.Raise(a), "raise failed")
253 var activeAlarms []AlarmNotification
254 activeAlarms = make([]AlarmNotification, 1)
255 req, _ := http.NewRequest("GET", "/ric/v1/alarms/active", nil)
256 req = mux.SetURLVars(req, nil)
257 handleFunc := http.HandlerFunc(alarmManager.GetActiveAlarms)
258 response := executeRequest(req, handleFunc)
259 checkResponseCode(t, http.StatusOK, response.Code)
261 // Decode the json output from handler
262 json.NewDecoder(response.Body).Decode(activeAlarms)
263 if len(activeAlarms) != 1 {
264 t.Errorf("Incorrect alarm alarm count")
267 var alarmHistory []AlarmNotification
268 alarmHistory = make([]AlarmNotification, 1)
269 req, _ = http.NewRequest("GET", "/ric/v1/alarms/history", nil)
270 req = mux.SetURLVars(req, nil)
271 handleFunc = http.HandlerFunc(alarmManager.GetAlarmHistory)
272 response = executeRequest(req, handleFunc)
273 checkResponseCode(t, http.StatusOK, response.Code)
275 // Decode the json output from handler
276 json.NewDecoder(response.Body).Decode(alarmHistory)
277 if len(alarmHistory) != 1 {
278 t.Errorf("Incorrect alarm history count")
282 func TestAlarmClearedSucess(t *testing.T) {
283 xapp.Logger.Info("TestAlarmClearedSucess")
284 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
288 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
289 assert.Nil(t, alarmer.Raise(a), "raise failed")
293 // Now Clear the alarm and check alarm is removed
294 a = alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some App data", "eth 0 1")
295 assert.Nil(t, alarmer.Clear(a), "clear failed")
297 time.Sleep(time.Duration(2) * time.Second)
298 assert.Equal(t, len(alarmManager.activeAlarms), 0)
301 func TestMultipleAlarmsRaisedSucess(t *testing.T) {
302 xapp.Logger.Info("TestMultipleAlarmsRaisedSucess")
303 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
307 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
308 assert.Nil(t, alarmer.Raise(a), "raise failed")
310 b := alarmer.NewAlarm(alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD, alarm.SeverityMinor, "Hello", "abcd 11")
311 assert.Nil(t, alarmer.Raise(b), "raise failed")
313 time.Sleep(time.Duration(5) * time.Second)
315 xapp.Logger.Info("VerifyAlarm: %d %+v", len(alarmManager.activeAlarms), alarmManager.activeAlarms)
317 xapp.Logger.Info("VerifyAlarm: %d %+v", len(alarmManager.activeAlarms), alarmManager.activeAlarms)
321 func TestMultipleAlarmsClearedSucess(t *testing.T) {
322 xapp.Logger.Info("TestMultipleAlarmsClearedSucess")
323 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
327 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
328 assert.Nil(t, alarmer.Clear(a), "clear failed")
330 b := alarmer.NewAlarm(alarm.ACTIVE_ALARM_EXCEED_MAX_THRESHOLD, alarm.SeverityMinor, "Hello", "abcd 11")
331 assert.Nil(t, alarmer.Clear(b), "clear failed")
333 time.Sleep(time.Duration(2) * time.Second)
334 assert.Equal(t, len(alarmManager.activeAlarms), 0)
337 func TestAlarmsSuppresedSucess(t *testing.T) {
338 xapp.Logger.Info("TestAlarmsSuppresedSucess")
339 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
342 // Raise two similar/matching alarms ... the second one suppresed
343 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
344 assert.Nil(t, alarmer.Raise(a), "raise failed")
345 assert.Nil(t, alarmer.Raise(a), "raise failed")
348 assert.Nil(t, alarmer.Clear(a), "clear failed")
351 func TestInvalidAlarms(t *testing.T) {
352 xapp.Logger.Info("TestInvalidAlarms")
353 a := alarmer.NewAlarm(1111, alarm.SeverityMajor, "Some App data", "eth 0 1")
354 assert.Nil(t, alarmer.Raise(a), "raise failed")
355 time.Sleep(time.Duration(2) * time.Second)
358 func TestAlarmHandlingErrorCases(t *testing.T) {
359 xapp.Logger.Info("TestAlarmHandlingErrorCases")
360 ok, err := alarmManager.HandleAlarms(&xapp.RMRParams{})
361 assert.Equal(t, err.Error(), "unexpected end of JSON input")
362 assert.Nil(t, ok, "raise failed")
365 func TestConsumeUnknownMessage(t *testing.T) {
366 xapp.Logger.Info("TestConsumeUnknownMessage")
367 err := alarmManager.Consume(&xapp.RMRParams{})
368 assert.Nil(t, err, "raise failed")
371 func TestStatusCallback(t *testing.T) {
372 xapp.Logger.Info("TestStatusCallback")
373 assert.Equal(t, true, alarmManager.StatusCB())
376 func TestActiveAlarmMaxThresholds(t *testing.T) {
377 xapp.Logger.Info("TestActiveAlarmMaxThresholds")
378 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
379 alarmManager.maxActiveAlarms = 0
380 alarmManager.maxAlarmHistory = 10
382 a := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityCritical, "Some Application data", "eth 0 2")
383 assert.Nil(t, alarmer.Raise(a), "raise failed")
385 var alarmConfigParams alarm.AlarmConfigParams
386 req, _ := http.NewRequest("GET", "/ric/v1/alarms/config", nil)
387 req = mux.SetURLVars(req, nil)
388 handleFunc := http.HandlerFunc(alarmManager.GetAlarmConfig)
389 response := executeRequest(req, handleFunc)
391 // Check HTTP Status Code
392 checkResponseCode(t, http.StatusOK, response.Code)
394 // Decode the json output from handler
395 json.NewDecoder(response.Body).Decode(&alarmConfigParams)
396 if alarmConfigParams.MaxActiveAlarms != 0 || alarmConfigParams.MaxAlarmHistory != 10 {
397 t.Errorf("Incorrect alarm thresholds")
400 time.Sleep(time.Duration(1) * time.Second)
401 alarmManager.maxActiveAlarms = 5000
402 alarmManager.maxAlarmHistory = 20000
408 func TestGetPrometheusAlerts(t *testing.T) {
409 time.Sleep(1 * time.Second)
410 xapp.Logger.Info("TestGetPrometheusAlerts")
411 ts := CreatePromAlertSimulator2(t, "GET", "/alerts?active=true&inhibited=true&silenced=true&unprocessed=true")
413 commandReady := make(chan bool, 1)
414 command := "cli/alarm-cli"
415 args := []string{"alerts", "--active", "true", "--inhibited", "true", "--silenced", "--unprocessed", "true", "true", "--host", "localhost", "--port", "9093", "flushall"}
416 ExecCLICommand(commandReady, command, args...)
422 func TestDelayedAlarmRaiseAndClear(t *testing.T) {
423 xapp.Logger.Info("TestDelayedAlarmRaiseAndClear")
425 activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
426 alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
428 // Add new alarm definition
429 var alarm9999Definition alarm.AlarmDefinition
430 alarm9999Definition.AlarmId = 9999
431 alarm9999Definition.AlarmText = "DELAYED TEST ALARM"
432 alarm9999Definition.EventType = "Test type"
433 alarm9999Definition.OperationInstructions = "Not defined"
434 alarm9999Definition.RaiseDelay = 1
435 alarm9999Definition.ClearDelay = 1
436 pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm9999Definition}}
437 pbodyEn, _ := json.Marshal(pbodyParams)
438 req, _ := http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
439 handleFunc := http.HandlerFunc(alarmManager.SetAlarmDefinition)
440 response := executeRequest(req, handleFunc)
441 checkResponseCode(t, http.StatusOK, response.Code)
443 // Verify 9999 alarm definition
444 req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
445 vars := map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
446 req = mux.SetURLVars(req, vars)
447 handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
448 response = executeRequest(req, handleFunc)
449 checkResponseCode(t, http.StatusOK, response.Code)
451 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
454 // Raise alarm. Posting alert and updating alarm history should be delayed
455 a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
456 assert.Nil(t, alarmer.Raise(a), "raise failed")
457 VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
459 // Clear the alarm and check the alarm is removed. Posting alert clear and updating alarm history should be delayed
460 assert.Nil(t, alarmer.Clear(a), "clear failed")
462 time.Sleep(time.Duration(2) * time.Second)
463 assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
464 assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+2)
467 func TestDelayedAlarmRaiseAndClear2(t *testing.T) {
468 xapp.Logger.Info("TestDelayedAlarmRaiseAndClear2")
470 activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
471 alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
473 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
476 // Raise two alarms. The first should be delayed
477 a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
478 assert.Nil(t, alarmer.Raise(a), "raise failed")
479 VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
481 b := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
482 assert.Nil(t, alarmer.Raise(b), "raise failed")
483 VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
485 // Clear two alarms. The first should be delayed. Check the alarms are removed
486 assert.Nil(t, alarmer.Clear(a), "clear failed")
487 assert.Nil(t, alarmer.Clear(b), "clear failed")
489 time.Sleep(time.Duration(2) * time.Second)
490 assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
491 assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
494 func TestDelayedAlarmRaiseAndClear3(t *testing.T) {
495 xapp.Logger.Info("TestDelayedAlarmRaiseAndClear3")
497 // Delete exisitng 9999 alarm definition
498 req, _ := http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
499 vars := map[string]string{"alarmId": strconv.FormatUint(9999, 10)}
500 req = mux.SetURLVars(req, vars)
501 handleFunc := http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
502 response := executeRequest(req, handleFunc)
503 checkResponseCode(t, http.StatusOK, response.Code)
505 // Add updated 9999 alarm definition
506 var alarm9999Definition alarm.AlarmDefinition
507 alarm9999Definition.AlarmId = 9999
508 alarm9999Definition.AlarmText = "DELAYED TEST ALARM"
509 alarm9999Definition.EventType = "Test type"
510 alarm9999Definition.OperationInstructions = "Not defined"
511 alarm9999Definition.RaiseDelay = 1
512 alarm9999Definition.ClearDelay = 0
513 pbodyParams := RicAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarm9999Definition}}
514 pbodyEn, _ := json.Marshal(pbodyParams)
515 req, _ = http.NewRequest("POST", "/ric/v1/alarms/define", bytes.NewBuffer(pbodyEn))
516 handleFunc = http.HandlerFunc(alarmManager.SetAlarmDefinition)
517 response = executeRequest(req, handleFunc)
518 checkResponseCode(t, http.StatusOK, response.Code)
520 // Verify 9999 alarm definition
521 req, _ = http.NewRequest("GET", "/ric/v1/alarms/define", nil)
522 vars = map[string]string{"alarmId": strconv.FormatUint(72004, 10)}
523 req = mux.SetURLVars(req, vars)
524 handleFunc = http.HandlerFunc(alarmManager.GetAlarmDefinition)
525 response = executeRequest(req, handleFunc)
526 checkResponseCode(t, http.StatusOK, response.Code)
528 activeAlarmsBeforeTest := len(alarmManager.activeAlarms)
529 alarmHistoryBeforeTest := len(alarmManager.alarmHistory)
531 ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
534 // Raise two alarms. The first should be delayed
535 a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
536 assert.Nil(t, alarmer.Raise(a), "raise failed")
537 VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
539 b := alarmer.NewAlarm(alarm.E2_CONNECTION_PROBLEM, alarm.SeverityMajor, "Some App data", "eth 0 1")
540 assert.Nil(t, alarmer.Raise(b), "raise failed")
541 VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
543 // Clear two alarms. The first should be delayed. Check the alarms are removed
544 assert.Nil(t, alarmer.Clear(a), "clear failed")
545 assert.Nil(t, alarmer.Clear(b), "clear failed")
547 time.Sleep(time.Duration(2) * time.Second)
548 assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
549 assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
552 func TestClearExpiredAlarms(t *testing.T) {
553 xapp.Logger.Info("TestClearExpiredAlarms")
555 a := alarm.AlarmMessage{
556 Alarm: alarmer.NewAlarm(72004, alarm.SeverityWarning, "threshold", ""),
557 AlarmAction: alarm.AlarmActionRaise,
558 AlarmTime: time.Now().UnixNano(),
560 d := alarm.RICAlarmDefinitions[72004]
561 n := AlarmNotification{a, *d}
562 alarmManager.activeAlarms = make([]AlarmNotification, 0)
563 alarmManager.UpdateActiveAlarmList(&n)
566 a.Alarm.SpecificProblem = 1234
567 assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
571 assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
574 a.Alarm.SpecificProblem = 72004
576 assert.False(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
578 // TTL expired, alarm should be cleared
579 time.Sleep(time.Duration(3) * time.Second)
580 assert.Equal(t, len(alarmManager.activeAlarms), 1)
581 assert.True(t, alarmManager.ClearExpiredAlarms(n, 0, false), "ClearExpiredAlarms failed")
582 assert.Equal(t, len(alarmManager.activeAlarms), 0)
585 func TestSetAlarmConfig(t *testing.T) {
586 xapp.Logger.Info("TestSetAlarmConfig")
588 var setAlarmConfig alarm.AlarmConfigParams
589 setAlarmConfig.MaxActiveAlarms = 500
590 setAlarmConfig.MaxAlarmHistory = 2000
592 pbodyEn, _ := json.Marshal(setAlarmConfig)
593 req, _ := http.NewRequest("POST", "/ric/v1/alarms/config", bytes.NewBuffer(pbodyEn))
594 handleFunc := http.HandlerFunc(alarmManager.SetAlarmConfig)
595 response := executeRequest(req, handleFunc)
596 checkResponseCode(t, http.StatusOK, response.Code)
598 var getAlarmConfig alarm.AlarmConfigParams
599 req, _ = http.NewRequest("GET", "/ric/v1/alarms/config", nil)
600 req = mux.SetURLVars(req, nil)
601 handleFunc = http.HandlerFunc(alarmManager.GetAlarmConfig)
602 response = executeRequest(req, handleFunc)
603 checkResponseCode(t, http.StatusOK, response.Code)
605 // Decode the json output from handler
606 json.NewDecoder(response.Body).Decode(&getAlarmConfig)
607 if getAlarmConfig.MaxActiveAlarms != 500 || getAlarmConfig.MaxAlarmHistory != 2000 {
608 t.Errorf("Incorrect alarm thresholds")
612 setAlarmConfig.MaxActiveAlarms = 5000
613 setAlarmConfig.MaxAlarmHistory = 20000
615 pbodyEn, _ = json.Marshal(setAlarmConfig)
616 req, _ = http.NewRequest("POST", "/ric/v1/alarms/config", bytes.NewBuffer(pbodyEn))
617 handleFunc = http.HandlerFunc(alarmManager.SetAlarmConfig)
618 response = executeRequest(req, handleFunc)
619 checkResponseCode(t, http.StatusOK, response.Code)
621 req, _ = http.NewRequest("GET", "/ric/v1/alarms/config", nil)
622 req = mux.SetURLVars(req, nil)
623 handleFunc = http.HandlerFunc(alarmManager.GetAlarmConfig)
624 response = executeRequest(req, handleFunc)
625 checkResponseCode(t, http.StatusOK, response.Code)
627 // Decode the json output from handler
628 json.NewDecoder(response.Body).Decode(&getAlarmConfig)
629 if getAlarmConfig.MaxActiveAlarms != 5000 || getAlarmConfig.MaxAlarmHistory != 20000 {
630 t.Errorf("Incorrect alarm thresholds")
634 func TestConfigChangeCB(t *testing.T) {
635 xapp.Logger.Info("TestConfigChangeCB")
636 alarmManager.ConfigChangeCB("AlarmManager")
639 func TestPostAlarm(t *testing.T) {
640 xapp.Logger.Info("TestPostAlarm")
641 var activeAlarms []AlarmNotification
642 activeAlarms = make([]AlarmNotification, 1)
643 alarmManager.PostAlarm(&activeAlarms[0])
646 func TestPostAlarm1(t *testing.T) {
647 xapp.Logger.Info("TestPostAlarm")
648 var activeAlarms []AlarmNotification
649 activeAlarms = make([]AlarmNotification, 2)
650 alarmManager.PostAlarm(&activeAlarms[0])
653 func TestNewAlarmManagerOther(t *testing.T){
654 NewAlarmManager("", 0, true)
657 func TestStatusCallbackFailure(t *testing.T) {
658 xapp.Logger.Info("TestStatusCallbackFailure")
659 alarmManager.rmrReady = false
660 assert.Equal(t, false, alarmManager.StatusCB())
663 func TestConfigChangeCBFailure(t *testing.T) {
664 xapp.Logger.Info("TestConfigChangeCBFailure")
665 alarmManager.maxActiveAlarms = 0
666 alarmManager.maxAlarmHistory = 0
667 alarmManager.ConfigChangeCB("AlarmManager")
670 func TestReadAlarmDefinitionFromJsonWrongFilename(t *testing.T) {
671 // use to set wrong file name os.Setenv("SITE_TITLE", "Test Site")
672 xapp.Logger.Info("TestReadAlarmDefinitionFromJsonWrongFilename")
673 os.Setenv("DEF_FILE","test.json")
674 alarmManager.ReadAlarmDefinitionFromJson()
675 // correct the filename
678 func TestReadAlarmDefinitionFromJsonInvalidFilename(t *testing.T) {
679 // use to set wrong file name os.Setenv("SITE_TITLE", "Test Site")
680 xapp.Logger.Info("TestReadAlarmDefinitionFromJsonInvalidFilename")
681 os.Setenv("DEF_FILE","../../definitions/test.json")
682 alarmManager.ReadAlarmDefinitionFromJson()
683 // correct the filename
686 func TestPersistentStorage(t *testing.T) {
687 xapp.Logger.Info("TestPersistentStorage")
688 alarmManager.alarmInfoPvFile = "../../definitions/sample.json"
689 alarmManager.ReadAlarmInfoFromPersistentVolume()
692 func TestDeleteAlarmDefinitions1(t *testing.T) {
693 xapp.Logger.Info("TestDeleteAlarmDefinitions1")
695 //Delete Alarm which doesn't present
696 req, _ := http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
697 vars := map[string]string{"alarmId": strconv.FormatUint(882004, 10)}
698 req = mux.SetURLVars(req, vars)
699 handleFunc := http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
700 response := executeRequest(req, handleFunc)
701 checkResponseCode(t, http.StatusOK, response.Code)
703 //Delete Alarm which is incorrect present
704 req, _ = http.NewRequest("DELETE", "/ric/v1/alarms/define", nil)
705 vars = map[string]string{"alarmId": strconv.FormatUint(898989, 8)}
706 req = mux.SetURLVars(req, vars)
707 handleFunc = http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
708 response = executeRequest(req, handleFunc)
709 checkResponseCode(t, http.StatusOK, response.Code)
712 func TestGetPreDefinedAlarmInvalidAlarm(t *testing.T) {
713 xapp.Logger.Info("TestGetPreDefinedAlarmInvalidAlarm")
714 req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
715 vars := map[string]string{"alarmId": "asdsc"}
716 req = mux.SetURLVars(req, vars)
717 handleFunc := http.HandlerFunc(alarmManager.GetAlarmDefinition)
718 response := executeRequest(req, handleFunc)
719 xapp.Logger.Info("response code = %v",response.Code)
720 checkResponseCode(t, http.StatusBadRequest, response.Code)
723 func TestDeleteAlarmDefinitions2(t *testing.T) {
724 xapp.Logger.Info("TestDeleteAlarmDefinitions2")
725 req, _ := http.NewRequest("GET", "/ric/v1/alarms/define", nil)
726 //Giving Wrong alarmId which can't convert into int
727 vars := map[string]string{"alarmId": "asdsc"}
728 req = mux.SetURLVars(req, vars)
729 handleFunc := http.HandlerFunc(alarmManager.DeleteAlarmDefinition)
730 response := executeRequest(req, handleFunc)
731 checkResponseCode(t, http.StatusBadRequest, response.Code)
734 func VerifyAlarm(t *testing.T, a alarm.Alarm, expectedCount int) string {
735 receivedAlert := waitForEvent()
737 assert.Equal(t, expectedCount, len(alarmManager.activeAlarms))
738 _, ok := alarmManager.IsMatchFound(a)
744 func VerifyAlert(t *testing.T, receivedAlert, expectedAlert string) {
745 receivedAlert = strings.Replace(fmt.Sprintf("%v", receivedAlert), "\r\n", " ", -1)
746 //assert.Equal(t, receivedAlert, e)
749 func CreatePromAlertSimulator(t *testing.T, method, url string, status int, respData interface{}) *httptest.Server {
750 l, err := net.Listen("tcp", "localhost:9093")
752 t.Error("Failed to create listener: " + err.Error())
754 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
755 assert.Equal(t, r.Method, method)
756 assert.Equal(t, r.URL.String(), url)
760 w.Header().Add("Content-Type", "application/json")
761 w.WriteHeader(status)
762 b, _ := json.Marshal(respData)
773 func CreatePromAlertSimulator2(t *testing.T, method, url string) *httptest.Server {
774 l, err := net.Listen("tcp", "localhost:9093")
776 t.Error("Failed to create listener: " + err.Error())
778 ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
779 assert.Equal(t, r.Method, method)
780 assert.Equal(t, r.URL.String(), url)
782 w.Header().Add("Content-Type", "application/json")
784 // Read alerts from file
785 payload, err := readJSONFromFile("../testresources/prometheus-alerts.json")
787 t.Error("Failed to send response: ", err)
789 _, err = w.Write(payload)
791 t.Error("Failed to send response: " + err.Error())
800 func waitForEvent() string {
801 receivedAlert := <-eventChan
805 func fireEvent(t *testing.T, body io.ReadCloser) {
806 reqBody, err := ioutil.ReadAll(body)
807 assert.Nil(t, err, "ioutil.ReadAll failed")
808 assert.NotNil(t, reqBody, "ioutil.ReadAll failed")
810 eventChan <- fmt.Sprintf("%s", reqBody)
813 func executeRequest(req *http.Request, handleR http.HandlerFunc) *httptest.ResponseRecorder {
814 rr := httptest.NewRecorder()
816 handleR.ServeHTTP(rr, req)
821 func checkResponseCode(t *testing.T, expected, actual int) bool {
822 if expected != actual {
823 t.Errorf("Expected response code %d. Got %d\n", expected, actual)
829 func ExecCLICommand(commandReady chan bool, command string, args ...string) {
831 xapp.Logger.Info("Giving CLI command")
832 cmd := exec.Command(command, args...)
834 output, err := cmd.CombinedOutput()
836 xapp.Logger.Info("CLI command failed out: %s", err)
838 xapp.Logger.Info("CLI command output: %s", output)
840 xapp.Logger.Info("CLI command completed")
844 func readJSONFromFile(filename string) ([]byte, error) {
845 file, err := ioutil.ReadFile(filename)
847 err := fmt.Errorf("readJSONFromFile() failed: Error: %v", err)