Source code for simstack.core.services.slurm_status_service
import logging
from datetime import datetime
from simstack.core.context import context
from simstack.core.definitions import TaskStatus
from simstack.models import NodeRegistry
from simstack.models.parameters import Resource
from simstack.models.slurm_info import SlurmInfo
from simstack.util.runner_utils import get_job_info, clean_slurm_info
from simstack.core.services.base_service import BaseService
logger = logging.getLogger("NodeRunner")
[docs]
class SlurmStatusService(BaseService):
def __init__(self, resource: Resource, interval: int) -> None:
super().__init__("SlurmStatus", resource, interval)
self._resource_name = str(resource)
[docs]
async def execute(self) -> None:
try:
# logger.info(f"Running clean_slurm_info for {self._resource} and user {self._username}")
await clean_slurm_info(self._resource, user=self._username)
running_tasks = await context.db.find(
NodeRegistry,
(NodeRegistry.status == TaskStatus.RUNNING)
& (NodeRegistry.parameters.resource == self._resource),
)
queued_tasks = await context.db.find(
NodeRegistry,
(NodeRegistry.status == TaskStatus.SLURM_QUEUED)
& (NodeRegistry.parameters.resource == self._resource),
)
# logger.info(f"Checking Slurm status for {len(running_tasks)} running jobs on resource {self._resource}")
for task in list(running_tasks) + list(queued_tasks):
if task.job_id is not None:
slurm_info = get_job_info(
task.job_id, task.id, Resource(value=self._resource_name)
)
slurm_entry = await context.db.find_one(
SlurmInfo, SlurmInfo.job_id == task.job_id
)
if slurm_info:
if slurm_entry:
slurm_entry.code = slurm_info.code
slurm_entry.time = slurm_info.time
slurm_entry.updated = datetime.now()
await context.db.save(slurm_entry)
else:
await context.db.save(slurm_info)
else:
# Logic for finished/timed out jobs
check_job = await context.db.find_one(
NodeRegistry, NodeRegistry.id == task.id
)
if slurm_entry:
await context.db.delete(slurm_entry)
if check_job.status == TaskStatus.RUNNING:
task.job_id = None
task.status = TaskStatus.TIME_OUT
await context.db.save(task)
except Exception as e:
logger.exception(f"Error checking Slurm status: {e}")
raise e