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