fractal-server 2.0.0a10__py3-none-any.whl → 2.0.0a12__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fractal_server/__init__.py +1 -1
- fractal_server/app/models/__init__.py +5 -3
- fractal_server/app/models/v1/__init__.py +1 -0
- fractal_server/app/models/{state.py → v1/state.py} +2 -2
- fractal_server/app/models/v2/__init__.py +2 -0
- fractal_server/app/models/v2/collection_state.py +21 -0
- fractal_server/app/models/v2/job.py +2 -2
- fractal_server/app/models/v2/workflowtask.py +0 -39
- fractal_server/app/routes/admin/v1.py +5 -5
- fractal_server/app/routes/admin/v2.py +4 -4
- fractal_server/app/routes/api/v1/_aux_functions.py +6 -6
- fractal_server/app/routes/api/v1/dataset.py +4 -4
- fractal_server/app/routes/api/v1/project.py +4 -4
- fractal_server/app/routes/api/v1/task.py +2 -2
- fractal_server/app/routes/api/v1/task_collection.py +3 -3
- fractal_server/app/routes/api/v1/workflow.py +4 -4
- fractal_server/app/routes/api/v1/workflowtask.py +1 -1
- fractal_server/app/routes/api/v2/_aux_functions.py +2 -2
- fractal_server/app/routes/api/v2/dataset.py +10 -0
- fractal_server/app/routes/api/v2/job.py +1 -1
- fractal_server/app/routes/api/v2/project.py +5 -17
- fractal_server/app/routes/api/v2/submit.py +1 -1
- fractal_server/app/routes/api/v2/task_collection.py +5 -5
- fractal_server/app/routes/api/v2/workflowtask.py +10 -10
- fractal_server/app/routes/aux/_job.py +1 -1
- fractal_server/app/runner/task_files.py +1 -1
- fractal_server/app/runner/v1/__init__.py +4 -4
- fractal_server/app/runner/v1/_common.py +2 -2
- fractal_server/app/runner/v1/_local/__init__.py +3 -3
- fractal_server/app/runner/v2/runner.py +62 -25
- fractal_server/app/runner/v2/runner_functions.py +36 -10
- fractal_server/app/runner/v2/runner_functions_low_level.py +6 -13
- fractal_server/app/runner/v2/task_interface.py +4 -2
- fractal_server/app/schemas/__init__.py +0 -3
- fractal_server/app/schemas/v1/__init__.py +0 -6
- fractal_server/app/schemas/v2/__init__.py +2 -0
- fractal_server/app/schemas/v2/dataset.py +5 -0
- fractal_server/app/schemas/v2/workflowtask.py +60 -14
- fractal_server/images/tools.py +0 -1
- fractal_server/migrations/versions/{80e12e1bc4fd_v2.py → 5bf02391cfef_v2.py} +12 -4
- fractal_server/tasks/v1/background_operations.py +2 -2
- fractal_server/tasks/v2/background_operations.py +2 -2
- {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/METADATA +1 -1
- {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/RECORD +47 -46
- {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/LICENSE +0 -0
- {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/WHEEL +0 -0
- {fractal_server-2.0.0a10.dist-info → fractal_server-2.0.0a12.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.0.
|
1
|
+
__VERSION__ = "2.0.0a12"
|
@@ -2,6 +2,8 @@
|
|
2
2
|
`models` module
|
3
3
|
"""
|
4
4
|
from .security import * # noqa: F401, F403
|
5
|
-
from .
|
6
|
-
from .
|
7
|
-
|
5
|
+
from .v1 import Project # noqa: F401
|
6
|
+
from .v2 import ProjectV2 # noqa: F401
|
7
|
+
|
8
|
+
# We include the project models to avoid issues with LinkUserProject
|
9
|
+
# (sometimes taking place in alembic autogenerate)
|
@@ -6,6 +6,7 @@ from .dataset import Resource # noqa: F401
|
|
6
6
|
from .job import ApplyWorkflow # noqa: F403, F401
|
7
7
|
from .job import JobStatusTypeV1 # noqa: F401, F403
|
8
8
|
from .project import Project # noqa: F403, F401
|
9
|
+
from .state import State # noqa: F403, F401
|
9
10
|
from .task import Task # noqa: F403, F401
|
10
11
|
from .workflow import Workflow # noqa: F401, F403
|
11
12
|
from .workflow import WorkflowTask # noqa: F401, F403
|
@@ -8,8 +8,8 @@ from sqlalchemy.types import JSON
|
|
8
8
|
from sqlmodel import Field
|
9
9
|
from sqlmodel import SQLModel
|
10
10
|
|
11
|
-
from
|
12
|
-
from
|
11
|
+
from ....utils import get_timestamp
|
12
|
+
from ...schemas.state import _StateBase
|
13
13
|
|
14
14
|
|
15
15
|
class State(_StateBase, SQLModel, table=True):
|
@@ -2,6 +2,7 @@
|
|
2
2
|
v2 `models` module
|
3
3
|
"""
|
4
4
|
from ..linkuserproject import LinkUserProjectV2
|
5
|
+
from .collection_state import CollectionStateV2
|
5
6
|
from .dataset import DatasetV2
|
6
7
|
from .job import JobV2
|
7
8
|
from .project import ProjectV2
|
@@ -14,6 +15,7 @@ __all__ = [
|
|
14
15
|
"DatasetV2",
|
15
16
|
"JobV2",
|
16
17
|
"ProjectV2",
|
18
|
+
"CollectionStateV2",
|
17
19
|
"TaskV2",
|
18
20
|
"WorkflowTaskV2",
|
19
21
|
"WorkflowV2",
|
@@ -0,0 +1,21 @@
|
|
1
|
+
from datetime import datetime
|
2
|
+
from typing import Any
|
3
|
+
from typing import Optional
|
4
|
+
|
5
|
+
from sqlalchemy import Column
|
6
|
+
from sqlalchemy.types import DateTime
|
7
|
+
from sqlalchemy.types import JSON
|
8
|
+
from sqlmodel import Field
|
9
|
+
from sqlmodel import SQLModel
|
10
|
+
|
11
|
+
from ....utils import get_timestamp
|
12
|
+
|
13
|
+
|
14
|
+
class CollectionStateV2(SQLModel, table=True):
|
15
|
+
|
16
|
+
id: Optional[int] = Field(default=None, primary_key=True)
|
17
|
+
data: dict[str, Any] = Field(sa_column=Column(JSON), default={})
|
18
|
+
timestamp: datetime = Field(
|
19
|
+
default_factory=get_timestamp,
|
20
|
+
sa_column=Column(DateTime(timezone=True)),
|
21
|
+
)
|
@@ -9,7 +9,7 @@ from sqlmodel import Field
|
|
9
9
|
from sqlmodel import SQLModel
|
10
10
|
|
11
11
|
from ....utils import get_timestamp
|
12
|
-
from ...schemas.
|
12
|
+
from ...schemas.v2 import JobStatusTypeV2
|
13
13
|
|
14
14
|
|
15
15
|
class JobV2(SQLModel, table=True):
|
@@ -47,5 +47,5 @@ class JobV2(SQLModel, table=True):
|
|
47
47
|
end_timestamp: Optional[datetime] = Field(
|
48
48
|
default=None, sa_column=Column(DateTime(timezone=True))
|
49
49
|
)
|
50
|
-
status: str =
|
50
|
+
status: str = JobStatusTypeV2.SUBMITTED
|
51
51
|
log: Optional[str] = None
|
@@ -2,7 +2,6 @@ from typing import Any
|
|
2
2
|
from typing import Literal
|
3
3
|
from typing import Optional
|
4
4
|
|
5
|
-
from pydantic import validator
|
6
5
|
from sqlalchemy import Column
|
7
6
|
from sqlalchemy.types import JSON
|
8
7
|
from sqlmodel import Field
|
@@ -48,41 +47,3 @@ class WorkflowTaskV2(SQLModel, table=True):
|
|
48
47
|
task_legacy: Optional[Task] = Relationship(
|
49
48
|
sa_relationship_kwargs=dict(lazy="selectin")
|
50
49
|
)
|
51
|
-
|
52
|
-
@validator("args_non_parallel")
|
53
|
-
def validate_args_non_parallel(cls, value):
|
54
|
-
if value is None:
|
55
|
-
return
|
56
|
-
forbidden_args_keys = {
|
57
|
-
"zarr_dir",
|
58
|
-
"zarr_url",
|
59
|
-
"zarr_urls",
|
60
|
-
"init_args",
|
61
|
-
}
|
62
|
-
args_keys = set(value.keys())
|
63
|
-
intersect_keys = forbidden_args_keys.intersection(args_keys)
|
64
|
-
if intersect_keys:
|
65
|
-
raise ValueError(
|
66
|
-
"`args` contains the following forbidden keys: "
|
67
|
-
f"{intersect_keys}"
|
68
|
-
)
|
69
|
-
return value
|
70
|
-
|
71
|
-
@validator("args_parallel")
|
72
|
-
def validate_args_parallel(cls, value):
|
73
|
-
if value is None:
|
74
|
-
return
|
75
|
-
forbidden_args_keys = {
|
76
|
-
"zarr_dir",
|
77
|
-
"zarr_url",
|
78
|
-
"zarr_urls",
|
79
|
-
"init_args",
|
80
|
-
}
|
81
|
-
args_keys = set(value.keys())
|
82
|
-
intersect_keys = forbidden_args_keys.intersection(args_keys)
|
83
|
-
if intersect_keys:
|
84
|
-
raise ValueError(
|
85
|
-
"`args` contains the following forbidden keys: "
|
86
|
-
f"{intersect_keys}"
|
87
|
-
)
|
88
|
-
return value
|
@@ -20,12 +20,12 @@ from ....syringe import Inject
|
|
20
20
|
from ....utils import get_timestamp
|
21
21
|
from ...db import AsyncSession
|
22
22
|
from ...db import get_async_db
|
23
|
-
from ...models import ApplyWorkflow
|
24
|
-
from ...models import Dataset
|
25
|
-
from ...models import JobStatusTypeV1
|
26
|
-
from ...models import Project
|
27
|
-
from ...models import Workflow
|
28
23
|
from ...models.security import UserOAuth as User
|
24
|
+
from ...models.v1 import ApplyWorkflow
|
25
|
+
from ...models.v1 import Dataset
|
26
|
+
from ...models.v1 import JobStatusTypeV1
|
27
|
+
from ...models.v1 import Project
|
28
|
+
from ...models.v1 import Workflow
|
29
29
|
from ...runner.filenames import WORKFLOW_LOG_FILENAME
|
30
30
|
from ...schemas.v1 import ApplyWorkflowReadV1
|
31
31
|
from ...schemas.v1 import ApplyWorkflowUpdateV1
|
@@ -20,13 +20,13 @@ from ....syringe import Inject
|
|
20
20
|
from ....utils import get_timestamp
|
21
21
|
from ...db import AsyncSession
|
22
22
|
from ...db import get_async_db
|
23
|
-
from ...models import JobStatusTypeV1
|
24
23
|
from ...models.security import UserOAuth as User
|
25
24
|
from ...models.v1 import Task
|
26
25
|
from ...models.v2 import JobV2
|
27
26
|
from ...models.v2 import ProjectV2
|
28
27
|
from ...runner.filenames import WORKFLOW_LOG_FILENAME
|
29
28
|
from ...schemas.v2 import JobReadV2
|
29
|
+
from ...schemas.v2 import JobStatusTypeV2
|
30
30
|
from ...schemas.v2 import JobUpdateV2
|
31
31
|
from ...schemas.v2 import ProjectReadV2
|
32
32
|
from ...security import current_active_superuser
|
@@ -90,7 +90,7 @@ async def view_job(
|
|
90
90
|
project_id: Optional[int] = None,
|
91
91
|
dataset_id: Optional[int] = None,
|
92
92
|
workflow_id: Optional[int] = None,
|
93
|
-
status: Optional[
|
93
|
+
status: Optional[JobStatusTypeV2] = None,
|
94
94
|
start_timestamp_min: Optional[datetime] = None,
|
95
95
|
start_timestamp_max: Optional[datetime] = None,
|
96
96
|
end_timestamp_min: Optional[datetime] = None,
|
@@ -175,7 +175,7 @@ async def view_single_job(
|
|
175
175
|
)
|
176
176
|
await db.close()
|
177
177
|
|
178
|
-
if show_tmp_logs and (job.status ==
|
178
|
+
if show_tmp_logs and (job.status == JobStatusTypeV2.SUBMITTED):
|
179
179
|
try:
|
180
180
|
with open(f"{job.working_dir}/{WORKFLOW_LOG_FILENAME}", "r") as f:
|
181
181
|
job.log = f.read()
|
@@ -208,7 +208,7 @@ async def update_job(
|
|
208
208
|
detail=f"Job {job_id} not found",
|
209
209
|
)
|
210
210
|
|
211
|
-
if job_update.status !=
|
211
|
+
if job_update.status != JobStatusTypeV2.FAILED:
|
212
212
|
raise HTTPException(
|
213
213
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
214
214
|
detail=f"Cannot set job status to {job_update.status}",
|
@@ -12,13 +12,13 @@ from sqlmodel import select
|
|
12
12
|
from sqlmodel.sql.expression import SelectOfScalar
|
13
13
|
|
14
14
|
from ....db import AsyncSession
|
15
|
-
from ....models import ApplyWorkflow
|
16
|
-
from ....models import Dataset
|
17
15
|
from ....models import LinkUserProject
|
18
|
-
from ....models import
|
19
|
-
from ....models import
|
20
|
-
from ....models import
|
21
|
-
from ....models import
|
16
|
+
from ....models.v1 import ApplyWorkflow
|
17
|
+
from ....models.v1 import Dataset
|
18
|
+
from ....models.v1 import Project
|
19
|
+
from ....models.v1 import Task
|
20
|
+
from ....models.v1 import Workflow
|
21
|
+
from ....models.v1 import WorkflowTask
|
22
22
|
from ....schemas.v1 import JobStatusTypeV1
|
23
23
|
from ....security import User
|
24
24
|
|
@@ -13,10 +13,10 @@ from sqlmodel import select
|
|
13
13
|
|
14
14
|
from ....db import AsyncSession
|
15
15
|
from ....db import get_async_db
|
16
|
-
from ....models import ApplyWorkflow
|
17
|
-
from ....models import Dataset
|
18
|
-
from ....models import Project
|
19
|
-
from ....models import Resource
|
16
|
+
from ....models.v1 import ApplyWorkflow
|
17
|
+
from ....models.v1 import Dataset
|
18
|
+
from ....models.v1 import Project
|
19
|
+
from ....models.v1 import Resource
|
20
20
|
from ....runner.filenames import HISTORY_FILENAME
|
21
21
|
from ....schemas.v1 import DatasetCreateV1
|
22
22
|
from ....schemas.v1 import DatasetReadV1
|
@@ -18,11 +18,11 @@ from .....logger import set_logger
|
|
18
18
|
from .....syringe import Inject
|
19
19
|
from ....db import AsyncSession
|
20
20
|
from ....db import get_async_db
|
21
|
-
from ....models import ApplyWorkflow
|
22
|
-
from ....models import Dataset
|
23
21
|
from ....models import LinkUserProject
|
24
|
-
from ....models import
|
25
|
-
from ....models import
|
22
|
+
from ....models.v1 import ApplyWorkflow
|
23
|
+
from ....models.v1 import Dataset
|
24
|
+
from ....models.v1 import Project
|
25
|
+
from ....models.v1 import Workflow
|
26
26
|
from ....runner.set_start_and_last_task_index import (
|
27
27
|
set_start_and_last_task_index,
|
28
28
|
)
|
@@ -11,8 +11,8 @@ from sqlmodel import select
|
|
11
11
|
from .....logger import set_logger
|
12
12
|
from ....db import AsyncSession
|
13
13
|
from ....db import get_async_db
|
14
|
-
from ....models import Task
|
15
|
-
from ....models import WorkflowTask
|
14
|
+
from ....models.v1 import Task
|
15
|
+
from ....models.v1 import WorkflowTask
|
16
16
|
from ....models.v2 import TaskV2
|
17
17
|
from ....schemas.v1 import TaskCreateV1
|
18
18
|
from ....schemas.v1 import TaskReadV1
|
@@ -17,9 +17,9 @@ from .....logger import set_logger
|
|
17
17
|
from .....syringe import Inject
|
18
18
|
from ....db import AsyncSession
|
19
19
|
from ....db import get_async_db
|
20
|
-
from ....models import State
|
21
|
-
from ....models import Task
|
22
|
-
from ....schemas.
|
20
|
+
from ....models.v1 import State
|
21
|
+
from ....models.v1 import Task
|
22
|
+
from ....schemas.state import StateRead
|
23
23
|
from ....schemas.v1 import TaskCollectPipV1
|
24
24
|
from ....schemas.v1 import TaskCollectStatusV1
|
25
25
|
from ....security import current_active_user
|
@@ -23,10 +23,10 @@ from .....logger import close_logger
|
|
23
23
|
from .....logger import set_logger
|
24
24
|
from ....db import AsyncSession
|
25
25
|
from ....db import get_async_db
|
26
|
-
from ....models import ApplyWorkflow
|
27
|
-
from ....models import Project
|
28
|
-
from ....models import Task
|
29
|
-
from ....models import Workflow
|
26
|
+
from ....models.v1 import ApplyWorkflow
|
27
|
+
from ....models.v1 import Project
|
28
|
+
from ....models.v1 import Task
|
29
|
+
from ....models.v1 import Workflow
|
30
30
|
from ....schemas.v1 import WorkflowCreateV1
|
31
31
|
from ....schemas.v1 import WorkflowExportV1
|
32
32
|
from ....schemas.v1 import WorkflowImportV1
|
@@ -22,7 +22,7 @@ from fastapi import status
|
|
22
22
|
|
23
23
|
from ....db import AsyncSession
|
24
24
|
from ....db import get_async_db
|
25
|
-
from ....models import Task
|
25
|
+
from ....models.v1 import Task
|
26
26
|
from ....schemas.v1 import WorkflowTaskCreateV1
|
27
27
|
from ....schemas.v1 import WorkflowTaskReadV1
|
28
28
|
from ....schemas.v1 import WorkflowTaskUpdateV1
|
@@ -21,7 +21,7 @@ from ....models.v2 import ProjectV2
|
|
21
21
|
from ....models.v2 import TaskV2
|
22
22
|
from ....models.v2 import WorkflowTaskV2
|
23
23
|
from ....models.v2 import WorkflowV2
|
24
|
-
from ....schemas.
|
24
|
+
from ....schemas.v2 import JobStatusTypeV2
|
25
25
|
from ....security import User
|
26
26
|
from fractal_server.images import Filters
|
27
27
|
|
@@ -384,7 +384,7 @@ def _get_submitted_jobs_statement() -> SelectOfScalar:
|
|
384
384
|
A sqlmodel statement that selects all `Job`s with
|
385
385
|
`Job.status` equal to `submitted`.
|
386
386
|
"""
|
387
|
-
stm = select(JobV2).where(JobV2.status ==
|
387
|
+
stm = select(JobV2).where(JobV2.status == JobStatusTypeV2.SUBMITTED)
|
388
388
|
return stm
|
389
389
|
|
390
390
|
|
@@ -270,6 +270,16 @@ async def import_dataset(
|
|
270
270
|
db=db,
|
271
271
|
)
|
272
272
|
|
273
|
+
for image in dataset.images:
|
274
|
+
if not image.zarr_url.startswith(dataset.zarr_dir):
|
275
|
+
raise HTTPException(
|
276
|
+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
277
|
+
detail=(
|
278
|
+
f"Cannot import dataset: zarr_url {image.zarr_url} is not "
|
279
|
+
f"relative to zarr_dir={dataset.zarr_dir}."
|
280
|
+
),
|
281
|
+
)
|
282
|
+
|
273
283
|
# Create new Dataset
|
274
284
|
db_dataset = DatasetV2(
|
275
285
|
project_id=project_id,
|
@@ -12,7 +12,7 @@ from ....db import AsyncSession
|
|
12
12
|
from ....db import get_async_db
|
13
13
|
from ....models.v2 import JobV2
|
14
14
|
from ....models.v2 import ProjectV2
|
15
|
-
from ....runner.filenames import WORKFLOW_LOG_FILENAME
|
15
|
+
from ....runner.filenames import WORKFLOW_LOG_FILENAME
|
16
16
|
from ....schemas.v2 import JobReadV2
|
17
17
|
from ....schemas.v2 import JobStatusTypeV2
|
18
18
|
from ....security import current_active_user
|
@@ -5,11 +5,8 @@ from fastapi import Depends
|
|
5
5
|
from fastapi import HTTPException
|
6
6
|
from fastapi import Response
|
7
7
|
from fastapi import status
|
8
|
-
from sqlalchemy.exc import IntegrityError
|
9
8
|
from sqlmodel import select
|
10
9
|
|
11
|
-
from .....logger import close_logger
|
12
|
-
from .....logger import set_logger
|
13
10
|
from ....db import AsyncSession
|
14
11
|
from ....db import get_async_db
|
15
12
|
from ....models.v2 import DatasetV2
|
@@ -65,20 +62,11 @@ async def create_project(
|
|
65
62
|
|
66
63
|
db_project = ProjectV2(**project.dict())
|
67
64
|
db_project.user_list.append(user)
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
except IntegrityError as e:
|
74
|
-
await db.rollback()
|
75
|
-
logger = set_logger("create_project")
|
76
|
-
logger.error(str(e))
|
77
|
-
close_logger(logger)
|
78
|
-
raise HTTPException(
|
79
|
-
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
80
|
-
detail=str(e),
|
81
|
-
)
|
65
|
+
|
66
|
+
db.add(db_project)
|
67
|
+
await db.commit()
|
68
|
+
await db.refresh(db_project)
|
69
|
+
await db.close()
|
82
70
|
|
83
71
|
return db_project
|
84
72
|
|
@@ -17,7 +17,7 @@ from ....db import get_async_db
|
|
17
17
|
from ....models.v2 import JobV2
|
18
18
|
from ....runner.set_start_and_last_task_index import (
|
19
19
|
set_start_and_last_task_index,
|
20
|
-
)
|
20
|
+
)
|
21
21
|
from ....runner.v2 import submit_workflow
|
22
22
|
from ....schemas.v2 import JobCreateV2
|
23
23
|
from ....schemas.v2 import JobReadV2
|
@@ -17,9 +17,9 @@ from .....logger import set_logger
|
|
17
17
|
from .....syringe import Inject
|
18
18
|
from ....db import AsyncSession
|
19
19
|
from ....db import get_async_db
|
20
|
-
from ....models import
|
20
|
+
from ....models.v2 import CollectionStateV2
|
21
21
|
from ....models.v2 import TaskV2
|
22
|
-
from ....schemas import StateRead
|
22
|
+
from ....schemas.state import StateRead
|
23
23
|
from ....schemas.v2 import TaskCollectPipV2
|
24
24
|
from ....schemas.v2 import TaskCollectStatusV2
|
25
25
|
from ....security import current_active_user
|
@@ -151,7 +151,7 @@ async def collect_tasks_pip(
|
|
151
151
|
),
|
152
152
|
)
|
153
153
|
task_collect_status.info = "Already installed"
|
154
|
-
state =
|
154
|
+
state = CollectionStateV2(data=task_collect_status.sanitised_dict())
|
155
155
|
response.status_code == status.HTTP_200_OK
|
156
156
|
await db.close()
|
157
157
|
return state
|
@@ -181,7 +181,7 @@ async def collect_tasks_pip(
|
|
181
181
|
# Create State object (after casting venv_path to string)
|
182
182
|
collection_status_dict = collection_status.dict()
|
183
183
|
collection_status_dict["venv_path"] = str(collection_status.venv_path)
|
184
|
-
state =
|
184
|
+
state = CollectionStateV2(data=collection_status_dict)
|
185
185
|
db.add(state)
|
186
186
|
await db.commit()
|
187
187
|
await db.refresh(state)
|
@@ -220,7 +220,7 @@ async def check_collection_status(
|
|
220
220
|
"""
|
221
221
|
logger = set_logger(logger_name="check_collection_status")
|
222
222
|
logger.debug(f"Querying state for state.id={state_id}")
|
223
|
-
state = await db.get(
|
223
|
+
state = await db.get(CollectionStateV2, state_id)
|
224
224
|
if not state:
|
225
225
|
await db.close()
|
226
226
|
raise HTTPException(
|
@@ -46,6 +46,11 @@ async def create_workflowtask(
|
|
46
46
|
|
47
47
|
if new_task.is_legacy_task is True:
|
48
48
|
task = await db.get(Task, task_id)
|
49
|
+
if not task:
|
50
|
+
raise HTTPException(
|
51
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
52
|
+
detail=f"Task {task_id} not found.",
|
53
|
+
)
|
49
54
|
if not task.is_v2_compatible:
|
50
55
|
raise HTTPException(
|
51
56
|
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
@@ -53,16 +58,11 @@ async def create_workflowtask(
|
|
53
58
|
)
|
54
59
|
else:
|
55
60
|
task = await db.get(TaskV2, task_id)
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
error = f"TaskV2 {task_id} not found."
|
62
|
-
|
63
|
-
raise HTTPException(
|
64
|
-
status_code=status.HTTP_404_NOT_FOUND, detail=error
|
65
|
-
)
|
61
|
+
if not task:
|
62
|
+
raise HTTPException(
|
63
|
+
status_code=status.HTTP_404_NOT_FOUND,
|
64
|
+
detail=f"TaskV2 {task_id} not found.",
|
65
|
+
)
|
66
66
|
|
67
67
|
if new_task.is_legacy_task is True or task.type == "parallel":
|
68
68
|
if (
|
@@ -26,10 +26,10 @@ from ....logger import set_logger
|
|
26
26
|
from ....syringe import Inject
|
27
27
|
from ....utils import get_timestamp
|
28
28
|
from ...db import DB
|
29
|
-
from ...models import ApplyWorkflow
|
30
|
-
from ...models import Dataset
|
31
|
-
from ...models import Workflow
|
32
|
-
from ...models import WorkflowTask
|
29
|
+
from ...models.v1 import ApplyWorkflow
|
30
|
+
from ...models.v1 import Dataset
|
31
|
+
from ...models.v1 import Workflow
|
32
|
+
from ...models.v1 import WorkflowTask
|
33
33
|
from ...schemas.v1 import JobStatusTypeV1
|
34
34
|
from ..exceptions import JobExecutionError
|
35
35
|
from ..exceptions import TaskExecutionError
|
@@ -21,8 +21,8 @@ from typing import Optional
|
|
21
21
|
from ....config import get_settings
|
22
22
|
from ....logger import get_logger
|
23
23
|
from ....syringe import Inject
|
24
|
-
from ...models import Task
|
25
|
-
from ...models import WorkflowTask
|
24
|
+
from ...models.v1 import Task
|
25
|
+
from ...models.v1 import WorkflowTask
|
26
26
|
from ...schemas.v1 import WorkflowTaskStatusTypeV1
|
27
27
|
from ..exceptions import JobExecutionError
|
28
28
|
from ..exceptions import TaskExecutionError
|
@@ -23,11 +23,11 @@ from pathlib import Path
|
|
23
23
|
from typing import Any
|
24
24
|
from typing import Optional
|
25
25
|
|
26
|
-
from ....models import Workflow
|
26
|
+
from ....models.v1 import Workflow
|
27
27
|
from ...async_wrap import async_wrap
|
28
28
|
from ...set_start_and_last_task_index import set_start_and_last_task_index
|
29
|
-
from .._common import execute_tasks
|
30
|
-
from ..common import TaskParameters
|
29
|
+
from .._common import execute_tasks
|
30
|
+
from ..common import TaskParameters
|
31
31
|
from ._submit_setup import _local_submit_setup
|
32
32
|
from .executor import FractalThreadPoolExecutor
|
33
33
|
|