fractal-server 2.18.0a4__py3-none-any.whl → 2.18.0a5__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/v2/job.py +13 -2
- fractal_server/app/models/v2/resource.py +13 -0
- fractal_server/app/routes/admin/v2/__init__.py +10 -12
- fractal_server/app/routes/admin/v2/job.py +15 -15
- fractal_server/app/routes/admin/v2/task.py +7 -7
- fractal_server/app/routes/admin/v2/task_group.py +11 -11
- fractal_server/app/routes/admin/v2/task_group_lifecycle.py +20 -20
- fractal_server/app/routes/api/v2/__init__.py +47 -49
- fractal_server/app/routes/api/v2/_aux_functions.py +22 -47
- fractal_server/app/routes/api/v2/_aux_functions_task_lifecycle.py +4 -4
- fractal_server/app/routes/api/v2/_aux_functions_tasks.py +2 -2
- fractal_server/app/routes/api/v2/dataset.py +63 -73
- fractal_server/app/routes/api/v2/history.py +7 -5
- fractal_server/app/routes/api/v2/job.py +12 -12
- fractal_server/app/routes/api/v2/project.py +11 -11
- fractal_server/app/routes/api/v2/status_legacy.py +15 -29
- fractal_server/app/routes/api/v2/submit.py +65 -66
- fractal_server/app/routes/api/v2/task.py +15 -17
- fractal_server/app/routes/api/v2/task_collection.py +18 -18
- fractal_server/app/routes/api/v2/task_collection_custom.py +11 -13
- fractal_server/app/routes/api/v2/task_collection_pixi.py +9 -9
- fractal_server/app/routes/api/v2/task_group.py +18 -18
- fractal_server/app/routes/api/v2/task_group_lifecycle.py +26 -26
- fractal_server/app/routes/api/v2/task_version_update.py +5 -5
- fractal_server/app/routes/api/v2/workflow.py +18 -18
- fractal_server/app/routes/api/v2/workflow_import.py +11 -11
- fractal_server/app/routes/api/v2/workflowtask.py +10 -10
- fractal_server/app/routes/auth/_aux_auth.py +99 -0
- fractal_server/app/routes/auth/users.py +9 -0
- fractal_server/app/schemas/user.py +1 -1
- fractal_server/app/schemas/v2/__init__.py +48 -48
- fractal_server/app/schemas/v2/dataset.py +25 -13
- fractal_server/app/schemas/v2/dumps.py +9 -9
- fractal_server/app/schemas/v2/job.py +11 -11
- fractal_server/app/schemas/v2/project.py +3 -3
- fractal_server/app/schemas/v2/resource.py +13 -4
- fractal_server/app/schemas/v2/status_legacy.py +3 -3
- fractal_server/app/schemas/v2/task.py +6 -6
- fractal_server/app/schemas/v2/task_collection.py +4 -4
- fractal_server/app/schemas/v2/task_group.py +16 -16
- fractal_server/app/schemas/v2/workflow.py +16 -16
- fractal_server/app/schemas/v2/workflowtask.py +14 -14
- fractal_server/app/shutdown.py +6 -6
- fractal_server/config/_main.py +1 -1
- fractal_server/data_migrations/2_18_0.py +2 -1
- fractal_server/main.py +8 -12
- fractal_server/migrations/versions/88270f589c9b_add_prevent_new_submissions.py +39 -0
- fractal_server/migrations/versions/f0702066b007_one_submitted_job_per_dataset.py +40 -0
- fractal_server/runner/v2/_local.py +3 -2
- fractal_server/runner/v2/_slurm_ssh.py +3 -2
- fractal_server/runner/v2/_slurm_sudo.py +3 -2
- fractal_server/runner/v2/runner.py +36 -17
- fractal_server/runner/v2/runner_functions.py +11 -14
- fractal_server/runner/v2/submit_workflow.py +22 -9
- fractal_server/tasks/v2/local/_utils.py +2 -2
- fractal_server/tasks/v2/local/collect.py +5 -6
- fractal_server/tasks/v2/local/collect_pixi.py +5 -6
- fractal_server/tasks/v2/local/deactivate.py +7 -7
- fractal_server/tasks/v2/local/deactivate_pixi.py +3 -3
- fractal_server/tasks/v2/local/delete.py +5 -5
- fractal_server/tasks/v2/local/reactivate.py +5 -5
- fractal_server/tasks/v2/local/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/collect.py +5 -5
- fractal_server/tasks/v2/ssh/collect_pixi.py +5 -5
- fractal_server/tasks/v2/ssh/deactivate.py +7 -7
- fractal_server/tasks/v2/ssh/deactivate_pixi.py +2 -2
- fractal_server/tasks/v2/ssh/delete.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate.py +5 -5
- fractal_server/tasks/v2/ssh/reactivate_pixi.py +5 -5
- fractal_server/tasks/v2/utils_background.py +7 -7
- fractal_server/tasks/v2/utils_database.py +5 -5
- fractal_server/types/__init__.py +13 -4
- fractal_server/types/validators/__init__.py +3 -1
- fractal_server/types/validators/_common_validators.py +23 -1
- {fractal_server-2.18.0a4.dist-info → fractal_server-2.18.0a5.dist-info}/METADATA +1 -1
- {fractal_server-2.18.0a4.dist-info → fractal_server-2.18.0a5.dist-info}/RECORD +80 -78
- {fractal_server-2.18.0a4.dist-info → fractal_server-2.18.0a5.dist-info}/WHEEL +0 -0
- {fractal_server-2.18.0a4.dist-info → fractal_server-2.18.0a5.dist-info}/entry_points.txt +0 -0
- {fractal_server-2.18.0a4.dist-info → fractal_server-2.18.0a5.dist-info}/licenses/LICENSE +0 -0
fractal_server/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__VERSION__ = "2.18.
|
|
1
|
+
__VERSION__ = "2.18.0a5"
|
|
@@ -6,9 +6,11 @@ from sqlalchemy import Column
|
|
|
6
6
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
7
7
|
from sqlalchemy.types import DateTime
|
|
8
8
|
from sqlmodel import Field
|
|
9
|
+
from sqlmodel import Index
|
|
9
10
|
from sqlmodel import SQLModel
|
|
11
|
+
from sqlmodel import text
|
|
10
12
|
|
|
11
|
-
from fractal_server.app.schemas.v2 import
|
|
13
|
+
from fractal_server.app.schemas.v2 import JobStatusType
|
|
12
14
|
from fractal_server.utils import get_timestamp
|
|
13
15
|
|
|
14
16
|
|
|
@@ -56,7 +58,7 @@ class JobV2(SQLModel, table=True):
|
|
|
56
58
|
end_timestamp: datetime | None = Field(
|
|
57
59
|
default=None, sa_column=Column(DateTime(timezone=True))
|
|
58
60
|
)
|
|
59
|
-
status: str =
|
|
61
|
+
status: str = JobStatusType.SUBMITTED
|
|
60
62
|
log: str | None = None
|
|
61
63
|
executor_error_log: str | None = None
|
|
62
64
|
|
|
@@ -66,3 +68,12 @@ class JobV2(SQLModel, table=True):
|
|
|
66
68
|
type_filters: dict[str, bool] = Field(
|
|
67
69
|
sa_column=Column(JSONB, nullable=False, server_default="{}")
|
|
68
70
|
)
|
|
71
|
+
|
|
72
|
+
__table_args__ = (
|
|
73
|
+
Index(
|
|
74
|
+
"ix_jobv2_one_submitted_job_per_dataset",
|
|
75
|
+
"dataset_id",
|
|
76
|
+
unique=True,
|
|
77
|
+
postgresql_where=text(f"status = '{JobStatusType.SUBMITTED}'"),
|
|
78
|
+
),
|
|
79
|
+
)
|
|
@@ -5,6 +5,7 @@ from typing import Self
|
|
|
5
5
|
from sqlalchemy import Column
|
|
6
6
|
from sqlalchemy.dialects.postgresql import JSONB
|
|
7
7
|
from sqlalchemy.types import DateTime
|
|
8
|
+
from sqlmodel import BOOLEAN
|
|
8
9
|
from sqlmodel import CheckConstraint
|
|
9
10
|
from sqlmodel import Field
|
|
10
11
|
from sqlmodel import SQLModel
|
|
@@ -43,6 +44,18 @@ class Resource(SQLModel, table=True):
|
|
|
43
44
|
Address for ssh connections, when `type="slurm_ssh"`.
|
|
44
45
|
"""
|
|
45
46
|
|
|
47
|
+
prevent_new_submissions: bool = Field(
|
|
48
|
+
sa_column=Column(
|
|
49
|
+
BOOLEAN,
|
|
50
|
+
server_default="false",
|
|
51
|
+
nullable=False,
|
|
52
|
+
),
|
|
53
|
+
)
|
|
54
|
+
"""
|
|
55
|
+
When set to true: Prevent new job submissions and stop execution of
|
|
56
|
+
ongoing jobs as soon as the current task is complete.
|
|
57
|
+
"""
|
|
58
|
+
|
|
46
59
|
jobs_local_dir: str
|
|
47
60
|
"""
|
|
48
61
|
Base local folder for job subfolders (containing artifacts and logs).
|
|
@@ -14,16 +14,14 @@ from .task import router as task_router
|
|
|
14
14
|
from .task_group import router as task_group_router
|
|
15
15
|
from .task_group_lifecycle import router as task_group_lifecycle_router
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
router_admin = APIRouter()
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
router_admin_v2.include_router(profile_router, prefix="/profile")
|
|
29
|
-
router_admin_v2.include_router(sharing_router, prefix="/linkuserproject")
|
|
19
|
+
router_admin.include_router(accounting_router, prefix="/accounting")
|
|
20
|
+
router_admin.include_router(job_router, prefix="/job")
|
|
21
|
+
router_admin.include_router(task_router, prefix="/task")
|
|
22
|
+
router_admin.include_router(task_group_router, prefix="/task-group")
|
|
23
|
+
router_admin.include_router(task_group_lifecycle_router, prefix="/task-group")
|
|
24
|
+
router_admin.include_router(impersonate_router, prefix="/impersonate")
|
|
25
|
+
router_admin.include_router(resource_router, prefix="/resource")
|
|
26
|
+
router_admin.include_router(profile_router, prefix="/profile")
|
|
27
|
+
router_admin.include_router(sharing_router, prefix="/linkuserproject")
|
|
@@ -24,9 +24,9 @@ from fractal_server.app.routes.pagination import PaginationRequest
|
|
|
24
24
|
from fractal_server.app.routes.pagination import PaginationResponse
|
|
25
25
|
from fractal_server.app.routes.pagination import get_pagination_params
|
|
26
26
|
from fractal_server.app.schemas.v2 import HistoryUnitStatus
|
|
27
|
-
from fractal_server.app.schemas.v2 import
|
|
28
|
-
from fractal_server.app.schemas.v2 import
|
|
29
|
-
from fractal_server.app.schemas.v2 import
|
|
27
|
+
from fractal_server.app.schemas.v2 import JobRead
|
|
28
|
+
from fractal_server.app.schemas.v2 import JobStatusType
|
|
29
|
+
from fractal_server.app.schemas.v2 import JobUpdate
|
|
30
30
|
from fractal_server.runner.filenames import WORKFLOW_LOG_FILENAME
|
|
31
31
|
from fractal_server.utils import get_timestamp
|
|
32
32
|
from fractal_server.zip_tools import _zip_folder_to_byte_stream_iterator
|
|
@@ -34,14 +34,14 @@ from fractal_server.zip_tools import _zip_folder_to_byte_stream_iterator
|
|
|
34
34
|
router = APIRouter()
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
@router.get("/", response_model=PaginationResponse[
|
|
37
|
+
@router.get("/", response_model=PaginationResponse[JobRead])
|
|
38
38
|
async def view_job(
|
|
39
39
|
id: int | None = None,
|
|
40
40
|
user_id: int | None = None,
|
|
41
41
|
project_id: int | None = None,
|
|
42
42
|
dataset_id: int | None = None,
|
|
43
43
|
workflow_id: int | None = None,
|
|
44
|
-
status:
|
|
44
|
+
status: JobStatusType | None = None,
|
|
45
45
|
start_timestamp_min: AwareDatetime | None = None,
|
|
46
46
|
start_timestamp_max: AwareDatetime | None = None,
|
|
47
47
|
end_timestamp_min: AwareDatetime | None = None,
|
|
@@ -50,7 +50,7 @@ async def view_job(
|
|
|
50
50
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
51
51
|
user: UserOAuth = Depends(current_superuser_act),
|
|
52
52
|
db: AsyncSession = Depends(get_async_db),
|
|
53
|
-
) -> PaginationResponse[
|
|
53
|
+
) -> PaginationResponse[JobRead]:
|
|
54
54
|
"""
|
|
55
55
|
Query `JobV2` table.
|
|
56
56
|
|
|
@@ -154,13 +154,13 @@ async def view_job(
|
|
|
154
154
|
)
|
|
155
155
|
|
|
156
156
|
|
|
157
|
-
@router.get("/{job_id}/", response_model=
|
|
157
|
+
@router.get("/{job_id}/", response_model=JobRead)
|
|
158
158
|
async def view_single_job(
|
|
159
159
|
job_id: int,
|
|
160
160
|
show_tmp_logs: bool = False,
|
|
161
161
|
user: UserOAuth = Depends(current_superuser_act),
|
|
162
162
|
db: AsyncSession = Depends(get_async_db),
|
|
163
|
-
) ->
|
|
163
|
+
) -> JobRead:
|
|
164
164
|
job = await db.get(JobV2, job_id)
|
|
165
165
|
if not job:
|
|
166
166
|
raise HTTPException(
|
|
@@ -169,7 +169,7 @@ async def view_single_job(
|
|
|
169
169
|
)
|
|
170
170
|
await db.close()
|
|
171
171
|
|
|
172
|
-
if show_tmp_logs and (job.status ==
|
|
172
|
+
if show_tmp_logs and (job.status == JobStatusType.SUBMITTED):
|
|
173
173
|
try:
|
|
174
174
|
with open(f"{job.working_dir}/{WORKFLOW_LOG_FILENAME}") as f:
|
|
175
175
|
job.log = f.read()
|
|
@@ -179,13 +179,13 @@ async def view_single_job(
|
|
|
179
179
|
return job
|
|
180
180
|
|
|
181
181
|
|
|
182
|
-
@router.patch("/{job_id}/", response_model=
|
|
182
|
+
@router.patch("/{job_id}/", response_model=JobRead)
|
|
183
183
|
async def update_job(
|
|
184
|
-
job_update:
|
|
184
|
+
job_update: JobUpdate,
|
|
185
185
|
job_id: int,
|
|
186
186
|
user: UserOAuth = Depends(current_superuser_act),
|
|
187
187
|
db: AsyncSession = Depends(get_async_db),
|
|
188
|
-
) ->
|
|
188
|
+
) -> JobRead | None:
|
|
189
189
|
"""
|
|
190
190
|
Change the status of an existing job.
|
|
191
191
|
|
|
@@ -198,13 +198,13 @@ async def update_job(
|
|
|
198
198
|
status_code=status.HTTP_404_NOT_FOUND,
|
|
199
199
|
detail=f"Job {job_id} not found",
|
|
200
200
|
)
|
|
201
|
-
if job.status !=
|
|
201
|
+
if job.status != JobStatusType.SUBMITTED:
|
|
202
202
|
raise HTTPException(
|
|
203
203
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
204
204
|
detail=f"Job {job_id} has status {job.status=} != 'submitted'.",
|
|
205
205
|
)
|
|
206
206
|
|
|
207
|
-
if job_update.status !=
|
|
207
|
+
if job_update.status != JobStatusType.FAILED:
|
|
208
208
|
raise HTTPException(
|
|
209
209
|
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
210
210
|
detail=f"Cannot set job status to {job_update.status}",
|
|
@@ -217,7 +217,7 @@ async def update_job(
|
|
|
217
217
|
job,
|
|
218
218
|
"log",
|
|
219
219
|
f"{job.log or ''}\nThis job was manually marked as "
|
|
220
|
-
f"'{
|
|
220
|
+
f"'{JobStatusType.FAILED}' by an admin ({timestamp.isoformat()}).",
|
|
221
221
|
)
|
|
222
222
|
|
|
223
223
|
res = await db.execute(
|
|
@@ -23,7 +23,7 @@ from fractal_server.app.schemas.v2.task import TaskType
|
|
|
23
23
|
router = APIRouter()
|
|
24
24
|
|
|
25
25
|
|
|
26
|
-
class
|
|
26
|
+
class TaskMinimal(BaseModel):
|
|
27
27
|
id: int
|
|
28
28
|
name: str
|
|
29
29
|
type: str
|
|
@@ -39,7 +39,7 @@ class ProjectUser(BaseModel):
|
|
|
39
39
|
email: EmailStr
|
|
40
40
|
|
|
41
41
|
|
|
42
|
-
class
|
|
42
|
+
class TaskRelationship(BaseModel):
|
|
43
43
|
workflow_id: int
|
|
44
44
|
workflow_name: str
|
|
45
45
|
project_id: int
|
|
@@ -47,12 +47,12 @@ class TaskV2Relationship(BaseModel):
|
|
|
47
47
|
project_users: list[ProjectUser] = Field(default_factory=list)
|
|
48
48
|
|
|
49
49
|
|
|
50
|
-
class
|
|
51
|
-
task:
|
|
52
|
-
relationships: list[
|
|
50
|
+
class TaskInfo(BaseModel):
|
|
51
|
+
task: TaskMinimal
|
|
52
|
+
relationships: list[TaskRelationship]
|
|
53
53
|
|
|
54
54
|
|
|
55
|
-
@router.get("/", response_model=PaginationResponse[
|
|
55
|
+
@router.get("/", response_model=PaginationResponse[TaskInfo])
|
|
56
56
|
async def query_tasks(
|
|
57
57
|
id: int | None = None,
|
|
58
58
|
source: str | None = None,
|
|
@@ -66,7 +66,7 @@ async def query_tasks(
|
|
|
66
66
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
67
67
|
user: UserOAuth = Depends(current_superuser_act),
|
|
68
68
|
db: AsyncSession = Depends(get_async_db),
|
|
69
|
-
) -> PaginationResponse[
|
|
69
|
+
) -> PaginationResponse[TaskInfo]:
|
|
70
70
|
"""
|
|
71
71
|
Query `TaskV2` and get information about related workflows and projects.
|
|
72
72
|
"""
|
|
@@ -20,12 +20,12 @@ from fractal_server.app.routes.auth._aux_auth import (
|
|
|
20
20
|
from fractal_server.app.routes.pagination import PaginationRequest
|
|
21
21
|
from fractal_server.app.routes.pagination import PaginationResponse
|
|
22
22
|
from fractal_server.app.routes.pagination import get_pagination_params
|
|
23
|
-
from fractal_server.app.schemas.v2 import
|
|
24
|
-
from fractal_server.app.schemas.v2 import
|
|
25
|
-
from fractal_server.app.schemas.v2 import
|
|
23
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityAction
|
|
24
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityRead
|
|
25
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
26
|
+
from fractal_server.app.schemas.v2 import TaskGroupOriginEnum
|
|
26
27
|
from fractal_server.app.schemas.v2 import TaskGroupReadSuperuser
|
|
27
|
-
from fractal_server.app.schemas.v2 import
|
|
28
|
-
from fractal_server.app.schemas.v2 import TaskGroupV2OriginEnum
|
|
28
|
+
from fractal_server.app.schemas.v2 import TaskGroupUpdate
|
|
29
29
|
from fractal_server.logger import set_logger
|
|
30
30
|
|
|
31
31
|
router = APIRouter()
|
|
@@ -34,20 +34,20 @@ logger = set_logger(__name__)
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
@router.get(
|
|
37
|
-
"/activity/", response_model=PaginationResponse[
|
|
37
|
+
"/activity/", response_model=PaginationResponse[TaskGroupActivityRead]
|
|
38
38
|
)
|
|
39
39
|
async def get_task_group_activity_list(
|
|
40
40
|
task_group_activity_id: int | None = None,
|
|
41
41
|
user_id: int | None = None,
|
|
42
42
|
taskgroupv2_id: int | None = None,
|
|
43
43
|
pkg_name: str | None = None,
|
|
44
|
-
status:
|
|
45
|
-
action:
|
|
44
|
+
status: TaskGroupActivityStatus | None = None,
|
|
45
|
+
action: TaskGroupActivityAction | None = None,
|
|
46
46
|
timestamp_started_min: AwareDatetime | None = None,
|
|
47
47
|
pagination: PaginationRequest = Depends(get_pagination_params),
|
|
48
48
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
49
49
|
db: AsyncSession = Depends(get_async_db),
|
|
50
|
-
) -> PaginationResponse[
|
|
50
|
+
) -> PaginationResponse[TaskGroupActivityRead]:
|
|
51
51
|
# Assign pagination parameters
|
|
52
52
|
page = pagination.page
|
|
53
53
|
page_size = pagination.page_size
|
|
@@ -127,7 +127,7 @@ async def query_task_group_list(
|
|
|
127
127
|
private: bool | None = None,
|
|
128
128
|
active: bool | None = None,
|
|
129
129
|
pkg_name: str | None = None,
|
|
130
|
-
origin:
|
|
130
|
+
origin: TaskGroupOriginEnum | None = None,
|
|
131
131
|
timestamp_last_used_min: AwareDatetime | None = None,
|
|
132
132
|
timestamp_last_used_max: AwareDatetime | None = None,
|
|
133
133
|
resource_id: int | None = None,
|
|
@@ -217,7 +217,7 @@ async def query_task_group_list(
|
|
|
217
217
|
@router.patch("/{task_group_id}/", response_model=TaskGroupReadSuperuser)
|
|
218
218
|
async def patch_task_group(
|
|
219
219
|
task_group_id: int,
|
|
220
|
-
task_group_update:
|
|
220
|
+
task_group_update: TaskGroupUpdate,
|
|
221
221
|
user: UserOAuth = Depends(current_superuser_act),
|
|
222
222
|
db: AsyncSession = Depends(get_async_db),
|
|
223
223
|
) -> list[TaskGroupReadSuperuser]:
|
|
@@ -26,10 +26,10 @@ from fractal_server.app.routes.aux.validate_user_profile import (
|
|
|
26
26
|
validate_user_profile,
|
|
27
27
|
)
|
|
28
28
|
from fractal_server.app.schemas.v2 import ResourceType
|
|
29
|
-
from fractal_server.app.schemas.v2 import
|
|
30
|
-
from fractal_server.app.schemas.v2 import
|
|
31
|
-
from fractal_server.app.schemas.v2 import
|
|
32
|
-
from fractal_server.app.schemas.v2 import
|
|
29
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityAction
|
|
30
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityRead
|
|
31
|
+
from fractal_server.app.schemas.v2 import TaskGroupActivityStatus
|
|
32
|
+
from fractal_server.app.schemas.v2 import TaskGroupOriginEnum
|
|
33
33
|
from fractal_server.logger import set_logger
|
|
34
34
|
from fractal_server.tasks.v2.local import deactivate_local
|
|
35
35
|
from fractal_server.tasks.v2.local import delete_local
|
|
@@ -46,7 +46,7 @@ logger = set_logger(__name__)
|
|
|
46
46
|
|
|
47
47
|
@router.post(
|
|
48
48
|
"/{task_group_id}/deactivate/",
|
|
49
|
-
response_model=
|
|
49
|
+
response_model=TaskGroupActivityRead,
|
|
50
50
|
)
|
|
51
51
|
async def deactivate_task_group(
|
|
52
52
|
task_group_id: int,
|
|
@@ -54,7 +54,7 @@ async def deactivate_task_group(
|
|
|
54
54
|
response: Response,
|
|
55
55
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
56
56
|
db: AsyncSession = Depends(get_async_db),
|
|
57
|
-
) ->
|
|
57
|
+
) -> TaskGroupActivityRead:
|
|
58
58
|
"""
|
|
59
59
|
Deactivate task-group venv
|
|
60
60
|
"""
|
|
@@ -78,13 +78,13 @@ async def deactivate_task_group(
|
|
|
78
78
|
await check_no_submitted_job(task_group_id=task_group.id, db=db)
|
|
79
79
|
|
|
80
80
|
# Shortcut for task-group with origin="other"
|
|
81
|
-
if task_group.origin ==
|
|
81
|
+
if task_group.origin == TaskGroupOriginEnum.OTHER:
|
|
82
82
|
task_group.active = False
|
|
83
83
|
task_group_activity = TaskGroupActivityV2(
|
|
84
84
|
user_id=task_group.user_id,
|
|
85
85
|
taskgroupv2_id=task_group.id,
|
|
86
|
-
status=
|
|
87
|
-
action=
|
|
86
|
+
status=TaskGroupActivityStatus.OK,
|
|
87
|
+
action=TaskGroupActivityAction.DEACTIVATE,
|
|
88
88
|
pkg_name=task_group.pkg_name,
|
|
89
89
|
version=(task_group.version or "N/A"),
|
|
90
90
|
log=(
|
|
@@ -103,8 +103,8 @@ async def deactivate_task_group(
|
|
|
103
103
|
task_group_activity = TaskGroupActivityV2(
|
|
104
104
|
user_id=task_group.user_id,
|
|
105
105
|
taskgroupv2_id=task_group.id,
|
|
106
|
-
status=
|
|
107
|
-
action=
|
|
106
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
107
|
+
action=TaskGroupActivityAction.DEACTIVATE,
|
|
108
108
|
pkg_name=task_group.pkg_name,
|
|
109
109
|
version=task_group.version,
|
|
110
110
|
timestamp_started=get_timestamp(),
|
|
@@ -140,7 +140,7 @@ async def deactivate_task_group(
|
|
|
140
140
|
|
|
141
141
|
@router.post(
|
|
142
142
|
"/{task_group_id}/reactivate/",
|
|
143
|
-
response_model=
|
|
143
|
+
response_model=TaskGroupActivityRead,
|
|
144
144
|
)
|
|
145
145
|
async def reactivate_task_group(
|
|
146
146
|
task_group_id: int,
|
|
@@ -148,7 +148,7 @@ async def reactivate_task_group(
|
|
|
148
148
|
response: Response,
|
|
149
149
|
superuser: UserOAuth = Depends(current_superuser_act),
|
|
150
150
|
db: AsyncSession = Depends(get_async_db),
|
|
151
|
-
) ->
|
|
151
|
+
) -> TaskGroupActivityRead:
|
|
152
152
|
"""
|
|
153
153
|
Deactivate task-group venv
|
|
154
154
|
"""
|
|
@@ -173,13 +173,13 @@ async def reactivate_task_group(
|
|
|
173
173
|
await check_no_submitted_job(task_group_id=task_group.id, db=db)
|
|
174
174
|
|
|
175
175
|
# Shortcut for task-group with origin="other"
|
|
176
|
-
if task_group.origin ==
|
|
176
|
+
if task_group.origin == TaskGroupOriginEnum.OTHER:
|
|
177
177
|
task_group.active = True
|
|
178
178
|
task_group_activity = TaskGroupActivityV2(
|
|
179
179
|
user_id=task_group.user_id,
|
|
180
180
|
taskgroupv2_id=task_group.id,
|
|
181
|
-
status=
|
|
182
|
-
action=
|
|
181
|
+
status=TaskGroupActivityStatus.OK,
|
|
182
|
+
action=TaskGroupActivityAction.REACTIVATE,
|
|
183
183
|
pkg_name=task_group.pkg_name,
|
|
184
184
|
version=(task_group.version or "N/A"),
|
|
185
185
|
log=(
|
|
@@ -206,8 +206,8 @@ async def reactivate_task_group(
|
|
|
206
206
|
task_group_activity = TaskGroupActivityV2(
|
|
207
207
|
user_id=task_group.user_id,
|
|
208
208
|
taskgroupv2_id=task_group.id,
|
|
209
|
-
status=
|
|
210
|
-
action=
|
|
209
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
210
|
+
action=TaskGroupActivityAction.REACTIVATE,
|
|
211
211
|
pkg_name=task_group.pkg_name,
|
|
212
212
|
version=task_group.version,
|
|
213
213
|
timestamp_started=get_timestamp(),
|
|
@@ -259,8 +259,8 @@ async def delete_task_group(
|
|
|
259
259
|
task_group_activity = TaskGroupActivityV2(
|
|
260
260
|
user_id=task_group.user_id,
|
|
261
261
|
taskgroupv2_id=task_group.id,
|
|
262
|
-
status=
|
|
263
|
-
action=
|
|
262
|
+
status=TaskGroupActivityStatus.PENDING,
|
|
263
|
+
action=TaskGroupActivityAction.DELETE,
|
|
264
264
|
pkg_name=task_group.pkg_name,
|
|
265
265
|
version=(task_group.version or "N/A"),
|
|
266
266
|
timestamp_started=get_timestamp(),
|
|
@@ -7,68 +7,66 @@ from fastapi import APIRouter
|
|
|
7
7
|
from fractal_server.config import get_settings
|
|
8
8
|
from fractal_server.syringe import Inject
|
|
9
9
|
|
|
10
|
-
from .dataset import router as
|
|
11
|
-
from .history import router as
|
|
12
|
-
from .images import router as
|
|
13
|
-
from .job import router as
|
|
10
|
+
from .dataset import router as dataset_router
|
|
11
|
+
from .history import router as history_router
|
|
12
|
+
from .images import router as images_routes
|
|
13
|
+
from .job import router as job_router
|
|
14
14
|
from .pre_submission_checks import router as pre_submission_checks_router
|
|
15
|
-
from .project import router as
|
|
16
|
-
from .sharing import router as
|
|
17
|
-
from .status_legacy import router as
|
|
18
|
-
from .submit import router as
|
|
19
|
-
from .task import router as
|
|
20
|
-
from .task_collection import router as
|
|
21
|
-
from .task_collection_custom import router as
|
|
22
|
-
from .task_collection_pixi import router as
|
|
23
|
-
from .task_group import router as
|
|
24
|
-
from .task_group_lifecycle import router as
|
|
25
|
-
from .task_version_update import router as
|
|
26
|
-
from .workflow import router as
|
|
27
|
-
from .workflow_import import router as
|
|
28
|
-
from .workflowtask import router as
|
|
15
|
+
from .project import router as project_router
|
|
16
|
+
from .sharing import router as sharing_router
|
|
17
|
+
from .status_legacy import router as status_legacy_router
|
|
18
|
+
from .submit import router as submit_job_router
|
|
19
|
+
from .task import router as task_router
|
|
20
|
+
from .task_collection import router as task_collection_router
|
|
21
|
+
from .task_collection_custom import router as task_collection_router_custom
|
|
22
|
+
from .task_collection_pixi import router as task_collection_pixi_router
|
|
23
|
+
from .task_group import router as task_group_router
|
|
24
|
+
from .task_group_lifecycle import router as task_group_lifecycle_router
|
|
25
|
+
from .task_version_update import router as task_version_update_router
|
|
26
|
+
from .workflow import router as workflow_router
|
|
27
|
+
from .workflow_import import router as workflow_import_router
|
|
28
|
+
from .workflowtask import router as workflowtask_router
|
|
29
29
|
|
|
30
|
-
|
|
30
|
+
router_api = APIRouter()
|
|
31
31
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
32
|
+
router_api.include_router(dataset_router, tags=["Dataset"])
|
|
33
|
+
router_api.include_router(pre_submission_checks_router, tags=["Job"])
|
|
34
|
+
router_api.include_router(job_router, tags=["Job"])
|
|
35
|
+
router_api.include_router(images_routes, tags=["Images"])
|
|
36
|
+
router_api.include_router(sharing_router, tags=["Project Sharing"])
|
|
37
|
+
router_api.include_router(project_router, tags=["Project"])
|
|
38
|
+
router_api.include_router(submit_job_router, tags=["Job"])
|
|
39
|
+
router_api.include_router(history_router, tags=["History"])
|
|
40
|
+
router_api.include_router(status_legacy_router, tags=["Status Legacy"])
|
|
41
41
|
|
|
42
42
|
|
|
43
43
|
settings = Inject(get_settings)
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
router_api.include_router(
|
|
45
|
+
task_collection_router,
|
|
46
46
|
prefix="/task",
|
|
47
|
-
tags=["
|
|
47
|
+
tags=["Task Lifecycle"],
|
|
48
48
|
)
|
|
49
|
-
|
|
50
|
-
|
|
49
|
+
router_api.include_router(
|
|
50
|
+
task_collection_router_custom,
|
|
51
51
|
prefix="/task",
|
|
52
|
-
tags=["
|
|
52
|
+
tags=["Task Lifecycle"],
|
|
53
53
|
)
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
router_api.include_router(
|
|
55
|
+
task_collection_pixi_router,
|
|
56
56
|
prefix="/task",
|
|
57
|
-
tags=["
|
|
57
|
+
tags=["Task Lifecycle"],
|
|
58
58
|
)
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
router_api.include_router(
|
|
60
|
+
task_group_lifecycle_router,
|
|
61
61
|
prefix="/task-group",
|
|
62
|
-
tags=["
|
|
62
|
+
tags=["Task Lifecycle"],
|
|
63
63
|
)
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
65
|
+
router_api.include_router(task_router, prefix="/task", tags=["Task"])
|
|
66
|
+
router_api.include_router(task_version_update_router, tags=["Task"])
|
|
67
|
+
router_api.include_router(
|
|
68
|
+
task_group_router, prefix="/task-group", tags=["TaskGroup"]
|
|
69
69
|
)
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
)
|
|
74
|
-
router_api_v2.include_router(workflowtask_router_v2, tags=["V2 WorkflowTask"])
|
|
70
|
+
router_api.include_router(workflow_router, tags=["Workflow"])
|
|
71
|
+
router_api.include_router(workflow_import_router, tags=["Workflow Import"])
|
|
72
|
+
router_api.include_router(workflowtask_router, tags=["WorkflowTask"])
|