Simplify the QoS bandwidth test to increase reliability

The initial implementation was measuring the bandwidth stability
over segments of time. But recent failures on high gate pressure
has shown that such stability can't be expected on the edge.

The test now checks the average bandwidth during the whole transmission.

Change-Id: Ic6a00f20ce76aba319ecdada79f68599c891cf29
Closes-Bug: #1662109
This commit is contained in:
Miguel Angel Ajo 2017-02-07 16:21:16 +01:00
parent 31e5176a36
commit b7213030fd
1 changed files with 15 additions and 30 deletions

View File

@ -38,7 +38,6 @@ def _try_connect(host_ip, port):
client_socket = socket.socket(socket.AF_INET,
socket.SOCK_STREAM)
client_socket.connect((host_ip, port))
client_socket.setblocking(0)
return client_socket
except socket.error as serr:
if serr.errno == errno.ECONNREFUSED:
@ -97,10 +96,6 @@ class QoSTest(base.BaseTempestTestCase):
file=QoSTest.FILE_PATH)
def _check_bw(self, ssh_client, host, port):
total_bytes_read = 0
cycle_start_time = time.time()
cycle_data_read = 0
cmd = "killall -q nc"
try:
ssh_client.exec_command(cmd)
@ -109,36 +104,26 @@ class QoSTest(base.BaseTempestTestCase):
cmd = ("(nc -ll -p %(port)d < %(file_path)s > /dev/null &)" % {
'port': port, 'file_path': QoSTest.FILE_PATH})
ssh_client.exec_command(cmd)
start_time = time.time()
client_socket = _connect_socket(host, port)
total_bytes_read = 0
while total_bytes_read < QoSTest.FILE_SIZE:
try:
data = client_socket.recv(QoSTest.BUFFER_SIZE)
except socket.error as e:
if e.args[0] in [errno.EAGAIN, errno.EWOULDBLOCK]:
continue
else:
raise
data = client_socket.recv(QoSTest.BUFFER_SIZE)
total_bytes_read += len(data)
cycle_data_read += len(data)
time_elapsed = time.time() - cycle_start_time
should_check = (time_elapsed >= 5 or
total_bytes_read == QoSTest.FILE_SIZE)
if should_check:
LOG.debug("time_elapsed = %(time_elapsed)d,"
"total_bytes_read = %(bytes_read)d,"
"cycle_data_read = %(cycle_data)d",
{"time_elapsed": time_elapsed,
"bytes_read": total_bytes_read,
"cycle_data": cycle_data_read})
if cycle_data_read / time_elapsed > QoSTest.LIMIT_BYTES_SEC:
# Limit reached
return False
else:
cycle_start_time = time.time()
cycle_data_read = 0
return True
time_elapsed = time.time() - start_time
bytes_per_second = total_bytes_read / time_elapsed
LOG.debug("time_elapsed = %(time_elapsed)d, "
"total_bytes_read = %(total_bytes_read)d, "
"bytes_per_second = %(bytes_per_second)d",
{'time_elapsed': time_elapsed,
'total_bytes_read': total_bytes_read,
'bytes_per_second': bytes_per_second})
return bytes_per_second <= QoSTest.LIMIT_BYTES_SEC
@test.idempotent_id('1f7ed39b-428f-410a-bd2b-db9f465680df')
def test_qos(self):