mirror of
https://github.com/ivan-usov-org/bec.git
synced 2025-04-21 18:20:01 +02:00
feat(queue schedule): added endpoint and queue schedule methods
This commit is contained in:
parent
506def06c1
commit
0c7e0eb37f
@ -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:
|
||||||
|
@ -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())
|
||||||
|
@ -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() == []
|
||||||
|
Loading…
x
Reference in New Issue
Block a user