diff --git a/CHANGELOG.md b/CHANGELOG.md index 48ac2d5994..c137b8eb9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ * Make `ApplyWorkflow.start_timestamp` non-nullable (\#927). * Remove `"cascade": "all, delete-orphan"` from `Project.job_list` (\#927). * Add `Workflow.job_list` relation (\#927). + * Do not use `Enum`s as column types (e.g. for `ApplyWorkflow.status`), but only for (de-)serialization (\#974). * Runner: * Refresh DB objects within `submit_workflow` (\#927). * Testing: diff --git a/fractal_server/app/api/v1/dataset.py b/fractal_server/app/api/v1/dataset.py index d340371f04..e7cbd1330b 100644 --- a/fractal_server/app/api/v1/dataset.py +++ b/fractal_server/app/api/v1/dataset.py @@ -13,13 +13,13 @@ from ...db import get_db from ...models import ApplyWorkflow from ...models import Dataset -from ...models import JobStatusType from ...models import Resource from ...runner._common import HISTORY_FILENAME from ...schemas import DatasetCreate from ...schemas import DatasetRead from ...schemas import DatasetStatusRead from ...schemas import DatasetUpdate +from ...schemas import JobStatusType from ...schemas import ResourceCreate from ...schemas import ResourceRead from ...schemas import ResourceUpdate diff --git a/fractal_server/app/api/v1/project.py b/fractal_server/app/api/v1/project.py index 70db2ee529..aa93020fd9 100644 --- a/fractal_server/app/api/v1/project.py +++ b/fractal_server/app/api/v1/project.py @@ -18,7 +18,6 @@ from ...db import get_db from ...db import get_sync_db from ...models import ApplyWorkflow -from ...models import JobStatusType from ...models import LinkUserProject from ...models import Project from ...runner import submit_workflow @@ -26,6 +25,7 @@ from ...runner.common import set_start_and_last_task_index from ...schemas import ApplyWorkflowCreate from ...schemas import ApplyWorkflowRead +from ...schemas import JobStatusType from ...schemas import ProjectCreate from ...schemas import ProjectRead from ...schemas import ProjectUpdate diff --git a/fractal_server/app/models/job.py b/fractal_server/app/models/job.py index aa4131682f..18462e8bd4 100644 --- a/fractal_server/app/models/job.py +++ b/fractal_server/app/models/job.py @@ -1,5 +1,4 @@ from datetime import datetime -from enum import Enum from typing import Any from typing import Optional @@ -10,34 +9,10 @@ from sqlmodel import SQLModel from ...utils import get_timestamp +from ..schemas import JobStatusType from ..schemas.applyworkflow import _ApplyWorkflowBase -class JobStatusType(str, Enum): - """ - Define the job status available - - Attributes: - SUBMITTED: - The workflow has been applied but not yet scheduled with an - executor. In this phase, due diligence takes place, such as - creating working directory, assemblying arguments, etc. - RUNNING: - The workflow was scheduled with an executor. Note that it might not - yet be running within the executor, e.g., jobs could still be - pending within a SLURM executor. - DONE: - The workflow was applied successfully - FAILED: - The workflow terminated with an error. - """ - - SUBMITTED = "submitted" - RUNNING = "running" - DONE = "done" - FAILED = "failed" - - class ApplyWorkflow(_ApplyWorkflowBase, SQLModel, table=True): """ Represent a workflow run @@ -115,5 +90,5 @@ class Config: end_timestamp: Optional[datetime] = Field( default=None, sa_column=Column(DateTime(timezone=True)) ) - status: JobStatusType = JobStatusType.SUBMITTED + status: str = JobStatusType.SUBMITTED log: Optional[str] = None diff --git a/fractal_server/app/runner/__init__.py b/fractal_server/app/runner/__init__.py index d531e54561..1e504d9ace 100644 --- a/fractal_server/app/runner/__init__.py +++ b/fractal_server/app/runner/__init__.py @@ -30,9 +30,9 @@ from ..db import DB from ..models import ApplyWorkflow from ..models import Dataset -from ..models import JobStatusType from ..models import Workflow from ..models import WorkflowTask +from ..schemas import JobStatusType from ._local import process_workflow as local_process_workflow from .common import close_job_logger from .common import JobExecutionError diff --git a/fractal_server/app/schemas/__init__.py b/fractal_server/app/schemas/__init__.py index ab808b414e..0efa0412ea 100644 --- a/fractal_server/app/schemas/__init__.py +++ b/fractal_server/app/schemas/__init__.py @@ -3,6 +3,7 @@ """ from .applyworkflow import ApplyWorkflowCreate # noqa: F401 from .applyworkflow import ApplyWorkflowRead # noqa: F401 +from .applyworkflow import JobStatusType # noqa: F401 from .dataset import DatasetCreate # noqa: F401 from .dataset import DatasetRead # noqa: F401 from .dataset import DatasetStatusRead # noqa: F401 diff --git a/fractal_server/app/schemas/applyworkflow.py b/fractal_server/app/schemas/applyworkflow.py index f13bbe6583..31bc7f2207 100644 --- a/fractal_server/app/schemas/applyworkflow.py +++ b/fractal_server/app/schemas/applyworkflow.py @@ -1,4 +1,5 @@ from datetime import datetime +from enum import Enum from typing import Any from typing import Optional @@ -14,6 +15,31 @@ ) +class JobStatusType(str, Enum): + """ + Define the available job statuses + + Attributes: + SUBMITTED: + The workflow has been applied but not yet scheduled with an + executor. In this phase, due diligence takes place, such as + creating working directory, assemblying arguments, etc. + RUNNING: + The workflow was scheduled with an executor. Note that it might not + yet be running within the executor, e.g., jobs could still be + pending within a SLURM executor. + DONE: + The workflow was applied successfully + FAILED: + The workflow terminated with an error. + """ + + SUBMITTED = "submitted" + RUNNING = "running" + DONE = "done" + FAILED = "failed" + + class _ApplyWorkflowBase(BaseModel): """ Base class for `ApplyWorkflow`. diff --git a/tests/test_unit_submit_workflow.py b/tests/test_unit_submit_workflow.py index 817784ccb4..131b3672e2 100644 --- a/tests/test_unit_submit_workflow.py +++ b/tests/test_unit_submit_workflow.py @@ -7,8 +7,8 @@ from fractal_server.app.db import get_sync_db from fractal_server.app.models import ApplyWorkflow -from fractal_server.app.models import JobStatusType from fractal_server.app.runner import submit_workflow +from fractal_server.app.schemas import JobStatusType async def test_success_submit_workflows(