X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fovs%2Fofctl.py;h=1ee48133734e64658dfabfa7cbf011baa0163861;hb=30d75a0778d825fa13eecea7d352eedfe35bd4ed;hp=43151d3a606fb43ce4168ece2a48b74a6aca6b35;hpb=f463c563912abb806fe0d2fe85a4cf6825f416cc;p=vswitchperf.git diff --git a/src/ovs/ofctl.py b/src/ovs/ofctl.py index 43151d3a..1ee48133 100644 --- a/src/ovs/ofctl.py +++ b/src/ovs/ofctl.py @@ -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