Skip to content

Commit 1154545

Browse files
committed
fix: restart BL states when device config updated
1 parent 85067be commit 1154545

3 files changed

Lines changed: 32 additions & 5 deletions

File tree

bec_lib/bec_lib/bl_states.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ def start(self) -> None:
286286
self.update_device_signal_info()
287287
except Exception as exc:
288288
self._handle_state_exception(exc)
289+
self.started = False
289290
return
290291

291292
msg = self.connector.get(MessageEndpoints.device_readback(self.device_obj.root.name))

bec_server/bec_server/scan_server/beamline_state_manager.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from bec_lib.alarm_handler import Alarms
77
from bec_lib.devicemanager import DeviceManagerBase
88
from bec_lib.endpoints import MessageEndpoints
9+
from bec_lib.logger import bec_logger
910
from bec_lib.messages import ErrorInfo
1011
from bec_lib.redis_connector import RedisConnector
1112

@@ -22,6 +23,7 @@ def __init__(self, connector: RedisConnector, device_manager: DeviceManagerBase)
2223
cb=self._handle_state_update,
2324
from_start=True,
2425
)
26+
self.connector.register(MessageEndpoints.device_config_update(), cb=self.restart_all)
2527

2628
def _handle_state_update(self, msg_dict: dict, **_kwargs) -> None:
2729

@@ -30,13 +32,18 @@ def _handle_state_update(self, msg_dict: dict, **_kwargs) -> None:
3032
self.update_states(msg)
3133
except Exception as exc:
3234
content = traceback.format_exc()
35+
bec_logger.logger.error(content)
3336
info = ErrorInfo(
3437
exception_type=type(exc).__name__,
3538
error_message=content,
3639
compact_error_message="Error updating beamline states.",
3740
)
3841
self.connector.raise_alarm(severity=Alarms.WARNING, info=info)
3942

43+
def restart_all(self, *_):
44+
for state in self._states.values():
45+
state.restart()
46+
4047
def update_states(self, msg: messages.AvailableBeamlineStatesMessage) -> None:
4148
"""
4249
Update the beamline states based on the received update message.

bec_server/tests/tests_scan_server/test_beamline_state_manager.py

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,22 @@ def restart(self):
3939
return FakeState
4040

4141

42-
def test_state_manager_fetches_states(dm_with_devices):
42+
def test_state_manager_fetches_states(dm_with_devices, fake_bl_states):
4343
"""
4444
Test that the BeamlineStateManager fetches all available beamline states on initialization.
4545
"""
4646

4747
connector = mock.MagicMock()
4848
state_manager = BeamlineStateManager(connector, device_manager=dm_with_devices)
49-
connector.register.assert_called_once_with(
50-
MessageEndpoints.available_beamline_states(),
51-
cb=state_manager._handle_state_update,
52-
from_start=True,
49+
connector.register.assert_has_calls(
50+
[
51+
mock.call(
52+
MessageEndpoints.available_beamline_states(),
53+
cb=state_manager._handle_state_update,
54+
from_start=True,
55+
),
56+
mock.call(MessageEndpoints.device_config_update(), cb=state_manager.restart_all),
57+
]
5358
)
5459

5560

@@ -125,3 +130,17 @@ def test_state_manager_updates_states(state_manager, connected_connector, fake_b
125130

126131
assert len(state_manager._states) == 1
127132
assert "State2" in state_manager._states
133+
134+
135+
@pytest.mark.timeout(5)
136+
def test_states_restarted_when_device_config_updated(
137+
state_manager, connected_connector, fake_bl_states
138+
):
139+
state_mock = mock.MagicMock()
140+
state_manager._states["test"] = state_mock
141+
connected_connector.send(
142+
MessageEndpoints.device_config_update(), messages.DeviceConfigMessage(action="reload")
143+
)
144+
145+
while state_mock.restart.call_count == 0:
146+
time.sleep(0.1)

0 commit comments

Comments
 (0)