dpdk: Support of DPDK v16.04
[vswitchperf.git] / src / ovs / ofctl.py
index 43151d3..1ee4813 100644 (file)
@@ -23,6 +23,7 @@ https://github.com/openstack/neutron/blob/6eac1dc99124ca024d6a69b3abfa3bc69c7356
 import os
 import logging
 import string
+import re
 
 from tools import tasks
 from conf import settings
@@ -56,12 +57,18 @@ class OFBase(object):
     def run_vsctl(self, args, check_error=False):
         """Run ``ovs-vsctl`` with supplied arguments.
 
+        In case that timeout is set to -1, then ovs-vsctl
+        will be called with --no-wait option.
+
         :param args: Arguments to pass to ``ovs-vsctl``
         :param check_error: Throw exception on error
 
         :return: None
         """
-        cmd = ['sudo', _OVS_VSCTL_BIN, '--timeout', str(self.timeout)] + args
+        if self.timeout == -1:
+            cmd = ['sudo', _OVS_VSCTL_BIN, '--no-wait'] + args
+        else:
+            cmd = ['sudo', _OVS_VSCTL_BIN, '--timeout', str(self.timeout)] + args
         return tasks.run_task(
             cmd, self.logger, 'Running ovs-vsctl...', check_error)
 
@@ -389,3 +396,26 @@ def flow_key(flow):
         flow_str = _flow_del_key.substitute(_flow_key_param)
 
     return flow_str
+
+def flow_match(flow_dump, flow_src):
+    """ Compares two flows
+
+    :param flow_dump: string - a string with flow obtained by ovs-ofctl dump-flows
+    :param flow_src: string - a string with flow obtained by call of flow_key()
+
+    :return: boolean
+    """
+    # perform unifications on both source and destination flows
+    flow_dump = flow_dump.replace('actions=', 'action=')
+    flow_src = flow_src.replace('actions=', 'action=')
+
+    # split flow strings into lists of comparable elements
+    flow_dump_list = re.findall(r"[\w.:=()]+", flow_dump)
+    flow_src_list = re.findall(r"[\w.:=()]+", flow_src)
+
+    # check if all items from source flow are present in dump flow
+    flow_src_ctrl = list(flow_src_list)
+    for rule in flow_src_list:
+        if rule in flow_dump_list:
+            flow_src_ctrl.remove(rule)
+    return True if not len(flow_src_ctrl) else False