Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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([])
Пример #5
0
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
Пример #6
0
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([])
Пример #7
0
  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))
Пример #8
0
    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)]
Пример #10
0
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)
Пример #11
0
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)