teststeps: Improvements and bugfixing of teststeps
[vswitchperf.git] / tools / functions.py
index d00200d..9292867 100644 (file)
@@ -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