feat(queue schedule): added endpoint and queue schedule methods

This commit is contained in:
wakonig_k 2024-09-02 07:47:18 +02:00
parent 506def06c1
commit 0c7e0eb37f
3 changed files with 135 additions and 2 deletions

View File

@ -21,7 +21,7 @@ class MessageOp(list[str], enum.Enum):
SET_PUBLISH = ["register", "set_and_publish", "delete", "get", "keys"] SET_PUBLISH = ["register", "set_and_publish", "delete", "get", "keys"]
SEND = ["send", "register"] SEND = ["send", "register"]
STREAM = ["xadd", "xrange", "xread", "register_stream", "keys", "get_last"] STREAM = ["xadd", "xrange", "xread", "register_stream", "keys", "get_last"]
LIST = ["lpush", "lrange", "rpush", "ltrim", "keys"] LIST = ["lpush", "lrange", "rpush", "ltrim", "keys", "delete"]
SET = ["set", "get", "delete", "keys"] SET = ["set", "get", "delete", "keys"]
@ -499,6 +499,23 @@ class MessageEndpoints:
message_op=MessageOp.LIST, message_op=MessageOp.LIST,
) )
@staticmethod
def scan_queue_schedule(schedule_name: str) -> EndpointInfo:
"""
Endpoint for scan queue schedule. This endpoint is used to store messages.ScanQueueScheduleMessage messages
in a redis list.
Args:
schedule_name (str): Name of the schedule.
Returns:
EndpointInfo: Endpoint for scan queue schedule.
"""
endpoint = f"internal/queue/queue_schedule/{schedule_name}"
return EndpointInfo(
endpoint=endpoint, message_type=messages.ScanQueueMessage, message_op=MessageOp.LIST
)
# scan info # scan info
@staticmethod @staticmethod
def scan_number() -> EndpointInfo: def scan_number() -> EndpointInfo:

View File

@ -6,6 +6,7 @@ as the requests and scans that are currently running or have been completed.
from __future__ import annotations from __future__ import annotations
import uuid import uuid
from typing import TYPE_CHECKING
from typeguard import typechecked from typeguard import typechecked
@ -18,9 +19,12 @@ from bec_lib.scan_items import ScanStorage
logger = bec_logger.logger logger = bec_logger.logger
if TYPE_CHECKING:
from bec_lib.redis_connector import RedisConnector
class ScanManager: class ScanManager:
def __init__(self, connector): def __init__(self, connector: RedisConnector):
""" """
ScanManager is a class that provides a convenient way to interact with the scan queue as well ScanManager is a class that provides a convenient way to interact with the scan queue as well
as the requests and scans that are currently running or have been completed. as the requests and scans that are currently running or have been completed.
@ -225,6 +229,64 @@ class ScanManager:
msg = msg.value msg = msg.value
self.scan_storage.add_scan_baseline(msg) self.scan_storage.add_scan_baseline(msg)
@typechecked
def add_scan_to_queue_schedule(
self, schedule_name: str, msg: messages.ScanQueueMessage
) -> None:
"""
Add a scan to the queue schedule
Args:
schedule_name (str): name of the queue schedule
msg (messages.ScanQueueMessage): scan message
"""
self.connector.rpush(MessageEndpoints.scan_queue_schedule(schedule_name=schedule_name), msg)
@typechecked
def get_scan_queue_schedule(self, schedule_name: str) -> list:
"""
Get the scan queue schedule
Args:
schedule_name (str): name of the queue schedule
Returns:
list: list of scan messages
"""
return self.connector.lrange(
MessageEndpoints.scan_queue_schedule(schedule_name=schedule_name), 0, -1
)
@typechecked
def clear_scan_queue_schedule(self, schedule_name: str) -> None:
"""
Clear the scan queue schedule
Args:
schedule_name (str): name of the queue schedule
"""
self.connector.delete(MessageEndpoints.scan_queue_schedule(schedule_name=schedule_name))
def get_scan_queue_schedule_names(self) -> list:
"""
Get the names of the scan queue schedules
Returns:
list: list of schedule names
"""
keys = self.connector.keys(MessageEndpoints.scan_queue_schedule(schedule_name="*"))
if not keys:
return []
return [key.decode().split("/")[-1] for key in keys]
def clear_all_scan_queue_schedules(self) -> None:
"""
Clear all scan queue schedules
"""
keys = self.get_scan_queue_schedule_names()
for key in keys:
self.clear_scan_queue_schedule(key)
def __str__(self) -> str: def __str__(self) -> str:
try: try:
return "\n".join(self.queue_storage.describe_queue()) return "\n".join(self.queue_storage.describe_queue())

View File

@ -1,11 +1,18 @@
from __future__ import annotations
from typing import TYPE_CHECKING
from unittest import mock from unittest import mock
import pytest import pytest
from typeguard import TypeCheckError
from bec_lib import messages from bec_lib import messages
from bec_lib.endpoints import MessageEndpoints from bec_lib.endpoints import MessageEndpoints
from bec_lib.scan_manager import ScanManager from bec_lib.scan_manager import ScanManager
if TYPE_CHECKING:
from bec_lib.redis_connector import RedisConnector
@pytest.fixture @pytest.fixture
def scan_manager(): def scan_manager():
@ -15,6 +22,13 @@ def scan_manager():
manager.shutdown() manager.shutdown()
@pytest.fixture
def scan_manager_with_fakeredis(connected_connector: RedisConnector):
manager = ScanManager(connector=connected_connector)
yield manager
manager.shutdown()
def test_scan_manager_next_scan_number(scan_manager): def test_scan_manager_next_scan_number(scan_manager):
scan_manager.connector.get.return_value = messages.VariableMessage(value=3) scan_manager.connector.get.return_value = messages.VariableMessage(value=3)
assert scan_manager.next_scan_number == 3 assert scan_manager.next_scan_number == 3
@ -135,3 +149,43 @@ def test_scan_manager_request_scan_continuation_scan_id(scan_manager, scan_id):
MessageEndpoints.scan_queue_modification_request(), MessageEndpoints.scan_queue_modification_request(),
messages.ScanQueueModificationMessage(scan_id=scan_id, action="continue", parameter={}), messages.ScanQueueModificationMessage(scan_id=scan_id, action="continue", parameter={}),
) )
def test_scan_manager_add_scan_to_queue_schedule(scan_manager_with_fakeredis):
"""
Test the interaction with queue schedules
Args:
scan_manager_with_fakeredis: The scan manager fixture with a fakeredis connection
"""
manager: ScanManager = scan_manager_with_fakeredis
msg = messages.ScanQueueMessage(scan_type="mv", parameter={"args": {"samx": [5], "samy": [5]}})
manager.add_scan_to_queue_schedule("new_schedule", msg)
with pytest.raises(TypeCheckError):
manager.add_scan_to_queue_schedule("new_schedule", {})
assert manager.get_scan_queue_schedule("new_schedule") == [msg]
msg2 = messages.ScanQueueMessage(scan_type="mv", parameter={"args": {"samx": [6], "samy": [6]}})
manager.add_scan_to_queue_schedule("new_schedule", msg2)
assert manager.get_scan_queue_schedule("new_schedule") == [msg, msg2]
manager.add_scan_to_queue_schedule("new_schedule2", msg)
assert manager.get_scan_queue_schedule("new_schedule2") == [msg]
assert manager.get_scan_queue_schedule_names() == ["new_schedule", "new_schedule2"]
manager.clear_scan_queue_schedule("new_schedule2")
assert manager.get_scan_queue_schedule_names() == ["new_schedule"]
assert manager.get_scan_queue_schedule("new_schedule2") == []
assert manager.get_scan_queue_schedule("new_schedule") == [msg, msg2]
manager.clear_all_scan_queue_schedules()
assert manager.get_scan_queue_schedule_names() == []