Skip to content

Commit 00ef65e

Browse files
author
Andrei Neagu
committed
extended store
1 parent 2c57d5b commit 00ef65e

File tree

2 files changed

+70
-2
lines changed
  • services/dynamic-scheduler
    • src/simcore_service_dynamic_scheduler/services/generic_scheduler
    • tests/unit/service_generic_scheduler

2 files changed

+70
-2
lines changed

services/dynamic-scheduler/src/simcore_service_dynamic_scheduler/services/generic_scheduler/_store.py

Lines changed: 33 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
ScheduleId,
1616
StepGroupName,
1717
StepName,
18+
StepStatus,
1819
)
1920

2021
_SCHEDULE_NAMESPACE: Final[str] = "SCH"
@@ -167,20 +168,27 @@ async def delete(self, *keys: _DeleteScheduleDataKeys) -> None:
167168
await self._store.delete(self._get_hash_key(), *keys)
168169

169170

171+
class _StepDict(TypedDict):
172+
status: NotRequired[StepStatus]
173+
174+
175+
_DeleteStepKeys = Literal["status"]
176+
177+
170178
class StepStoreProxy:
171179
def __init__(
172180
self,
173181
*,
174182
store: Store,
175183
schedule_id: ScheduleId,
176184
operation_name: OperationName,
177-
group: StepGroupName,
185+
step_group_name: StepGroupName,
178186
step_name: StepName,
179187
) -> None:
180188
self._store = store
181189
self._schedule_id = schedule_id
182190
self._operation_name = operation_name
183-
self._group = group
191+
self._group = step_group_name
184192
self._step_name = step_name
185193

186194
def _get_hash_key(self) -> str:
@@ -190,3 +198,26 @@ def _get_hash_key(self) -> str:
190198
group=self._group,
191199
step_name=self._step_name,
192200
)
201+
202+
@overload
203+
async def get(self, key: Literal["status"]) -> StepStatus: ...
204+
async def get(self, key: str) -> Any:
205+
"""raises KeyNotFoundInHashError if the key is not present in the hash"""
206+
hash_key = self._get_hash_key()
207+
(result,) = await self._store.get(hash_key, key)
208+
if result is None:
209+
raise KeyNotFoundInHashError(
210+
schedule_id=self._schedule_id, hash_key=hash_key
211+
)
212+
return result
213+
214+
@overload
215+
async def set(self, key: Literal["status"], value: StepStatus) -> None: ...
216+
async def set(self, key: str, value: Any) -> None:
217+
await self._store.set(self._get_hash_key(), key, value)
218+
219+
async def set_multiple(self, values: _StepDict) -> None:
220+
await self._store.set_multiple(self._get_hash_key(), updates=values)
221+
222+
async def delete(self, *keys: _DeleteStepKeys) -> None:
223+
await self._store.delete(self._get_hash_key(), *keys)

services/dynamic-scheduler/tests/unit/service_generic_scheduler/test__store.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,11 @@
1212
from settings_library.redis import RedisSettings
1313
from simcore_service_dynamic_scheduler.services.generic_scheduler._models import (
1414
ScheduleId,
15+
StepStatus,
1516
)
1617
from simcore_service_dynamic_scheduler.services.generic_scheduler._store import (
1718
ScheduleDataStoreProxy,
19+
StepStoreProxy,
1820
Store,
1921
)
2022

@@ -154,3 +156,38 @@ async def test_schedule_data_store_proxy_workflow(
154156
await proxy.delete("operation_name", "is_creating", "group_index")
155157
await _assert_keys(store, set())
156158
await _assert_keys_in_hash(store, hash_key, set())
159+
160+
161+
async def test_step_store_proxy_workflow(store: Store, schedule_id: ScheduleId):
162+
step_name = "MyStep"
163+
proxy = StepStoreProxy(
164+
store=store,
165+
schedule_id=schedule_id,
166+
operation_name="op1",
167+
step_group_name="sg1",
168+
step_name=step_name,
169+
)
170+
hash_key = f"SCH:{schedule_id}:STEPS:op1:sg1:{step_name}"
171+
172+
# set
173+
await proxy.set("status", StepStatus.RUNNING)
174+
await _assert_keys(store, {hash_key})
175+
await _assert_keys_in_hash(store, hash_key, {"status"})
176+
177+
# get
178+
assert await proxy.get("status") == StepStatus.RUNNING
179+
180+
# remove
181+
await proxy.delete("status")
182+
await _assert_keys(store, set())
183+
await _assert_keys_in_hash(store, hash_key, set())
184+
185+
# set multiple
186+
await proxy.set_multiple({"status": StepStatus.SUCCESS})
187+
await _assert_keys(store, {hash_key})
188+
await _assert_keys_in_hash(store, hash_key, {"status"})
189+
190+
# remove all keys an even missing ones
191+
await proxy.delete("status")
192+
await _assert_keys(store, set())
193+
await _assert_keys_in_hash(store, hash_key, set())

0 commit comments

Comments
 (0)