diff --git a/whitebox_neutron_tempest_plugin/tests/scenario/test_qos.py b/whitebox_neutron_tempest_plugin/tests/scenario/test_qos.py index 45dc4d8..c6e86b3 100644 --- a/whitebox_neutron_tempest_plugin/tests/scenario/test_qos.py +++ b/whitebox_neutron_tempest_plugin/tests/scenario/test_qos.py @@ -176,7 +176,8 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): raise ValueError('Unsupported protocol %s' % protocol) def _test_egress_bw( - self, ssh_client, ssh_server, server_ip, protocol, timeout=10): + self, ssh_client, ssh_server, server_ip, protocol, maxbitrate, + timeout=6): utils.kill_iperf_process(ssh_server) utils.kill_iperf_process(ssh_client) @@ -196,7 +197,7 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): port=self.IPERF_PORT, protocol_param=protocol_param, timeout=timeout, - maxbitrate=self.MIN_KBPS_NO_BWLIMIT * 2000)) + maxbitrate=maxbitrate)) LOG.debug('Run iperf3 command on client: %s', client_cmd) ssh_client.exec_command(client_cmd) time.sleep(0.1) @@ -204,7 +205,8 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): ssh_server, iperf_server_filename)) def _test_ingress_bw( - self, ssh_client, ssh_server, server_ip, protocol, timeout=10): + self, ssh_client, ssh_server, server_ip, protocol, maxbitrate, + timeout=6): utils.kill_iperf_process(ssh_server) utils.kill_iperf_process(ssh_client) @@ -220,7 +222,7 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): '-R -J > {output_file}'.format( server_ip=server_ip, port=self.IPERF_PORT, protocol_param=protocol_param, timeout=timeout, - maxbitrate=self.MIN_KBPS_NO_BWLIMIT * 2000, + maxbitrate=maxbitrate, output_file=iperf_client_filename)) LOG.debug('Run iperf3 command on client: %s', client_cmd) ssh_client.exec_command(client_cmd) @@ -229,6 +231,13 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): ssh_client, iperf_client_filename)) def _calculate_bw(self, perf_measures): + # For rocky images, final interval is ignored + # TODO(eolivare): provide link to iperf/rocky bug + intervals_end = (len(perf_measures['intervals']) + if self.username != "rocky" + else len(perf_measures['intervals']) - 1) + intervals = perf_measures['intervals'][:intervals_end] + # First 3 for ovs envs, 2 for ovn sriov envs and 1 for normal ovn # intervals are removed because BW measured during it is not # limited - it takes ~2-4 seconds to traffic shaping algorithm to apply @@ -240,14 +249,8 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): intervals_start = 2 else: intervals_start = 1 - - # For rocky images, final interval is ignored - # TODO(eolivare): provide link to iperf/rocky bug - intervals_end = (len(perf_measures['intervals']) - if self.username != "rocky" - else len(perf_measures['intervals']) - 1) - - intervals = perf_measures['intervals'][intervals_start:intervals_end] + if len(intervals) > intervals_start + 1: + intervals = intervals[intervals_start:] bits_received = sum([interval['sum']['bytes'] * 8 for interval in intervals]) @@ -284,12 +287,20 @@ class QosBaseTest(test_qos.QoSTestMixin, base.TrafficFlowTest): test_bw_method = self._test_ingress_bw direction = 'ingress' + # NOTE: with traffic shaping, if the bitrate exceeds the BW limit, the + # excees traffic is buffered and sent once the iperf3 client has ended + # sending traffic, but this could lead to an iperf error: + # "control socket has closed unexpectedly" + # due to this we limit the bitrate to 1.5 * bw_limit + maxbitrate = (bw_limit * 1.5 if bw_limit is not None + else self.MIN_KBPS_NO_BWLIMIT * 2000) + # egress: send payload from client to server # ingress: download payload from server to client for server_ip in server_ips: perf_measures = test_bw_method( client['ssh_client'], server['ssh_client'], - server_ip, protocol) + server_ip, protocol, maxbitrate=maxbitrate) LOG.debug('perf_measures = %s', perf_measures) # verify bw limit