[AETHER-1472]: Add iperf downlink+uplink test to edge monitoring server

Change-Id: Ic91714e240268d31229cc9d7ec769e72715a40bb
diff --git a/edge-monitoring/edge_monitoring_server.py b/edge-monitoring/edge_monitoring_server.py
index 16bfe9e..30613fe 100755
--- a/edge-monitoring/edge_monitoring_server.py
+++ b/edge-monitoring/edge_monitoring_server.py
@@ -39,6 +39,12 @@
                     'max': 0.0,
                     'stddev': 0.0
                 }
+            },
+            'iperf': {
+                'cluster': {
+                    'downlink': 0.0,
+                    'uplink': 0.0
+                }
             }
         },
         'signal_quality': {
@@ -72,12 +78,16 @@
 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"])
 
-# Speedtest metrics
+# Speedtest ping metrics
 ping_dns_min = prom.Gauge("aetheredge_ping_dns_test_min","Last ping test minimum value",["name"])
 ping_dns_avg = prom.Gauge("aetheredge_ping_dns_test_avg","Last ping test average",["name"])
 ping_dns_max = prom.Gauge("aetheredge_ping_dns_test_max","Last ping test maximum value",["name"])
 ping_dns_stddev = prom.Gauge("aetheredge_ping_dns_test_stddev","Last ping test standard deviation",["name"])
 
+# Speedtest iperf metrics
+iperf_cluster_downlink = prom.Gauge("aetheredge_iperf_cluster_downlink_test","Last iperf test downlink result",["name"])
+iperf_cluster_uplink = prom.Gauge("aetheredge_iperf_cluster_uplink_test","Last iperf test downlink result",["name"])
+
 # Signal quality metrics in CESQ format not dB
 # RSRQ: >=53 excellent, 43 ~ 53 good, 33 ~ 43 mid, <=33 bad, 0 no signal
 # RSRP: >=20 excellent, 10 ~ 20 good, 0 ~ 10 mid, 0 no signal
@@ -168,6 +178,12 @@
         pass
 
     try:
+        iperf_cluster_downlink.remove(name)
+        iperf_cluster_uplink.remove(name)
+    except:
+        pass
+
+    try:
         signal_quality_rsrq.remove(name)
         signal_quality_rsrp.remove(name)
     except:
@@ -189,14 +205,21 @@
         connect_status = edge['status']['control_plane']
         ping_status = edge['status']['user_plane']
 
-        speedtest_results_exist = True
+        speedtest_ping_results_exist = True
         if edge['speedtest']['ping']['dns']['avg']:
             ping_dns_min_result = edge['speedtest']['ping']['dns']['min']
             ping_dns_avg_result = edge['speedtest']['ping']['dns']['avg']
             ping_dns_max_result = edge['speedtest']['ping']['dns']['max']
             ping_dns_stddev_result = edge['speedtest']['ping']['dns']['stddev']
         else:
-            speedtest_results_exist = False
+            speedtest_ping_results_exist = False
+
+        speedtest_iperf_results_exist = True
+        if edge['speedtest']['iperf']['cluster']['downlink']:
+            iperf_cluster_downlink_result = edge['speedtest']['iperf']['cluster']['downlink']
+            iperf_cluster_uplink_result = edge['speedtest']['iperf']['cluster']['uplink']
+        else:
+            speedtest_iperf_results_exist = False
 
         cp_status.labels(edge['name']).set(status_codes[connect_status])
         up_status.labels(edge['name']).set(status_codes[ping_status])
@@ -220,12 +243,16 @@
             if connect_status == "connected" and ping_status == "connected":
                 e2e_tests_ok.labels(edge['name']).set(1)
 
-        if speedtest_results_exist:
+        if speedtest_ping_results_exist:
             ping_dns_min.labels(edge['name']).set(ping_dns_min_result)
             ping_dns_avg.labels(edge['name']).set(ping_dns_avg_result)
             ping_dns_max.labels(edge['name']).set(ping_dns_max_result)
             ping_dns_stddev.labels(edge['name']).set(ping_dns_stddev_result)
 
+        if speedtest_iperf_results_exist:
+            iperf_cluster_downlink.labels(edge['name']).set(iperf_cluster_downlink_result)
+            iperf_cluster_uplink.labels(edge['name']).set(iperf_cluster_uplink_result)
+
         if 'signal_quality' in edge.keys():
             signal_quality_rsrq.labels(edge['name']).set(edge['signal_quality']['rsrq'])
             signal_quality_rsrp.labels(edge['name']).set(edge['signal_quality']['rsrp'])
@@ -236,6 +263,8 @@
     res.append(prom.generate_latest(ping_dns_avg))
     res.append(prom.generate_latest(ping_dns_max))
     res.append(prom.generate_latest(ping_dns_stddev))
+    res.append(prom.generate_latest(iperf_cluster_downlink))
+    res.append(prom.generate_latest(iperf_cluster_uplink))
     res.append(prom.generate_latest(last_update))
     res.append(prom.generate_latest(maint_window))
     res.append(prom.generate_latest(connect_test_ok))
@@ -292,15 +321,22 @@
                     'max': 0.0,
                     'stddev': 0.0
                 }
+            },
+            'iperf': {
+                'cluster': {
+                    'downlink': 0.0,
+                    'uplink': 0.0
+                }
             }
         },
         'last_update': time.time()
     }
 
     if 'speedtest' in request.json:
-        req_edge['speedtest'] = {
-            'ping': request.json['speedtest']['ping']
-        }
+        if 'ping' in request.json['speedtest']:
+            req_edge['speedtest']['ping'] = request.json['speedtest']['ping']
+        if 'iperf' in request.json['speedtest']:
+            req_edge['speedtest']['iperf'] = request.json['speedtest']['iperf']
 
     if 'signal_quality' in request.json:
         req_edge['signal_quality'] = request.json['signal_quality']
diff --git a/edge-monitoring/test_edge_monitoring_server.py b/edge-monitoring/test_edge_monitoring_server.py
index fa980cd..33e26f7 100755
--- a/edge-monitoring/test_edge_monitoring_server.py
+++ b/edge-monitoring/test_edge_monitoring_server.py
@@ -26,6 +26,12 @@
                 'max': 6.0,
                 'stddev': 1.0
             }
+        },
+        'iperf': {
+            'cluster': {
+                'downlink': 100.0,
+                'uplink': 10.0
+            }
         }
     },
     'signal_quality': {
@@ -71,11 +77,40 @@
                 'max': 6.0,
                 'stddev': 1.0
             }
+        },
+        'iperf': {
+            'cluster': {
+                'downlink': 100.0,
+                'uplink': 10.0
+            }
         }
     },
     'last_update': time.time()
 }
 
+test_edge_no_iperf = {
+    'name': 'ace-menlo-pixel',
+    'status': {
+        'control_plane': 'connected',
+        'user_plane': 'connected'
+    },
+    'speedtest': {
+        'ping': {
+            'dns': {
+                'min': 2.0,
+                'avg': 4.0,
+                'max': 6.0,
+                'stddev': 1.0
+            }
+        }
+    },
+    'signal_quality': {
+        'rsrq': 30,
+        'rsrp': 80
+    },
+    'last_update': time.time()
+}
+
 
 class MyEvent:
     def __init__ (self, location = "", description = "", summary = "", start = None, end = None, all_day = False):
@@ -119,6 +154,8 @@
         self.assertTrue('aetheredge_ping_dns_test_avg{name="ace-menlo-pixel"} 4.0' in data)
         self.assertTrue('aetheredge_ping_dns_test_max{name="ace-menlo-pixel"} 6.0' in data)
         self.assertTrue('aetheredge_ping_dns_test_stddev{name="ace-menlo-pixel"} 1.0' in data)
+        self.assertTrue('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-pixel"} 100.0' in data)
+        self.assertTrue('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-pixel"} 10.0' in data)
 
     def _assert_signal_quality_metrics_exist(self, data):
         self.assertTrue('aetheredge_signal_quality_rsrq{name="ace-menlo-pixel"} 30' in data)
@@ -301,6 +338,8 @@
         self.assertFalse('aetheredge_ping_dns_test_avg{name="ace-menlo-pixel"}' in data)
         self.assertFalse('aetheredge_ping_dns_test_max{name="ace-menlo-pixel"}' in data)
         self.assertFalse('aetheredge_ping_dns_test_stddev{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_iperf_cluster_downlink_test{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_iperf_cluster_uplink_test{name="ace-menlo-pixel"}' in data)
 
         self._assert_status_metrics_exist(data)
         self._assert_signal_quality_metrics_exist(data)
@@ -349,6 +388,22 @@
         self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 0.0)
         self.assertFalse('signal_quality' in data['edge'])
 
+    def test_backwards_compatible_no_iperf(self):
+        response = self.app.post('/testresults', json=test_edge_no_iperf)
+        data = json.loads(response.get_data(as_text=True))
+        self.assertEqual(data['edge']['name'], 'ace-menlo-pixel')
+
+        response = self.app.get('/edges/metrics')
+        data = response.get_data(as_text=True)
+        print(data)
+
+        self.assertFalse('iperf_cluster_downlink{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('iperf_cluster_uplink{name="ace-menlo-pixel"}' in data)
+
+        response = self.app.delete('/testresults/ace-menlo-pixel')
+        data = json.loads(response.get_data(as_text=True))
+        self.assertEqual(data['result'], True)
+
 
 if __name__ == '__main__':
     suite = unittest.TestLoader().loadTestsFromTestCase(TestEdgeMonitoringServer)