Refactor job model and optimize job streaming.

Updated the `JobModel` with foreign key relationships and string-based status to enhance database consistency, and improved job event streaming by using `jsonable_encoder` for better serialization. Also, streamlined dependencies by adding `urllib3` to handle HTTP requests.
This commit is contained in:
GotthardG
2025-04-29 09:47:57 +02:00
parent 866139baea
commit 3eb4050d82
9 changed files with 352 additions and 7909 deletions

View File

@@ -7,7 +7,6 @@ from sqlalchemy import (
JSON,
DateTime,
Boolean,
Enum,
func,
)
from sqlalchemy.orm import relationship
@@ -318,8 +317,8 @@ class Jobs(Base):
__tablename__ = "jobs"
id = Column(Integer, primary_key=True, index=True)
experiment_parameters_id = Column(Integer, nullable=False)
status = Column(Enum(JobStatus), default=JobStatus.TODO, nullable=False)
parameters = Column(JSON, nullable=False)
experiment_parameters_id = Column(Integer, ForeignKey("experiment_parameters.id"))
status = Column(String, nullable=False)
parameters = relationship(ExperimentParameters)
created_at = Column(DateTime, server_default=func.now())
updated_at = Column(DateTime, onupdate=func.now())

View File

@@ -1,6 +1,7 @@
import json
import asyncio
from fastapi import APIRouter, Depends
from fastapi.encoders import jsonable_encoder
from sqlalchemy.orm import Session
from starlette.responses import StreamingResponse
from app.models import JobStatus, Jobs as JobModel
@@ -11,15 +12,14 @@ router = APIRouter()
async def job_event_generator(db: Session):
while True:
# Fetch jobs with status TODO
jobs = db.query(JobModel).filter(JobModel.status == JobStatus.TODO).all()
if jobs:
# It's recommended to explicitly communicate IDs clearly
job_payload = [{"id": job.id, "parameters": job.parameters} for job in jobs]
job_payload = jsonable_encoder(jobs)
yield f"data: {json.dumps(job_payload)}\n\n"
await asyncio.sleep(5)
await asyncio.sleep(5) # A reasonable heartbeat/refresh
# A reasonable heartbeat/refresh
@router.get("/jobs/stream")

View File

@@ -352,7 +352,7 @@ def create_experiment_parameters_for_sample(
new_job = JobModel(
experiment_parameters_id=new_exp.id, # <-- Correct reference here
parameters=new_exp.to_dict(), # assuming params has a to_dict() method
parameters=new_exp, # assuming params has a to_dict() method
status=JobStatus.TODO,
)
db.add(new_job)

View File

@@ -941,3 +941,19 @@ class ResultResponse(BaseModel):
class Config:
from_attributes = True
class JobsCreate(BaseModel):
id: str
name: str
status: str
type: str
start_time: datetime
end_time: datetime
description: Optional[str]
parameters: str
datacollectionparameters: DataCollectionParameters
beamlineparameters: BeamlineParameters
class Config:
from_attributes = True