Skip to content

Commit 5382eb3

Browse files
Set up the transport for reposting failed calls and bump supported python version (#668)
Ugly requirement coming from the way the workflows transport is set up and how the murfey transport is defined. Will want revisiting in future. Leads to a bump in the python version as this requires workflows 3
1 parent 3e47841 commit 5382eb3

File tree

5 files changed

+41
-22
lines changed

5 files changed

+41
-22
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ jobs:
1414
runs-on: ubuntu-latest
1515
strategy:
1616
matrix:
17-
python-version: ["3.9", "3.10", "3.11"]
17+
python-version: ["3.10", "3.11", "3.12"]
1818
services:
1919
mariadb:
2020
image: mariadb:11.7.2 # released 2024-05-06

pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,14 @@ keywords = [
1616
license = {file = "LICENSE"}
1717
maintainers = []
1818
authors = []
19-
requires-python = ">=3.9"
19+
requires-python = ">=3.10"
2020
classifiers = [
2121
"Development Status :: 3 - Alpha",
2222
"Environment :: Console",
2323
"Intended Audience :: Science/Research",
2424
"License :: OSI Approved :: BSD License",
2525
"Operating System :: OS Independent",
2626
"Programming Language :: Python :: 3 :: Only",
27-
"Programming Language :: Python :: 3.9",
2827
"Programming Language :: Python :: 3.10",
2928
"Programming Language :: Python :: 3.11",
3029
"Programming Language :: Python :: 3.12",

src/murfey/cli/repost_failed_calls.py

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,22 +10,8 @@
1010
from sqlmodel import Session, create_engine
1111
from workflows.transport.pika_transport import PikaTransport
1212

13-
import murfey.server.api.auth
14-
import murfey.server.api.bootstrap
15-
import murfey.server.api.clem
16-
import murfey.server.api.display
17-
import murfey.server.api.file_io_frontend
18-
import murfey.server.api.file_io_instrument
19-
import murfey.server.api.hub
20-
import murfey.server.api.instrument
21-
import murfey.server.api.mag_table
22-
import murfey.server.api.processing_parameters
23-
import murfey.server.api.prometheus
24-
import murfey.server.api.session_control
25-
import murfey.server.api.session_info
26-
import murfey.server.api.websocket
27-
import murfey.server.api.workflow
2813
from murfey.server.murfey_db import url
14+
from murfey.server.run import _set_up_transport
2915
from murfey.util.config import security_from_file
3016

3117

@@ -104,6 +90,23 @@ def handle_dlq_messages(messages_path: list[Path], rabbitmq_credentials: Path):
10490

10591
def handle_failed_posts(messages_path: list[Path], murfey_db: Session):
10692
"""Deal with any messages that have been sent as failed client posts"""
93+
# These imports need to happen after transport object is configured
94+
import murfey.server.api.auth
95+
import murfey.server.api.bootstrap
96+
import murfey.server.api.clem
97+
import murfey.server.api.display
98+
import murfey.server.api.file_io_frontend
99+
import murfey.server.api.file_io_instrument
100+
import murfey.server.api.hub
101+
import murfey.server.api.instrument
102+
import murfey.server.api.mag_table
103+
import murfey.server.api.processing_parameters
104+
import murfey.server.api.prometheus
105+
import murfey.server.api.session_control
106+
import murfey.server.api.session_info
107+
import murfey.server.api.websocket
108+
import murfey.server.api.workflow
109+
107110
for json_file in messages_path:
108111
with open(json_file, "r") as json_data:
109112
message = json.load(json_data)
@@ -181,6 +184,15 @@ def run():
181184
# Read the security config file
182185
security_config = security_from_file(args.config)
183186

187+
# Configure the transport
188+
PikaTransport().load_configuration_file(security_config.rabbitmq_credentials)
189+
_set_up_transport("PikaTransport")
190+
191+
# Now import transport object which was set up in the above step
192+
from murfey.server import _transport_object
193+
194+
_transport_object.feedback_queue = security_config.feedback_queue
195+
184196
# Purge the queue and repost/reinject any messages found
185197
dlq_dump_path = Path(args.dir)
186198
dlq_dump_path.mkdir(parents=True, exist_ok=True)

tests/cli/test_repost_failed_calls.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,8 @@ def test_handle_failed_posts(tmp_path):
187187
assert (tmp_path / "msg6").is_file() # function does not exist
188188

189189

190+
@mock.patch("workflows.transport.pika_transport.PikaTransport")
191+
@mock.patch("murfey.cli.repost_failed_calls.PikaTransport")
190192
@mock.patch("murfey.cli.repost_failed_calls.dlq_purge")
191193
@mock.patch("murfey.cli.repost_failed_calls.handle_failed_posts")
192194
@mock.patch("murfey.cli.repost_failed_calls.handle_dlq_messages")
@@ -200,6 +202,8 @@ def test_run_repost_failed_calls(
200202
mock_reinject,
201203
mock_repost,
202204
mock_purge,
205+
mock_pika,
206+
mock_workflows,
203207
mock_security_configuration,
204208
):
205209
mock_session = mock.MagicMock()
@@ -227,6 +231,11 @@ def test_run_repost_failed_calls(
227231
mock_db_engine.assert_called_with("db_url")
228232
mock_db_session.assert_called_with("db_engine")
229233

234+
mock_pika().load_configuration_file.assert_called_with(
235+
Path("/path/to/rabbitmq.yaml")
236+
)
237+
mock_workflows().connect.assert_called_once()
238+
230239
mock_purge.assert_called_once_with(
231240
Path("DLQ_dir"),
232241
"murfey_feedback",

tests/server/test_main.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ def login(test_user):
2424
f"{url_path_for('auth.router', 'generate_token')}",
2525
data=test_user,
2626
)
27-
assert mock_validate.called_once()
27+
mock_validate.assert_called_once()
2828
assert response.status_code == 200
2929
token = response.json()["access_token"]
3030
assert token is not None
@@ -35,10 +35,9 @@ def login(test_user):
3535
def test_read_main(mock_check, test_user):
3636
token = login(test_user)
3737
response = client.get(
38-
"/session_info/connections",
39-
headers={"Authorization": f"Bearer {token}"}
38+
"/session_info/connections", headers={"Authorization": f"Bearer {token}"}
4039
)
41-
assert mock_check.called_once()
40+
mock_check.assert_called_once()
4241
assert response.status_code == 200
4342

4443

0 commit comments

Comments
 (0)