A local user interface (CLI) for alarm system
[ric-plt/alarm-go.git] / cli / alarm-cli.go
1 package main
2
3 import (
4         "bytes"
5         "encoding/json"
6         "fmt"
7         "github.com/jedib0t/go-pretty/table"
8         "github.com/thatisuday/commando"
9         "io/ioutil"
10         "net/http"
11         "os"
12         "time"
13
14         "gerrit.o-ran-sc.org/r/ric-plt/alarm-go/alarm"
15 )
16
17 func main() {
18
19         // configure commando
20         commando.
21                 SetExecutableName("alarm-cli").
22                 SetVersion("1.0.0").
23                 SetDescription("This CLI tool provides management interface to SEP alarm system")
24
25         // Get active alarms
26         commando.
27                 Register("active").
28                 SetShortDescription("Displays the SEP active alarms").
29                 SetDescription("This command displays more information about the SEP active alarms").
30                 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
31                 AddFlag("port", "Alarm manager host address", commando.String, "8080").
32                 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
33                         displayAlarms(getAlarms(flags, "active"), false)
34                 })
35
36         // Get alarm history
37         commando.
38                 Register("history").
39                 SetShortDescription("Displays the SEP alarm history").
40                 SetDescription("This command displays more information about the SEP alarm history").
41                 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
42                 AddFlag("port", "Alarm manager host address", commando.String, "8080").
43                 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
44                         displayAlarms(getAlarms(flags, "history"), true)
45                 })
46
47         // Raise an alarm
48         commando.
49                 Register("raise").
50                 SetShortDescription("Raises alarm with given parameters").
51                 AddFlag("moid", "Managed object Id", commando.String, nil).
52                 AddFlag("apid", "Application Id", commando.String, nil).
53                 AddFlag("sp", "Specific problem Id", commando.Int, nil).
54                 AddFlag("severity", "Perceived severity", commando.String, nil).
55                 AddFlag("iinfo", "Application identifying info", commando.String, nil).
56                 AddFlag("aai", "Application additional info", commando.String, "-").
57                 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
58                 AddFlag("port", "Alarm manager host address", commando.String, "8080").
59                 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
60                         postAlarm(flags, readAlarmParams(flags, false), alarm.AlarmActionRaise)
61                 })
62
63         // Clear an alarm
64         commando.
65                 Register("clear").
66                 SetShortDescription("Raises alarm with given parameters").
67                 AddFlag("moid", "Managed object Id", commando.String, nil).
68                 AddFlag("apid", "Application Id", commando.String, nil).
69                 AddFlag("sp", "Specific problem Id", commando.Int, nil).
70                 AddFlag("iinfo", "Application identifying info", commando.String, nil).
71                 AddFlag("host", "Alarm manager host address", commando.String, "localhost").
72                 AddFlag("port", "Alarm manager host address", commando.String, "8080").
73                 SetAction(func(args map[string]commando.ArgValue, flags map[string]commando.FlagValue) {
74                         postAlarm(flags, readAlarmParams(flags, true), alarm.AlarmActionClear)
75                 })
76
77         // parse command-line arguments
78         commando.Parse(nil)
79 }
80
81 func readAlarmParams(flags map[string]commando.FlagValue, clear bool) (a alarm.Alarm) {
82         a.ManagedObjectId, _ = flags["moid"].GetString()
83         a.ApplicationId, _ = flags["apid"].GetString()
84         a.SpecificProblem, _ = flags["sp"].GetInt()
85         a.IdentifyingInfo, _ = flags["iinfo"].GetString()
86
87         if !clear {
88                 s, _ := flags["severity"].GetString()
89                 a.PerceivedSeverity = alarm.Severity(s)
90         }
91
92         if !clear {
93                 a.AdditionalInfo, _ = flags["aai"].GetString()
94         }
95
96         return
97 }
98
99 func getAlarms(flags map[string]commando.FlagValue, action alarm.AlarmAction) (alarms []alarm.AlarmMessage) {
100         host, _ := flags["host"].GetString()
101         port, _ := flags["port"].GetString()
102         targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms/%s", host, port, action)
103         resp, err := http.Get(targetUrl)
104         if err != nil || resp == nil || resp.Body == nil {
105                 fmt.Println("Couldn't fetch active alarm list due to error: %v", err)
106                 return alarms
107         }
108
109         defer resp.Body.Close()
110
111         body, err := ioutil.ReadAll(resp.Body)
112         if err != nil {
113                 fmt.Println("ioutil.ReadAll failed: %v", err)
114                 return alarms
115         }
116
117         json.Unmarshal([]byte(body), &alarms)
118         fmt.Println(alarms)
119         return alarms
120 }
121
122 func postAlarm(flags map[string]commando.FlagValue, a alarm.Alarm, action alarm.AlarmAction) {
123         host, _ := flags["host"].GetString()
124         port, _ := flags["port"].GetString()
125         targetUrl := fmt.Sprintf("http://%s:%s/ric/v1/alarms", host, port)
126
127         m := alarm.AlarmMessage{Alarm: a, AlarmAction: action}
128         jsonData, err := json.Marshal(m)
129         if err != nil {
130                 fmt.Println("json.Marshal failed: %v", err)
131                 return
132         }
133
134         resp, err := http.Post(targetUrl, "application/json", bytes.NewBuffer(jsonData))
135         if err != nil || resp == nil {
136                 fmt.Println("Couldn't fetch active alarm list due to error: %v", err)
137                 return
138         }
139 }
140
141 func displayAlarms(alarms []alarm.AlarmMessage, isHistory bool) {
142         t := table.NewWriter()
143         t.SetOutputMirror(os.Stdout)
144         if isHistory {
145                 t.AppendHeader(table.Row{"SP", "MOID", "APPID", "IINFO", "SEVERITY", "AAI", "TIME", "ACTION"})
146         } else {
147                 t.AppendHeader(table.Row{"SP", "MOID", "APPID", "IINFO", "SEVERITY", "AAI", "TIME"})
148         }
149
150         for _, a := range alarms {
151                 alarmTime := time.Unix(0, a.AlarmTime).Format("02/01/2006, 15:04:05")
152                 if isHistory {
153                         t.AppendRows([]table.Row{
154                                 {a.SpecificProblem, a.ManagedObjectId, a.ApplicationId, a.IdentifyingInfo, a.PerceivedSeverity, a.AdditionalInfo, alarmTime, a.AlarmAction},
155                         })
156                 } else {
157                         t.AppendRows([]table.Row{
158                                 {a.SpecificProblem, a.ManagedObjectId, a.ApplicationId, a.IdentifyingInfo, a.PerceivedSeverity, a.AdditionalInfo, alarmTime},
159                         })
160                 }
161         }
162
163         t.SetStyle(table.StyleColoredBright)
164         t.Render()
165 }