X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=blobdiff_plain;f=tools%2Ffunctions.py;h=9292867d9166b6d07aea63a3b7b7311fc38f43cf;hb=b1534957e463b5e34957a8d48ce5c6b0552ffbb4;hp=d00200d91e10016f1d80a47af824a8e129cb73e5;hpb=ca9c9275ed6d5d852987c69a378e88a3502cb2ab;p=vswitchperf.git diff --git a/tools/functions.py b/tools/functions.py index d00200d9..9292867d 100644 --- a/tools/functions.py +++ b/tools/functions.py @@ -19,8 +19,11 @@ import os import logging import glob import shutil +import re from conf import settings as S +MAX_L4_FLOWS = 65536 + # # Support functions # @@ -139,3 +142,74 @@ def settings_update_paths(): tools['dpdk_src'] = S.getValue('PATHS')['dpdk']['src']['path'] S.setValue('TOOLS', tools) + +def check_traffic(traffic): + """Check traffic definition and correct it if possible. + """ + # check if requested networking layers make sense + if traffic['l4']['enabled']: + if not traffic['l3']['enabled']: + raise RuntimeError('TRAFFIC misconfiguration: l3 must be enabled ' + 'if l4 is enabled.') + + # check if multistream configuration makes sense + if traffic['multistream']: + if traffic['stream_type'] == 'L3': + if not traffic['l3']['enabled']: + raise RuntimeError('TRAFFIC misconfiguration: l3 must be ' + 'enabled if l3 streams are requested.') + if traffic['stream_type'] == 'L4': + if not traffic['l4']['enabled']: + raise RuntimeError('TRAFFIC misconfiguration: l4 must be ' + 'enabled if l4 streams are requested.') + + # in case of UDP ports we have only 65536 (0-65535) unique options + if traffic['multistream'] > MAX_L4_FLOWS: + logging.getLogger().warning( + 'Requested amount of L4 flows %s is bigger than number of ' + 'transport protocol ports. It was set to %s.', + traffic['multistream'], MAX_L4_FLOWS) + traffic['multistream'] = MAX_L4_FLOWS + + return traffic + +def filter_output(output, regex): + """Filter output by defined regex. Output can be either string, list or tuple. + Every string is split into list line by line. After that regex is applied + to filter only matching lines, which are returned back. + + :returns: list of matching records + """ + result = [] + if isinstance(output, str): + for line in output.split('\n'): + result += re.findall(regex, line) + return result + elif isinstance(output, list) or isinstance(output, tuple): + tmp_res = [] + for item in output: + tmp_res.append(filter_output(item, regex)) + return tmp_res + else: + raise RuntimeError('Only strings and lists are supported by filter_output(), ' + 'but output has type {}'.format(type(output))) + +def format_description(desc, length): + """ Split description into multiple lines based on given line length. + + :param desc: A string with testcase description + :param length: A maximum line length + """ + # split description to multiple lines + words = desc.split() + output = [] + line = '' + for word in words: + if len(line) + len(word) < length: + line += '{} '.format(word) + else: + output.append(line.strip()) + line = '{} '.format(word) + + output.append(line.strip()) + return output