[AETHER-3268] - Continue reporting upon dry ping failure

Change-Id: I854892e61dd530f93e3a87536b77e052841b47af
diff --git a/VERSION b/VERSION
index 972ef76..5b209ea 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.7.9
+0.7.10
diff --git a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
index 6a32cb0..bcd8b06 100755
--- a/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
+++ b/edge-monitoring/agent_modem/edge_monitoring_agent_modem.py
@@ -24,6 +24,8 @@
 report the result to the central monitoring server.
 '''
 
+USE_MODEM_CMDS = False
+
 # 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")
@@ -121,8 +123,11 @@
 
 
 def get_control_plane_state(modem, dongle_stats=None):
-    if dongle_stats and dongle_stats['Connection'] == 'Connected':
-        return State.connected
+    if not modem and dongle_stats:
+        if dongle_stats and dongle_stats['Connection'] == 'Connected':
+            return State.connected
+        else:
+            return State.disconnected
 
     # Disable radio fuction
     # "echo" works more stable than serial for this action
@@ -174,7 +179,7 @@
     return state
 
 
-def get_user_plane_state(modem):
+def get_user_plane_state():
     if "dry_run" in CONF.ips._fields and CONF.ips.dry_run: # run dry_run latency test as user plane test
         dry_run_latency, dry_run_passed = run_ping_test(CONF.ips.dry_run, 10)
         if dry_run_passed:
@@ -320,10 +325,15 @@
 
 
 def get_signal_quality(modem, dongle_stats=None):
-    if dongle_stats and dongle_stats['RSRQ'] != '' and dongle_stats['RSRP'] != '':
-        rsrq = int((float(dongle_stats['RSRQ']) + 19.5) * 2)
-        rsrp = int(float(dongle_stats['RSRP']) + 140)
-        return {'rsrq': rsrq, 'rsrp': rsrp}
+    if not modem and dongle_stats:
+        if dongle_stats['RSRQ'] != '' and dongle_stats['RSRP'] != '':
+            rsrq = int((float(dongle_stats['RSRQ']) + 19.5) * 2)
+            rsrp = int(float(dongle_stats['RSRP']) + 140)
+            return {'rsrq': rsrq, 'rsrp': rsrp}
+        else:
+            return {'rsrq': 0, 'rsrp': 0}
+
+    # Fall back to modem cmds
 
     success, result = modem.write('AT+CESQ')
     logging.debug("get_signal_quality success %i result %s",success,result)
@@ -479,8 +489,6 @@
         logging.error("Failed to send report: " + str(e))
         c.close()
 
-    time.sleep(CONF.report_interval)
-
 def reset_usb():
     try:
         # Attempt to run uhubctl
@@ -533,46 +541,51 @@
             time.sleep(10) # Sleep for 10 seconds before retry
             sys.exit(1)
 
-    modem = Modem(CONF.modem.port, CONF.modem.baud)
-    try:
-        modem.connect()
-    except serial.serialutil.SerialException as e:
-        logging.error("Failed to connect the modem for %s", e)
-        sys.exit(1)
-
-    while True:
-        dongle_stats = get_dongle_stats()
-        cp_state = get_control_plane_state(modem, dongle_stats)
-        if cp_state != State.connected:
-            logging.error("Control plane not connected")
-            continue
-        signal_quality = get_signal_quality(modem, dongle_stats)
-        if cp_state is State.error:
-            logging.error("Modem is in error state.")
-            reset_usb()
+    if USE_MODEM_CMDS:
+        modem = Modem(CONF.modem.port, CONF.modem.baud)
+        try:
+            modem.connect()
+        except serial.serialutil.SerialException as e:
+            logging.error("Failed to connect the modem for %s", e)
             sys.exit(1)
-        if cp_state is State.disconnected:
-            # Failed to attach, don't need to run other tests
-            logging.error("Check control plane - fail")
-            report_status(signal_quality, dongle_stats)
-            continue
+    else:
+        modem = None
 
-        up_state, dry_run_latency = get_user_plane_state(modem)
+    connect_retries = 0
+    while True:
+        dongle_retries = 0
+        dongle_stats = get_dongle_stats()
+        while not dongle_stats['SuccessfulFetch']:
+            log.error("Dongle error")
+            dongle_retries += 1
+            if dongle_retries > 10:
+                logging.warn("Rebooting Pi")
+                os.system("shutdown /r /t 0")
+                sys.exit(1)
+            dongle_stats = get_dongle_stats()
+
+        cp_state = get_control_plane_state(modem, dongle_stats)
+
+        if cp_state != State.connected:
+            logging.error("Dongle not connected")
+            connect_retries += 1
+            if connect_retries > 10:
+                os.system("shutdown /r /t 0")
+                sys.exit(1)
+
+        signal_quality = get_signal_quality(modem, dongle_stats)
+        up_state, dry_run_latency = get_user_plane_state()
         if up_state is State.disconnected:
-            logging.error("Check user plane - fail")
-            # Basic user plane test failed, don't need to run the rest of tests
-            report_status(signal_quality, dongle_stats, cp_state)
-            continue
+            logging.error("Dry run ping failed")
 
         speedtest_ping, speedtest_status = get_ping_test(modem, dry_run_latency)
-        if speedtest_status:
-            speedtest_iperf = get_iperf_test(modem)
-        else:
-            logging.error("Check iperf check - fail")
-            report_status(signal_quality, dongle_stats, cp_state, up_state, speedtest_ping)
-            continue
+        if not speedtest_status:
+            logging.error("Ping tests failed")
+
+        speedtest_iperf = get_iperf_test(modem)
 
         report_status(signal_quality, dongle_stats, cp_state, up_state, speedtest_ping, speedtest_iperf)
+        time.sleep(CONF.report_interval)
 
     modem.close()