fractal-server 1.4.10__py3-none-any.whl → 2.0.0a0__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.
Files changed (132) hide show
  1. fractal_server/__init__.py +1 -1
  2. fractal_server/app/models/__init__.py +4 -7
  3. fractal_server/app/models/linkuserproject.py +9 -0
  4. fractal_server/app/models/security.py +6 -0
  5. fractal_server/app/models/state.py +1 -1
  6. fractal_server/app/models/v1/__init__.py +10 -0
  7. fractal_server/app/models/{dataset.py → v1/dataset.py} +5 -5
  8. fractal_server/app/models/{job.py → v1/job.py} +5 -5
  9. fractal_server/app/models/{project.py → v1/project.py} +5 -5
  10. fractal_server/app/models/{task.py → v1/task.py} +7 -2
  11. fractal_server/app/models/{workflow.py → v1/workflow.py} +5 -5
  12. fractal_server/app/models/v2/__init__.py +20 -0
  13. fractal_server/app/models/v2/dataset.py +55 -0
  14. fractal_server/app/models/v2/job.py +51 -0
  15. fractal_server/app/models/v2/project.py +31 -0
  16. fractal_server/app/models/v2/task.py +93 -0
  17. fractal_server/app/models/v2/workflow.py +43 -0
  18. fractal_server/app/models/v2/workflowtask.py +90 -0
  19. fractal_server/app/routes/{admin.py → admin/v1.py} +42 -42
  20. fractal_server/app/routes/admin/v2.py +275 -0
  21. fractal_server/app/routes/api/v1/__init__.py +7 -7
  22. fractal_server/app/routes/api/v1/_aux_functions.py +2 -2
  23. fractal_server/app/routes/api/v1/dataset.py +37 -37
  24. fractal_server/app/routes/api/v1/job.py +12 -12
  25. fractal_server/app/routes/api/v1/project.py +23 -21
  26. fractal_server/app/routes/api/v1/task.py +24 -14
  27. fractal_server/app/routes/api/v1/task_collection.py +16 -14
  28. fractal_server/app/routes/api/v1/workflow.py +24 -24
  29. fractal_server/app/routes/api/v1/workflowtask.py +10 -10
  30. fractal_server/app/routes/api/v2/__init__.py +28 -0
  31. fractal_server/app/routes/api/v2/_aux_functions.py +497 -0
  32. fractal_server/app/routes/api/v2/apply.py +220 -0
  33. fractal_server/app/routes/api/v2/dataset.py +310 -0
  34. fractal_server/app/routes/api/v2/images.py +212 -0
  35. fractal_server/app/routes/api/v2/job.py +200 -0
  36. fractal_server/app/routes/api/v2/project.py +205 -0
  37. fractal_server/app/routes/api/v2/task.py +222 -0
  38. fractal_server/app/routes/api/v2/task_collection.py +229 -0
  39. fractal_server/app/routes/api/v2/workflow.py +398 -0
  40. fractal_server/app/routes/api/v2/workflowtask.py +269 -0
  41. fractal_server/app/routes/aux/_job.py +1 -1
  42. fractal_server/app/runner/async_wrap.py +27 -0
  43. fractal_server/app/runner/exceptions.py +129 -0
  44. fractal_server/app/runner/executors/local/__init__.py +3 -0
  45. fractal_server/app/runner/{_local → executors/local}/executor.py +2 -2
  46. fractal_server/app/runner/executors/slurm/__init__.py +3 -0
  47. fractal_server/app/runner/{_slurm → executors/slurm}/_batching.py +1 -1
  48. fractal_server/app/runner/{_slurm → executors/slurm}/_check_jobs_status.py +1 -1
  49. fractal_server/app/runner/{_slurm → executors/slurm}/_executor_wait_thread.py +1 -1
  50. fractal_server/app/runner/{_slurm → executors/slurm}/_slurm_config.py +3 -152
  51. fractal_server/app/runner/{_slurm → executors/slurm}/_subprocess_run_as_user.py +1 -1
  52. fractal_server/app/runner/{_slurm → executors/slurm}/executor.py +9 -9
  53. fractal_server/app/runner/filenames.py +6 -0
  54. fractal_server/app/runner/set_start_and_last_task_index.py +39 -0
  55. fractal_server/app/runner/task_files.py +105 -0
  56. fractal_server/app/runner/{__init__.py → v1/__init__.py} +24 -22
  57. fractal_server/app/runner/{_common.py → v1/_common.py} +13 -120
  58. fractal_server/app/runner/{_local → v1/_local}/__init__.py +6 -6
  59. fractal_server/app/runner/{_local → v1/_local}/_local_config.py +6 -7
  60. fractal_server/app/runner/{_local → v1/_local}/_submit_setup.py +1 -5
  61. fractal_server/app/runner/v1/_slurm/__init__.py +310 -0
  62. fractal_server/app/runner/{_slurm → v1/_slurm}/_submit_setup.py +3 -9
  63. fractal_server/app/runner/v1/_slurm/get_slurm_config.py +163 -0
  64. fractal_server/app/runner/v1/common.py +117 -0
  65. fractal_server/app/runner/{handle_failed_job.py → v1/handle_failed_job.py} +8 -8
  66. fractal_server/app/runner/v2/__init__.py +337 -0
  67. fractal_server/app/runner/v2/_local/__init__.py +169 -0
  68. fractal_server/app/runner/v2/_local/_local_config.py +118 -0
  69. fractal_server/app/runner/v2/_local/_submit_setup.py +52 -0
  70. fractal_server/app/runner/v2/_slurm/__init__.py +157 -0
  71. fractal_server/app/runner/v2/_slurm/_submit_setup.py +83 -0
  72. fractal_server/app/runner/v2/_slurm/get_slurm_config.py +179 -0
  73. fractal_server/app/runner/v2/components.py +5 -0
  74. fractal_server/app/runner/v2/deduplicate_list.py +24 -0
  75. fractal_server/app/runner/v2/handle_failed_job.py +156 -0
  76. fractal_server/app/runner/v2/merge_outputs.py +41 -0
  77. fractal_server/app/runner/v2/runner.py +264 -0
  78. fractal_server/app/runner/v2/runner_functions.py +339 -0
  79. fractal_server/app/runner/v2/runner_functions_low_level.py +134 -0
  80. fractal_server/app/runner/v2/task_interface.py +43 -0
  81. fractal_server/app/runner/v2/v1_compat.py +21 -0
  82. fractal_server/app/schemas/__init__.py +4 -42
  83. fractal_server/app/schemas/v1/__init__.py +42 -0
  84. fractal_server/app/schemas/{applyworkflow.py → v1/applyworkflow.py} +18 -18
  85. fractal_server/app/schemas/{dataset.py → v1/dataset.py} +30 -30
  86. fractal_server/app/schemas/{dumps.py → v1/dumps.py} +8 -8
  87. fractal_server/app/schemas/{manifest.py → v1/manifest.py} +5 -5
  88. fractal_server/app/schemas/{project.py → v1/project.py} +9 -9
  89. fractal_server/app/schemas/{task.py → v1/task.py} +12 -12
  90. fractal_server/app/schemas/{task_collection.py → v1/task_collection.py} +7 -7
  91. fractal_server/app/schemas/{workflow.py → v1/workflow.py} +38 -38
  92. fractal_server/app/schemas/v2/__init__.py +34 -0
  93. fractal_server/app/schemas/v2/dataset.py +88 -0
  94. fractal_server/app/schemas/v2/dumps.py +87 -0
  95. fractal_server/app/schemas/v2/job.py +113 -0
  96. fractal_server/app/schemas/v2/manifest.py +109 -0
  97. fractal_server/app/schemas/v2/project.py +36 -0
  98. fractal_server/app/schemas/v2/task.py +121 -0
  99. fractal_server/app/schemas/v2/task_collection.py +105 -0
  100. fractal_server/app/schemas/v2/workflow.py +78 -0
  101. fractal_server/app/schemas/v2/workflowtask.py +118 -0
  102. fractal_server/config.py +5 -4
  103. fractal_server/images/__init__.py +50 -0
  104. fractal_server/images/tools.py +86 -0
  105. fractal_server/main.py +11 -3
  106. fractal_server/migrations/versions/4b35c5cefbe3_tmp_is_v2_compatible.py +39 -0
  107. fractal_server/migrations/versions/56af171b0159_v2.py +217 -0
  108. fractal_server/migrations/versions/876f28db9d4e_tmp_split_task_and_wftask_meta.py +68 -0
  109. fractal_server/migrations/versions/974c802f0dd0_tmp_workflowtaskv2_type_in_db.py +37 -0
  110. fractal_server/migrations/versions/9cd305cd6023_tmp_workflowtaskv2.py +40 -0
  111. fractal_server/migrations/versions/a6231ed6273c_tmp_args_schemas_in_taskv2.py +42 -0
  112. fractal_server/migrations/versions/b9e9eed9d442_tmp_taskv2_type.py +37 -0
  113. fractal_server/migrations/versions/e3e639454d4b_tmp_make_task_meta_non_optional.py +50 -0
  114. fractal_server/tasks/__init__.py +0 -5
  115. fractal_server/tasks/endpoint_operations.py +13 -19
  116. fractal_server/tasks/utils.py +35 -0
  117. fractal_server/tasks/{_TaskCollectPip.py → v1/_TaskCollectPip.py} +3 -3
  118. fractal_server/tasks/{background_operations.py → v1/background_operations.py} +18 -50
  119. fractal_server/tasks/v1/get_collection_data.py +14 -0
  120. fractal_server/tasks/v2/_TaskCollectPip.py +103 -0
  121. fractal_server/tasks/v2/background_operations.py +382 -0
  122. fractal_server/tasks/v2/get_collection_data.py +14 -0
  123. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a0.dist-info}/METADATA +1 -1
  124. fractal_server-2.0.0a0.dist-info/RECORD +166 -0
  125. fractal_server/app/runner/_slurm/.gitignore +0 -2
  126. fractal_server/app/runner/_slurm/__init__.py +0 -150
  127. fractal_server/app/runner/common.py +0 -311
  128. fractal_server-1.4.10.dist-info/RECORD +0 -98
  129. /fractal_server/app/runner/{_slurm → executors/slurm}/remote.py +0 -0
  130. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a0.dist-info}/LICENSE +0 -0
  131. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a0.dist-info}/WHEEL +0 -0
  132. {fractal_server-1.4.10.dist-info → fractal_server-2.0.0a0.dist-info}/entry_points.txt +0 -0
@@ -27,12 +27,12 @@ from ....models import ApplyWorkflow
27
27
  from ....models import Project
28
28
  from ....models import Task
29
29
  from ....models import Workflow
30
- from ....schemas import WorkflowCreate
31
- from ....schemas import WorkflowExport
32
- from ....schemas import WorkflowImport
33
- from ....schemas import WorkflowRead
34
- from ....schemas import WorkflowTaskCreate
35
- from ....schemas import WorkflowUpdate
30
+ from ....schemas.v1 import WorkflowCreateV1
31
+ from ....schemas.v1 import WorkflowExportV1
32
+ from ....schemas.v1 import WorkflowImportV1
33
+ from ....schemas.v1 import WorkflowReadV1
34
+ from ....schemas.v1 import WorkflowTaskCreateV1
35
+ from ....schemas.v1 import WorkflowUpdateV1
36
36
  from ....security import current_active_user
37
37
  from ....security import User
38
38
  from ._aux_functions import _check_workflow_exists
@@ -47,13 +47,13 @@ router = APIRouter()
47
47
 
48
48
  @router.get(
49
49
  "/project/{project_id}/workflow/",
50
- response_model=list[WorkflowRead],
50
+ response_model=list[WorkflowReadV1],
51
51
  )
52
52
  async def get_workflow_list(
53
53
  project_id: int,
54
54
  user: User = Depends(current_active_user),
55
55
  db: AsyncSession = Depends(get_async_db),
56
- ) -> Optional[list[WorkflowRead]]:
56
+ ) -> Optional[list[WorkflowReadV1]]:
57
57
  """
58
58
  Get workflow list for given project
59
59
  """
@@ -72,15 +72,15 @@ async def get_workflow_list(
72
72
 
73
73
  @router.post(
74
74
  "/project/{project_id}/workflow/",
75
- response_model=WorkflowRead,
75
+ response_model=WorkflowReadV1,
76
76
  status_code=status.HTTP_201_CREATED,
77
77
  )
78
78
  async def create_workflow(
79
79
  project_id: int,
80
- workflow: WorkflowCreate,
80
+ workflow: WorkflowCreateV1,
81
81
  user: User = Depends(current_active_user),
82
82
  db: AsyncSession = Depends(get_async_db),
83
- ) -> Optional[WorkflowRead]:
83
+ ) -> Optional[WorkflowReadV1]:
84
84
  """
85
85
  Create a workflow, associate to a project
86
86
  """
@@ -103,14 +103,14 @@ async def create_workflow(
103
103
 
104
104
  @router.get(
105
105
  "/project/{project_id}/workflow/{workflow_id}/",
106
- response_model=WorkflowRead,
106
+ response_model=WorkflowReadV1,
107
107
  )
108
108
  async def read_workflow(
109
109
  project_id: int,
110
110
  workflow_id: int,
111
111
  user: User = Depends(current_active_user),
112
112
  db: AsyncSession = Depends(get_async_db),
113
- ) -> Optional[WorkflowRead]:
113
+ ) -> Optional[WorkflowReadV1]:
114
114
  """
115
115
  Get info on an existing workflow
116
116
  """
@@ -124,15 +124,15 @@ async def read_workflow(
124
124
 
125
125
  @router.patch(
126
126
  "/project/{project_id}/workflow/{workflow_id}/",
127
- response_model=WorkflowRead,
127
+ response_model=WorkflowReadV1,
128
128
  )
129
129
  async def update_workflow(
130
130
  project_id: int,
131
131
  workflow_id: int,
132
- patch: WorkflowUpdate,
132
+ patch: WorkflowUpdateV1,
133
133
  user: User = Depends(current_active_user),
134
134
  db: AsyncSession = Depends(get_async_db),
135
- ) -> Optional[WorkflowRead]:
135
+ ) -> Optional[WorkflowReadV1]:
136
136
  """
137
137
  Edit a workflow
138
138
  """
@@ -228,14 +228,14 @@ async def delete_workflow(
228
228
 
229
229
  @router.get(
230
230
  "/project/{project_id}/workflow/{workflow_id}/export/",
231
- response_model=WorkflowExport,
231
+ response_model=WorkflowExportV1,
232
232
  )
233
233
  async def export_worfklow(
234
234
  project_id: int,
235
235
  workflow_id: int,
236
236
  user: User = Depends(current_active_user),
237
237
  db: AsyncSession = Depends(get_async_db),
238
- ) -> Optional[WorkflowExport]:
238
+ ) -> Optional[WorkflowExportV1]:
239
239
  """
240
240
  Export an existing workflow, after stripping all IDs
241
241
  """
@@ -260,15 +260,15 @@ async def export_worfklow(
260
260
 
261
261
  @router.post(
262
262
  "/project/{project_id}/workflow/import/",
263
- response_model=WorkflowRead,
263
+ response_model=WorkflowReadV1,
264
264
  status_code=status.HTTP_201_CREATED,
265
265
  )
266
266
  async def import_workflow(
267
267
  project_id: int,
268
- workflow: WorkflowImport,
268
+ workflow: WorkflowImportV1,
269
269
  user: User = Depends(current_active_user),
270
270
  db: AsyncSession = Depends(get_async_db),
271
- ) -> Optional[WorkflowRead]:
271
+ ) -> Optional[WorkflowReadV1]:
272
272
  """
273
273
  Import an existing workflow into a project
274
274
 
@@ -320,7 +320,7 @@ async def import_workflow(
320
320
  source = wf_task.task.source
321
321
  task_id = source_to_id[source]
322
322
  # Prepare new_wf_task
323
- new_wf_task = WorkflowTaskCreate(
323
+ new_wf_task = WorkflowTaskCreateV1(
324
324
  **wf_task.dict(exclude_none=True),
325
325
  )
326
326
  # Insert task
@@ -335,11 +335,11 @@ async def import_workflow(
335
335
  return db_workflow
336
336
 
337
337
 
338
- @router.get("/workflow/", response_model=list[WorkflowRead])
338
+ @router.get("/workflow/", response_model=list[WorkflowReadV1])
339
339
  async def get_user_workflows(
340
340
  user: User = Depends(current_active_user),
341
341
  db: AsyncSession = Depends(get_async_db),
342
- ) -> list[WorkflowRead]:
342
+ ) -> list[WorkflowReadV1]:
343
343
  """
344
344
  Returns all the workflows of the current user
345
345
  """
@@ -23,9 +23,9 @@ from fastapi import status
23
23
  from ....db import AsyncSession
24
24
  from ....db import get_async_db
25
25
  from ....models import Task
26
- from ....schemas import WorkflowTaskCreate
27
- from ....schemas import WorkflowTaskRead
28
- from ....schemas import WorkflowTaskUpdate
26
+ from ....schemas.v1 import WorkflowTaskCreateV1
27
+ from ....schemas.v1 import WorkflowTaskReadV1
28
+ from ....schemas.v1 import WorkflowTaskUpdateV1
29
29
  from ....security import current_active_user
30
30
  from ....security import User
31
31
  from ._aux_functions import _get_workflow_check_owner
@@ -37,17 +37,17 @@ router = APIRouter()
37
37
 
38
38
  @router.post(
39
39
  "/project/{project_id}/workflow/{workflow_id}/wftask/",
40
- response_model=WorkflowTaskRead,
40
+ response_model=WorkflowTaskReadV1,
41
41
  status_code=status.HTTP_201_CREATED,
42
42
  )
43
43
  async def create_workflowtask(
44
44
  project_id: int,
45
45
  workflow_id: int,
46
46
  task_id: int,
47
- new_task: WorkflowTaskCreate,
47
+ new_task: WorkflowTaskCreateV1,
48
48
  user: User = Depends(current_active_user),
49
49
  db: AsyncSession = Depends(get_async_db),
50
- ) -> Optional[WorkflowTaskRead]:
50
+ ) -> Optional[WorkflowTaskReadV1]:
51
51
  """
52
52
  Add a WorkflowTask to a Workflow
53
53
  """
@@ -78,7 +78,7 @@ async def create_workflowtask(
78
78
 
79
79
  @router.get(
80
80
  "/project/{project_id}/workflow/{workflow_id}/wftask/{workflow_task_id}/",
81
- response_model=WorkflowTaskRead,
81
+ response_model=WorkflowTaskReadV1,
82
82
  )
83
83
  async def read_workflowtask(
84
84
  project_id: int,
@@ -99,16 +99,16 @@ async def read_workflowtask(
99
99
 
100
100
  @router.patch(
101
101
  "/project/{project_id}/workflow/{workflow_id}/wftask/{workflow_task_id}/",
102
- response_model=WorkflowTaskRead,
102
+ response_model=WorkflowTaskReadV1,
103
103
  )
104
104
  async def update_workflowtask(
105
105
  project_id: int,
106
106
  workflow_id: int,
107
107
  workflow_task_id: int,
108
- workflow_task_update: WorkflowTaskUpdate,
108
+ workflow_task_update: WorkflowTaskUpdateV1,
109
109
  user: User = Depends(current_active_user),
110
110
  db: AsyncSession = Depends(get_async_db),
111
- ) -> Optional[WorkflowTaskRead]:
111
+ ) -> Optional[WorkflowTaskReadV1]:
112
112
  """
113
113
  Edit a WorkflowTask of a Workflow
114
114
  """
@@ -0,0 +1,28 @@
1
+ """
2
+ `api/v2` module
3
+ """
4
+ from fastapi import APIRouter
5
+
6
+ from .apply import router as runner_router_v2
7
+ from .dataset import router as dataset_router_v2
8
+ from .images import router as images_routes_v2
9
+ from .job import router as job_router_v2
10
+ from .project import router as project_router_v2
11
+ from .task import router as task_router_v2
12
+ from .task_collection import router as task_collection_router_v2
13
+ from .workflow import router as workflow_router_v2
14
+ from .workflowtask import router as workflowtask_router_v2
15
+
16
+ router_api_v2 = APIRouter()
17
+
18
+ router_api_v2.include_router(dataset_router_v2, tags=["V2 Dataset"])
19
+ router_api_v2.include_router(job_router_v2, tags=["V2 Job"])
20
+ router_api_v2.include_router(images_routes_v2, tags=["V2 Images"])
21
+ router_api_v2.include_router(project_router_v2, tags=["V2 Project"])
22
+ router_api_v2.include_router(runner_router_v2, tags=["V2 Apply-workflow"])
23
+ router_api_v2.include_router(task_router_v2, prefix="/task", tags=["V2 Task"])
24
+ router_api_v2.include_router(
25
+ task_collection_router_v2, prefix="/task", tags=["V2 Task Collection"]
26
+ )
27
+ router_api_v2.include_router(workflow_router_v2, tags=["V2 Workflow"])
28
+ router_api_v2.include_router(workflowtask_router_v2, tags=["V2 WorkflowTask"])