13 "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
14 "github.com/jedib0t/go-pretty/table"
15 "github.com/thatisuday/commando"
18 type CliAlarmDefinitions struct {
19 AlarmDefinitions []*alarm.AlarmDefinition `json:"alarmdefinitions"`
22 type AlarmClient struct {
23 alarmer *alarm.RICAlarm
30 SetExecutableName("alarm-cli").
32 SetDescription("This CLI tool provides management interface to SEP alarm system")
37 SetShortDescription("Displays the SEP active alarms").
38 SetDescription("This command displays more information about the SEP active alarms").
39 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
40 AddFlag("port", "Alarm manager host address", commando.String, "8080").
41 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
42 displayAlarms(getAlarms(flags, "active"), false)
48 SetShortDescription("Displays the SEP alarm history").
49 SetDescription("This command displays more information about the SEP alarm history").
50 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
51 AddFlag("port", "Alarm manager host address", commando.String, "8080").
52 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
53 displayAlarms(getAlarms(flags, "history"), true)
59 SetShortDescription("Raises alarm with given parameters").
60 AddFlag("moid", "Managed object Id", commando.String, nil).
61 AddFlag("apid", "Application Id", commando.String, nil).
62 AddFlag("sp", "Specific problem Id", commando.Int, nil).
63 AddFlag("severity", "Perceived severity", commando.String, nil).
64 AddFlag("iinfo", "Application identifying info", commando.String, nil).
65 AddFlag("aai", "Application additional info", commando.String, "-").
66 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
67 AddFlag("port", "Alarm manager host address", commando.String, "8080").
68 AddFlag("if", "http or rmr used as interface", commando.String, "http").
69 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
70 postAlarm(flags, readAlarmParams(flags, false), alarm.AlarmActionRaise)
76 SetShortDescription("Raises alarm with given parameters").
77 AddFlag("moid", "Managed object Id", commando.String, nil).
78 AddFlag("apid", "Application Id", commando.String, nil).
79 AddFlag("sp", "Specific problem Id", commando.Int, nil).
80 AddFlag("iinfo", "Application identifying info", commando.String, nil).
81 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
82 AddFlag("port", "Alarm manager host address", commando.String, "8080").
83 AddFlag("if", "http or rmr used as interface", commando.String, "http").
84 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
85 postAlarm(flags, readAlarmParams(flags, true), alarm.AlarmActionClear)
88 // Configure an alarm manager
90 Register("configure").
91 SetShortDescription("Configure alarm manager with given parameters").
92 AddFlag("mal", "max active alarms", commando.Int, nil).
93 AddFlag("mah", "max alarm history", commando.Int, nil).
94 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
95 AddFlag("port", "Alarm manager host address", commando.String, "8080").
96 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
97 postAlarmConfig(flags)
99 // Create alarm definition
102 SetShortDescription("Define alarm with given parameters").
103 AddFlag("aid", "alarm identifier", commando.Int, nil).
104 AddFlag("atx", "alarm text", commando.String, nil).
105 AddFlag("ety", "event type", commando.String, nil).
106 AddFlag("oin", "operation instructions", commando.String, nil).
107 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
108 AddFlag("port", "Alarm manager host address", commando.String, "8080").
109 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
110 postAlarmDefinition(flags)
112 // Delete alarm definition
114 Register("undefine").
115 SetShortDescription("Define alarm with given parameters").
116 AddFlag("aid", "alarm identifier", commando.Int, nil).
117 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
118 AddFlag("port", "Alarm manager host address", commando.String, "8080").
119 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
120 deleteAlarmDefinition(flags)
123 // parse command-line arguments
127 func readAlarmParams(flags map[string]commando.FlagValue, clear bool) (a alarm.Alarm) {
128 a.ManagedObjectId, _ = flags["moid"].GetString()
129 a.ApplicationId, _ = flags["apid"].GetString()
130 a.SpecificProblem, _ = flags["sp"].GetInt()
131 a.IdentifyingInfo, _ = flags["iinfo"].GetString()
134 s, _ := flags["severity"].GetString()
135 a.PerceivedSeverity = alarm.Severity(s)
139 a.AdditionalInfo, _ = flags["aai"].GetString()
144 func getAlarms(flags map[string]commando.FlagValue, action alarm.AlarmAction) (alarms []alarm.AlarmMessage) {
145 host, _ := flags["host"].GetString()
146 port, _ := flags["port"].GetString()
147 targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/%s", host, port, action)
148 resp, err := http.Get(targetUrl)
149 if err != nil || resp == nil || resp.Body == nil {
150 fmt.Println("Couldn't fetch active alarm list due to error: %v", err)
154 defer resp.Body.Close()
156 body, err := ioutil.ReadAll(resp.Body)
158 fmt.Println("ioutil.ReadAll failed: %v", err)
162 json.Unmarshal([]byte(body), &alarms)
166 func postAlarm(flags map[string]commando.FlagValue, a alarm.Alarm, action alarm.AlarmAction) {
168 // Check the interface to be used for raise or clear the alarm
169 rmr_or_http, _ := flags["if"].GetString()
170 if rmr_or_http == "rmr" {
171 alarmClient := NewAlarmClient("my-pod", "my-app")
172 if alarmClient == nil {
176 // Wait until RMR is up-and-running
177 for !alarmClient.alarmer.IsRMRReady() {
178 time.Sleep(100 * time.Millisecond)
181 if action == alarm.AlarmActionRaise {
182 alarmClient.alarmer.Raise(a)
185 if action == alarm.AlarmActionClear {
186 alarmClient.alarmer.Clear(a)
191 host, _ := flags["host"].GetString()
192 port, _ := flags["port"].GetString()
193 targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms", host, port)
195 m := alarm.AlarmMessage{Alarm: a, AlarmAction: action}
196 jsonData, err := json.Marshal(m)
198 fmt.Println("json.Marshal failed: %v", err)
202 resp, err := http.Post(targetUrl, "application/json", bytes.NewBuffer(jsonData))
203 if err != nil || resp == nil {
204 fmt.Println("Couldn't fetch active alarm list due to error: %v", err)
209 func displayAlarms(alarms []alarm.AlarmMessage, isHistory bool) {
210 t := table.NewWriter()
211 t.SetOutputMirror(os.Stdout)
213 t.AppendHeader(table.Row{"SP", "MOID", "APPID", "IINFO", "SEVERITY", "AAI", "ACTION", "TIME"})
215 t.AppendHeader(table.Row{"SP", "MOID", "APPID", "IINFO", "SEVERITY", "AAI", "TIME"})
218 for _, a := range alarms {
219 alarmTime := time.Unix(0, a.AlarmTime).Format("02/01/2006, 15:04:05")
221 t.AppendRows([]table.Row{
222 {a.SpecificProblem, a.ManagedObjectId, a.ApplicationId, a.IdentifyingInfo, a.PerceivedSeverity, a.AdditionalInfo, a.AlarmAction, alarmTime},
225 t.AppendRows([]table.Row{
226 {a.SpecificProblem, a.ManagedObjectId, a.ApplicationId, a.IdentifyingInfo, a.PerceivedSeverity, a.AdditionalInfo, alarmTime},
231 t.SetStyle(table.StyleColoredBright)
235 func postAlarmConfig(flags map[string]commando.FlagValue) {
236 host, _ := flags["host"].GetString()
237 port, _ := flags["port"].GetString()
238 maxactivealarms, _ := flags["mal"].GetInt()
239 maxalarmhistory, _ := flags["mah"].GetInt()
240 targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/config", host, port)
242 m := alarm.AlarmConfigParams{MaxActiveAlarms: maxactivealarms, MaxAlarmHistory: maxalarmhistory}
243 jsonData, err := json.Marshal(m)
245 fmt.Println("json.Marshal failed: %v", err)
249 resp, err := http.Post(targetUrl, "application/json", bytes.NewBuffer(jsonData))
250 if err != nil || resp == nil {
251 fmt.Println("Couldn't fetch post alarm configuration due to error: %v", err)
256 func postAlarmDefinition(flags map[string]commando.FlagValue) {
257 host, _ := flags["host"].GetString()
258 port, _ := flags["port"].GetString()
259 alarmid, _ := flags["aid"].GetInt()
260 alarmtxt, _ := flags["atx"].GetString()
261 etype, _ := flags["ety"].GetString()
262 operation, _ := flags["oin"].GetString()
263 targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/define", host, port)
265 var alarmdefinition alarm.AlarmDefinition
266 alarmdefinition.AlarmId = alarmid
267 alarmdefinition.AlarmText = alarmtxt
268 alarmdefinition.EventType = etype
269 alarmdefinition.OperationInstructions = operation
271 m := CliAlarmDefinitions{AlarmDefinitions: []*alarm.AlarmDefinition{&alarmdefinition}}
272 jsonData, err := json.Marshal(m)
274 fmt.Println("json.Marshal failed: %v", err)
278 resp, err := http.Post(targetUrl, "application/json", bytes.NewBuffer(jsonData))
279 if err != nil || resp == nil {
280 fmt.Println("Couldn't post alarm definition due to error: %v", err)
285 func deleteAlarmDefinition(flags map[string]commando.FlagValue) {
286 host, _ := flags["host"].GetString()
287 port, _ := flags["port"].GetString()
288 alarmid, _ := flags["aid"].GetInt()
289 salarmid := strconv.FormatUint(uint64(alarmid), 10)
290 targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/define/%s", host, port, salarmid)
292 client := &http.Client{}
293 req, err := http.NewRequest("DELETE", targetUrl, nil)
294 if err != nil || req == nil {
295 fmt.Println("Couldn't make delete request due to error: %v", err)
298 resp, errr := client.Do(req)
299 if errr != nil || resp == nil {
300 fmt.Println("Couldn't send delete request due to error: %v", err)
305 // NewAlarmClient returns a new AlarmClient.
306 func NewAlarmClient(moId, appId string) *AlarmClient {
307 alarmInstance, err := alarm.InitAlarm(moId, appId)
310 alarmer: alarmInstance,
313 fmt.Println("Failed to create alarmInstance", err)