New parse_nping_output function

Parse the output from the nping command and return as a dictionary.

Change-Id: I1550aed177882154247d16f8a9b2a3f82c5ae2cc
Signed-off-by: Michael Walsh <micwalsh@us.ibm.com>
diff --git a/lib/bmc_network_utils.py b/lib/bmc_network_utils.py
index 530f80f..eb1f4e9 100644
--- a/lib/bmc_network_utils.py
+++ b/lib/bmc_network_utils.py
@@ -5,8 +5,10 @@
 
 """
 
+import re
 import ipaddress
 from robot.libraries.BuiltIn import BuiltIn
+import var_funcs as vf
 
 
 def netmask_prefix_length(netmask):
@@ -20,3 +22,51 @@
 
     # IP address netmask format: '0.0.0.0/255.255.252.0'
     return ipaddress.ip_network('0.0.0.0/' + netmask).prefixlen
+
+
+def parse_nping_output(output):
+    r"""
+    Parse the output from the nping command and return as a dictionary.
+
+    Example of output value:
+
+    Starting Nping 0.6.47 ( http://nmap.org/nping ) at 2019-08-07 22:05 IST
+    SENT (0.0181s) TCP Source IP:37577 >
+      Destination IP:80 S ttl=64 id=39113 iplen=40  seq=629782493 win=1480
+    SENT (0.2189s) TCP Source IP:37577 >
+      Destination IP:80 S ttl=64 id=39113 iplen=40  seq=629782493 win=1480
+    RCVD (0.4120s) TCP Destination IP:80 >
+      Source IP:37577 SA ttl=49 id=0 iplen=44  seq=1078301364 win=5840 <mss 1380>
+    Max rtt: 193.010ms | Min rtt: 193.010ms | Avg rtt: 193.010ms
+    Raw packets sent: 2 (80B) | Rcvd: 1 (46B) | Lost: 1 (50.00%)
+    Nping done: 1 IP address pinged in 0.43 seconds
+
+    Example of data returned by this function:
+
+    nping_result:
+      [max_rtt]:                 193.010ms
+      [min_rtt]:                 193.010ms
+      [avg_rtt]:                 193.010ms
+      [raw_packets_sent]:        2 (80B)
+      [rcvd]:                    1 (46B)
+      [lost]:                    1 (50.00%)
+      [percent_lost]:            50.00
+
+    Description of argument(s):
+    output                          The output obtained by running an nping
+                                    command.
+    """
+
+    lines = output.split("\n")
+    # Obtain only the lines of interest.
+    lines = list(filter(lambda x: re.match(r"(Max rtt|Raw packets)", x),
+                        lines))
+
+    key_value_list = []
+    for line in lines:
+        key_value_list += line.split("|")
+    nping_result = vf.key_value_list_to_dict(key_value_list)
+    # Extract percent_lost value from lost field.
+    nping_result['percent_lost'] = \
+        float(nping_result['lost'].split(" ")[-1].strip("()%"))
+    return nping_result