Source code for pyslurmutils.client.rest.api.slurm_logs
import os
from dataclasses import dataclass
from typing import List
from typing import Optional
from typing import Tuple
from pydantic import BaseModel
[docs]
@dataclass
class StdInfo:
"""Information about a SLURM job stdout/stderr log file"""
name: str
filename: Optional[str]
content: Optional[List[str]]
[docs]
def lines(self) -> List[str]:
title = f"{self.name}: {self.filename}\n"
line = "-" * len(title) + "\n"
if self.content is None:
return [title, line, " <not found>"]
if not self.content:
return [title, line, " <empty>"]
return [title, line] + self.content
[docs]
def read_slurm_log(
job_properties: BaseModel, stderr: bool = False
) -> Tuple[Optional[str], Optional[List[str]]]:
if stderr:
filename = job_properties.standard_error
else:
filename = job_properties.standard_output
filename = slurm_log_filename(job_properties, filename)
if not filename:
return None, None
try:
with open(filename) as f:
return filename, list(f)
except FileNotFoundError:
return None, None
[docs]
def remove_slurm_log(job_properties: BaseModel, stderr: bool = False) -> None:
if stderr:
filename = job_properties.standard_error
else:
filename = job_properties.standard_output
filename = slurm_log_filename(job_properties, filename)
if not filename or filename == "/dev/null":
return
try:
os.remove(filename)
except (FileNotFoundError, PermissionError):
pass
[docs]
def get_stdout_stderr(job_properties: BaseModel) -> Tuple[StdInfo, Optional[StdInfo]]:
if (
not job_properties.standard_error
or job_properties.standard_output == job_properties.standard_error
):
ofilename, ocontent = read_slurm_log(job_properties, stderr=False)
std = StdInfo(name="STDOUT/STDERR", filename=ofilename, content=ocontent)
return std, None
ofilename, ocontent = read_slurm_log(job_properties, stderr=False)
efilename, econtent = read_slurm_log(job_properties, stderr=True)
stdout = StdInfo(name="STDOUT", filename=ofilename, content=ocontent)
stderr = StdInfo(name="STDERR", filename=efilename, content=econtent)
return stdout, stderr
[docs]
def slurm_log_filename(
job_properties: BaseModel, filename: Optional[str]
) -> Optional[str]:
if filename:
return filename.replace("%j", str(job_properties.job_id))