fractal-server 2.0.1__py3-none-any.whl → 2.0.3__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/routes/api/v1/project.py +2 -2
- fractal_server/app/routes/api/v2/status.py +19 -1
- fractal_server/app/routes/api/v2/submit.py +3 -1
- fractal_server/app/schemas/v2/dumps.py +2 -2
- fractal_server/config.py +0 -5
- fractal_server/data_migrations/2_0_3.py +79 -0
- fractal_server/main.py +10 -0
- {fractal_server-2.0.1.dist-info → fractal_server-2.0.3.dist-info}/METADATA +1 -1
- {fractal_server-2.0.1.dist-info → fractal_server-2.0.3.dist-info}/RECORD +13 -12
- {fractal_server-2.0.1.dist-info → fractal_server-2.0.3.dist-info}/LICENSE +0 -0
- {fractal_server-2.0.1.dist-info → fractal_server-2.0.3.dist-info}/WHEEL +0 -0
- {fractal_server-2.0.1.dist-info → fractal_server-2.0.3.dist-info}/entry_points.txt +0 -0
fractal_server/__init__.py
CHANGED
@@ -1 +1 @@
|
|
1
|
-
__VERSION__ = "2.0.
|
1
|
+
__VERSION__ = "2.0.3"
|
@@ -398,7 +398,7 @@ async def apply_workflow(
|
|
398
398
|
user_email=user.email,
|
399
399
|
input_dataset_dump=dict(
|
400
400
|
**input_dataset.model_dump(
|
401
|
-
exclude={"resource_list", "timestamp_created"}
|
401
|
+
exclude={"resource_list", "history", "timestamp_created"}
|
402
402
|
),
|
403
403
|
timestamp_created=_encode_as_utc(input_dataset.timestamp_created),
|
404
404
|
resource_list=[
|
@@ -408,7 +408,7 @@ async def apply_workflow(
|
|
408
408
|
),
|
409
409
|
output_dataset_dump=dict(
|
410
410
|
**output_dataset.model_dump(
|
411
|
-
exclude={"resource_list", "timestamp_created"}
|
411
|
+
exclude={"resource_list", "history", "timestamp_created"}
|
412
412
|
),
|
413
413
|
timestamp_created=_encode_as_utc(output_dataset.timestamp_created),
|
414
414
|
resource_list=[
|
@@ -7,6 +7,7 @@ from fastapi import Depends
|
|
7
7
|
from fastapi import HTTPException
|
8
8
|
from fastapi import status
|
9
9
|
|
10
|
+
from .....logger import set_logger
|
10
11
|
from ....db import AsyncSession
|
11
12
|
from ....db import get_async_db
|
12
13
|
from ....models.v2 import JobV2
|
@@ -21,6 +22,8 @@ from fractal_server.app.runner.filenames import HISTORY_FILENAME
|
|
21
22
|
|
22
23
|
router = APIRouter()
|
23
24
|
|
25
|
+
logger = set_logger(__name__)
|
26
|
+
|
24
27
|
|
25
28
|
@router.get(
|
26
29
|
"/project/{project_id}/status/",
|
@@ -113,7 +116,22 @@ async def get_workflowtask_status(
|
|
113
116
|
|
114
117
|
# The last workflow task that is included in the submitted job is also
|
115
118
|
# the positional-last workflow task to be included in the response.
|
116
|
-
|
119
|
+
try:
|
120
|
+
last_valid_wftask_id = workflow.task_list[end - 1].id
|
121
|
+
except IndexError as e:
|
122
|
+
logger.warning(
|
123
|
+
f"Handled IndexError in `get_workflowtask_status` ({str(e)})."
|
124
|
+
)
|
125
|
+
logger.warning(
|
126
|
+
"Additional information: "
|
127
|
+
f"{running_job.first_task_index=}; "
|
128
|
+
f"{running_job.last_task_index=}; "
|
129
|
+
f"{len(workflow.task_list)=}; "
|
130
|
+
f"{dataset_id=}; "
|
131
|
+
f"{workflow_id=}."
|
132
|
+
)
|
133
|
+
last_valid_wftask_id = None
|
134
|
+
logger.warning(f"Now setting {last_valid_wftask_id=}.")
|
117
135
|
|
118
136
|
# Highest priority: Read status updates coming from the running-job
|
119
137
|
# temporary file. Note: this file only contains information on
|
@@ -146,7 +146,9 @@ async def apply_workflow(
|
|
146
146
|
workflow_id=workflow_id,
|
147
147
|
user_email=user.email,
|
148
148
|
dataset_dump=dict(
|
149
|
-
**dataset.model_dump(
|
149
|
+
**dataset.model_dump(
|
150
|
+
exclude={"images", "history", "timestamp_created"}
|
151
|
+
),
|
150
152
|
timestamp_created=_encode_as_utc(dataset.timestamp_created),
|
151
153
|
),
|
152
154
|
workflow_dump=dict(
|
@@ -70,14 +70,14 @@ class WorkflowTaskDumpV2(BaseModel):
|
|
70
70
|
return values
|
71
71
|
|
72
72
|
|
73
|
-
class WorkflowDumpV2(BaseModel):
|
73
|
+
class WorkflowDumpV2(BaseModel, extra=Extra.forbid):
|
74
74
|
id: int
|
75
75
|
name: str
|
76
76
|
project_id: int
|
77
77
|
timestamp_created: str
|
78
78
|
|
79
79
|
|
80
|
-
class DatasetDumpV2(BaseModel):
|
80
|
+
class DatasetDumpV2(BaseModel, extra=Extra.forbid):
|
81
81
|
id: int
|
82
82
|
name: str
|
83
83
|
project_id: int
|
fractal_server/config.py
CHANGED
@@ -441,9 +441,4 @@ class Settings(BaseSettings):
|
|
441
441
|
|
442
442
|
|
443
443
|
def get_settings(settings=Settings()) -> Settings:
|
444
|
-
logging.debug("Fractal Settings:")
|
445
|
-
for key, value in settings.dict().items():
|
446
|
-
if any(s in key.upper() for s in ["PASSWORD", "SECRET"]):
|
447
|
-
value = "*****"
|
448
|
-
logging.debug(f"{key}: {value}")
|
449
444
|
return settings
|
@@ -0,0 +1,79 @@
|
|
1
|
+
import logging
|
2
|
+
|
3
|
+
from packaging.version import parse
|
4
|
+
from sqlalchemy import select
|
5
|
+
from sqlalchemy.orm.attributes import flag_modified
|
6
|
+
|
7
|
+
import fractal_server
|
8
|
+
from fractal_server.app.db import get_sync_db
|
9
|
+
from fractal_server.app.models.v1 import ApplyWorkflow
|
10
|
+
from fractal_server.app.models.v2 import JobV2
|
11
|
+
from fractal_server.app.schemas.v1 import ApplyWorkflowReadV1
|
12
|
+
from fractal_server.app.schemas.v2 import JobReadV2
|
13
|
+
|
14
|
+
|
15
|
+
def fix_db():
|
16
|
+
logger = logging.getLogger("fix_db")
|
17
|
+
logger.warning("START execution of fix_db function")
|
18
|
+
|
19
|
+
# Check that this module matches with the current version
|
20
|
+
module_version = parse("2.0.3")
|
21
|
+
current_version = parse(fractal_server.__VERSION__)
|
22
|
+
if (
|
23
|
+
current_version.major != module_version.major
|
24
|
+
or current_version.minor != module_version.minor
|
25
|
+
or current_version.micro != module_version.micro
|
26
|
+
):
|
27
|
+
raise RuntimeError(
|
28
|
+
f"{fractal_server.__VERSION__=} not matching with {__file__=}"
|
29
|
+
)
|
30
|
+
|
31
|
+
with next(get_sync_db()) as db:
|
32
|
+
|
33
|
+
# V1 jobs
|
34
|
+
stm = select(ApplyWorkflow)
|
35
|
+
jobs_v1 = db.execute(stm).scalars().all()
|
36
|
+
for job_v1 in sorted(jobs_v1, key=lambda x: x.id):
|
37
|
+
for KEY in ["history"]:
|
38
|
+
logger.warning(
|
39
|
+
f"Now removing {KEY} from `input/output_dataset_dump`, "
|
40
|
+
f"for appplyworkflow.id={job_v1.id}."
|
41
|
+
)
|
42
|
+
if KEY in job_v1.input_dataset_dump.keys():
|
43
|
+
job_v1.input_dataset_dump.pop(KEY)
|
44
|
+
if KEY in job_v1.output_dataset_dump.keys():
|
45
|
+
job_v1.output_dataset_dump.pop(KEY)
|
46
|
+
flag_modified(job_v1, "input_dataset_dump")
|
47
|
+
flag_modified(job_v1, "output_dataset_dump")
|
48
|
+
db.add(job_v1)
|
49
|
+
db.commit()
|
50
|
+
db.refresh(job_v1)
|
51
|
+
db.expunge(job_v1)
|
52
|
+
logger.warning(
|
53
|
+
f"Now validating applyworkflow.id={job_v1.id} with "
|
54
|
+
"ApplyWorkflowReadV1."
|
55
|
+
)
|
56
|
+
ApplyWorkflowReadV1(**job_v1.model_dump())
|
57
|
+
|
58
|
+
# V2 jobs
|
59
|
+
stm = select(JobV2)
|
60
|
+
jobs_v2 = db.execute(stm).scalars().all()
|
61
|
+
for job_v2 in sorted(jobs_v2, key=lambda x: x.id):
|
62
|
+
for KEY in ["history", "images"]:
|
63
|
+
logger.warning(
|
64
|
+
f"Now removing {KEY} from `dataset_dump`, "
|
65
|
+
f"for jobv2.id={job_v2.id}."
|
66
|
+
)
|
67
|
+
if KEY in job_v2.dataset_dump.keys():
|
68
|
+
job_v2.dataset_dump.pop(KEY)
|
69
|
+
flag_modified(job_v2, "dataset_dump")
|
70
|
+
db.add(job_v2)
|
71
|
+
db.commit()
|
72
|
+
db.refresh(job_v2)
|
73
|
+
db.expunge(job_v2)
|
74
|
+
logger.warning(
|
75
|
+
f"Now validating jobv2.id={job_v2.id} with JobReadV2."
|
76
|
+
)
|
77
|
+
JobReadV2(**job_v2.model_dump())
|
78
|
+
|
79
|
+
logger.warning("END of execution of fix_db function")
|
fractal_server/main.py
CHANGED
@@ -19,6 +19,8 @@ from fastapi import FastAPI
|
|
19
19
|
|
20
20
|
from .app.security import _create_first_user
|
21
21
|
from .config import get_settings
|
22
|
+
from .logger import reset_logger_handlers
|
23
|
+
from .logger import set_logger
|
22
24
|
from .syringe import Inject
|
23
25
|
|
24
26
|
|
@@ -62,6 +64,14 @@ def check_settings() -> None:
|
|
62
64
|
settings = Inject(get_settings)
|
63
65
|
settings.check()
|
64
66
|
|
67
|
+
logger = set_logger("fractal_server_settings")
|
68
|
+
logger.debug("Fractal Settings:")
|
69
|
+
for key, value in settings.dict().items():
|
70
|
+
if any(s in key.upper() for s in ["PASSWORD", "SECRET"]):
|
71
|
+
value = "*****"
|
72
|
+
logger.debug(f" {key}: {value}")
|
73
|
+
reset_logger_handlers(logger)
|
74
|
+
|
65
75
|
|
66
76
|
async def __on_startup() -> None:
|
67
77
|
"""
|
@@ -1,4 +1,4 @@
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
1
|
+
fractal_server/__init__.py,sha256=y8qIfi3XJXZnIlvcM-yGdSqRCMQ2ceId2VN0yHXJBAI,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
|
@@ -30,7 +30,7 @@ fractal_server/app/routes/api/v1/__init__.py,sha256=Y2HQdG197J0a7DyQEE2jn53IfxD0
|
|
30
30
|
fractal_server/app/routes/api/v1/_aux_functions.py,sha256=KoSefKiBXximu0df4fJ3l9bKsGaLO8rb3z6xhD8PWj4,11973
|
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=tb1M2hhAKyHeToV0RwAQQx0ptIDeX6sEjM7dkfjCpXQ,15799
|
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
|
@@ -41,8 +41,8 @@ fractal_server/app/routes/api/v2/dataset.py,sha256=_HjKNP9XsMGoqyubGdF2ZyeW7vXC3
|
|
41
41
|
fractal_server/app/routes/api/v2/images.py,sha256=4r_HblPWyuKSZSJZfn8mbDaLv1ncwZU0gWdKneZcNG4,7894
|
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
|
-
fractal_server/app/routes/api/v2/status.py,sha256=
|
45
|
-
fractal_server/app/routes/api/v2/submit.py,sha256=
|
44
|
+
fractal_server/app/routes/api/v2/status.py,sha256=osLexiMOSqmYcEV-41tlrwt9ofyFbtRm5HmPS5BU0t4,6394
|
45
|
+
fractal_server/app/routes/api/v2/submit.py,sha256=svI1Oa2zIxUEAomzRt7-M66xKC4Pb9NEGcXNrtN6b5g,6940
|
46
46
|
fractal_server/app/routes/api/v2/task.py,sha256=gJ0LruSk-Q1iMw8ZOX8C0wrZ4S4DGlQTr_5SdJJud0Q,7130
|
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
|
@@ -111,7 +111,7 @@ fractal_server/app/schemas/v1/task_collection.py,sha256=uvq9bcMaGD_qHsh7YtcpoSAk
|
|
111
111
|
fractal_server/app/schemas/v1/workflow.py,sha256=tuOs5E5Q_ozA8if7YPZ07cQjzqB_QMkBS4u92qo4Ro0,4618
|
112
112
|
fractal_server/app/schemas/v2/__init__.py,sha256=IssDWR6q_mgNkaAxfhSnEZZLZRZIqOsr9SM7RvN1IsY,1852
|
113
113
|
fractal_server/app/schemas/v2/dataset.py,sha256=dLT52tV4dSf2HrFNak4vdQEn8PT_04IUrGnd2z-AXIU,2599
|
114
|
-
fractal_server/app/schemas/v2/dumps.py,sha256=
|
114
|
+
fractal_server/app/schemas/v2/dumps.py,sha256=Qg7n0WNfqCV5DBFwfYIKP-OrBjyMZETnNZyoL-EqIco,2063
|
115
115
|
fractal_server/app/schemas/v2/job.py,sha256=zfF9K3v4jWUJ7M482ta2CkqUJ4tVT4XfVt60p9IRhP0,3250
|
116
116
|
fractal_server/app/schemas/v2/manifest.py,sha256=N37IWohcfO3_y2l8rVM0h_1nZq7m4Izxk9iL1vtwBJw,6243
|
117
117
|
fractal_server/app/schemas/v2/project.py,sha256=u7S4B-bote1oGjzAGiZ-DuQIyeRAGqJsI71Tc1EtYE0,736
|
@@ -121,13 +121,14 @@ fractal_server/app/schemas/v2/task_collection.py,sha256=sY29NQfJrbjiidmVkVjSIH-2
|
|
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
123
|
fractal_server/app/security/__init__.py,sha256=wxosoHc3mJYPCdPMyWnRD8w_2OgnKYp2aDkdmwrZh5k,11203
|
124
|
-
fractal_server/config.py,sha256=
|
124
|
+
fractal_server/config.py,sha256=2vw5M78aAogELsWut9X5sxxUz2lirNFpgqP6OynmKOQ,14859
|
125
|
+
fractal_server/data_migrations/2_0_3.py,sha256=7EhwLCZTk1yHD_dlU-HIf2uvx6jUIgfDaA5np27QEEM,2918
|
125
126
|
fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
|
126
127
|
fractal_server/images/__init__.py,sha256=xO6jTLE4EZKO6cTDdJsBmK9cdeh9hFTaSbSuWgQg7y4,196
|
127
128
|
fractal_server/images/models.py,sha256=9ipU5h4N6ogBChoB-2vHoqtL0TXOHCv6kRR-fER3mkM,4167
|
128
129
|
fractal_server/images/tools.py,sha256=gxeniYy4Z-cp_ToK2LHPJUTVVUUrdpogYdcBUvBuLiY,2209
|
129
130
|
fractal_server/logger.py,sha256=AuCmrwIydaFWpotMTM_tGRNJbExQO5fP8Xolo82Vdbg,4178
|
130
|
-
fractal_server/main.py,sha256=
|
131
|
+
fractal_server/main.py,sha256=u_MngsZWI-1uKrBpNDUYXKyLgaYodyAEw2dKZrIzS_U,3381
|
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.0.3.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
167
|
+
fractal_server-2.0.3.dist-info/METADATA,sha256=DE7GliLouz0Eb5ar6MOL0eShI-bqrvx7jZi6RPavLtc,4202
|
168
|
+
fractal_server-2.0.3.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
|
169
|
+
fractal_server-2.0.3.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
170
|
+
fractal_server-2.0.3.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|