diff options
author | Martin Klozik <martinx.klozik@intel.com> | 2017-08-31 15:01:18 +0200 |
---|---|---|
committer | Martin Klozik <martinx.klozik@intel.com> | 2017-11-03 08:36:29 +0000 |
commit | b1534957e463b5e34957a8d48ce5c6b0552ffbb4 (patch) | |
tree | 10985b181d62cffb4ea36355de66dc8ea4edbf8a /core | |
parent | 87f6e48ca1b17361955f0d31551b0c6360028688 (diff) |
teststeps: Improvements and bugfixing of teststeps
This patch introduces several improvements and small bugfixes
of teststeps. These changes were identified during implementation
of OVS/DPDK regression tests.
Patch content:
* teststeps: step aliases were implemented
* teststeps: improved filtering by regex for any step, which returns string
or list of stings; filter will process all lines
* teststeps: support for log object
* teststeps: support for trafficgen get_results call
* teststeps: configurable suppression of step validation
* trafficgen: remove old results before traffic is executed
* trafficgen: support for flow control on/off (IxNet)
* trafficgen: support for configurable learning frames (IxNet)
* trafficgen: support for runtime changes of TRAFFICGEN_PKT_SIZES, _DURATION
and _LOSSRATE
* vnf: flush pexpect output of previous commands
* vnf: use execute_and_wait() to ensure correct cmds order
* vnf: dpdk vHost User interface name set according to its type,
e.g. dpdkvhostuserclient
* vswitch: support for OVS restart
* decap: simplify configuration of tunneling decapsulation tests
* settings: values of all configuration options are restored after TC execution
* modified formatting of test description used by --list
* testcase name and description is logged before its execution
* small bugfixes
JIRA: VSPERF-539
Change-Id: I550ba0d897ece89abd3f33d6d66f545c4d863e7b
Signed-off-by: Martin Klozik <martinx.klozik@intel.com>
Reviewed-by: Al Morton <acmorton@att.com>
Reviewed-by: Christian Trautman <ctrautma@redhat.com>
Reviewed-by: Sridhar Rao <sridhar.rao@spirent.com>
Reviewed-by: Trevor Cooper <trevor.cooper@intel.com>
Diffstat (limited to 'core')
-rw-r--r-- | core/traffic_controller.py | 39 | ||||
-rw-r--r-- | core/traffic_controller_rfc2544.py | 18 | ||||
-rw-r--r-- | core/traffic_controller_rfc2889.py | 18 |
3 files changed, 46 insertions, 29 deletions
diff --git a/core/traffic_controller.py b/core/traffic_controller.py index 5ebdc0d9..d6e7629c 100644 --- a/core/traffic_controller.py +++ b/core/traffic_controller.py @@ -40,13 +40,25 @@ class TrafficController(object): self._traffic_gen_class = traffic_gen_class() self._traffic_started = False self._traffic_started_call_count = 0 + self._duration = None + self._lossrate = None + self._packet_sizes = None + + self._mode = str(settings.getValue('mode')).lower() + self._results = [] + + def configure(self, traffic): + """Set configuration values just before test execution so they + can be changed during runtime by test steps. + """ self._duration = int(settings.getValue('TRAFFICGEN_DURATION')) self._lossrate = float(settings.getValue('TRAFFICGEN_LOSSRATE')) self._packet_sizes = settings.getValue('TRAFFICGEN_PKT_SIZES') - - self._mode = str(settings.getValue('mode')).lower() self._results = [] + # update type with detailed traffic value + self._type = traffic['traffic_type'] + def __enter__(self): """Call initialisation function. """ @@ -101,18 +113,18 @@ class TrafficController(object): print("Please respond with 'yes', 'y', 'no' or 'n' ", end='') return True - def send_traffic(self, dummy_traffic): + def send_traffic(self, traffic): """Triggers traffic to be sent from the traffic generator. This is a blocking function. :param traffic: A dictionary describing the traffic to send. """ - raise NotImplementedError( - "The TrafficController does not implement", - "the \"send_traffic\" function.") + self._logger.debug('send_traffic with ' + + str(self._traffic_gen_class)) + self.configure(traffic) - def send_traffic_async(self, dummy_traffic, dummy_function): + def send_traffic_async(self, traffic, dummy_function): """Triggers traffic to be sent asynchronously. This is not a blocking function. @@ -127,9 +139,9 @@ class TrafficController(object): If this function requires more than one argument, all should be should be passed using the args list and appropriately handled. """ - raise NotImplementedError( - "The TrafficController does not implement", - "the \"send_traffic_async\" function.") + self._logger.debug('send_traffic_async with ' + + str(self._traffic_gen_class)) + self.configure(traffic) def stop_traffic(self): """Kills traffic being sent from the traffic generator. @@ -155,7 +167,7 @@ class TrafficController(object): def validate_send_traffic(self, dummy_result, dummy_traffic): """Verify that send traffic has succeeded """ - if len(self._results): + if self._results: if 'b2b_frames' in self._results[-1]: return float(self._results[-1]['b2b_frames']) > 0 elif 'throughput_rx_fps' in self._results[-1]: @@ -164,3 +176,8 @@ class TrafficController(object): return True else: return False + + def validate_get_results(self, result): + """Verify that results has been returned + """ + return self._results == result diff --git a/core/traffic_controller_rfc2544.py b/core/traffic_controller_rfc2544.py index cb839518..488dde6f 100644 --- a/core/traffic_controller_rfc2544.py +++ b/core/traffic_controller_rfc2544.py @@ -30,8 +30,14 @@ class TrafficControllerRFC2544(TrafficController, IResults): :param traffic_gen_class: The traffic generator class to be used. """ - super(TrafficControllerRFC2544, self).__init__(traffic_gen_class) + super().__init__(traffic_gen_class) self._type = 'rfc2544' + self._tests = None + + def configure(self, traffic): + """See TrafficController for description + """ + super().configure(traffic) self._tests = int(settings.getValue('TRAFFICGEN_RFC2544_TESTS')) def send_traffic(self, traffic): @@ -39,11 +45,8 @@ class TrafficControllerRFC2544(TrafficController, IResults): """ if not self.traffic_required(): return - self._logger.debug('send_traffic with ' + - str(self._traffic_gen_class)) - # update type with detailed traffic value - self._type = traffic['traffic_type'] + super().send_traffic(traffic) for packet_size in self._packet_sizes: # Merge framesize with the default traffic definition @@ -74,11 +77,8 @@ class TrafficControllerRFC2544(TrafficController, IResults): """ if not self.traffic_required(): return - self._logger.debug('send_traffic_async with ' + - str(self._traffic_gen_class)) - # update type with detailed traffic value - self._type = traffic['traffic_type'] + super().send_traffic_async(traffic, function) for packet_size in self._packet_sizes: traffic['l2'] = {'framesize': packet_size} diff --git a/core/traffic_controller_rfc2889.py b/core/traffic_controller_rfc2889.py index 01aaa722..64ab0ba6 100644 --- a/core/traffic_controller_rfc2889.py +++ b/core/traffic_controller_rfc2889.py @@ -30,8 +30,14 @@ class TrafficControllerRFC2889(TrafficController, IResults): :param traffic_gen_class: The traffic generator class to be used. """ - super(TrafficControllerRFC2889, self).__init__(traffic_gen_class) + super().__init__(traffic_gen_class) self._type = 'rfc2889' + self._trials = None + + def configure(self, traffic): + """See TrafficController for description + """ + super().configure(traffic) self._trials = int(settings.getValue('TRAFFICGEN_RFC2889_TRIALS')) def send_traffic(self, traffic): @@ -39,11 +45,8 @@ class TrafficControllerRFC2889(TrafficController, IResults): """ if not self.traffic_required(): return - self._logger.debug('send_traffic with ' + - str(self._traffic_gen_class)) - # update type with detailed traffic value - self._type = traffic['traffic_type'] + super().send_traffic(traffic) for packet_size in self._packet_sizes: # Merge framesize with the default traffic definition @@ -71,11 +74,8 @@ class TrafficControllerRFC2889(TrafficController, IResults): """ if not self.traffic_required(): return - self._logger.debug('send_traffic_async with ' + - str(self._traffic_gen_class)) - # update type with detailed traffic value - self._type = traffic['traffic_type'] + super().send_traffic_async(traffic, function) for packet_size in self._packet_sizes: traffic['l2'] = {'framesize': packet_size} |