def test_client_handles_connection_recovery_gracefully(self): sync_log('test_client_handles_connection_recovery_gracefully') zk = ZooKeeper(self._server.ensemble, logger=sync_log) sync_log('Creating serverset.') service = ServerSet(zk, SERVICE_PATH) sync_log(' done') sync_log('Registering instance...') service.register(INSTANCE1) sync_log(' done') client = ServerSetClient(SERVICE_PATH, zk=zk) assert list(client) == [INSTANCE1] # Restart the server after delay threading.Timer(3.0, lambda: self._server.start()).start() self._server.shutdown() time.sleep(1.0) # This will block until the server returns, or the retry attempts fail (in # which cause it will throw an exception and the test will fail) assert list(client) == [INSTANCE1] sync_log('success.') zk.close()
def test_client_iteration(self): sync_log('test_client_iteration') zk = ZooKeeper(self._server.ensemble, timeout_secs=10, logger=sync_log) service = ServerSet(zk, SERVICE_PATH) client = ServerSetClient(SERVICE_PATH, zk=zk) assert list(client) == [] service.register(INSTANCE1) assert list(client) == [INSTANCE1] service.register(INSTANCE2) assert list(client) == [INSTANCE1, INSTANCE2] sync_log('Test over, killing client.') zk.close()
def test_client_watcher(self): sync_log('test_client_watcher') updated = threading.Event() old_endpoints = ['init'] new_endpoints = ['init'] def watcher(service_path, old, new): old_endpoints[:] = old new_endpoints[:] = new updated.set() zk = ZooKeeper(self._server.ensemble, timeout_secs=10, logger=sync_log) service = ServerSet(zk, SERVICE_PATH) client = ServerSetClient(SERVICE_PATH, zk=zk, watcher=watcher) updated.wait(2.0) assert updated.is_set() assert old_endpoints == [] assert new_endpoints == [] updated.clear() instance1 = service.register(INSTANCE1) updated.wait(2.0) assert updated.is_set() assert old_endpoints == [] assert new_endpoints == [INSTANCE1] updated.clear() service.register(INSTANCE2) updated.wait(2.0) assert updated.is_set() assert old_endpoints == [INSTANCE1] assert new_endpoints == [INSTANCE1, INSTANCE2] updated.clear() service.unregister(instance1) updated.wait(2.0) assert updated.is_set() assert old_endpoints == [INSTANCE1, INSTANCE2] assert new_endpoints == [INSTANCE2] updated.clear() zk.close()
def __init__(self, endpoint, zk=None, watcher=None, retries=None): self._error = None self._endpoint = endpoint self._watcher = watcher self._lock = threading.Lock() self._endpoints = set() options = app.get_options() self._retries = options.serverset_retries if retries is None else retries self._zk = zk or ZooKeeper() self._start()