[AETHER-1869]: Add Ping to Iperf Server to Edge Monitoring Agent (client+server)

Change-Id: Id8eac4cf410e4e3496da84871ba55e1e935cda86
diff --git a/VERSION b/VERSION
index ef5e445..05e8a45 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.6.5
+0.6.6
diff --git a/edge-monitoring-server/edge_monitoring_server.py b/edge-monitoring-server/edge_monitoring_server.py
index 6addd31..a467fee 100755
--- a/edge-monitoring-server/edge_monitoring_server.py
+++ b/edge-monitoring-server/edge_monitoring_server.py
@@ -70,6 +70,16 @@
                                 "stddev": {"type": "number"}
                             },
                             "required": ["min", "avg", "max", "stddev"]
+                        },
+                        "iperf_server": {
+                            "type": "object",
+                            "properties": {
+                                "min": {"type": "number"},
+                                "avg": {"type": "number"},
+                                "max": {"type": "number"},
+                                "stddev": {"type": "number"}
+                            },
+                            "required": ["min", "avg", "max", "stddev"]
                         }
                     }
                 },
@@ -114,6 +124,12 @@
                     'avg': 0.0,
                     'max': 0.0,
                     'stddev': 0.0
+                },
+                'iperf_server': {
+                    'min': 0.0,
+                    'avg': 0.0,
+                    'max': 0.0,
+                    'stddev': 0.0
                 }
             },
             'iperf': {
@@ -154,11 +170,17 @@
 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 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 dns ping metrics
+ping_dns_min = prom.Gauge("aetheredge_ping_dns_test_min","Last ping test to dns minimum value",["name"])
+ping_dns_avg = prom.Gauge("aetheredge_ping_dns_test_avg","Last ping test to dns average",["name"])
+ping_dns_max = prom.Gauge("aetheredge_ping_dns_test_max","Last ping test to dns maximum value",["name"])
+ping_dns_stddev = prom.Gauge("aetheredge_ping_dns_test_stddev","Last ping test to dns standard deviation",["name"])
+
+# Speedtest iperf server ping metrics
+ping_iperf_server_min = prom.Gauge("aetheredge_ping_iperf_server_test_min","Last ping test to iperf_server minimum value",["name"])
+ping_iperf_server_avg = prom.Gauge("aetheredge_ping_iperf_server_test_avg","Last ping test to iperf_server average",["name"])
+ping_iperf_server_max = prom.Gauge("aetheredge_ping_iperf_server_test_max","Last ping test to iperf_server maximum value",["name"])
+ping_iperf_server_stddev = prom.Gauge("aetheredge_ping_iperf_server_test_stddev","Last ping test to iperf_server standard deviation",["name"])
 
 # Speedtest iperf metrics
 iperf_cluster_downlink = prom.Gauge("aetheredge_iperf_cluster_downlink_test","Last iperf test downlink result",["name"])
@@ -231,6 +253,10 @@
                                                 'avg': 0.0,
                                                 'max': 0.0,
                                                 'stddev': 0.0}
+            edge['speedtest']['ping']['iperf_server'] = {'min': 0.0,
+                                                         'avg': 0.0,
+                                                         'max': 0.0,
+                                                         'stddev': 0.0}
             edge['speedtest']['iperf'] = {'cluster': {
                                             'downlink': 0.0,
                                             'uplink': 0.0
@@ -259,6 +285,14 @@
         pass
 
     try:
+        ping_iperf_server_min.remove(name)
+        ping_iperf_server_avg.remove(name)
+        ping_iperf_server_max.remove(name)
+        ping_iperf_server_stddev.remove(name)
+    except:
+        pass
+
+    try:
         iperf_cluster_downlink.remove(name)
         iperf_cluster_uplink.remove(name)
     except:
@@ -286,21 +320,24 @@
         connect_status = edge['status']['control_plane']
         ping_status = edge['status']['user_plane']
 
-        speedtest_ping_results_exist = True
+        # Add ping dns latency results if available
         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_ping_results_exist = False
+            ping_dns_min.labels(edge['name']).set(edge['speedtest']['ping']['dns']['min'])
+            ping_dns_avg.labels(edge['name']).set(edge['speedtest']['ping']['dns']['avg'])
+            ping_dns_max.labels(edge['name']).set(edge['speedtest']['ping']['dns']['max'])
+            ping_dns_stddev.labels(edge['name']).set(edge['speedtest']['ping']['dns']['stddev'])
 
-        speedtest_iperf_results_exist = True
+        # Add ping iperf_server latency results if available
+        if edge['speedtest']['ping']['iperf_server']['avg']:
+            ping_iperf_server_min.labels(edge['name']).set(edge['speedtest']['ping']['iperf_server']['min'])
+            ping_iperf_server_avg.labels(edge['name']).set(edge['speedtest']['ping']['iperf_server']['avg'])
+            ping_iperf_server_max.labels(edge['name']).set(edge['speedtest']['ping']['iperf_server']['max'])
+            ping_iperf_server_stddev.labels(edge['name']).set(edge['speedtest']['ping']['iperf_server']['stddev'])
+
+        # Add iperf bandwidth results if available
         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
+            iperf_cluster_downlink.labels(edge['name']).set(edge['speedtest']['iperf']['cluster']['downlink'])
+            iperf_cluster_uplink.labels(edge['name']).set(edge['speedtest']['iperf']['cluster']['uplink'])
 
         cp_status.labels(edge['name']).set(status_codes[connect_status])
         up_status.labels(edge['name']).set(status_codes[ping_status])
@@ -324,16 +361,6 @@
             if connect_status == "connected" and ping_status == "connected":
                 e2e_tests_ok.labels(edge['name']).set(1)
 
-        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'])
@@ -344,6 +371,10 @@
     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(ping_iperf_server_min))
+    res.append(prom.generate_latest(ping_iperf_server_avg))
+    res.append(prom.generate_latest(ping_iperf_server_max))
+    res.append(prom.generate_latest(ping_iperf_server_stddev))
     res.append(prom.generate_latest(iperf_cluster_downlink))
     res.append(prom.generate_latest(iperf_cluster_uplink))
     res.append(prom.generate_latest(last_update))
@@ -400,6 +431,12 @@
                     'avg': 0.0,
                     'max': 0.0,
                     'stddev': 0.0
+                },
+                'iperf_server': {
+                    'min': 0.0,
+                    'avg': 0.0,
+                    'max': 0.0,
+                    'stddev': 0.0
                 }
             },
             'iperf': {
diff --git a/edge-monitoring-server/test_edge_monitoring_server.py b/edge-monitoring-server/test_edge_monitoring_server.py
index d86cd4c..f365c95 100755
--- a/edge-monitoring-server/test_edge_monitoring_server.py
+++ b/edge-monitoring-server/test_edge_monitoring_server.py
@@ -26,6 +26,12 @@
                 'avg': 4.0,
                 'max': 6.0,
                 'stddev': 1.0
+            },
+            'iperf_server': {
+                'min': 1.0,
+                'avg': 3.0,
+                'max': 5.0,
+                'stddev': 1.0
             }
         },
         'iperf': {
@@ -77,6 +83,12 @@
                 'avg': 4.0,
                 'max': 6.0,
                 'stddev': 1.0
+            },
+            'iperf_server': {
+                'min': 1.0,
+                'avg': 3.0,
+                'max': 5.0,
+                'stddev': 1.0
             }
         },
         'iperf': {
@@ -155,6 +167,10 @@
         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_ping_iperf_server_test_min{name="ace-menlo-pixel"} 1.0' in data)
+        self.assertTrue('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-pixel"} 3.0' in data)
+        self.assertTrue('aetheredge_ping_iperf_server_test_max{name="ace-menlo-pixel"} 5.0' in data)
+        self.assertTrue('aetheredge_ping_iperf_server_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)
 
@@ -339,6 +355,10 @@
         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_ping_iperf_server_test_min{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_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)
 
@@ -376,6 +396,7 @@
         self.assertEqual(data['edge']['status']['control_plane'], 'connected')
         self.assertEqual(data['edge']['status']['user_plane'], 'connected')
         self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 4.0)
+        self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 3.0)
         self.assertTrue('signal_quality' in data['edge'])
 
         self.emulated_time += (ems.NO_RESULT_THRESHOLD + 1)
@@ -387,6 +408,7 @@
         self.assertEqual(data['edge']['status']['control_plane'], 'no result')
         self.assertEqual(data['edge']['status']['user_plane'], 'no result')
         self.assertEqual(data['edge']['speedtest']['ping']['dns']['avg'], 0.0)
+        self.assertEqual(data['edge']['speedtest']['ping']['iperf_server']['avg'], 0.0)
         self.assertFalse('signal_quality' in data['edge'])
 
     def test_backwards_compatible_no_iperf(self):
@@ -398,8 +420,12 @@
         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)
+        self.assertFalse('aetheredge_iperf_cluster_downlink{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_iperf_cluster_uplink{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_min{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_avg{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_max{name="ace-menlo-pixel"}' in data)
+        self.assertFalse('aetheredge_ping_iperf_server_test_stddev{name="ace-menlo-pixel"}' in data)
 
         response = self.app.delete('/testresults/ace-menlo-pixel')
         data = json.loads(response.get_data(as_text=True))
@@ -460,4 +486,4 @@
 if __name__ == '__main__':
     import xmlrunner
     with open('results.xml', 'wb') as output:
-        unittest.main(testRunner=xmlrunner.XMLTestRunner(verbosity=2, output=output))
\ No newline at end of file
+        unittest.main(testRunner=xmlrunner.XMLTestRunner(verbosity=2, output=output))
diff --git a/edge-monitoring/agent_modem/config.json b/edge-monitoring/agent_modem/config.json
index 7bfb02d..a824f91 100644
--- a/edge-monitoring/agent_modem/config.json
+++ b/edge-monitoring/agent_modem/config.json
@@ -6,9 +6,8 @@
         "ip_addr": "192.168.0.1"
     },
     "ips": {
-      "user_plane_ping_test": "8.8.8.8",
-      "speedtest_ping_dns": "8.8.8.8",
-      "speedtest_iperf": ""
+      "dns": "8.8.8.8",
+      "iperf_server": ""
     },
     "attach_timeout": 30,
     "detach_timeout": 10,
diff --git a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
index 1d31474..3c81d19 100755
--- a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
+++ b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
@@ -21,10 +21,13 @@
 report the result to the central monitoring server.
 '''
 
-
+# Parse config with backwards compatibility with config.json pre 0.6.6
+config_file_contents = open(os.getenv('CONFIG_FILE', "./config.json")).read()
+config_file_contents = config_file_contents.replace("user_plane_ping_test", "dns")
+config_file_contents = config_file_contents.replace("speedtest_iperf", "iperf_server")
+config_file_contents = config_file_contents.replace("\"speedtest_ping_dns\": \"8.8.8.8\",", "")
 CONF = json.loads(
-    open(os.getenv('CONFIG_FILE', "./config.json")).read(),
-    object_hook=lambda d: namedtuple('X', d.keys())(*d.values())
+    config_file_contents, object_hook=lambda d: namedtuple('X', d.keys())(*d.values())
 )
 
 logging.basicConfig(
@@ -166,7 +169,7 @@
 def get_user_plane_state(modem):
     try:
         subprocess.check_output(
-            "ping -c 3 " + CONF.ips.user_plane_ping_test + ">/dev/null 2>&1",
+            "ping -c 3 " + CONF.ips.dns + ">/dev/null 2>&1",
             shell=True)
         return State.connected
     except subprocess.CalledProcessError as e:
@@ -184,6 +187,8 @@
               'avg': 0.0,
               'max': 0.0,
               'stddev': 0.0}
+    if not ip:
+        return result
     try:
         pingResult = subprocess.check_output(
                 "ping -c " + str(count) + " " + ip + \
@@ -206,7 +211,9 @@
     2) # TODO: Performs ping to device on network.
     '''
     speedtest_ping = {}
-    speedtest_ping['dns'] = run_ping_test(CONF.ips.speedtest_ping_dns, 10)
+
+    for i in range(0, len(CONF.ips)):
+        speedtest_ping[CONF.ips._fields[i]] = run_ping_test(CONF.ips[i], 10)
     return speedtest_ping
 
 def run_iperf_test(ip, port, time_duration, is_downlink):
@@ -239,8 +246,8 @@
     '''
     speedtest_iperf = {}
     speedtest_iperf['cluster'] = {}
-    speedtest_iperf['cluster']['downlink'] = run_iperf_test(CONF.ips.speedtest_iperf, CONF.iperf_port, 10, True)
-    speedtest_iperf['cluster']['uplink'] = run_iperf_test(CONF.ips.speedtest_iperf, CONF.iperf_port, 10, False)
+    speedtest_iperf['cluster']['downlink'] = run_iperf_test(CONF.ips.iperf_server, CONF.iperf_port, 10, True)
+    speedtest_iperf['cluster']['uplink'] = run_iperf_test(CONF.ips.iperf_server, CONF.iperf_port, 10, False)
 
     return speedtest_iperf
 
@@ -281,6 +288,12 @@
                     'avg': 0.0,
                     'max': 0.0,
                     'stddev': 0.0
+                },
+                'iperf_server': {
+                    'min': 0.0,
+                    'avg': 0.0,
+                    'max': 0.0,
+                    'stddev': 0.0
                 }
             },
             'iperf': {