import logging
import glob
import shutil
+import re
from conf import settings as S
MAX_L4_FLOWS = 65536
S.setValue('TOOLS', tools)
def check_traffic(traffic):
- """Check traffic definition and correct it if needed.
+ """Check traffic definition and correct it if possible.
"""
- # in case of UDP ports we have only 65536 (0-65535) unique options
- if traffic['multistream'] > MAX_L4_FLOWS and \
- traffic['stream_type'] == 'L4':
- 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
+ # 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