generated from coulomb/repo-seed
Add schedule smoke test routine
This commit is contained in:
@@ -51,6 +51,11 @@ def schedule_id(activity_id: str | UUID) -> str:
|
||||
return f"activity-schedule-{activity_id}"
|
||||
|
||||
|
||||
def smoke_schedule_id(activity_id: str | UUID) -> str:
|
||||
"""Return the one-shot smoke-test Schedule ID for an ActivityDefinition."""
|
||||
return f"activity-smoke-test-{activity_id}"
|
||||
|
||||
|
||||
def _overlap_policy(misfire_policy: str) -> ScheduleOverlapPolicy:
|
||||
return _MISFIRE_TO_OVERLAP.get(misfire_policy, ScheduleOverlapPolicy.SKIP)
|
||||
|
||||
@@ -128,6 +133,55 @@ def _build_onetime_schedule(defn: ActivityDefinition) -> tuple[str, Schedule]:
|
||||
return sid, Schedule(action=action, spec=spec, state=state)
|
||||
|
||||
|
||||
def _build_smoke_test_schedule(
|
||||
defn: ActivityDefinition,
|
||||
fire_at: datetime,
|
||||
) -> tuple[str, str, Schedule]:
|
||||
"""Build a one-shot smoke Schedule for an enabled cron ActivityDefinition."""
|
||||
if not isinstance(defn.trigger_config, CronTriggerConfig):
|
||||
raise ValueError("schedule smoke tests require trigger_type='cron'")
|
||||
if not defn.enabled:
|
||||
raise ValueError("schedule smoke tests require an enabled ActivityDefinition")
|
||||
|
||||
at = fire_at.astimezone(timezone.utc)
|
||||
token = at.strftime("%Y%m%dT%H%M%SZ")
|
||||
workflow_id_prefix = f"activity-{defn.id}:smoke-{token}"
|
||||
trigger_key = f"schedule-smoke-{token}"
|
||||
|
||||
action = ScheduleActionStartWorkflow(
|
||||
"RunActivityWorkflow",
|
||||
args=[str(defn.id), trigger_key, at.isoformat(), None],
|
||||
id=workflow_id_prefix,
|
||||
task_queue=_ORCHESTRATOR_TASK_QUEUE,
|
||||
)
|
||||
|
||||
spec = ScheduleSpec(
|
||||
calendars=[
|
||||
ScheduleCalendarSpec(
|
||||
second=[ScheduleRange(at.second)],
|
||||
minute=[ScheduleRange(at.minute)],
|
||||
hour=[ScheduleRange(at.hour)],
|
||||
day_of_month=[ScheduleRange(at.day)],
|
||||
month=[ScheduleRange(at.month)],
|
||||
year=[ScheduleRange(at.year)],
|
||||
)
|
||||
],
|
||||
time_zone_name="UTC",
|
||||
)
|
||||
|
||||
state = ScheduleState(
|
||||
limited_actions=True,
|
||||
remaining_actions=1,
|
||||
paused=False,
|
||||
)
|
||||
|
||||
return (
|
||||
smoke_schedule_id(defn.id),
|
||||
workflow_id_prefix,
|
||||
Schedule(action=action, spec=spec, state=state),
|
||||
)
|
||||
|
||||
|
||||
async def cancel_scheduled(client: Client, activity_id: str | UUID) -> None:
|
||||
"""Delete the one-off Temporal Schedule for a ScheduledTriggerConfig definition.
|
||||
|
||||
@@ -140,6 +194,45 @@ async def cancel_scheduled(client: Client, activity_id: str | UUID) -> None:
|
||||
pass
|
||||
|
||||
|
||||
async def schedule_smoke_test(
|
||||
client: Client,
|
||||
defn: ActivityDefinition,
|
||||
*,
|
||||
delay: timedelta = timedelta(minutes=1),
|
||||
now: datetime | None = None,
|
||||
) -> tuple[str, str, datetime]:
|
||||
"""Schedule a one-shot smoke run for a recurring ActivityDefinition.
|
||||
|
||||
Returns ``(schedule_id, workflow_id_prefix, fire_at)``. Temporal appends
|
||||
the scheduled fire time to workflow IDs created by schedules.
|
||||
"""
|
||||
base = now or datetime.now(tz=timezone.utc)
|
||||
if base.tzinfo is None:
|
||||
base = base.replace(tzinfo=timezone.utc)
|
||||
fire_at = (base + delay).astimezone(timezone.utc)
|
||||
sid, workflow_id_prefix, sched = _build_smoke_test_schedule(defn, fire_at)
|
||||
try:
|
||||
await client.create_schedule(sid, sched)
|
||||
except (RPCError, ScheduleAlreadyRunningError):
|
||||
handle = client.get_schedule_handle(sid)
|
||||
|
||||
async def _updater_smoke(inp: ScheduleUpdateInput) -> ScheduleUpdate: # noqa: ARG001
|
||||
return ScheduleUpdate(schedule=sched)
|
||||
|
||||
await handle.update(_updater_smoke)
|
||||
await handle.unpause()
|
||||
return sid, workflow_id_prefix, fire_at
|
||||
|
||||
|
||||
async def delete_smoke_test_schedule(client: Client, activity_id: str | UUID) -> None:
|
||||
"""Delete the smoke-test Schedule for the given activity_id if present."""
|
||||
handle = client.get_schedule_handle(smoke_schedule_id(activity_id))
|
||||
try:
|
||||
await handle.delete()
|
||||
except RPCError:
|
||||
pass
|
||||
|
||||
|
||||
async def upsert_schedule(client: Client, defn: ActivityDefinition) -> ScheduleHandle:
|
||||
"""Create or update a Temporal Schedule for a cron or scheduled ActivityDefinition.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user