# This is used directly by server/tests/barriertest/control.srv
import logging, time
from autotest_lib.client.bin import test
from autotest_lib.client.common_lib import barrier, error
class barriertest(test.test):
version = 2
def run_once(self, our_addr, hostnames, master, timeout=120):
# A reusable local server as we're using multiple barriers in one test.
server = barrier.listen_server()
# Basic barrier rendezvous test.
self.job.barrier(our_addr, 'First', timeout=timeout,
listen_server=server).rendezvous(*hostnames)
logging.info('1. rendezvous "First" complete.')
time.sleep(2)
# A rendezvous_servers using a different master than the default.
self.job.barrier(our_addr, 'Second', timeout=timeout,
listen_server=server
).rendezvous_servers(hostnames[-1], *hostnames[:-1])
logging.info('2. rendezvous_servers "Second" complete.')
time.sleep(2)
# A regular rendezvous, this time testing the abort functionality.
try:
self.job.barrier(our_addr, 'WillAbort', timeout=timeout,
listen_server=server
).rendezvous(abort=True, *hostnames)
except error.BarrierAbortError:
pass
except error.BarrierError, e:
# We did get an error from the barrier, but was is acceptable or
# not? Site code may not be able to indicate an explicit abort.
self.job.record('WARN', None, 'barriertest',
'BarrierError %s instead of BarrierAbortError.' % e)
else:
raise error.TestFail('Explicit barrier rendezvous abort failed.')
logging.info('3. rendezvous(abort=True) complete.')
time.sleep(2)
# Now attempt a rendezvous_servers that also includes the server.
self.job.barrier(our_addr, 'FinalSync', timeout=timeout,
listen_server=server
).rendezvous_servers(master, *hostnames)
logging.info('4. rendezvous_servers "FinalSync" complete.')
time.sleep(2)
# rendezvous_servers, aborted from the master.
try:
self.job.barrier(our_addr, 'WillAbortServers', timeout=timeout,
listen_server=server
).rendezvous_servers(master, *hostnames)
except error.BarrierAbortError:
pass
except error.BarrierError, e:
# We did get an error from the barrier, but was is acceptable or
# not? Site code may not be able to indicate an explicit abort.
self.job.record('WARN', None, 'barriertest',
'BarrierError %s instead of BarrierAbortError.' % e)
else:
raise error.TestFail('Explicit barrier rendezvous abort failed.')
logging.info('5. rendezvous_servers(abort=True) complete.')
time.sleep(2)
server.close()