[AETHER-2442]: Add fetching dongle stats in monitoring agent

Change-Id: I0b43652be971c4a12ee228cefcf864d77751ed0c
diff --git a/edge-monitoring-server/edge_monitoring_server.py b/edge-monitoring-server/edge_monitoring_server.py
index 0110e34..3fd0212 100755
--- a/edge-monitoring-server/edge_monitoring_server.py
+++ b/edge-monitoring-server/edge_monitoring_server.py
@@ -55,6 +55,28 @@
             },
             "required": ["control_plane", "user_plane"]
         },
+        "dongle_stats": {
+            "type": "object",
+            "properties": {
+                "SuccessfulFetch": {"type": "boolean"},
+                "MAC": {"type": "string"},
+                "PLMNStatus": {"type": "string"},
+                "UICCStatus": {"type": "string"},
+                "IMEI": {"type": "string"},
+                "IMSI": {"type": "string"},
+                "PLMNSelected": {"type": "string"},
+                "MCC": {"type": "string"},
+                "MNC": {"type": "string"},
+                "PhyCellID": {"type": "string"},
+                "CellGlobalID": {"type": "string"},
+                "Band": {"type": "string"},
+                "EARFCN": {"type": "string"},
+                "BandWidth": {"type": "string"},
+                "ServCellState": {"type": "string"},
+                "Connection": {"type": "string"},
+                "IPv4Addr": {"type": "string"}
+            }
+        },
         "speedtest": {
             "type": "object",
             "properties": {
@@ -149,6 +171,9 @@
             'control_plane': 'connected',
             'user_plane': 'connected'
         },
+        'dongle_stats': {
+            'SuccessfulFetch' : False
+        },
         'speedtest': {
             'ping': {
                 'dry_run': {
@@ -226,6 +251,11 @@
 ping_test_ok = prom.Gauge("aetheredge_ping_test_ok", "Last ping test passed", ["name"])
 e2e_tests_down = prom.Gauge("aetheredge_e2e_tests_down", "E2E tests not reporting", ["name"])
 
+# Dongle Stats (strings can't be stored in Prometheus)
+dongle_stats_imsi = prom.Gauge("aetheredge_dongle_stats_imsi", "IMSI of the UE", ["name"])
+dongle_stats_cellglobalid = prom.Gauge("aetheredge_dongle_stats_cellglobalid", "CellGlobalID of the UE", ["name", "value"])
+dongle_stats_plmnstatus = prom.Gauge("aetheredge_dongle_stats_plmnstatus", "PLMNStatus of the UE", ["name", "value"])
+
 # Ping dry_run metrics
 ping_dry_run_transmitted = prom.Gauge("aetheredge_ping_dry_run_test_transmitted","Last ping test to dry_run number of transmitted packets",["name"])
 ping_dry_run_received = prom.Gauge("aetheredge_ping_dry_run_test_received","Last ping test to dry_run number of received packets",["name"])
@@ -329,6 +359,7 @@
         if time_elapsed > NO_RESULT_THRESHOLD:
             edge['status']['control_plane'] = "no result"
             edge['status']['user_plane'] = "no result"
+            edge['dongle_stats'] = {'SuccessfulFetch' : False}
             edge['speedtest']['ping']['dry_run'] = {'transmitted': 0,
                                                     'received': 0,
                                                     'median': 0.0,
@@ -377,6 +408,13 @@
         pass
 
     try:
+        dongle_stats_imsi.remove(name)
+        dongle_stats_cellglobalid.clear()
+        dongle_stats_plmnstatus.clear()
+    except:
+        pass
+
+    try:
         ping_dry_run_min.remove(name)
         ping_dry_run_avg.remove(name)
         ping_dry_run_max.remove(name)
@@ -448,6 +486,13 @@
         connect_status = edge['status']['control_plane']
         ping_status = edge['status']['user_plane']
 
+        try:
+            dongle_stats_imsi.labels(edge['name']).set(float(edge['dongle_stats']['IMSI']))
+            dongle_stats_cellglobalid.labels(name=edge['name'], value=edge['dongle_stats']['CellGlobalID']).set(0)
+            dongle_stats_plmnstatus.labels(name=edge['name'], value=edge['dongle_stats']['PLMNStatus']).set(0)
+        except KeyError:
+            pass
+
         # Add ping dry_run latency results if available
         try:
             if edge['speedtest']['ping']['dry_run']['avg']:
@@ -537,6 +582,10 @@
     res.append(prom.generate_latest(cp_status))
     res.append(prom.generate_latest(up_status))
 
+    res.append(prom.generate_latest(dongle_stats_imsi))
+    res.append(prom.generate_latest(dongle_stats_cellglobalid))
+    res.append(prom.generate_latest(dongle_stats_plmnstatus))
+
     res.append(prom.generate_latest(ping_dry_run_min))
     res.append(prom.generate_latest(ping_dry_run_avg))
     res.append(prom.generate_latest(ping_dry_run_max))
@@ -618,6 +667,9 @@
             'control_plane': request.json['status']['control_plane'],
             'user_plane': request.json['status']['user_plane']
         },
+        'dongle_stats': {
+            'SuccessfulFetch' : False
+        },
         'speedtest': {
             'ping': {
                 'dry_run': {
@@ -676,6 +728,9 @@
     if 'signal_quality' in request.json:
         req_edge['signal_quality'] = request.json['signal_quality']
 
+    if 'dongle_stats' in request.json:
+        req_edge['dongle_stats'] = request.json['dongle_stats']
+
     edge = [edge for edge in edges if edge['name'] == req_edge['name']]
     if len(edge) == 0:
         app.logger.info("new edge request " + req_edge['name'])
@@ -685,6 +740,7 @@
         edge[0]['status']['user_plane'] = req_edge['status']['user_plane']
         edge[0]['speedtest']['ping'] = req_edge['speedtest']['ping']
         edge[0]['speedtest']['iperf'] = req_edge['speedtest']['iperf']
+        edge[0]['dongle_stats'] = req_edge['dongle_stats']
         if 'signal_quality' in req_edge.keys():
             edge[0]['signal_quality'] = req_edge['signal_quality']
         edge[0]['last_update'] = req_edge['last_update']