Skip to content

Commit de52f82

Browse files
committed
f
1 parent c8b9799 commit de52f82

3 files changed

Lines changed: 111 additions & 27 deletions

File tree

bec_ipython_client/tests/end-2-end/test_scans_lib_e2e.py

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -411,32 +411,40 @@ def test_config_reload_with_describe_failure(bec_test_config_file_path, bec_clie
411411
},
412412
}
413413

414-
# set hexapod to fail
415-
bec.connector.set(
416-
f"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=1)
417-
)
414+
try:
415+
# set hexapod to fail
416+
bec.connector.set(
417+
"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=1)
418+
)
418419

419-
# write new config to disk
420-
with open(runtime_config_file_path, "w") as f:
421-
f.write(yaml.dump(config))
420+
# write new config to disk
421+
with open(runtime_config_file_path, "w") as f:
422+
f.write(yaml.dump(config))
422423

423-
with pytest.raises(DeviceConfigError):
424-
bec.config.update_session_with_file(runtime_config_file_path, force=True, validate=False)
424+
with pytest.raises(DeviceConfigError):
425+
bec.config.update_session_with_file(
426+
runtime_config_file_path, force=True, validate=False
427+
)
425428

426-
assert len(bec.device_manager.devices) == 2
427-
assert bec.device_manager.devices["eyefoc"].enabled is True
428-
assert bec.device_manager.devices["hexapod"].enabled is False
429+
assert len(bec.device_manager.devices) == 2
430+
assert bec.device_manager.devices["eyefoc"].enabled is True
431+
assert bec.device_manager.devices["hexapod"].enabled is False
429432

430-
# set hexapod to pass
431-
bec.connector.set(
432-
f"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=0)
433-
)
433+
# set hexapod to pass
434+
bec.connector.set(
435+
"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=0)
436+
)
434437

435-
bec.config.update_session_with_file(runtime_config_file_path, force=True)
436-
assert len(bec.device_manager.devices) == 2
437-
assert bec.device_manager.devices["eyefoc"].enabled is True
438-
assert bec.device_manager.devices["hexapod"].enabled is True
439-
assert bec.device_manager.devices["hexapod"].precision == 3
438+
bec.config.update_session_with_file(runtime_config_file_path, force=True)
439+
assert len(bec.device_manager.devices) == 2
440+
assert bec.device_manager.devices["eyefoc"].enabled is True
441+
assert bec.device_manager.devices["hexapod"].enabled is True
442+
assert bec.device_manager.devices["hexapod"].precision == 3
443+
finally:
444+
bec.connector.set(
445+
"e2e_test_hexapod_fail", messages.DeviceStatusMessage(device="hexapod", status=0)
446+
)
447+
bec.config.update_session_with_file(bec_test_config_file_path, force=True)
440448

441449

442450
@pytest.mark.timeout(100)

bec_server/bec_server/scan_server/scan_guard.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,10 @@ def _check_valid_scan(self, request: messages.ScanQueueMessage) -> None:
115115
if scan_type not in avail_scans.resource:
116116
raise ScanRejection(f"Unknown scan type {scan_type}.")
117117

118-
if scan_type == "device_rpc":
118+
if scan_type in ["device_rpc", "_v4_device_rpc"]:
119119
# ensure that the requested rpc is allowed for this particular device
120-
params = request.content.get("parameter")
121-
if not self._device_rpc_is_valid(device=params.get("device"), func=params.get("func")):
120+
device, func = self._extract_device_rpc_target(request)
121+
if not self._device_rpc_is_valid(device=device, func=func):
122122
raise ScanRejection(f"Rejected rpc: {request.content}")
123123

124124
def _device_rpc_is_valid(self, device: str, func: str) -> bool:
@@ -142,10 +142,12 @@ def _check_motors_movable(self, request: messages.ScanQueueMessage) -> None:
142142
"""
143143
parameter = request.parameter
144144
if request.scan_type in ["device_rpc", "_v4_device_rpc"]:
145-
device = parameter.get("device")
145+
device, _ = self._extract_device_rpc_target(request)
146146
if not isinstance(device, list):
147147
device = [device]
148148
for dev in device:
149+
if dev not in self.device_manager.devices:
150+
raise ScanRejection(f"Device {dev} is not known.")
149151
if not self.device_manager.devices[dev].enabled:
150152
raise ScanRejection(f"Device {dev} is not enabled.")
151153
return
@@ -212,14 +214,24 @@ def _handle_scan_request(self, msg: messages.ScanQueueMessage, username: str):
212214
logger.info(f"Request was rejected: {scan_status.message}")
213215
return
214216

215-
if msg.scan_type == "device_rpc":
216-
func = msg.content.get("parameter", {}).get("func", "")
217+
if msg.scan_type in ["device_rpc", "_v4_device_rpc"]:
218+
_, func = self._extract_device_rpc_target(msg)
217219
if func in ["get", "read"] or func.endswith(".get") or func.endswith(".read"):
218220
logger.info("Scan request is a read operation, not enqueuing.")
219221
self._direct_device_rpc(msg)
220222
return
221223
self._append_to_scan_queue(msg)
222224

225+
@staticmethod
226+
def _extract_device_rpc_target(
227+
msg: messages.ScanQueueMessage,
228+
) -> tuple[str | list[str] | None, str]:
229+
params = msg.content.get("parameter", {})
230+
if msg.scan_type == "_v4_device_rpc":
231+
rpc_kwargs = params.get("kwargs", {})
232+
return rpc_kwargs.get("device"), rpc_kwargs.get("func", "")
233+
return params.get("device"), params.get("func", "")
234+
223235
def _direct_device_rpc(self, msg: messages.ScanQueueMessage):
224236
"""
225237
Directly send a device RPC request without enqueuing.

bec_server/tests/tests_scan_server/test_scan_guard.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@ def scan_guard_mock(scan_server_mock):
4242
queue="primary",
4343
)
4444
),
45+
(
46+
messages.ScanQueueMessage(
47+
scan_type="_v4_device_rpc",
48+
parameter={
49+
"args": [],
50+
"kwargs": {
51+
"device": "samy",
52+
"func": "set",
53+
"func_args": [1],
54+
"func_kwargs": {},
55+
"rpc_id": "rpc-id",
56+
},
57+
},
58+
queue="primary",
59+
)
60+
),
4561
],
4662
)
4763
def test_check_motors_movable_enabled(scan_server_mock, scan_queue_msg):
@@ -97,6 +113,24 @@ def test_device_rpc_is_valid(scan_guard_mock, device, func, is_valid):
97113
),
98114
True,
99115
),
116+
(
117+
messages.ScanQueueMessage(
118+
scan_type="_v4_device_rpc",
119+
parameter={
120+
"args": [],
121+
"kwargs": {
122+
"device": "samy",
123+
"func": "set",
124+
"func_args": [1],
125+
"func_kwargs": {},
126+
"rpc_id": "rpc-id",
127+
},
128+
},
129+
queue="primary",
130+
metadata={"client_info": {"acl_user": "default"}},
131+
),
132+
True,
133+
),
100134
],
101135
)
102136
def test_valid_request(scan_server_mock, scan_queue_msg, valid):
@@ -316,6 +350,36 @@ def test_handle_scan_request(scan_guard_mock):
316350
},
317351
queue="primary",
318352
),
353+
messages.ScanQueueMessage(
354+
metadata={"RID": "9db0c540-c1e0-4f44-872d-f41209512316", "response": True},
355+
scan_type="_v4_device_rpc",
356+
parameter={
357+
"args": [],
358+
"kwargs": {
359+
"device": "hexapod",
360+
"rpc_id": "rpc-id-v4",
361+
"func": "x.read",
362+
"func_args": [],
363+
"func_kwargs": {},
364+
},
365+
},
366+
queue="primary",
367+
),
368+
messages.ScanQueueMessage(
369+
metadata={"RID": "7d28d801-8e33-484d-af34-9cc061eefe0e", "response": True},
370+
scan_type="_v4_device_rpc",
371+
parameter={
372+
"args": [],
373+
"kwargs": {
374+
"device": "samx",
375+
"rpc_id": "rpc-id-v4-2",
376+
"func": "get",
377+
"func_args": [],
378+
"func_kwargs": {},
379+
},
380+
},
381+
queue="primary",
382+
),
319383
],
320384
)
321385
def test_handle_scan_request_bypassed_for_read(scan_guard_mock, msg):

0 commit comments

Comments
 (0)