From b4427fc7970d1c7f1d3b98393d5d9de9d6d9a34e Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 11:57:27 +0100 Subject: [PATCH 1/6] Set up the transport for the reposts --- src/murfey/cli/repost_failed_calls.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/murfey/cli/repost_failed_calls.py b/src/murfey/cli/repost_failed_calls.py index 525b60598..295d4886c 100644 --- a/src/murfey/cli/repost_failed_calls.py +++ b/src/murfey/cli/repost_failed_calls.py @@ -26,6 +26,7 @@ import murfey.server.api.websocket import murfey.server.api.workflow from murfey.server.murfey_db import url +from murfey.server.run import _set_up_transport from murfey.util.config import security_from_file @@ -178,8 +179,10 @@ def run(): ) args = parser.parse_args() - # Read the security config file + # Read the security config file and configure the transport security_config = security_from_file(args.config) + PikaTransport().load_configuration_file(security_config.rabbitmq_credentials) + _set_up_transport("PikaTransport") # Purge the queue and repost/reinject any messages found dlq_dump_path = Path(args.dir) From f96c1964410db767d16997e07ef9a621a4673ac6 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 12:24:54 +0100 Subject: [PATCH 2/6] Fix broken test --- src/murfey/cli/repost_failed_calls.py | 1 + tests/cli/test_repost_failed_calls.py | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/murfey/cli/repost_failed_calls.py b/src/murfey/cli/repost_failed_calls.py index 295d4886c..9a98a9a4c 100644 --- a/src/murfey/cli/repost_failed_calls.py +++ b/src/murfey/cli/repost_failed_calls.py @@ -183,6 +183,7 @@ def run(): security_config = security_from_file(args.config) PikaTransport().load_configuration_file(security_config.rabbitmq_credentials) _set_up_transport("PikaTransport") + murfey.server._transport_object.feedback_queue = security_config.feedback_queue # Purge the queue and repost/reinject any messages found dlq_dump_path = Path(args.dir) diff --git a/tests/cli/test_repost_failed_calls.py b/tests/cli/test_repost_failed_calls.py index 1a2f6df12..1bb841d52 100644 --- a/tests/cli/test_repost_failed_calls.py +++ b/tests/cli/test_repost_failed_calls.py @@ -187,6 +187,8 @@ def test_handle_failed_posts(tmp_path): assert (tmp_path / "msg6").is_file() # function does not exist +@mock.patch("workflows.transport.pika_transport.PikaTransport") +@mock.patch("murfey.cli.repost_failed_calls.PikaTransport") @mock.patch("murfey.cli.repost_failed_calls.dlq_purge") @mock.patch("murfey.cli.repost_failed_calls.handle_failed_posts") @mock.patch("murfey.cli.repost_failed_calls.handle_dlq_messages") @@ -200,6 +202,8 @@ def test_run_repost_failed_calls( mock_reinject, mock_repost, mock_purge, + mock_pika, + mock_workflows, mock_security_configuration, ): mock_session = mock.MagicMock() @@ -227,6 +231,11 @@ def test_run_repost_failed_calls( mock_db_engine.assert_called_with("db_url") mock_db_session.assert_called_with("db_engine") + mock_pika().load_configuration_file.assert_called_with( + Path("/path/to/rabbitmq.yaml") + ) + mock_workflows().connect.assert_called_once() + mock_purge.assert_called_once_with( Path("DLQ_dir"), "murfey_feedback", From 6bf9892a904bf6a882b8586af33653f27bb05cf3 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 13:41:15 +0100 Subject: [PATCH 3/6] Import sequence matters --- src/murfey/cli/repost_failed_calls.py | 42 ++++++++++++++++----------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/murfey/cli/repost_failed_calls.py b/src/murfey/cli/repost_failed_calls.py index 9a98a9a4c..5bb326429 100644 --- a/src/murfey/cli/repost_failed_calls.py +++ b/src/murfey/cli/repost_failed_calls.py @@ -10,21 +10,6 @@ from sqlmodel import Session, create_engine from workflows.transport.pika_transport import PikaTransport -import murfey.server.api.auth -import murfey.server.api.bootstrap -import murfey.server.api.clem -import murfey.server.api.display -import murfey.server.api.file_io_frontend -import murfey.server.api.file_io_instrument -import murfey.server.api.hub -import murfey.server.api.instrument -import murfey.server.api.mag_table -import murfey.server.api.processing_parameters -import murfey.server.api.prometheus -import murfey.server.api.session_control -import murfey.server.api.session_info -import murfey.server.api.websocket -import murfey.server.api.workflow from murfey.server.murfey_db import url from murfey.server.run import _set_up_transport from murfey.util.config import security_from_file @@ -118,6 +103,23 @@ def handle_failed_posts(messages_path: list[Path], murfey_db: Session): continue try: + # These imports need to happen after transport object is configured + import murfey.server.api.auth + import murfey.server.api.bootstrap + import murfey.server.api.clem + import murfey.server.api.display + import murfey.server.api.file_io_frontend + import murfey.server.api.file_io_instrument + import murfey.server.api.hub + import murfey.server.api.instrument + import murfey.server.api.mag_table + import murfey.server.api.processing_parameters + import murfey.server.api.prometheus + import murfey.server.api.session_control + import murfey.server.api.session_info + import murfey.server.api.websocket + import murfey.server.api.workflow + function_to_call = getattr( getattr(murfey.server.api, router_base), function_name ) @@ -179,11 +181,17 @@ def run(): ) args = parser.parse_args() - # Read the security config file and configure the transport + # Read the security config file security_config = security_from_file(args.config) + + # Configure the transport PikaTransport().load_configuration_file(security_config.rabbitmq_credentials) _set_up_transport("PikaTransport") - murfey.server._transport_object.feedback_queue = security_config.feedback_queue + + # Now import transport object which was set up in the above step + from murfey.server import _transport_object + + _transport_object.feedback_queue = security_config.feedback_queue # Purge the queue and repost/reinject any messages found dlq_dump_path = Path(args.dir) From 953e08bbf84db7e0da015e24345c3c80d1c8e642 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 14:01:49 +0100 Subject: [PATCH 4/6] Bump supported python version from 3.9-11 to 3.10-12 --- .github/workflows/ci.yml | 2 +- pyproject.toml | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a2a490928..18f30d949 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: ["3.9", "3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] services: mariadb: image: mariadb:11.7.2 # released 2024-05-06 diff --git a/pyproject.toml b/pyproject.toml index 7a3ad3b9f..5dc664769 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -16,7 +16,7 @@ keywords = [ license = {file = "LICENSE"} maintainers = [] authors = [] -requires-python = ">=3.9" +requires-python = ">=3.10" classifiers = [ "Development Status :: 3 - Alpha", "Environment :: Console", @@ -24,7 +24,6 @@ classifiers = [ "License :: OSI Approved :: BSD License", "Operating System :: OS Independent", "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", "Programming Language :: Python :: 3.12", From bcf55cac743462342881841aa0b3c281aa6b5802 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 14:17:32 +0100 Subject: [PATCH 5/6] Update old assertion statements --- tests/server/test_main.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/tests/server/test_main.py b/tests/server/test_main.py index b212b705d..828e15ef8 100644 --- a/tests/server/test_main.py +++ b/tests/server/test_main.py @@ -24,7 +24,7 @@ def login(test_user): f"{url_path_for('auth.router', 'generate_token')}", data=test_user, ) - assert mock_validate.called_once() + mock_validate.assert_called_once() assert response.status_code == 200 token = response.json()["access_token"] assert token is not None @@ -35,10 +35,9 @@ def login(test_user): def test_read_main(mock_check, test_user): token = login(test_user) response = client.get( - "/session_info/connections", - headers={"Authorization": f"Bearer {token}"} + "/session_info/connections", headers={"Authorization": f"Bearer {token}"} ) - assert mock_check.called_once() + mock_check.assert_called_once() assert response.status_code == 200 From 921790a699853c4802f5a67704179d4b962cb588 Mon Sep 17 00:00:00 2001 From: yxd92326 Date: Tue, 23 Sep 2025 15:26:20 +0100 Subject: [PATCH 6/6] Move imports out of loop --- src/murfey/cli/repost_failed_calls.py | 34 +++++++++++++-------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/murfey/cli/repost_failed_calls.py b/src/murfey/cli/repost_failed_calls.py index 5bb326429..7c7c7c9f2 100644 --- a/src/murfey/cli/repost_failed_calls.py +++ b/src/murfey/cli/repost_failed_calls.py @@ -90,6 +90,23 @@ def handle_dlq_messages(messages_path: list[Path], rabbitmq_credentials: Path): def handle_failed_posts(messages_path: list[Path], murfey_db: Session): """Deal with any messages that have been sent as failed client posts""" + # These imports need to happen after transport object is configured + import murfey.server.api.auth + import murfey.server.api.bootstrap + import murfey.server.api.clem + import murfey.server.api.display + import murfey.server.api.file_io_frontend + import murfey.server.api.file_io_instrument + import murfey.server.api.hub + import murfey.server.api.instrument + import murfey.server.api.mag_table + import murfey.server.api.processing_parameters + import murfey.server.api.prometheus + import murfey.server.api.session_control + import murfey.server.api.session_info + import murfey.server.api.websocket + import murfey.server.api.workflow + for json_file in messages_path: with open(json_file, "r") as json_data: message = json.load(json_data) @@ -103,23 +120,6 @@ def handle_failed_posts(messages_path: list[Path], murfey_db: Session): continue try: - # These imports need to happen after transport object is configured - import murfey.server.api.auth - import murfey.server.api.bootstrap - import murfey.server.api.clem - import murfey.server.api.display - import murfey.server.api.file_io_frontend - import murfey.server.api.file_io_instrument - import murfey.server.api.hub - import murfey.server.api.instrument - import murfey.server.api.mag_table - import murfey.server.api.processing_parameters - import murfey.server.api.prometheus - import murfey.server.api.session_control - import murfey.server.api.session_info - import murfey.server.api.websocket - import murfey.server.api.workflow - function_to_call = getattr( getattr(murfey.server.api, router_base), function_name )