Change-Id: I3d407763112c7e809f501e7aa69278af40a18b15
Signed-off-by: Mohamed Abukar <abukar.mohamed@nokia.com>
SetVersion("1.0.0").
SetDescription("This CLI tool provides management interface to SEP alarm system")
SetVersion("1.0.0").
SetDescription("This CLI tool provides management interface to SEP alarm system")
+ registerActiveCmd(alarmManagerHost)
+ registerHistoryCmd(alarmManagerHost)
+ registerRaiseCmd(alarmManagerHost)
+ registerClearCmd(alarmManagerHost)
+ registerDefineCmd(alarmManagerHost)
+ registerUndefineCmd(alarmManagerHost)
+ registerConfigureCmd(alarmManagerHost)
+ registerPerfCmd(alarmManagerHost)
+ registerAlertCmd(alertManagerHost)
+
+ // parse command-line arguments
+ commando.Parse(nil)
+}
+
+func registerActiveCmd(alarmManagerHost string) {
commando.
Register("active").
SetShortDescription("Displays the SEP active alarms").
commando.
Register("active").
SetShortDescription("Displays the SEP active alarms").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlarms(getAlarms(flags, "active"), false)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlarms(getAlarms(flags, "active"), false)
})
+func registerHistoryCmd(alarmManagerHost string) {
// Get alarm history
commando.
Register("history").
// Get alarm history
commando.
Register("history").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlarms(getAlarms(flags, "history"), true)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlarms(getAlarms(flags, "history"), true)
})
+func registerRaiseCmd(alarmManagerHost string) {
// Raise an alarm
commando.
Register("raise").
// Raise an alarm
commando.
Register("raise").
postAlarm(flags, readAlarmParams(flags, false), alarm.AlarmActionRaise, nil)
})
postAlarm(flags, readAlarmParams(flags, false), alarm.AlarmActionRaise, nil)
})
+}
+
+func registerClearCmd(alarmManagerHost string) {
// Clear an alarm
commando.
Register("clear").
// Clear an alarm
commando.
Register("clear").
postAlarm(flags, readAlarmParams(flags, true), alarm.AlarmActionClear, nil)
})
postAlarm(flags, readAlarmParams(flags, true), alarm.AlarmActionClear, nil)
})
+}
+
+func registerConfigureCmd(alarmManagerHost string) {
// Configure an alarm manager
commando.
Register("configure").
// Configure an alarm manager
commando.
Register("configure").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
postAlarmConfig(flags)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
postAlarmConfig(flags)
})
+}
+
+func registerDefineCmd(alarmManagerHost string) {
// Create alarm definition
commando.
Register("define").
// Create alarm definition
commando.
Register("define").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
postAlarmDefinition(flags)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
postAlarmDefinition(flags)
})
- // Delete alarm definition
+}
+
+func registerUndefineCmd(alarmManagerHost string) {
+ // Delete alarm definition
commando.
Register("undefine").
SetShortDescription("Define alarm with given parameters").
commando.
Register("undefine").
SetShortDescription("Define alarm with given parameters").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
deleteAlarmDefinition(flags)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
deleteAlarmDefinition(flags)
})
- // Conduct performance test for alarm-go
+}
+
+func registerPerfCmd(alarmManagerHost string) {
+ // Conduct performance test for alarm-go
commando.
Register("perf").
SetShortDescription("Conduct performance test with given parameters").
commando.
Register("perf").
SetShortDescription("Conduct performance test with given parameters").
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
conductperformancetest(flags)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
conductperformancetest(flags)
})
+func registerAlertCmd(alertManagerHost string) {
// Get alerts from Prometheus Alert Manager
commando.
// Get alerts from Prometheus Alert Manager
commando.
SetShortDescription("Get alerts from Prometheus Alert Manager").
AddFlag("active", "Active alerts in Prometheus Alert Manager", commando.Bool, true).
AddFlag("inhibited", "Inhibited alerts in Prometheus Alert Manager", commando.Bool, true).
SetShortDescription("Get alerts from Prometheus Alert Manager").
AddFlag("active", "Active alerts in Prometheus Alert Manager", commando.Bool, true).
AddFlag("inhibited", "Inhibited alerts in Prometheus Alert Manager", commando.Bool, true).
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlerts(flags)
})
SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
displayAlerts(flags)
})
-
- // parse command-line arguments
- commando.Parse(nil)
}
func readAlarmParams(flags map[string]commando.FlagValue, clear bool) (a alarm.Alarm) {
}
func readAlarmParams(flags map[string]commando.FlagValue, clear bool) (a alarm.Alarm) {
} else {
fmt.Printf("ReadPerfAlarmDefinitionFromJson: ioutil.ReadFile failed with error: %v, filename: %s\n", err, filename)
fmt.Printf("ReadPerfAlarmDefinitionFromJson: current directory: %s\n", getCurrentDirectory())
} else {
fmt.Printf("ReadPerfAlarmDefinitionFromJson: ioutil.ReadFile failed with error: %v, filename: %s\n", err, filename)
fmt.Printf("ReadPerfAlarmDefinitionFromJson: current directory: %s\n", getCurrentDirectory())
fmt.Println(err)
}
return dir
fmt.Println(err)
}
return dir
-}
\ No newline at end of file
}
// Clear alarm if found from active alarm list
}
// Clear alarm if found from active alarm list
- if m.AlarmAction == alarm.AlarmActionClear {
- if !found {
- app.Logger.Info("No matching active alarm found, suppressing ...")
- a.mutex.Unlock()
- return nil, nil
- }
-
- if a.ProcessClearAlarm(m, alarmDef, idx) == false {
- return nil, nil
- }
-
- a.mutex.Unlock()
- if !a.postClear {
- app.Logger.Info("Sending clear notification disabled!")
- return nil, nil
- }
-
- // Send alarm notification to NOMA, if enabled
- if app.Config.GetBool("controls.noma.enabled") {
- m.PerceivedSeverity = alarm.SeverityCleared
- return a.PostAlarm(m)
- }
+ if found && m.AlarmAction == alarm.AlarmActionClear {
+ return a.ProcessClearAlarm(m, alarmDef, idx)
}
// New alarm -> update active alarms and post to Alert Manager
if m.AlarmAction == alarm.AlarmActionRaise {
}
// New alarm -> update active alarms and post to Alert Manager
if m.AlarmAction == alarm.AlarmActionRaise {
- if a.ProcessRaiseAlarm(m, alarmDef) == false {
- return nil, nil
- }
- // Send alarm notification to NOMA, if enabled
- if app.Config.GetBool("controls.noma.enabled") {
- return a.PostAlarm(m)
- }
- return a.PostAlert(a.GenerateAlertLabels(m.Alarm, AlertStatusActive, m.AlarmTime))
+ return a.ProcessRaiseAlarm(m, alarmDef)
}
a.mutex.Unlock()
return nil, nil
}
}
a.mutex.Unlock()
return nil, nil
}
-func (a *AlarmManager)ProcessRaiseAlarm(m *AlarmNotification, alarmDef *alarm.AlarmDefinition) bool {
+func (a *AlarmManager) ProcessRaiseAlarm(m *AlarmNotification, alarmDef *alarm.AlarmDefinition) (*alert.PostAlertsOK, error) {
app.Logger.Debug("Raise alarmDef.RaiseDelay = %v, AlarmNotification = %v", alarmDef.RaiseDelay, *m)
app.Logger.Debug("Raise alarmDef.RaiseDelay = %v, AlarmNotification = %v", alarmDef.RaiseDelay, *m)
// RaiseDelay > 0 in an alarm object in active alarm table indicates that raise delay is still ongoing for the alarm
m.AlarmDefinition.RaiseDelay = alarmDef.RaiseDelay
a.UpdateAlarmFields(a.GenerateAlarmId(), m)
a.UpdateActiveAlarmList(m)
a.mutex.Unlock()
// RaiseDelay > 0 in an alarm object in active alarm table indicates that raise delay is still ongoing for the alarm
m.AlarmDefinition.RaiseDelay = alarmDef.RaiseDelay
a.UpdateAlarmFields(a.GenerateAlarmId(), m)
a.UpdateActiveAlarmList(m)
a.mutex.Unlock()
if alarmDef.RaiseDelay > 0 {
timerDelay(alarmDef.RaiseDelay)
a.mutex.Lock()
if alarmDef.RaiseDelay > 0 {
timerDelay(alarmDef.RaiseDelay)
a.mutex.Lock()
} else {
app.Logger.Debug("Alarm deleted during raise delay. AlarmNotification = %v", *m)
a.mutex.Unlock()
} else {
app.Logger.Debug("Alarm deleted during raise delay. AlarmNotification = %v", *m)
a.mutex.Unlock()
m.AlarmDefinition.RaiseDelay = 0
a.UpdateAlarmHistoryList(m)
m.AlarmDefinition.RaiseDelay = 0
a.UpdateAlarmHistoryList(m)
- a.WriteAlarmInfoToPersistentVolume()
- return true
+ a.WriteAlarmInfoToPersistentVolume()
+
+ // Send alarm notification to NOMA, if enabled
+ if app.Config.GetBool("controls.noma.enabled") {
+ return a.PostAlarm(m)
+ }
+ return a.PostAlert(a.GenerateAlertLabels(m.Alarm, AlertStatusActive, m.AlarmTime))
-func (a *AlarmManager)ProcessClearAlarm(m *AlarmNotification, alarmDef *alarm.AlarmDefinition, idx int) bool {
+func (a *AlarmManager) ProcessClearAlarm(m *AlarmNotification, alarmDef *alarm.AlarmDefinition, idx int) (*alert.PostAlertsOK, error) {
app.Logger.Debug("Clear alarmDef.ClearDelay = %v, AlarmNotification = %v", alarmDef.ClearDelay, *m)
if alarmDef.ClearDelay > 0 {
a.mutex.Unlock()
app.Logger.Debug("Clear alarmDef.ClearDelay = %v, AlarmNotification = %v", alarmDef.ClearDelay, *m)
if alarmDef.ClearDelay > 0 {
a.mutex.Unlock()
var found bool
idx, found = a.IsMatchFound(m.Alarm)
if !found {
var found bool
idx, found = a.IsMatchFound(m.Alarm)
if !found {
- app.Logger.Debug("Alarm not anymore in the active alarms table. AlarmNotification = %v", *m)
}
}
a.UpdateAlarmFields(a.activeAlarms[idx].AlarmId, m)
}
}
a.UpdateAlarmFields(a.activeAlarms[idx].AlarmId, m)
if a.exceededAlarmHistoryOn && m.Alarm.SpecificProblem == alarm.ALARM_HISTORY_EXCEED_MAX_THRESHOLD {
a.exceededAlarmHistoryOn = false
}
if a.exceededAlarmHistoryOn && m.Alarm.SpecificProblem == alarm.ALARM_HISTORY_EXCEED_MAX_THRESHOLD {
a.exceededAlarmHistoryOn = false
}
- a.WriteAlarmInfoToPersistentVolume()
- return true
+ a.WriteAlarmInfoToPersistentVolume()
+
+ a.mutex.Unlock()
+ if a.postClear && app.Config.GetBool("controls.noma.enabled") {
+ m.PerceivedSeverity = alarm.SeverityCleared
+ return a.PostAlarm(m)
+ }
+ return nil, nil
}
func timerDelay(delay int) {
}
func timerDelay(delay int) {
ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
defer ts.Close()
ts := CreatePromAlertSimulator(t, "POST", "/api/v2/alerts", http.StatusOK, models.LabelSet{})
defer ts.Close()
- // Raise alarm. Posting alert and updating alarm history should be delayed
+ // Raise alarm. Posting alert and updating alarm history should be delayed
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
- VerifyAlarm(t, a, activeAlarmsBeforeTest + 1)
+ VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
// Clear the alarm and check the alarm is removed. Posting alert clear and updating alarm history should be delayed
assert.Nil(t, alarmer.Clear(a), "clear failed")
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
// Clear the alarm and check the alarm is removed. Posting alert clear and updating alarm history should be delayed
assert.Nil(t, alarmer.Clear(a), "clear failed")
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
- assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest + 2)
+ assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+2)
}
func TestDelayedAlarmRaiseAndClear2(t *testing.T) {
}
func TestDelayedAlarmRaiseAndClear2(t *testing.T) {
// Raise two alarms. The first should be delayed
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
// Raise two alarms. The first should be delayed
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
- VerifyAlarm(t, a, activeAlarmsBeforeTest + 1)
+ VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
b := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(b), "raise failed")
b := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(b), "raise failed")
- VerifyAlarm(t, b, activeAlarmsBeforeTest + 2)
+ VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
// Clear two alarms. The first should be delayed. Check the alarms are removed
assert.Nil(t, alarmer.Clear(a), "clear failed")
// Clear two alarms. The first should be delayed. Check the alarms are removed
assert.Nil(t, alarmer.Clear(a), "clear failed")
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
- assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest + 4)
+ assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
}
func TestDelayedAlarmRaiseAndClear3(t *testing.T) {
}
func TestDelayedAlarmRaiseAndClear3(t *testing.T) {
// Raise two alarms. The first should be delayed
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
// Raise two alarms. The first should be delayed
a := alarmer.NewAlarm(9999, alarm.SeverityCritical, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(a), "raise failed")
- VerifyAlarm(t, a, activeAlarmsBeforeTest + 1)
+ VerifyAlarm(t, a, activeAlarmsBeforeTest+1)
b := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(b), "raise failed")
b := alarmer.NewAlarm(alarm.RIC_RT_DISTRIBUTION_FAILED, alarm.SeverityMajor, "Some App data", "eth 0 1")
assert.Nil(t, alarmer.Raise(b), "raise failed")
- VerifyAlarm(t, b, activeAlarmsBeforeTest + 2)
+ VerifyAlarm(t, b, activeAlarmsBeforeTest+2)
// Clear two alarms. The first should be delayed. Check the alarms are removed
assert.Nil(t, alarmer.Clear(a), "clear failed")
// Clear two alarms. The first should be delayed. Check the alarms are removed
assert.Nil(t, alarmer.Clear(a), "clear failed")
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
time.Sleep(time.Duration(2) * time.Second)
assert.Equal(t, len(alarmManager.activeAlarms), activeAlarmsBeforeTest)
- assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest + 4)
+ assert.Equal(t, len(alarmManager.alarmHistory), alarmHistoryBeforeTest+4)
}
func VerifyAlarm(t *testing.T, a alarm.Alarm, expectedCount int) string {
}
func VerifyAlarm(t *testing.T, a alarm.Alarm, expectedCount int) string {