def test_canceled_join_long_time(self): zk = self.make_zk(self._server.ensemble) zk.live.wait() session_id = self.session_id(zk) ss = ServerSet(zk, self.SERVICE_PATH) join_signal = threading.Event() memberships = [] def on_expire(): pass def do_join(): memberships.append(ss.join(self.INSTANCE1, expire_callback=on_expire)) class JoinThread(threading.Thread): def run(_): while True: join_signal.wait() join_signal.clear() do_join() joiner = JoinThread() joiner.daemon = True joiner.start() do_join() assert len(memberships) == 1 and memberships[0] is not Membership.error() self._server.expire(session_id) self._server.shutdown() join_signal.set() self._server.start() while len(memberships) == 1: time.sleep(0.1) assert len(memberships) == 2 and memberships[1] is not Membership.error()
def test_against_alternate_groups(self): zkg1 = self.GroupImpl(self._zk, '/test') zkg2 = self.AlternateGroupImpl(self._zk, '/test') assert zkg1.list() == [] assert zkg2.list() == [] m1 = zkg1.join('morf gorf') assert len(zkg1.list()) == 1 assert len(zkg2.list()) == 0 m2 = zkg2.join('herp derp') assert len(zkg1.list()) == 1 assert len(zkg2.list()) == 1 assert zkg1.info(m1) == 'morf gorf' assert zkg1.info(m2) == Membership.error() assert zkg2.info(m1) == Membership.error() assert zkg2.info(m2) == 'herp derp'
def test_against_alternate_groups(self): zkg1 = self.GroupImpl(self._zk, '/test') zkg2 = self.AlternateGroupImpl(self._zk, '/test') assert zkg1.list() == [] assert zkg2.list() == [] m1 = zkg1.join('morf gorf') assert len(zkg1.list()) == 1 assert len(zkg2.list()) == 0 m2 = zkg2.join('herp derp') assert len(zkg1.list()) == 1 assert len(zkg2.list()) == 1 assert zkg1.info(m1) == 'morf gorf' assert zkg1.info(m2) == Membership.error() assert zkg2.info(m1) == Membership.error() assert zkg2.info(m2) == 'herp derp'
def test_internal_monitor(mock_group_impl_validator, MockActiveKazooGroup): mock_zk = mock.Mock(spec=KazooClient) mock_group = mock.MagicMock(spec=GroupInterface) MockActiveKazooGroup.mock_add_spec(ActiveKazooGroup) MockActiveKazooGroup.return_value = mock_group # by default it tries to assert that the group impl is a subclass of GroupInterface # since the group impl will be a mock, it doesn't pass that check, so we mock the validator # as well. mock_group_impl_validator.return_value = True def devnull(*args, **kwargs): pass serverset = ServerSet(mock_zk, '/some/path/to/group', on_join=devnull, on_leave=devnull) members = [Membership(id) for id in range(2)] print("Members are: %s" % members) serverset._internal_monitor(frozenset(members)) for call in mock_group.info.mock_calls: _, (_, callback), _ = call callback(ServiceInstance.unpack(SERVICE_INSTANCE_JSON)) assert len(serverset._members) == 2
def test_authentication(self): secure_zk = self.make_zk(self._server.ensemble, authentication=('digest', 'username:password')) # auth => unauth zkg = self.GroupImpl(self._zk, '/test') secure_zkg = self.GroupImpl(secure_zk, '/test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = zkg.join('hello world') assert secure_zkg.info(membership) == 'hello world' membership = secure_zkg.join('secure hello world') assert zkg.info(membership) == 'secure hello world' # unauth => auth zkg = self.GroupImpl(self._zk, '/secure-test') secure_zkg = self.GroupImpl(secure_zk, '/secure-test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = secure_zkg.join('hello world') assert zkg.info(membership) == 'hello world' assert zkg.join('unsecure hello world') == Membership.error() # unauth => auth monitor zkg = self.GroupImpl(self._zk, '/secure-test2') secure_zkg = self.GroupImpl(secure_zk, '/secure-test2', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership_event = threading.Event() members = set() def new_membership(m): members.update(m) membership_event.set() zkg.monitor(callback=new_membership) membership = secure_zkg.join('hello world') membership_event.wait(timeout=1.0) assert membership_event.is_set() assert members == set([membership])
def test_hard_root_acl(self): secure_zk = self.make_zk(self._server.ensemble, authentication=('digest', 'username:password')) secure_zk.live.wait() secure_zk.create('/test', '', self.ACLS['EVERYONE_READ_CREATOR_ALL']) secure_zk.set_acl('/', 0, self.ACLS['READ_ACL_UNSAFE']) secure_zkg = self.GroupImpl(secure_zk, '/test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = secure_zkg.join('secure hello world') assert membership != Membership.error() assert secure_zkg.info(membership) == 'secure hello world'
def test_async_join(self): zkg = self.GroupImpl(self._zk, '/test') event = threading.Event() memberships = [] def on_join(membership): memberships.append(membership) event.set() zkg.join('hello world', callback=on_join) event.wait() assert len(memberships) == 1 and memberships[0] != Membership.error() zkg.cancel(memberships[0])
def test_monitor_through_parent_death(self): zkg = self.GroupImpl(self._zk, '/test') membership_event = threading.Event() members = set() def new_membership(m): members.update(m) membership_event.set() zkg.monitor(callback=new_membership) membership = zkg.join('hello world') assert membership != Membership.error() membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set([membership]) membership_event.clear() members.clear() zkg.monitor(set([membership]), callback=new_membership) zkg.cancel(membership) membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set() membership_event.clear() members.clear() zkg.monitor(callback=new_membership) self._zk.delete('/test') membership = zkg.join('hello world 2') assert membership != Membership.error() membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set([membership])
def test_hard_root_acl(self): secure_zk = self.make_zk(self._server.ensemble, authentication=('digest', 'username:password')) secure_zk.live.wait() secure_zk.create('/test', '', self.ACLS['EVERYONE_READ_CREATOR_ALL']) secure_zk.set_acl('/', 0, self.ACLS['READ_ACL_UNSAFE']) secure_zkg = self.GroupImpl(secure_zk, '/test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = secure_zkg.join('secure hello world') assert membership != Membership.error() assert secure_zkg.info(membership) == 'secure hello world'
def test_async_join(self): zkg = self.GroupImpl(self._zk, '/test') event = threading.Event() memberships = [] def on_join(membership): memberships.append(membership) event.set() zkg.join('hello world', callback=on_join) event.wait() assert len(memberships) == 1 and memberships[0] != Membership.error() zkg.cancel(memberships[0])
def test_monitor_through_parent_death(self): zkg = self.GroupImpl(self._zk, '/test') membership_event = threading.Event() members = set() def new_membership(m): members.update(m) membership_event.set() zkg.monitor(callback=new_membership) membership = zkg.join('hello world') assert membership != Membership.error() membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set([membership]) membership_event.clear() members.clear() zkg.monitor(set([membership]), callback=new_membership) zkg.cancel(membership) membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set() membership_event.clear() members.clear() zkg.monitor(callback=new_membership) self._zk.delete('/test') membership = zkg.join('hello world 2') assert membership != Membership.error() membership_event.wait(timeout=self.MAX_EVENT_WAIT_SECS) assert membership_event.is_set() assert members == set([membership])
def test_info_after_expiration(self): zkg = self.GroupImpl(self._zk, '/test') membership = zkg.join('hello world') assert zkg.info(membership) == 'hello world' membership_event = threading.Event() members = [membership] def on_membership(new_membership): members[:] = new_membership membership_event.set() zkg.monitor(members, on_membership) self._server.expire(self.session_id(self._zk)) membership_event.wait() assert members == [] assert zkg.info(membership) == Membership.error() membership = zkg.join('herp derp') assert zkg.info(membership) == 'herp derp'
def test_info_after_expiration(self): zkg = self.GroupImpl(self._zk, '/test') membership = zkg.join('hello world') assert zkg.info(membership) == 'hello world' membership_event = threading.Event() members = [membership] def on_membership(new_membership): members[:] = new_membership membership_event.set() zkg.monitor(members, on_membership) self._server.expire(self.session_id(self._zk)) membership_event.wait() assert members == [] assert zkg.info(membership) == Membership.error() membership = zkg.join('herp derp') assert zkg.info(membership) == 'herp derp'
def test_authentication(self): secure_zk = self.make_zk(self._server.ensemble, authentication=('digest', 'username:password')) # auth => unauth zkg = self.GroupImpl(self._zk, '/test') secure_zkg = self.GroupImpl(secure_zk, '/test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = zkg.join('hello world') assert secure_zkg.info(membership) == 'hello world' membership = secure_zkg.join('secure hello world') assert zkg.info(membership) == 'secure hello world' # unauth => auth zkg = self.GroupImpl(self._zk, '/secure-test') secure_zkg = self.GroupImpl(secure_zk, '/secure-test', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership = secure_zkg.join('hello world') assert zkg.info(membership) == 'hello world' assert zkg.join('unsecure hello world') == Membership.error() # unauth => auth monitor zkg = self.GroupImpl(self._zk, '/secure-test2') secure_zkg = self.GroupImpl(secure_zk, '/secure-test2', acl=self.ACLS['EVERYONE_READ_CREATOR_ALL']) membership_event = threading.Event() members = set() def new_membership(m): members.update(m) membership_event.set() zkg.monitor(callback=new_membership) membership = secure_zkg.join('hello world') membership_event.wait(timeout=1.0) assert membership_event.is_set() assert members == set([membership])
def test_sync_join(self): zkg = self.GroupImpl(self._zk, '/test') membership = zkg.join('hello world') assert isinstance(membership, Membership) assert membership != Membership.error() assert zkg.info(membership) == 'hello world'
def test_sync_join(self): zkg = self.GroupImpl(self._zk, '/test') membership = zkg.join('hello world') assert isinstance(membership, Membership) assert membership != Membership.error() assert zkg.info(membership) == 'hello world'