Rename AlarmAdapter to AlarmManager
Change-Id: I1d1443456d724316a07021443d13270feadd976d
Signed-off-by: Abukar Mohamed <abukar.mohamed@nokia.com>
diff --git a/manager/cmd/manager_test.go b/manager/cmd/manager_test.go
new file mode 100755
index 0000000..c048f4b
--- /dev/null
+++ b/manager/cmd/manager_test.go
@@ -0,0 +1,206 @@
+/*
+ * Copyright (c) 2020 AT&T Intellectual Property.
+ * Copyright (c) 2020 Nokia.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * This source code is part of the near-RT RIC (RAN Intelligent Controller)
+ * platform project (RICP).
+ */
+
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "github.com/stretchr/testify/assert"
+ "io"
+ "io/ioutil"
+ "net"
+ "net/http"
+ "net/http/httptest"
+ "os"
+ "strings"
+ "testing"
+ "time"
+
+ "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
+ "gerrit.o-ran-sc.org/r/ric-plt/xapp-frame/pkg/xapp"
+ "github.com/prometheus/alertmanager/api/v2/models"
+)
+
+var alarmManager *AlarmManager
+var alarmer *alarm.RICAlarm
+var eventChan chan string
+
+// Test cases
+func TestMain(M *testing.M) {
+ os.Setenv("ALARM_IF_RMR", "true")
+ alarmManager = NewAlarmManager("localhost:9093", 500)
+ go alarmManager.Run(false)
+ time.Sleep(time.Duration(2) * time.Second)
+
+ // Wait until RMR is up-and-running
+ for !xapp.Rmr.IsReady() {
+ time.Sleep(time.Duration(1) * time.Second)
+ }
+
+ alarmer, _ = alarm.InitAlarm("my-pod", "my-app")
+ time.Sleep(time.Duration(5) * time.Second)
+ eventChan = make(chan string)
+
+ os.Exit(M.Run())
+}
+
+func TestNewAlarmStoredAndPostedSucess(t *testing.T) {
+ ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
+ defer ts.Close()
+
+ a := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityCritical, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+
+ VerifyAlarm(t, a, 1)
+}
+
+func TestAlarmClearedSucess(t *testing.T) {
+ ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
+ defer ts.Close()
+
+ // Raise the alarm
+ a := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityCritical, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+
+ VerifyAlarm(t, a, 1)
+
+ // Now Clear the alarm and check alarm is removed
+ a = alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityCritical, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Clear(a), "clear failed")
+
+ time.Sleep(time.Duration(2) * time.Second)
+ assert.Equal(t, len(alarmManager.activeAlarms), 0)
+}
+
+func TestMultipleAlarmsRaisedSucess(t *testing.T) {
+ ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
+ defer ts.Close()
+
+ // Raise two alarms
+ a := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+
+ b := alarmer.NewAlarm(alarm.TCP_CONNECTIVITY_LOST_TO_DBAAS, alarm.SeverityMinor, "Hello", "abcd 11")
+ assert.Nil(t, alarmer.Raise(b), "raise failed")
+
+ VerifyAlarm(t, a, 2)
+ VerifyAlarm(t, b, 2)
+}
+
+func TestMultipleAlarmsClearedSucess(t *testing.T) {
+ ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
+ defer ts.Close()
+
+ // Raise two alarms
+ a := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Clear(a), "clear failed")
+
+ b := alarmer.NewAlarm(alarm.TCP_CONNECTIVITY_LOST_TO_DBAAS, alarm.SeverityMinor, "Hello", "abcd 11")
+ assert.Nil(t, alarmer.Clear(b), "clear failed")
+
+ time.Sleep(time.Duration(2) * time.Second)
+ assert.Equal(t, len(alarmManager.activeAlarms), 0)
+}
+
+func TestAlarmsSuppresedSucess(t *testing.T) {
+ ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
+ defer ts.Close()
+
+ // Raise two similar/matching alarms ... the second one suppresed
+ a := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+
+ VerifyAlarm(t, a, 1)
+}
+
+func TestInvalidAlarms(t *testing.T) {
+ a := alarmer.NewAlarm(1111, alarm.SeverityMajor, "Some App data", "eth 0 1")
+ assert.Nil(t, alarmer.Raise(a), "raise failed")
+ time.Sleep(time.Duration(2) * time.Second)
+}
+
+func TestAlarmHandlingErrorCases(t *testing.T) {
+ ok, err := alarmManager.HandleAlarms(&xapp.RMRParams{})
+ assert.Equal(t, err.Error(), "unexpected end of JSON input")
+ assert.Nil(t, ok, "raise failed")
+}
+
+func TestConsumeUnknownMessage(t *testing.T) {
+ err := alarmManager.Consume(&xapp.RMRParams{})
+ assert.Nil(t, err, "raise failed")
+}
+
+func TestStatusCallback(t *testing.T) {
+ assert.Equal(t, true, alarmManager.StatusCB())
+}
+
+func VerifyAlarm(t *testing.T, a alarm.Alarm, expectedCount int) string {
+ receivedAlert := waitForEvent()
+
+ assert.Equal(t, len(alarmManager.activeAlarms), expectedCount)
+ _, ok := alarmManager.IsMatchFound(a)
+ assert.True(t, ok)
+
+ return receivedAlert
+}
+
+func VerifyAlert(t *testing.T, receivedAlert, expectedAlert string) {
+ receivedAlert = strings.Replace(fmt.Sprintf("%v", receivedAlert), "\r\n", " ", -1)
+ //assert.Equal(t, receivedAlert, e)
+}
+
+func CreatePromAlertSimulator(t *testing.T, method, url string, status int, respData interface{}) *httptest.Server {
+ l, err := net.Listen("tcp", "localhost:9093")
+ if err != nil {
+ t.Error("Failed to create listener: " + err.Error())
+ }
+ ts := httptest.NewUnstartedServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+ assert.Equal(t, r.Method, method)
+ assert.Equal(t, r.URL.String(), url)
+
+ fireEvent(t, r.Body)
+
+ w.Header().Add("Content-Type", "application/json")
+ w.WriteHeader(status)
+ b, _ := json.Marshal(respData)
+ w.Write(b)
+ }))
+ ts.Listener.Close()
+ ts.Listener = l
+
+ ts.Start()
+
+ return ts
+}
+
+func waitForEvent() string {
+ receivedAlert := <-eventChan
+ return receivedAlert
+}
+
+func fireEvent(t *testing.T, body io.ReadCloser) {
+ reqBody, err := ioutil.ReadAll(body)
+ assert.Nil(t, err, "ioutil.ReadAll failed")
+ assert.NotNil(t, reqBody, "ioutil.ReadAll failed")
+
+ eventChan <- fmt.Sprintf("%s", reqBody)
+}