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_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_service_instance_to_json(): json = """{ "additionalEndpoints": { "aurora": { "host": "hostname", "inet6": "2001:db8:1234:ffff:ffff:ffff:ffff:ffff", "port": 22 }, "health": { "host": "hostname", "inet": "1.2.3.4", "port": 23 }, "http": { "host": "hostname", "inet": "1.2.3.4", "inet6": "2001:db8:1234:ffff:ffff:ffff:ffff:ffff", "port": 23 } }, "serviceEndpoint": { "host": "hostname", "port": 24 }, "shard": 1, "status": "ALIVE" }""" service_instance = ServiceInstance( Endpoint("hostname", 24), { "aurora": Endpoint("hostname", 22, "1.2.3.4"), "health": Endpoint("hostname", 23, None, "2001:db8:1234:ffff:ffff:ffff:ffff:ffff"), "http": Endpoint("hostname", 23, "1.2.3.4", "2001:db8:1234:ffff:ffff:ffff:ffff:ffff"), }, 'ALIVE', 1) assert ServiceInstance.unpack(json) == service_instance assert ServiceInstance.unpack( ServiceInstance.pack(service_instance)) == service_instance
def test_url_when_not_connected_and_cluster_has_no_proxy_url(scheme): host = 'some-host.example.com' port = 31181 mock_zk = mock.create_autospec(spec=TwitterKazooClient, instance=True) service_json = '''{ "additionalEndpoints": { "%(scheme)s": { "host": "%(host)s", "port": %(port)d } }, "serviceEndpoint": { "host": "%(host)s", "port": %(port)d }, "shard": 0, "status": "ALIVE" }''' % dict(host=host, port=port, scheme=scheme) service_endpoints = [ServiceInstance.unpack(service_json)] def make_mock_client(proxy_url): client = scheduler_client.ZookeeperSchedulerClient( Cluster(proxy_url=proxy_url), auth=None, user_agent='Some-User-Agent', _deadline=lambda x, **kws: x()) client.get_scheduler_serverset = mock.MagicMock( return_value=(mock_zk, service_endpoints)) client.SERVERSET_TIMEOUT = Amount(0, Time.SECONDS) client._connect_scheduler = mock.MagicMock() return client client = make_mock_client(proxy_url=None) assert client.url == '%s://%s:%d' % (scheme, host, port) assert client.url == client.raw_url client._connect_scheduler.assert_has_calls([]) client = make_mock_client(proxy_url='https://scheduler.proxy') assert client.url == 'https://scheduler.proxy' assert client.raw_url == '%s://%s:%d' % (scheme, host, port) client._connect_scheduler.assert_has_calls([]) client = make_mock_client(proxy_url=None) client.get_thrift_client() assert client.url == '%s://%s:%d' % (scheme, host, port) client._connect_scheduler.assert_has_calls( [mock.call('%s://%s:%d/api' % (scheme, host, port))]) client._connect_scheduler.reset_mock() client.get_thrift_client() client._connect_scheduler.assert_has_calls([])
def test_service_instance_to_json(): json = """{ "additionalEndpoints": { "aurora": { "host": "hostname", "inet6": "2001:db8:1234:ffff:ffff:ffff:ffff:ffff", "port": 22 }, "health": { "host": "hostname", "inet": "1.2.3.4", "port": 23 }, "http": { "host": "hostname", "inet": "1.2.3.4", "inet6": "2001:db8:1234:ffff:ffff:ffff:ffff:ffff", "port": 23 } }, "serviceEndpoint": { "host": "hostname", "port": 24 }, "shard": 1, "status": "ALIVE" }""" service_instance = ServiceInstance( Endpoint("hostname", 24), {"aurora": Endpoint("hostname", 22, "1.2.3.4"), "health": Endpoint("hostname", 23, None, "2001:db8:1234:ffff:ffff:ffff:ffff:ffff"), "http": Endpoint("hostname", 23, "1.2.3.4", "2001:db8:1234:ffff:ffff:ffff:ffff:ffff"), }, 'ALIVE', 1 ) assert ServiceInstance.unpack(json) == service_instance assert ServiceInstance.unpack(ServiceInstance.pack(service_instance)) == service_instance
def test_url_when_not_connected_and_cluster_has_no_proxy_url(scheme): host = 'some-host.example.com' port = 31181 mock_zk = mock.create_autospec(spec=TwitterKazooClient, instance=True) service_json = '''{ "additionalEndpoints": { "%(scheme)s": { "host": "%(host)s", "port": %(port)d } }, "serviceEndpoint": { "host": "%(host)s", "port": %(port)d }, "shard": 0, "status": "ALIVE" }''' % dict(host=host, port=port, scheme=scheme) service_endpoints = [ServiceInstance.unpack(service_json)] def make_mock_client(proxy_url): client = scheduler_client.ZookeeperSchedulerClient( Cluster(proxy_url=proxy_url), auth=None, user_agent='Some-User-Agent', _deadline=lambda x, **kws: x()) client.get_scheduler_serverset = mock.MagicMock(return_value=(mock_zk, service_endpoints)) client.SERVERSET_TIMEOUT = Amount(0, Time.SECONDS) client._connect_scheduler = mock.MagicMock() return client client = make_mock_client(proxy_url=None) assert client.url == '%s://%s:%d' % (scheme, host, port) assert client.url == client.raw_url client._connect_scheduler.assert_has_calls([]) client = make_mock_client(proxy_url='https://scheduler.proxy') assert client.url == 'https://scheduler.proxy' assert client.raw_url == '%s://%s:%d' % (scheme, host, port) client._connect_scheduler.assert_has_calls([]) client = make_mock_client(proxy_url=None) client.get_thrift_client() assert client.url == '%s://%s:%d' % (scheme, host, port) client._connect_scheduler.assert_has_calls([mock.call('%s://%s:%d/api' % (scheme, host, port))]) client._connect_scheduler.reset_mock() client.get_thrift_client() client._connect_scheduler.assert_has_calls([])
def _swap(self, master, master_content): i_was_master = self._self_content and self._master_content == self._self_content self._master, self._master_content = master, master_content i_am_master = self._self_content and self._master_content == self._self_content # Invoke callbacks accordingly. # NOTE: No callbacks are invoked if there is currently no master and 'self_instance' wasn't the # master. if i_was_master and not i_am_master: self._demotion_callback() elif not i_was_master and i_am_master: self._promotion_callback() elif not i_was_master and not i_am_master and master: assert master_content self._master_callback(ServiceInstance.unpack(master_content))
def mock_get_serverset(*args, **kwargs): service_json = '''{ "additionalEndpoints": { "http": { "host": "%s", "port": %d } }, "serviceEndpoint": { "host": "%s", "port": %d }, "shard": 0, "status": "ALIVE" }''' % (host, port, host, port) return mock_zk, [ServiceInstance.unpack(service_json)]
def _service_instance(vals): json = '''{ "additionalEndpoints": { "aurora": { "host": "smfd-akb-%d-sr1.devel.twitter.com", "port": 31181 }, "health": { "host": "smfd-akb-%d-sr1.devel.twitter.com", "port": 31181 } }, "serviceEndpoint": { "host": "smfd-akb-%d-sr1.devel.twitter.com", "port": 31181 }, "shard": %d, "status": "ALIVE" }''' % vals return ServiceInstance.unpack(json)