Exemplo n.º 1
0
def test_request_transport_integration():
    handler = ReadOnlySchedulerHandler()
    processor = ReadOnlyScheduler.Processor(handler)
    pfactory = TJSONProtocol.TJSONProtocolFactory()
    server = THttpServer.THttpServer(processor, ('localhost', 0), pfactory)
    server_thread = Thread(target=server.serve)
    server_thread.start()
    _, server_port = server.httpd.socket.getsockname()

    response = None

    try:
        transport = TRequestsTransport('http://localhost:%d' % server_port)
        protocol = TJSONProtocol.TJSONProtocol(transport)
        client = ReadOnlyScheduler.Client(protocol)
        response = client.getRoleSummary()
    finally:
        server.httpd.shutdown()

    assert response is not None
    assert response.responseCode == ResponseCode.OK
    assert response.serverInfo.clusterName == 'west'
    assert response.serverInfo.thriftAPIVersion == 3

    transport.close()
Exemplo n.º 2
0
def test_requests_transports_lowers_logging_level():
    logging.getLogger('requests').setLevel(logging.NOTSET)

    TRequestsTransport('http://localhost:12345',
                       session_factory=lambda x: create_autospec(
                           spec=requests.Session, instance=True))

    assert logging.getLogger('requests').level == logging.WARNING
Exemplo n.º 3
0
def test_request_any_other_exception():
  session = create_autospec(spec=requests.Session, instance=True)
  session.headers = {}
  session.post = Mock(side_effect=request_exceptions.ConnectionError())
  transport = TRequestsTransport('http://localhost:12345', session_factory=lambda: session)
  protocol = TJSONProtocol.TJSONProtocol(transport)
  client = ReadOnlyScheduler.Client(protocol)

  with pytest.raises(TTransport.TTransportException):
    client.getRoleSummary()

  transport.close()
Exemplo n.º 4
0
def test_request_transport_timeout():
  session = create_autospec(spec=requests.Session, instance=True)
  session.headers = {}
  session.post = Mock(side_effect=request_exceptions.Timeout())
  transport = TRequestsTransport('http://localhost:12345', session_factory=lambda: session)
  protocol = TJSONProtocol.TJSONProtocol(transport)
  client = ReadOnlyScheduler.Client(protocol)

  with pytest.raises(TTransport.TTransportException) as execinfo:
    client.getRoleSummary()

  assert execinfo.value.message == 'Timed out talking to http://localhost:12345'

  transport.close()
Exemplo n.º 5
0
def test_raises_auth_error():
  response = requests.Response()
  response.status_code = 401

  session = create_autospec(spec=requests.Session, instance=True)
  session.headers = {}
  session.post.return_value = response

  transport = TRequestsTransport('http://localhost:12345', session_factory=lambda: session)
  protocol = TJSONProtocol.TJSONProtocol(transport)
  client = ReadOnlyScheduler.Client(protocol)

  with pytest.raises(TRequestsTransport.AuthError):
    client.getRoleSummary()

  transport.close()
Exemplo n.º 6
0
 def _connect_scheduler(cls, uri, clock=time):
     transport = TRequestsTransport(uri)
     protocol = TJSONProtocol.TJSONProtocol(transport)
     schedulerClient = AuroraAdmin.Client(protocol)
     for _ in range(cls.THRIFT_RETRIES):
         try:
             transport.open()
             return schedulerClient
         except TTransport.TTransportException:
             clock.sleep(cls.RETRY_TIMEOUT.as_(Time.SECONDS))
             continue
         except Exception as e:
             # Monkey-patched proxies, like socks, can generate a proxy error here.
             # without adding a dependency, we can't catch those in a more specific way.
             raise cls.CouldNotConnect(
                 'Connection to scheduler failed: %s' % e)
     raise cls.CouldNotConnect('Could not connect to %s' % uri)
Exemplo n.º 7
0
def test_request_any_other_exception():
    session = mock.MagicMock(spec=requests.Session)
    session.headers = {}
    session.post = mock.Mock(side_effect=request_exceptions.ConnectionError())
    transport = TRequestsTransport('http://localhost:12345',
                                   session_factory=lambda: session)
    protocol = TJSONProtocol.TJSONProtocol(transport)
    client = ReadOnlyScheduler.Client(protocol)

    try:
        client.getRoleSummary()
        assert False, 'getRoleSummary should not succeed'
    except TTransport.TTransportException:
        pass
    except Exception as e:
        assert False, 'Only expected TTransportException, got %s' % e

    transport.close()
Exemplo n.º 8
0
def test_raise_for_status_causes_exception():
  response = requests.Response()
  response.status_code = 503

  session = create_autospec(spec=requests.Session, instance=True)
  session.headers = {}
  session.post.return_value = response

  transport = TRequestsTransport('http://localhost:12345', session_factory=lambda: session)
  protocol = TJSONProtocol.TJSONProtocol(transport)
  client = ReadOnlyScheduler.Client(protocol)

  with pytest.raises(TTransport.TTransportException) as excinfo:
    client.getRoleSummary()

  assert excinfo.value.type == TTransport.TTransportException.UNKNOWN
  assert excinfo.value.message.startswith('Unknown error talking to http://localhost:12345')

  transport.close()
Exemplo n.º 9
0
def test_auth_type_valid():
  response = requests.Response()
  response.status_code = 500

  session = create_autospec(spec=requests.Session, instance=True)
  session.headers = {}
  session.post.return_value = response

  auth = requests.auth.AuthBase()
  transport = TRequestsTransport('http://localhost:1', auth=auth, session_factory=lambda: session)
  protocol = TJSONProtocol.TJSONProtocol(transport)
  client = ReadOnlyScheduler.Client(protocol)

  with pytest.raises(TTransport.TTransportException):
    client.getRoleSummary()

  transport.close()

  session.post.mock_calls = (call(ANY, data=ANY, timeout=ANY, auth=auth))
Exemplo n.º 10
0
def test_requests_transport_session_reuse():
    handler = ReadOnlySchedulerHandler()
    processor = ReadOnlyScheduler.Processor(handler)
    pfactory = TBinaryProtocol.TBinaryProtocolAcceleratedFactory()
    server = THttpServer.THttpServer(processor, ('localhost', 0), pfactory)
    server_thread = Thread(target=server.serve)
    server_thread.start()
    _, server_port = server.httpd.socket.getsockname()

    try:
        transport = TRequestsTransport('http://localhost:%d' % server_port)
        protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
        client = ReadOnlyScheduler.Client(protocol)
        client.getRoleSummary()
        old_session = transport._session
        client.getRoleSummary()
    finally:
        server.httpd.shutdown()

    assert old_session == transport._session

    transport.close()
Exemplo n.º 11
0
  def _connect_scheduler(self, uri, clock=time):
    transport = TRequestsTransport(
        uri,
        auth=self._auth_handler.auth(),
        user_agent=self._user_agent,
        session_factory=functools.partial(
            _bypass_leader_redirect_session_factory,
            should_bypass=self._bypass_leader_redirect))

    protocol = TBinaryProtocol.TBinaryProtocolAccelerated(transport)
    schedulerClient = AuroraAdmin.Client(protocol)
    for _ in range(self.THRIFT_RETRIES):
      try:
        transport.open()
        return schedulerClient
      except TTransport.TTransportException:
        clock.sleep(self.RETRY_TIMEOUT.as_(Time.SECONDS))
        continue
      except Exception as e:
        # Monkey-patched proxies, like socks, can generate a proxy error here.
        # without adding a dependency, we can't catch those in a more specific way.
        raise self.CouldNotConnect('Connection to scheduler failed: %s' % e)
    raise self.CouldNotConnect('Could not connect to %s' % uri)
Exemplo n.º 12
0
def test_transport_applies_default_user_agent_if_no_factory_provided():
    transport = TRequestsTransport('http://localhost:12345')
    transport.open()
    assert transport._session.headers['User-Agent'] == DEFAULT_USER_AGENT
Exemplo n.º 13
0
def test_transport_applies_user_agent_from_factory():
    user_agent = 'Some-User-Agent'
    transport = TRequestsTransport('http://localhost:12345',
                                   user_agent=user_agent)
    transport.open()
    assert transport._session.headers['User-Agent'] == user_agent
Exemplo n.º 14
0
def test_auth_type_invalid():
    with pytest.raises(TypeError) as e:
        TRequestsTransport('http://localhost:1', auth="auth")
    assert e.value.message == 'Invalid auth type. Expected: AuthBase but got str'