Fix on-work-request-completed if invalid token is sent

debusine.client on-work-request-completed exits with a backtrace (see below). I've checked on Bookworm branch only.

Update: debusine.client is receiving: '{"type": "connection_rejected", "reason": "No token header, token not associated to a user or not enabled"}' when connecting to: ws://SERVER/api/ws/1.0/work-request/on-completed/.

For other operations:

carles@pinux:[on-work-request-completed]~/git/debusine$ python3 -m debusine.client --server exoscale show-work-request 1
Server rejected connection: HTTP 403. Token (178b67d943867bbe57450fedbd930fb5c11e5fcad80d0a36f0c9497aa8cce6fe) is invalid or disabled
carles@pinux:[on-work-request-completed]~/git/debusine$ 

This is correct (I've been removing tokens in the server while testing something else). What's not correct is showing the backtrace to the user:

carles@pinux:[worker-str]~/git/debusine$ python3 -m debusine.client --server exoscale on-work-request-completed echo 
Requesting ws://89.145.160.104/api/ws/1.0/work-request/on-completed/
Connected! Waiting for notifications
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/carles/git/debusine/debusine/client/__main__.py", line 24, in <module>
    entry_point()
  File "/home/carles/git/debusine/debusine/client/__main__.py", line 20, in entry_point
    main.execute()
  File "/home/carles/git/debusine/debusine/client/cli.py", line 245, in execute
    self._on_work_request_completed(
  File "/home/carles/git/debusine/debusine/client/cli.py", line 472, in _on_work_request_completed
    debusine.on_work_request_completed(
  File "/home/carles/git/debusine/debusine/client/debusine.py", line 443, in on_work_request_completed
    asyncio.run(
  File "/usr/lib/python3.11/asyncio/runners.py", line 190, in run
    return runner.run(main)
           ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/asyncio/runners.py", line 118, in run
    return self._loop.run_until_complete(task)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/asyncio/base_events.py", line 653, in run_until_complete
    return future.result()
           ^^^^^^^^^^^^^^^
  File "/home/carles/git/debusine/debusine/client/debusine.py", line 380, in _wait_and_execute
    await do_wait_for_messages(session)
  File "/usr/lib/python3/dist-packages/tenacity/_asyncio.py", line 88, in async_wrapped
    return await fn(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/tenacity/_asyncio.py", line 47, in __call__
    do = self.iter(retry_state=retry_state)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/tenacity/__init__.py", line 314, in iter
    return fut.result()
           ^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 449, in result
    return self.__get_result()
           ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/concurrent/futures/_base.py", line 401, in __get_result
    raise self._exception
  File "/usr/lib/python3/dist-packages/tenacity/_asyncio.py", line 50, in __call__
    result = await fn(*args, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/carles/git/debusine/debusine/client/debusine.py", line 361, in do_wait_for_messages
    OnWorkRequestCompleted.parse_obj(msg.json())
  File "/usr/lib/python3/dist-packages/pydantic/main.py", line 527, in parse_obj
    return cls(**obj)
           ^^^^^^^^^^
  File "/usr/lib/python3/dist-packages/pydantic/main.py", line 342, in __init__
    raise validation_error
pydantic.error_wrappers.ValidationError: 3 validation errors for OnWorkRequestCompleted
work_request_id
  field required (type=value_error.missing)
completed_at
  field required (type=value_error.missing)
result
  field required (type=value_error.missing)
carles@pinux:[worker-str]~/git/debusine$ 
Edited by Carles Pina i Estany