Skip to content

Instantly share code, notes, and snippets.

@mangelajo
Created October 16, 2024 07:51
Show Gist options
  • Save mangelajo/58ee2d25c0a4791d50c4c3b26cf2113a to your computer and use it in GitHub Desktop.
Save mangelajo/58ee2d25c0a4791d50c4c3b26cf2113a to your computer and use it in GitHub Desktop.
test errors
======================================================================== FAILURES ========================================================================
__________________________________________________________________ test_exporter_serve ___________________________________________________________________
mock_controller = '127.0.0.1:44357'
async def test_exporter_serve(mock_controller):
exporter = ExporterConfigV1Alpha1(
apiVersion="jumpstarter.dev/v1alpha1",
kind="ExporterConfig",
endpoint=mock_controller,
token="dummy-exporter-token",
export={
"power": ExporterConfigV1Alpha1DriverInstance(
type="jumpstarter.drivers.power.driver.MockPower",
),
"nested": ExporterConfigV1Alpha1DriverInstance(
children={
"tcp": ExporterConfigV1Alpha1DriverInstance(
type="jumpstarter.drivers.network.driver.TcpNetwork",
config={
"host": "127.0.0.1",
"port": 8080,
},
)
}
),
},
)
client = ClientConfigV1Alpha1(
name="testclient",
client=ClientConfigV1Alpha1Client(
endpoint=mock_controller,
token="dummy-client-token",
drivers=ClientConfigV1Alpha1Drivers(allow=[], unsafe=True),
),
)
async with create_task_group() as tg:
tg.start_soon(exporter.serve_forever)
with start_blocking_portal() as portal:
> async with client.lease_async(metadata_filter=MetadataFilter(), portal=portal) as lease:
jumpstarter/config/exporter_test.py:50:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py:210: in __aenter__
return await anext(self.gen)
jumpstarter/config/client.py:83: in lease_async
async with Lease(
jumpstarter/client/lease.py:36: in __aenter__
self.lease = await self.controller.RequestLease(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_AioCall of RPC that terminated with:
status = failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0...iled (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
>
def __await__(self) -> Generator[Any, None, ResponseType]:
"""Wait till the ongoing RPC request finishes."""
try:
response = yield from self._call_response
except asyncio.CancelledError:
# Even if we caught all other CancelledError, there is still
# this corner case. If the application cancels immediately after
# the Call object is created, we will observe this
# `CancelledError`.
if not self.cancelled():
self.cancel()
raise
# NOTE(lidiz) If we raise RpcError in the task, and users doesn't
# 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
# Instead, if we move the exception raising here, the spam stops.
# Unfortunately, there can only be one 'yield from' in '__await__'. So,
# we need to access the private instance variable.
if response is cygrpc.EOF:
if self._cython_call.is_locally_cancelled():
raise asyncio.CancelledError()
else:
> raise _create_rpc_error(
self._cython_call._initial_metadata,
self._cython_call._status,
)
E grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E status = StatusCode.UNAVAILABLE
E details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
E debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:20.866003406+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
E >
../.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py:327: AioRpcError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/majopela/jumpstarter/jumpstarter/config/exporter_test.py", line 50, in test_exporter_serve
async with client.lease_async(metadata_filter=MetadataFilter(), portal=portal) as lease:
File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/jumpstarter/jumpstarter/config/client.py", line 83, in lease_async
async with Lease(
File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 36, in __aenter__
self.lease = await self.controller.RequestLease(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
raise _create_rpc_error(
grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:20.866003406+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
>
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 341, in from_call
| result: TResult | None = func()
| ^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 242, in <lambda>
| lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 182, in _multicall
| return outcome.get_result()
| ^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_result.py", line 100, in get_result
| raise exc.with_traceback(exc.__traceback__)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
| yield from thread_exception_runtest_hook()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
| yield from unraisable_exception_runtest_hook()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
| yield from self._runtest_for(item, "call")
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/logging.py", line 829, in _runtest_for
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
| return (yield)
| ^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
| return (yield)
| ^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
| res = hook_impl.function(*args)
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
| item.runtest()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/python.py", line 1627, in runtest
| self.ihook.pytest_pyfunc_call(pyfuncitem=self)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall
| raise exception.with_traceback(exception.__traceback__)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
| res = hook_impl.function(*args)
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/pytest_plugin.py", line 160, in pytest_pyfunc_call
| runner.run_test(pyfuncitem.obj, testargs)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2176, in run_test
| self._raise_async_exceptions()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2080, in _raise_async_exceptions
| raise exceptions[0]
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2170, in run_test
| self.get_loop().run_until_complete(
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
| return future.result()
| ^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2130, in _call_in_runner_task
| return await future
| ^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2097, in _run_tests_and_fixtures
| retval = await coro
| ^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/config/exporter_test.py", line 46, in test_exporter_serve
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/jumpstarter/config/exporter_test.py", line 50, in test_exporter_serve
| async with client.lease_async(metadata_filter=MetadataFilter(), portal=portal) as lease:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/config/client.py", line 83, in lease_async
| async with Lease(
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 36, in __aenter__
| self.lease = await self.controller.RequestLease(
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:20.866003406+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:44357: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
| >
+------------------------------------
___________________________________________________________ test_drivers_mock_storage_mux_http ___________________________________________________________
def test_drivers_mock_storage_mux_http():
class StaticHandler(BaseHTTPRequestHandler):
def do_HEAD(self):
self.send_response(200)
self.send_header("content-length", 11 * 1000)
self.end_headers()
def do_GET(self):
self.send_response(200)
self.send_header("content-length", 11 * 1000)
self.end_headers()
self.wfile.write(b"testcontent" * 1000)
with serve(MockStorageMux()) as client:
> server = HTTPServer(("127.0.0.1", 8080), StaticHandler)
jumpstarter/drivers/storage/driver_test.py:43:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
../.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/socketserver.py:457: in __init__
self.server_bind()
../.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/http/server.py:136: in server_bind
socketserver.TCPServer.server_bind(self)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <http.server.HTTPServer object at 0x7f0f0155dd60>
def server_bind(self):
"""Called by constructor to bind the socket.
May be overridden.
"""
if self.allow_reuse_address and hasattr(socket, "SO_REUSEADDR"):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
if self.allow_reuse_port and hasattr(socket, "SO_REUSEPORT"):
self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)
> self.socket.bind(self.server_address)
E OSError: [Errno 98] Address already in use
../.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/socketserver.py:473: OSError
______________________________________________________________________ test_router _______________________________________________________________________
handler = <function test_router.<locals>.handle_async at 0x7f0f0142bba0>
@asynccontextmanager
async def TemporaryUnixListener(handler):
with TemporarySocket() as path:
async with await create_unix_listener(path) as listener:
async with create_task_group() as tg:
tg.start_soon(listener.serve, handler, tg)
try:
> yield path
jumpstarter/common/tempfile.py:23:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
jumpstarter/client/lease.py:81: in serve_unix_async
yield path
jumpstarter/client/lease.py:86: in connect_async
async with client_from_path(path, self.portal) as client:
../.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py:210: in __aenter__
return await anext(self.gen)
jumpstarter/client/client.py:21: in client_from_path
yield await client_from_channel(channel, portal)
jumpstarter/client/client.py:32: in client_from_channel
response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_AioCall of RPC that terminated with:
status = failed to connect to all addresses; last error: UNAVAILABLE: unix:/tm..."failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
>
def __await__(self) -> Generator[Any, None, ResponseType]:
"""Wait till the ongoing RPC request finishes."""
try:
response = yield from self._call_response
except asyncio.CancelledError:
# Even if we caught all other CancelledError, there is still
# this corner case. If the application cancels immediately after
# the Call object is created, we will observe this
# `CancelledError`.
if not self.cancelled():
self.cancel()
raise
# NOTE(lidiz) If we raise RpcError in the task, and users doesn't
# 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
# Instead, if we move the exception raising here, the spam stops.
# Unfortunately, there can only be one 'yield from' in '__await__'. So,
# we need to access the private instance variable.
if response is cygrpc.EOF:
if self._cython_call.is_locally_cancelled():
raise asyncio.CancelledError()
else:
> raise _create_rpc_error(
self._cython_call._initial_metadata,
self._cython_call._status,
)
E grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E status = StatusCode.UNAVAILABLE
E details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
E debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
E >
../.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py:327: AioRpcError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 23, in TemporaryUnixListener
yield path
File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 81, in serve_unix_async
yield path
File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 86, in connect_async
async with client_from_path(path, self.portal) as client:
File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 21, in client_from_path
yield await client_from_channel(channel, portal)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 32, in client_from_channel
response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
raise _create_rpc_error(
grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
>
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 45, in test_router
| async with lease.connect_async() as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 85, in connect_async
| async with self.serve_unix_async() as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 80, in serve_unix_async
| async with TemporaryUnixListener(self.handle_async) as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 20, in TemporaryUnixListener
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 23, in TemporaryUnixListener
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 81, in serve_unix_async
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 86, in connect_async
| async with client_from_path(path, self.portal) as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 21, in client_from_path
| yield await client_from_channel(channel, portal)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 32, in client_from_channel
| response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
| >
+------------------------------------
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 45, in test_router
| async with lease.connect_async() as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 85, in connect_async
| async with self.serve_unix_async() as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 80, in serve_unix_async
| async with TemporaryUnixListener(self.handle_async) as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 20, in TemporaryUnixListener
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 23, in TemporaryUnixListener
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 81, in serve_unix_async
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 86, in connect_async
| async with client_from_path(path, self.portal) as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 21, in client_from_path
| yield await client_from_channel(channel, portal)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 32, in client_from_channel
| response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
| >
+------------------------------------
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 341, in from_call
| result: TResult | None = func()
| ^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 242, in <lambda>
| lambda: runtest_hook(item=item, **kwds), when=when, reraise=reraise
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 182, in _multicall
| return outcome.get_result()
| ^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_result.py", line 100, in get_result
| raise exc.with_traceback(exc.__traceback__)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/threadexception.py", line 92, in pytest_runtest_call
| yield from thread_exception_runtest_hook()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/threadexception.py", line 68, in thread_exception_runtest_hook
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 95, in pytest_runtest_call
| yield from unraisable_exception_runtest_hook()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/unraisableexception.py", line 70, in unraisable_exception_runtest_hook
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/logging.py", line 846, in pytest_runtest_call
| yield from self._runtest_for(item, "call")
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/logging.py", line 829, in _runtest_for
| yield
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/capture.py", line 880, in pytest_runtest_call
| return (yield)
| ^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 167, in _multicall
| teardown.throw(outcome._exception)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/skipping.py", line 257, in pytest_runtest_call
| return (yield)
| ^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
| res = hook_impl.function(*args)
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/runner.py", line 174, in pytest_runtest_call
| item.runtest()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/_pytest/python.py", line 1627, in runtest
| self.ihook.pytest_pyfunc_call(pyfuncitem=self)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_hooks.py", line 513, in __call__
| return self._hookexec(self.name, self._hookimpls.copy(), kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_manager.py", line 120, in _hookexec
| return self._inner_hookexec(hook_name, methods, kwargs, firstresult)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 139, in _multicall
| raise exception.with_traceback(exception.__traceback__)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/pluggy/_callers.py", line 103, in _multicall
| res = hook_impl.function(*args)
| ^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/pytest_plugin.py", line 160, in pytest_pyfunc_call
| runner.run_test(pyfuncitem.obj, testargs)
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2176, in run_test
| self._raise_async_exceptions()
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2080, in _raise_async_exceptions
| raise exceptions[0]
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2170, in run_test
| self.get_loop().run_until_complete(
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/asyncio/base_events.py", line 687, in run_until_complete
| return future.result()
| ^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2130, in _call_in_runner_task
| return await future
| ^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 2097, in _run_tests_and_fixtures
| retval = await coro
| ^^^^^^^^^^
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 34, in test_router
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 23, in TemporaryUnixListener
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 81, in serve_unix_async
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 86, in connect_async
| async with client_from_path(path, self.portal) as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 21, in client_from_path
| yield await client_from_channel(channel, portal)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 32, in client_from_channel
| response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
| >
|
| During handling of the above exception, another exception occurred:
|
| Exception Group Traceback (most recent call last):
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 45, in test_router
| async with lease.connect_async() as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 85, in connect_async
| async with self.serve_unix_async() as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 80, in serve_unix_async
| async with TemporaryUnixListener(self.handle_async) as path:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 231, in __aexit__
| await self.gen.athrow(value)
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 20, in TemporaryUnixListener
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/jumpstarter/common/tempfile.py", line 23, in TemporaryUnixListener
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 81, in serve_unix_async
| yield path
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 86, in connect_async
| async with client_from_path(path, self.portal) as client:
| File "/home/majopela/.local/share/uv/python/cpython-3.12.3-linux-x86_64-gnu/lib/python3.12/contextlib.py", line 210, in __aenter__
| return await anext(self.gen)
| ^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 21, in client_from_path
| yield await client_from_channel(channel, portal)
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/jumpstarter/jumpstarter/client/client.py", line 32, in client_from_channel
| response = await jumpstarter_pb2_grpc.ExporterServiceStub(channel).GetReport(empty_pb2.Empty())
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.572393001+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNAVAILABLE: unix:/tmp/jumpstarter-kl51mjm1/socket: Socket closed"}"
| >
+------------------------------------
____________________________________________________________________ test_controller _____________________________________________________________________
mock_controller = '127.0.0.1:46259'
@pytest.mark.xfail(raises=RuntimeError)
async def test_controller(mock_controller):
uuid = uuid4()
async with Exporter(
channel=grpc.aio.secure_channel(mock_controller, grpc.ssl_channel_credentials()),
uuid=uuid,
labels={},
device_factory=lambda: MockPower(),
) as exporter:
async with create_task_group() as tg:
tg.start_soon(exporter.serve)
with start_blocking_portal() as portal:
> async with Lease(
channel=grpc.aio.secure_channel(mock_controller, grpc.ssl_channel_credentials()),
metadata_filter=MetadataFilter(),
portal=portal,
) as lease:
tests/test_listener.py:64:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
jumpstarter/client/lease.py:36: in __aenter__
self.lease = await self.controller.RequestLease(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_AioCall of RPC that terminated with:
status = failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0...iled (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
>
def __await__(self) -> Generator[Any, None, ResponseType]:
"""Wait till the ongoing RPC request finishes."""
try:
response = yield from self._call_response
except asyncio.CancelledError:
# Even if we caught all other CancelledError, there is still
# this corner case. If the application cancels immediately after
# the Call object is created, we will observe this
# `CancelledError`.
if not self.cancelled():
self.cancel()
raise
# NOTE(lidiz) If we raise RpcError in the task, and users doesn't
# 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
# Instead, if we move the exception raising here, the spam stops.
# Unfortunately, there can only be one 'yield from' in '__await__'. So,
# we need to access the private instance variable.
if response is cygrpc.EOF:
if self._cython_call.is_locally_cancelled():
raise asyncio.CancelledError()
else:
> raise _create_rpc_error(
self._cython_call._initial_metadata,
self._cython_call._status,
)
E grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E status = StatusCode.UNAVAILABLE
E details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
E debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.637283203+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
E >
../.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py:327: AioRpcError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/majopela/jumpstarter/tests/test_listener.py", line 64, in test_controller
async with Lease(
File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 36, in __aenter__
self.lease = await self.controller.RequestLease(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
raise _create_rpc_error(
grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
status = StatusCode.UNAVAILABLE
details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.637283203+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
>
During handling of the above exception, another exception occurred:
+ Exception Group Traceback (most recent call last):
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 60, in test_controller
| async with create_task_group() as tg:
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/anyio/_backends/_asyncio.py", line 685, in __aexit__
| raise BaseExceptionGroup(
| ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
+-+---------------- 1 ----------------
| Traceback (most recent call last):
| File "/home/majopela/jumpstarter/tests/test_listener.py", line 64, in test_controller
| async with Lease(
| File "/home/majopela/jumpstarter/jumpstarter/client/lease.py", line 36, in __aenter__
| self.lease = await self.controller.RequestLease(
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| File "/home/majopela/.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py", line 327, in __await__
| raise _create_rpc_error(
| grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
| status = StatusCode.UNAVAILABLE
| details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
| debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.637283203+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
| >
+------------------------------------
During handling of the above exception, another exception occurred:
mock_controller = '127.0.0.1:46259'
@pytest.mark.xfail(raises=RuntimeError)
async def test_controller(mock_controller):
uuid = uuid4()
> async with Exporter(
channel=grpc.aio.secure_channel(mock_controller, grpc.ssl_channel_credentials()),
uuid=uuid,
labels={},
device_factory=lambda: MockPower(),
) as exporter:
tests/test_listener.py:54:
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
jumpstarter/exporter/exporter.py:35: in __aexit__
await self.controller.Unregister(
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
self = <_AioCall of RPC that terminated with:
status = failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0...iled (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
>
def __await__(self) -> Generator[Any, None, ResponseType]:
"""Wait till the ongoing RPC request finishes."""
try:
response = yield from self._call_response
except asyncio.CancelledError:
# Even if we caught all other CancelledError, there is still
# this corner case. If the application cancels immediately after
# the Call object is created, we will observe this
# `CancelledError`.
if not self.cancelled():
self.cancel()
raise
# NOTE(lidiz) If we raise RpcError in the task, and users doesn't
# 'await' on it. AsyncIO will log 'Task exception was never retrieved'.
# Instead, if we move the exception raising here, the spam stops.
# Unfortunately, there can only be one 'yield from' in '__await__'. So,
# we need to access the private instance variable.
if response is cygrpc.EOF:
if self._cython_call.is_locally_cancelled():
raise asyncio.CancelledError()
else:
> raise _create_rpc_error(
self._cython_call._initial_metadata,
self._cython_call._status,
)
E grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
E status = StatusCode.UNAVAILABLE
E details = "failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"
E debug_error_string = "UNKNOWN:Error received from peer {created_time:"2024-10-16T09:47:22.638772528+02:00", grpc_status:14, grpc_message:"failed to connect to all addresses; last error: UNKNOWN: ipv4:127.0.0.1:46259: Ssl handshake failed (TSI_PROTOCOL_FAILURE): SSL_ERROR_SSL: error:1000007d:SSL routines:OPENSSL_internal:CERTIFICATE_VERIFY_FAILED"}"
E >
../.cache/uv/builds-v0/.tmpmA5xPI/lib/python3.12/site-packages/grpc/aio/_call.py:327: AioRpcError
---------- coverage: platform linux, python 3.12.3-final-0 -----------
Coverage HTML written to dir htmlcov
Coverage XML written to file coverage.xml
================================================================ short test summary info =================================================================
FAILED jumpstarter/config/exporter_test.py::test_exporter_serve - ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
FAILED jumpstarter/drivers/storage/driver_test.py::test_drivers_mock_storage_mux_http - OSError: [Errno 98] Address already in use
FAILED tests/test_listener.py::test_router - ExceptionGroup: unhandled errors in a TaskGroup (1 sub-exception)
FAILED tests/test_listener.py::test_controller - grpc.aio._call.AioRpcError: <AioRpcError of RPC that terminated with:
======================================================== 4 failed, 59 passed, 1 skipped in 5.09s =========================================================
make: *** [Makefile:20: test-jumpstarter] Error 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment