Skip to content

[monitorlib/fetch] query_and_describe: catch AccessTokenError - #1834

Merged
mickmis merged 2 commits into
mainfrom
catch-access-token-error
Oct 20, 2026
Merged

mickmis merged 2 commits into
mainfrom
catch-access-token-error

Conversation

@mickmis

@mickmis mickmis commented Oct 20, 2026

Copy link
Copy Markdown
Contributor

It is possible for query_and_describe to raise an exception that is not caught anywhere and make a test run fail when it attempts to retrieve silently a token but fails to do so, e.g.:

Message: Unable to retrieve access token: {"error":"invalid_scope"}

Stack trace:

Traceback (most recent call last):
  File "/app/monitoring/uss_qualifier/suites/suite.py", line 168, in _run_test_scenario
    scenario.run(context)
    ~~~~~~~~~~~~^^^^^^^^^
  File "/app/monitoring/uss_qualifier/scenarios/astm/utm/data_exchange_validation/get_op_data_validation.py", line 138, in run
    self._plan_successfully_test_case()
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
  File "/app/monitoring/uss_qualifier/scenarios/astm/utm/data_exchange_validation/get_op_data_validation.py", line 196, in _plan_successfully_test_case
    expect_uss_obtained_op_intent_details(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        self,
        ^^^^^
    ...<3 lines>...
        self.tested_uss_client.participant_id,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/app/monitoring/uss_qualifier/scenarios/astm/utm/data_exchange_validation/test_steps/expected_interactions_test_steps.py", line 130, in expect_uss_obtained_op_intent_details
    all_interactions, query = get_mock_uss_interactions(
                              ~~~~~~~~~~~~~~~~~~~~~~~~~^
        scenario,
        ^^^^^^^^^
        mock_uss,
        ^^^^^^^^^
        st,
        ^^^
    )
    ^
  File "/app/monitoring/uss_qualifier/scenarios/interuss/mock_uss/test_steps.py", line 50, in get_mock_uss_interactions
    interactions, query = mock_uss.get_interactions(since)
                          ~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^
  File "/app/monitoring/uss_qualifier/resources/interuss/mock_uss/client.py", line 125, in get_interactions
    query = fetch.query_and_describe(
        self.session,
    ...<4 lines>...
        query_type=QueryType.InterUSSMockUSSGetLogs,
    )
  File "/app/monitoring/monitorlib/fetch/__init__.py", line 727, in query_and_describe
    _client.request(verb, url, **req_kwargs),
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/app/monitoring/monitorlib/infrastructure.py", line 252, in request
    return super().request(method, url, *args, **kwargs)
           ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/venv/lib/python3.13/site-packages/requests/sessions.py", line 635, in request
    prep = self.prepare_request(req)
  File "/app/monitoring/monitorlib/infrastructure.py", line 211, in prepare_request
    return super().prepare_request(request, **kwargs)
           ~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^
  File "/venv/lib/python3.13/site-packages/requests/sessions.py", line 541, in prepare_request
    p.prepare(
    ~~~~~~~~~^
        method=method.upper(),
        ^^^^^^^^^^^^^^^^^^^^^^
    ...<10 lines>...
        hooks=merge_hooks(request.hooks, self.hooks),
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/venv/lib/python3.13/site-packages/requests/models.py", line 443, in prepare
    self.prepare_auth(auth, url)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^
  File "/venv/lib/python3.13/site-packages/requests/models.py", line 689, in prepare_auth
    r = auth_handler(self)
  File "/app/monitoring/monitorlib/infrastructure.py", line 240, in 
    kwargs["auth"] = lambda req: self.add_auth(req, scopes)
                                 ~~~~~~~~~~~~~^^^^^^^^^^^^^
  File "/app/monitoring/monitorlib/infrastructure.py", line 217, in add_auth
    additional_headers = self.auth_adapter.add_headers(prepared_request, scopes)
  File "/app/monitoring/monitorlib/infrastructure.py", line 93, in add_headers
    additional_headers = self.get_headers(request.url, scopes)
  File "/app/monitoring/monitorlib/infrastructure.py", line 73, in get_headers
    token = self.issue_token(intended_audience, scopes)
  File "/app/monitoring/monitorlib/auth.py", line 556, in issue_token
    raise AccessTokenError(
        "Unable to retrieve access token:\n" + response.content.decode("utf-8")
    )
monitoring.monitorlib.auth.AccessTokenError: Unable to retrieve access token:
{"error":"invalid_scope"}

With this PR the exception is caught and handled as a non-retryable error.

Comment thread monitoring/monitorlib/fetch/__init__.py Outdated
Co-authored-by: Benjamin Pelletier <BenjaminPelletier@users.noreply.github.com>
@mickmis
mickmis merged commit ce78353 into main Oct 20, 2026
27 checks passed
@mickmis
mickmis deleted the catch-access-token-error branch October 20, 2026 15:07
github-actions Bot added a commit that referenced this pull request Oct 20, 2026
Co-authored-by: Benjamin Pelletier <BenjaminPelletier@users.noreply.github.com> ce78353
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants