fractal-server 2.0.5__py3-none-any.whl → 2.1.0__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 +0 -4
- fractal_server/app/models/security.py +0 -13
- fractal_server/app/models/v1/__init__.py +10 -9
- fractal_server/app/models/v1/project.py +1 -2
- fractal_server/app/models/v2/project.py +1 -2
- fractal_server/app/routes/api/v1/_aux_functions.py +1 -1
- fractal_server/app/routes/api/v1/project.py +1 -1
- fractal_server/app/routes/api/v2/submit.py +5 -10
- fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py +1 -1
- fractal_server/app/runner/executors/slurm/executor.py +12 -0
- fractal_server/app/runner/v1/__init__.py +5 -10
- fractal_server/app/security/__init__.py +4 -5
- fractal_server/config.py +26 -0
- fractal_server/{logger.py → logger/__init__.py} +28 -2
- fractal_server/logger/gunicorn_logger.py +19 -0
- fractal_server/main.py +31 -30
- {fractal_server-2.0.5.dist-info → fractal_server-2.1.0.dist-info}/METADATA +1 -1
- {fractal_server-2.0.5.dist-info → fractal_server-2.1.0.dist-info}/RECORD +22 -21
- {fractal_server-2.0.5.dist-info → fractal_server-2.1.0.dist-info}/LICENSE +0 -0
- {fractal_server-2.0.5.dist-info → fractal_server-2.1.0.dist-info}/WHEEL +0 -0
- {fractal_server-2.0.5.dist-info → fractal_server-2.1.0.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.0
|
1
|
+
__VERSION__ = "2.1.0"
|
@@ -18,9 +18,6 @@ from sqlmodel import Field
|
|
18
18
|
from sqlmodel import Relationship
|
19
19
|
from sqlmodel import SQLModel
|
20
20
|
|
21
|
-
from .linkuserproject import LinkUserProject
|
22
|
-
from .linkuserproject import LinkUserProjectV2
|
23
|
-
|
24
21
|
|
25
22
|
class OAuthAccount(SQLModel, table=True):
|
26
23
|
"""
|
@@ -103,16 +100,6 @@ class UserOAuth(SQLModel, table=True):
|
|
103
100
|
back_populates="user",
|
104
101
|
sa_relationship_kwargs={"lazy": "joined", "cascade": "all, delete"},
|
105
102
|
)
|
106
|
-
project_list: list["Project"] = Relationship( # noqa
|
107
|
-
back_populates="user_list",
|
108
|
-
link_model=LinkUserProject,
|
109
|
-
sa_relationship_kwargs={"lazy": "selectin"},
|
110
|
-
)
|
111
|
-
project_list_v2: list["ProjectV2"] = Relationship( # noqa
|
112
|
-
back_populates="user_list",
|
113
|
-
link_model=LinkUserProjectV2,
|
114
|
-
sa_relationship_kwargs={"lazy": "selectin"},
|
115
|
-
)
|
116
103
|
|
117
104
|
class Config:
|
118
105
|
orm_mode = True
|
@@ -1,12 +1,13 @@
|
|
1
1
|
"""
|
2
2
|
`models` module
|
3
3
|
"""
|
4
|
-
from
|
5
|
-
from .dataset import
|
6
|
-
from .
|
7
|
-
from .job import
|
8
|
-
from .
|
9
|
-
from .
|
10
|
-
from .
|
11
|
-
from .
|
12
|
-
from .workflow import
|
4
|
+
from ..linkuserproject import LinkUserProject # noqa F401
|
5
|
+
from .dataset import Dataset # noqa F401
|
6
|
+
from .dataset import Resource # noqa F401
|
7
|
+
from .job import ApplyWorkflow # noqa F401
|
8
|
+
from .job import JobStatusTypeV1 # noqa F401
|
9
|
+
from .project import Project # noqa F401
|
10
|
+
from .state import State # noqa F401
|
11
|
+
from .task import Task # noqa F401
|
12
|
+
from .workflow import Workflow # noqa F401
|
13
|
+
from .workflow import WorkflowTask # noqa F401
|
@@ -7,9 +7,9 @@ from sqlmodel import Field
|
|
7
7
|
from sqlmodel import Relationship
|
8
8
|
from sqlmodel import SQLModel
|
9
9
|
|
10
|
+
from . import LinkUserProject
|
10
11
|
from ....utils import get_timestamp
|
11
12
|
from ...schemas.v1.project import _ProjectBaseV1
|
12
|
-
from ..linkuserproject import LinkUserProject
|
13
13
|
from ..security import UserOAuth
|
14
14
|
|
15
15
|
|
@@ -23,7 +23,6 @@ class Project(_ProjectBaseV1, SQLModel, table=True):
|
|
23
23
|
|
24
24
|
user_list: list[UserOAuth] = Relationship(
|
25
25
|
link_model=LinkUserProject,
|
26
|
-
back_populates="project_list",
|
27
26
|
sa_relationship_kwargs={
|
28
27
|
"lazy": "selectin",
|
29
28
|
},
|
@@ -7,8 +7,8 @@ from sqlmodel import Field
|
|
7
7
|
from sqlmodel import Relationship
|
8
8
|
from sqlmodel import SQLModel
|
9
9
|
|
10
|
+
from . import LinkUserProjectV2
|
10
11
|
from ....utils import get_timestamp
|
11
|
-
from ..linkuserproject import LinkUserProjectV2
|
12
12
|
from ..security import UserOAuth
|
13
13
|
|
14
14
|
|
@@ -23,7 +23,6 @@ class ProjectV2(SQLModel, table=True):
|
|
23
23
|
|
24
24
|
user_list: list[UserOAuth] = Relationship(
|
25
25
|
link_model=LinkUserProjectV2,
|
26
|
-
back_populates="project_list_v2",
|
27
26
|
sa_relationship_kwargs={
|
28
27
|
"lazy": "selectin",
|
29
28
|
},
|
@@ -12,9 +12,9 @@ from sqlmodel import select
|
|
12
12
|
from sqlmodel.sql.expression import SelectOfScalar
|
13
13
|
|
14
14
|
from ....db import AsyncSession
|
15
|
-
from ....models import LinkUserProject
|
16
15
|
from ....models.v1 import ApplyWorkflow
|
17
16
|
from ....models.v1 import Dataset
|
17
|
+
from ....models.v1 import LinkUserProject
|
18
18
|
from ....models.v1 import Project
|
19
19
|
from ....models.v1 import Task
|
20
20
|
from ....models.v1 import Workflow
|
@@ -18,9 +18,9 @@ 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 LinkUserProject
|
22
21
|
from ....models.v1 import ApplyWorkflow
|
23
22
|
from ....models.v1 import Dataset
|
23
|
+
from ....models.v1 import LinkUserProject
|
24
24
|
from ....models.v1 import Project
|
25
25
|
from ....models.v1 import Workflow
|
26
26
|
from ....runner.set_start_and_last_task_index import (
|
@@ -195,21 +195,16 @@ async def apply_workflow(
|
|
195
195
|
|
196
196
|
# Define server-side job directory
|
197
197
|
timestamp_string = get_timestamp().strftime("%Y%m%d_%H%M%S")
|
198
|
-
WORKFLOW_DIR = (
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
f"_{timestamp_string}"
|
203
|
-
)
|
204
|
-
).resolve()
|
198
|
+
WORKFLOW_DIR = settings.FRACTAL_RUNNER_WORKING_BASE_DIR / (
|
199
|
+
f"proj_v2_{project_id:07d}_wf_{workflow_id:07d}_job_{job.id:07d}"
|
200
|
+
f"_{timestamp_string}"
|
201
|
+
)
|
205
202
|
|
206
203
|
# Define user-side job directory
|
207
204
|
if FRACTAL_RUNNER_BACKEND == "local":
|
208
205
|
WORKFLOW_DIR_USER = WORKFLOW_DIR
|
209
206
|
elif FRACTAL_RUNNER_BACKEND == "slurm":
|
210
|
-
WORKFLOW_DIR_USER = (
|
211
|
-
Path(user.cache_dir) / f"{WORKFLOW_DIR.name}"
|
212
|
-
).resolve()
|
207
|
+
WORKFLOW_DIR_USER = Path(user.cache_dir) / f"{WORKFLOW_DIR.name}"
|
213
208
|
|
214
209
|
# Update job folders in the db
|
215
210
|
job.working_dir = WORKFLOW_DIR.as_posix()
|
@@ -141,7 +141,7 @@ def _glob_as_user_strict(
|
|
141
141
|
new_output = []
|
142
142
|
known_filenames = [
|
143
143
|
f"{startswith}{suffix}"
|
144
|
-
for suffix in [".args.json", ".metadiff.json", ".err", ".out"]
|
144
|
+
for suffix in [".args.json", ".metadiff.json", ".err", ".out", ".log"]
|
145
145
|
]
|
146
146
|
for filename in output:
|
147
147
|
if filename in known_filenames:
|
@@ -1188,3 +1188,15 @@ class FractalSlurmExecutor(SlurmExecutor):
|
|
1188
1188
|
raise JobExecutionError(info=error_msg)
|
1189
1189
|
|
1190
1190
|
logger.debug("Executor shutdown: end")
|
1191
|
+
|
1192
|
+
def __exit__(self, *args, **kwargs):
|
1193
|
+
"""
|
1194
|
+
See
|
1195
|
+
https://github.com/fractal-analytics-platform/fractal-server/issues/1508
|
1196
|
+
"""
|
1197
|
+
logger.debug(
|
1198
|
+
"[FractalSlurmExecutor.__exit__] Stop and join `wait_thread`"
|
1199
|
+
)
|
1200
|
+
self.wait_thread.stop()
|
1201
|
+
self.wait_thread.join()
|
1202
|
+
logger.debug("[FractalSlurmExecutor.__exit__] End")
|
@@ -137,13 +137,10 @@ async def submit_workflow(
|
|
137
137
|
# Define and create server-side working folder
|
138
138
|
project_id = workflow.project_id
|
139
139
|
timestamp_string = get_timestamp().strftime("%Y%m%d_%H%M%S")
|
140
|
-
WORKFLOW_DIR = (
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
f"_{timestamp_string}"
|
145
|
-
)
|
146
|
-
).resolve()
|
140
|
+
WORKFLOW_DIR = settings.FRACTAL_RUNNER_WORKING_BASE_DIR / (
|
141
|
+
f"proj_{project_id:07d}_wf_{workflow_id:07d}_job_{job_id:07d}"
|
142
|
+
f"_{timestamp_string}"
|
143
|
+
)
|
147
144
|
|
148
145
|
if WORKFLOW_DIR.exists():
|
149
146
|
raise RuntimeError(f"Workflow dir {WORKFLOW_DIR} already exists.")
|
@@ -162,9 +159,7 @@ async def submit_workflow(
|
|
162
159
|
_mkdir_as_user,
|
163
160
|
)
|
164
161
|
|
165
|
-
WORKFLOW_DIR_USER = (
|
166
|
-
Path(user_cache_dir) / f"{WORKFLOW_DIR.name}"
|
167
|
-
).resolve()
|
162
|
+
WORKFLOW_DIR_USER = Path(user_cache_dir) / f"{WORKFLOW_DIR.name}"
|
168
163
|
_mkdir_as_user(folder=str(WORKFLOW_DIR_USER), user=slurm_user)
|
169
164
|
else:
|
170
165
|
raise ValueError(f"{FRACTAL_RUNNER_BACKEND=} not supported")
|
@@ -57,9 +57,8 @@ from sqlmodel import select
|
|
57
57
|
from ...config import get_settings
|
58
58
|
from ...syringe import Inject
|
59
59
|
from ..db import get_async_db
|
60
|
-
from
|
61
|
-
from
|
62
|
-
from fractal_server.app.models.security import UserOAuth
|
60
|
+
from fractal_server.app.models.security import OAuthAccount
|
61
|
+
from fractal_server.app.models.security import UserOAuth as User
|
63
62
|
from fractal_server.app.schemas.user import UserCreate
|
64
63
|
from fractal_server.logger import get_logger
|
65
64
|
|
@@ -287,8 +286,8 @@ async def _create_first_user(
|
|
287
286
|
|
288
287
|
if is_superuser is True:
|
289
288
|
# If a superuser already exists, exit
|
290
|
-
stm = select(
|
291
|
-
|
289
|
+
stm = select(User).where(
|
290
|
+
User.is_superuser == True # noqa E712
|
292
291
|
)
|
293
292
|
res = await session.execute(stm)
|
294
293
|
existing_superuser = res.scalars().first()
|
fractal_server/config.py
CHANGED
@@ -289,6 +289,27 @@ class Settings(BaseSettings):
|
|
289
289
|
)
|
290
290
|
return FRACTAL_TASKS_DIR_path
|
291
291
|
|
292
|
+
@validator("FRACTAL_RUNNER_WORKING_BASE_DIR", always=True)
|
293
|
+
def make_FRACTAL_RUNNER_WORKING_BASE_DIR_absolute(cls, v):
|
294
|
+
"""
|
295
|
+
(Copy of make_FRACTAL_TASKS_DIR_absolute)
|
296
|
+
If `FRACTAL_RUNNER_WORKING_BASE_DIR` is a non-absolute path,
|
297
|
+
make it absolute (based on the current working directory).
|
298
|
+
"""
|
299
|
+
if v is None:
|
300
|
+
return None
|
301
|
+
FRACTAL_RUNNER_WORKING_BASE_DIR_path = Path(v)
|
302
|
+
if not FRACTAL_RUNNER_WORKING_BASE_DIR_path.is_absolute():
|
303
|
+
FRACTAL_RUNNER_WORKING_BASE_DIR_path = (
|
304
|
+
FRACTAL_RUNNER_WORKING_BASE_DIR_path.resolve()
|
305
|
+
)
|
306
|
+
logging.warning(
|
307
|
+
f'FRACTAL_RUNNER_WORKING_BASE_DIR="{v}" is not an absolute '
|
308
|
+
"path; converting it to "
|
309
|
+
f'"{str(FRACTAL_RUNNER_WORKING_BASE_DIR_path)}"'
|
310
|
+
)
|
311
|
+
return FRACTAL_RUNNER_WORKING_BASE_DIR_path
|
312
|
+
|
292
313
|
FRACTAL_RUNNER_BACKEND: Literal["local", "slurm"] = "local"
|
293
314
|
"""
|
294
315
|
Select which runner backend to use.
|
@@ -361,6 +382,11 @@ class Settings(BaseSettings):
|
|
361
382
|
attribute in their input-arguments JSON file.
|
362
383
|
"""
|
363
384
|
|
385
|
+
FRACTAL_API_V1_MODE: Literal["include", "exclude"] = "include"
|
386
|
+
"""
|
387
|
+
Whether to include the v1 API.
|
388
|
+
"""
|
389
|
+
|
364
390
|
###########################################################################
|
365
391
|
# BUSINESS LOGIC
|
366
392
|
###########################################################################
|
@@ -17,8 +17,8 @@ from pathlib import Path
|
|
17
17
|
from typing import Optional
|
18
18
|
from typing import Union
|
19
19
|
|
20
|
-
from
|
21
|
-
from
|
20
|
+
from ..config import get_settings
|
21
|
+
from ..syringe import Inject
|
22
22
|
|
23
23
|
|
24
24
|
LOG_FORMAT = "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
|
@@ -136,3 +136,29 @@ def reset_logger_handlers(logger: logging.Logger) -> None:
|
|
136
136
|
"""
|
137
137
|
close_logger(logger)
|
138
138
|
logger.handlers.clear()
|
139
|
+
|
140
|
+
|
141
|
+
def config_uvicorn_loggers():
|
142
|
+
"""
|
143
|
+
Change the formatter for the uvicorn access/error loggers.
|
144
|
+
|
145
|
+
This is similar to https://stackoverflow.com/a/68864979/19085332. See also
|
146
|
+
https://github.com/tiangolo/fastapi/issues/1508.
|
147
|
+
|
148
|
+
This function is meant to work in two scenarios:
|
149
|
+
|
150
|
+
1. The most relevant case is for a `gunicorn` startup command, with
|
151
|
+
`--access-logfile` and `--error-logfile` options set.
|
152
|
+
2. The case of `fractalctl start` (directly calling `uvicorn`).
|
153
|
+
|
154
|
+
Because of the second use case, we need to check whether uvicorn loggers
|
155
|
+
already have a handler. If not, we skip the formatting.
|
156
|
+
"""
|
157
|
+
|
158
|
+
access_logger = logging.getLogger("uvicorn.access")
|
159
|
+
if len(access_logger.handlers) > 0:
|
160
|
+
access_logger.handlers[0].setFormatter(LOG_FORMATTER)
|
161
|
+
|
162
|
+
error_logger = logging.getLogger("uvicorn.error")
|
163
|
+
if len(error_logger.handlers) > 0:
|
164
|
+
error_logger.handlers[0].setFormatter(LOG_FORMATTER)
|
@@ -0,0 +1,19 @@
|
|
1
|
+
"""
|
2
|
+
This module (which is only executed if `gunicorn` can be imported) subclasses
|
3
|
+
the gunicorn `Logger` class in order to slightly change its log formats.
|
4
|
+
|
5
|
+
This class can be used by including this `gunicorn` command-line option:
|
6
|
+
```
|
7
|
+
--logger-class fractal_server.logger.gunicorn_logger.FractalGunicornLogger
|
8
|
+
```
|
9
|
+
"""
|
10
|
+
|
11
|
+
try:
|
12
|
+
from gunicorn.glogging import Logger as GunicornLogger
|
13
|
+
|
14
|
+
class FractalGunicornLogger(GunicornLogger):
|
15
|
+
error_fmt = r"%(asctime)s - gunicorn.error - %(levelname)s - [pid %(process)d] - %(message)s" # noqa: E501
|
16
|
+
datefmt = r"%Y-%m-%d %H:%M:%S,%u"
|
17
|
+
|
18
|
+
except (ModuleNotFoundError, ImportError):
|
19
|
+
pass
|
fractal_server/main.py
CHANGED
@@ -15,10 +15,13 @@
|
|
15
15
|
|
16
16
|
This module sets up the FastAPI application that serves the Fractal Server.
|
17
17
|
"""
|
18
|
+
from contextlib import asynccontextmanager
|
19
|
+
|
18
20
|
from fastapi import FastAPI
|
19
21
|
|
20
22
|
from .app.security import _create_first_user
|
21
23
|
from .config import get_settings
|
24
|
+
from .logger import config_uvicorn_loggers
|
22
25
|
from .logger import reset_logger_handlers
|
23
26
|
from .logger import set_logger
|
24
27
|
from .syringe import Inject
|
@@ -39,12 +42,15 @@ def collect_routers(app: FastAPI) -> None:
|
|
39
42
|
from .app.routes.admin.v2 import router_admin_v2
|
40
43
|
from .app.routes.auth import router_auth
|
41
44
|
|
45
|
+
settings = Inject(get_settings)
|
46
|
+
|
42
47
|
app.include_router(router_api, prefix="/api")
|
43
|
-
|
48
|
+
if settings.FRACTAL_API_V1_MODE == "include":
|
49
|
+
app.include_router(router_api_v1, prefix="/api/v1")
|
50
|
+
app.include_router(
|
51
|
+
router_admin_v1, prefix="/admin/v1", tags=["V1 Admin area"]
|
52
|
+
)
|
44
53
|
app.include_router(router_api_v2, prefix="/api/v2")
|
45
|
-
app.include_router(
|
46
|
-
router_admin_v1, prefix="/admin/v1", tags=["V1 Admin area"]
|
47
|
-
)
|
48
54
|
app.include_router(
|
49
55
|
router_admin_v2, prefix="/admin/v2", tags=["V2 Admin area"]
|
50
56
|
)
|
@@ -73,14 +79,27 @@ def check_settings() -> None:
|
|
73
79
|
reset_logger_handlers(logger)
|
74
80
|
|
75
81
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
It should only be called from a `@app.on_event("startup")`-decorated
|
81
|
-
callable.
|
82
|
-
"""
|
82
|
+
@asynccontextmanager
|
83
|
+
async def lifespan(app: FastAPI):
|
84
|
+
logger = set_logger("fractal_server.lifespan")
|
85
|
+
logger.info("Start application startup")
|
83
86
|
check_settings()
|
87
|
+
settings = Inject(get_settings)
|
88
|
+
await _create_first_user(
|
89
|
+
email=settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
|
90
|
+
password=settings.FRACTAL_DEFAULT_ADMIN_PASSWORD,
|
91
|
+
username=settings.FRACTAL_DEFAULT_ADMIN_USERNAME,
|
92
|
+
is_superuser=True,
|
93
|
+
is_verified=True,
|
94
|
+
)
|
95
|
+
config_uvicorn_loggers()
|
96
|
+
logger.info("End application startup")
|
97
|
+
reset_logger_handlers(logger)
|
98
|
+
yield
|
99
|
+
logger = set_logger("fractal_server.lifespan")
|
100
|
+
logger.info("Start application shutdown")
|
101
|
+
logger.info("End application shutdown")
|
102
|
+
reset_logger_handlers(logger)
|
84
103
|
|
85
104
|
|
86
105
|
def start_application() -> FastAPI:
|
@@ -91,27 +110,9 @@ def start_application() -> FastAPI:
|
|
91
110
|
app:
|
92
111
|
The fully initialised application.
|
93
112
|
"""
|
94
|
-
app = FastAPI()
|
113
|
+
app = FastAPI(lifespan=lifespan)
|
95
114
|
collect_routers(app)
|
96
115
|
return app
|
97
116
|
|
98
117
|
|
99
118
|
app = start_application()
|
100
|
-
|
101
|
-
|
102
|
-
@app.on_event("startup")
|
103
|
-
async def on_startup() -> None:
|
104
|
-
"""
|
105
|
-
Register the starup calls
|
106
|
-
|
107
|
-
If the calls raise any error, the application startup is aborted.
|
108
|
-
"""
|
109
|
-
settings = Inject(get_settings)
|
110
|
-
await _create_first_user(
|
111
|
-
email=settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
|
112
|
-
password=settings.FRACTAL_DEFAULT_ADMIN_PASSWORD,
|
113
|
-
username=settings.FRACTAL_DEFAULT_ADMIN_USERNAME,
|
114
|
-
is_superuser=True,
|
115
|
-
is_verified=True,
|
116
|
-
)
|
117
|
-
await __on_startup()
|
@@ -1,15 +1,15 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
1
|
+
fractal_server/__init__.py,sha256=M-UCl3baEQIODOL7Zae_0jXfPyeyyPZypKzTHK83oM0,22
|
2
2
|
fractal_server/__main__.py,sha256=CocbzZooX1UtGqPi55GcHGNxnrJXFg5tUU5b3wyFCyo,4958
|
3
3
|
fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
|
4
4
|
fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
5
5
|
fractal_server/app/db/__init__.py,sha256=WZEVfdJAX7ZyBM1ngfEGeqWWcjK_NygtCbawpmbwGpU,4042
|
6
|
-
fractal_server/app/models/__init__.py,sha256=
|
6
|
+
fractal_server/app/models/__init__.py,sha256=QGRjxBgk6GzHyyXh_7RuHvpLoe5PTl1g5KLkGqhFYMQ,199
|
7
7
|
fractal_server/app/models/linkuserproject.py,sha256=eQaourbGRshvlMVlKzLYJKHEjfsW1CbWws9yW4eHXhA,567
|
8
|
-
fractal_server/app/models/security.py,sha256=
|
9
|
-
fractal_server/app/models/v1/__init__.py,sha256=
|
8
|
+
fractal_server/app/models/security.py,sha256=0oYj_cqPcQFsPFDyN4OTsqbXsLlXRcweawjP_iSiRI0,2900
|
9
|
+
fractal_server/app/models/v1/__init__.py,sha256=hUI7dEbPaiZGN0IbHW4RSmSicyvtn_xeuevoX7zvUwI,466
|
10
10
|
fractal_server/app/models/v1/dataset.py,sha256=99GDgt7njx8yYQApkImqp_7bHA5HH3ElvbR6Oyj9kVI,2017
|
11
11
|
fractal_server/app/models/v1/job.py,sha256=QLGXcWdVRHaUHQNDapYYlLpEfw4K7QyD8TmcwhrWw2o,3304
|
12
|
-
fractal_server/app/models/v1/project.py,sha256=
|
12
|
+
fractal_server/app/models/v1/project.py,sha256=tf6fniyBH-sb6rBvGiqNl2wgN9ipR4hDEE3OKvxKaoo,804
|
13
13
|
fractal_server/app/models/v1/state.py,sha256=ew7xw3iPzBwUnPlzmsOEMiPbPEMsJn_TyZ5cK93jBRQ,1095
|
14
14
|
fractal_server/app/models/v1/task.py,sha256=3xZqNeFYUqslh8ddMSXF2nO4nIiOD8T5Ij37wY20kss,2782
|
15
15
|
fractal_server/app/models/v1/workflow.py,sha256=dnY5eMaOe3oZv8arn00RNX9qVkBtTLG-vYdWXcQuyo4,3950
|
@@ -17,7 +17,7 @@ fractal_server/app/models/v2/__init__.py,sha256=uLzdInqATSwi0bS_V4vKB-TqFrOFaXux
|
|
17
17
|
fractal_server/app/models/v2/collection_state.py,sha256=nxb042i8tt8rCpmgbFJoBCYWU-34m0HdUfO9YurTp8k,588
|
18
18
|
fractal_server/app/models/v2/dataset.py,sha256=-7sxHEw4IIAvF_uSan7tA3o8hvoakBkQ0SRvqS2iOQU,1455
|
19
19
|
fractal_server/app/models/v2/job.py,sha256=ypJmN-qspkKBGhBG7Mt-HypSQqcQ2EmB4Bzzb2-y550,1535
|
20
|
-
fractal_server/app/models/v2/project.py,sha256=
|
20
|
+
fractal_server/app/models/v2/project.py,sha256=CRBnZ8QITNp6u1f5bMxvi1_mcvEfXpWyitsWB5f7gn8,759
|
21
21
|
fractal_server/app/models/v2/task.py,sha256=9ZPhug3VWyeqgT8wQ9_8ZXQ2crSiiicRipxrxTslOso,3257
|
22
22
|
fractal_server/app/models/v2/workflow.py,sha256=YBgFGCziUgU0aJ5EM3Svu9W2c46AewZO9VBlFCHiSps,1069
|
23
23
|
fractal_server/app/models/v2/workflowtask.py,sha256=3jEkObsSnlI05Pur_dSsXYdJxRqPL60Z7tK5-EJLOks,1532
|
@@ -27,10 +27,10 @@ fractal_server/app/routes/admin/v1.py,sha256=uMupmRkicaoWazX8qSX5fgh00O3MbuSfim8
|
|
27
27
|
fractal_server/app/routes/admin/v2.py,sha256=e0A6RMWfmTO5dVL95XO-P2EljdEwR00FErxahEPzODQ,13757
|
28
28
|
fractal_server/app/routes/api/__init__.py,sha256=EVyZrEq3I_1643QGTPCC5lgCp4xH_auYbrFfogTm4pc,315
|
29
29
|
fractal_server/app/routes/api/v1/__init__.py,sha256=Y2HQdG197J0a7DyQEE2jn53IfxD0EHGhzK1I2JZuEck,958
|
30
|
-
fractal_server/app/routes/api/v1/_aux_functions.py,sha256=
|
30
|
+
fractal_server/app/routes/api/v1/_aux_functions.py,sha256=lFfGJxbJc-Ryah_pPkiTH2SBncWQ15n0iqVFolzIOCM,11976
|
31
31
|
fractal_server/app/routes/api/v1/dataset.py,sha256=HRE-8vPmVkeXf7WFYkI19mDtbY-iJZeJ7PmMiV0LMgY,16923
|
32
32
|
fractal_server/app/routes/api/v1/job.py,sha256=NwXyhvvzdPDor0ts8Im__9-I0P1H943s4NXIRgaz7PM,5436
|
33
|
-
fractal_server/app/routes/api/v1/project.py,sha256=
|
33
|
+
fractal_server/app/routes/api/v1/project.py,sha256=DKQ6n1CPmHqsKieBaJlKnOhKaHWgQTZIA_asJTT9Uxo,15802
|
34
34
|
fractal_server/app/routes/api/v1/task.py,sha256=udbKnenzc-Q10elYCVB9JmOPWATraa9tZi0AaByvWo0,6129
|
35
35
|
fractal_server/app/routes/api/v1/task_collection.py,sha256=mFaYyCWtCPRqvs3j6zx_zaiDXn31Uzoa7UHZS-Lu_L0,8882
|
36
36
|
fractal_server/app/routes/api/v1/workflow.py,sha256=7r9IoIevg_rvYCrerMOsIsUabSOQatxdPCfLdkP0dRs,10942
|
@@ -42,7 +42,7 @@ fractal_server/app/routes/api/v2/images.py,sha256=4r_HblPWyuKSZSJZfn8mbDaLv1ncwZ
|
|
42
42
|
fractal_server/app/routes/api/v2/job.py,sha256=BtaxErBDbLwjY2zgGD1I6eRpsffoMonifcS1CMEXmLU,5325
|
43
43
|
fractal_server/app/routes/api/v2/project.py,sha256=qyvizYZ4aUFgF3tGdfp4z8AwWgfo19N_KbFEljfUaC8,5594
|
44
44
|
fractal_server/app/routes/api/v2/status.py,sha256=osLexiMOSqmYcEV-41tlrwt9ofyFbtRm5HmPS5BU0t4,6394
|
45
|
-
fractal_server/app/routes/api/v2/submit.py,sha256=
|
45
|
+
fractal_server/app/routes/api/v2/submit.py,sha256=mdY1fN9VA8-8DkqeAGrzHa4n37QSPP-gN3sc4z-c-wc,7592
|
46
46
|
fractal_server/app/routes/api/v2/task.py,sha256=bRTtGgL8BBGbT7csVeRB-a54clgU2xHydi5XpcByDxg,8297
|
47
47
|
fractal_server/app/routes/api/v2/task_collection.py,sha256=eN3NkZaZHkrqnLGRKE7Xd5mo0cHc8aK2lojCt26ErOQ,8988
|
48
48
|
fractal_server/app/routes/api/v2/task_legacy.py,sha256=P_VJv9v0yzFUBuS-DQHhMVSOe20ecGJJcFBqiiFciOM,1628
|
@@ -63,13 +63,13 @@ fractal_server/app/runner/executors/slurm/_batching.py,sha256=1P6CgrAOCK9u_EvNFT
|
|
63
63
|
fractal_server/app/runner/executors/slurm/_check_jobs_status.py,sha256=8d29a7DQ2xoWxoFQCnFfTpHER-qBX8mEatl4Dw5HU_o,1908
|
64
64
|
fractal_server/app/runner/executors/slurm/_executor_wait_thread.py,sha256=J3tjAx33nBgW4eHAXDte7hDs7Oe9FLEZaElEt8inrbg,4421
|
65
65
|
fractal_server/app/runner/executors/slurm/_slurm_config.py,sha256=rF37XDImX1QoWx37MC5hSM9AuY_KfHU5gaWwN4vl4Zk,15552
|
66
|
-
fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py,sha256=
|
67
|
-
fractal_server/app/runner/executors/slurm/executor.py,sha256=
|
66
|
+
fractal_server/app/runner/executors/slurm/_subprocess_run_as_user.py,sha256=YwfJzZr_y4FL_hirHJdWK0vWzrldjoZZhXVFlO2AOMU,5131
|
67
|
+
fractal_server/app/runner/executors/slurm/executor.py,sha256=z2MbI9He1lPhKBPMs0pqoQ9wUiAsxOIZY62s5VFHs-0,45044
|
68
68
|
fractal_server/app/runner/executors/slurm/remote.py,sha256=wLziIsGdSMiO-jIXM8x77JRK82g_2hx0iBKTiMghuIo,5852
|
69
69
|
fractal_server/app/runner/filenames.py,sha256=9lwu3yB4C67yiijYw8XIKaLFn3mJUt6_TCyVFM_aZUQ,206
|
70
70
|
fractal_server/app/runner/set_start_and_last_task_index.py,sha256=-q4zVybAj8ek2XlbENKlfOAJ39hT_zoJoZkqzDqiAMY,1254
|
71
71
|
fractal_server/app/runner/task_files.py,sha256=b5aRDi35QemBQnHT_AU6L_IPJJU_k_f5sJn-JXzkzy0,3180
|
72
|
-
fractal_server/app/runner/v1/__init__.py,sha256=
|
72
|
+
fractal_server/app/runner/v1/__init__.py,sha256=kMiQJJ-XUp2ecI0tUAUYD_Em1vcct9iXULMoI5SGdU4,13520
|
73
73
|
fractal_server/app/runner/v1/_common.py,sha256=2-NScI-7qCIw14Od90so1onw-psIt8x1kx6EXq489Vk,21246
|
74
74
|
fractal_server/app/runner/v1/_local/__init__.py,sha256=ZcWftuGRLmN8-S6QZXm6FhNehsxwmwZRhuRv-a7zA6s,6839
|
75
75
|
fractal_server/app/runner/v1/_local/_local_config.py,sha256=hM7SPxR07luXPcXdrWXRpEB2uOyjSSRUdqW3QBKJn9c,3147
|
@@ -120,14 +120,15 @@ fractal_server/app/schemas/v2/task.py,sha256=7IfxiZkaVqlARy7WYE_H8m7j_IEcuQaZORU
|
|
120
120
|
fractal_server/app/schemas/v2/task_collection.py,sha256=sY29NQfJrbjiidmVkVjSIH-20wIsmh7G1QOdr05KoDQ,3171
|
121
121
|
fractal_server/app/schemas/v2/workflow.py,sha256=Zzx3e-qgkH8le0FUmAx9UrV5PWd7bj14PPXUh_zgZXM,1827
|
122
122
|
fractal_server/app/schemas/v2/workflowtask.py,sha256=atVuVN4aXsVEOmSd-vyg-8_8OnPmqx-gT75rXcn_AlQ,6552
|
123
|
-
fractal_server/app/security/__init__.py,sha256=
|
124
|
-
fractal_server/config.py,sha256=
|
123
|
+
fractal_server/app/security/__init__.py,sha256=2-QbwuR-nsuHM_uwKS_WzYvkhnuhO5jUv8UVROetyVk,11169
|
124
|
+
fractal_server/config.py,sha256=7fF_lTGH_mH_16aYr8m3E5Dv81jH9wdJuGu-2p1x9H0,16081
|
125
125
|
fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
|
126
126
|
fractal_server/images/__init__.py,sha256=xO6jTLE4EZKO6cTDdJsBmK9cdeh9hFTaSbSuWgQg7y4,196
|
127
127
|
fractal_server/images/models.py,sha256=9ipU5h4N6ogBChoB-2vHoqtL0TXOHCv6kRR-fER3mkM,4167
|
128
128
|
fractal_server/images/tools.py,sha256=gxeniYy4Z-cp_ToK2LHPJUTVVUUrdpogYdcBUvBuLiY,2209
|
129
|
-
fractal_server/logger.py,sha256=
|
130
|
-
fractal_server/
|
129
|
+
fractal_server/logger/__init__.py,sha256=Q_e03Lj30VWdCqGBJrKw9A2QEeDbCKC_OOkDQVW9Dyw,5132
|
130
|
+
fractal_server/logger/gunicorn_logger.py,sha256=vb5s7mruCHPkKWGrTTOPyrB_658Y2Z05ECdHhCCBhp0,644
|
131
|
+
fractal_server/main.py,sha256=faQfINM4k3G7Oakkn8R_EfHLma6Dd-U_TeyWesjs0js,3613
|
131
132
|
fractal_server/migrations/README,sha256=4rQvyDfqodGhpJw74VYijRmgFP49ji5chyEemWGHsuw,59
|
132
133
|
fractal_server/migrations/env.py,sha256=bsl0HGZpjhommztgcs7wQ94sJzI1Orgnij97K8P_uyo,2630
|
133
134
|
fractal_server/migrations/script.py.mako,sha256=oMXw9LC3zRbinWWPPDgeZ4z9FJrV2zhRWiYdS5YgNbI,526
|
@@ -162,8 +163,8 @@ fractal_server/tasks/v2/background_operations.py,sha256=MAMBn6W2bhkdK59kfUGiD7a1
|
|
162
163
|
fractal_server/tasks/v2/get_collection_data.py,sha256=Qhf2T_aaqAfqu9_KpUSlXsS7EJoZQbEPEreHHa2jco8,502
|
163
164
|
fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
|
164
165
|
fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
|
165
|
-
fractal_server-2.0.
|
166
|
-
fractal_server-2.0.
|
167
|
-
fractal_server-2.0.
|
168
|
-
fractal_server-2.0.
|
169
|
-
fractal_server-2.0.
|
166
|
+
fractal_server-2.1.0.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
167
|
+
fractal_server-2.1.0.dist-info/METADATA,sha256=kyfeNStKB16vegug3_OV6wxtnxDT1Mo1pqj5HKKXG1w,4222
|
168
|
+
fractal_server-2.1.0.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
169
|
+
fractal_server-2.1.0.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
170
|
+
fractal_server-2.1.0.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|