fractal-server 2.17.0a3__py3-none-any.whl → 2.17.0a4__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/__main__.py +120 -99
- fractal_server/app/routes/admin/v2/resource.py +34 -0
- fractal_server/config/__init__.py +0 -7
- fractal_server/runner/config/_slurm.py +3 -2
- fractal_server/runner/executors/slurm_common/base_slurm_runner.py +1 -1
- fractal_server/runner/executors/slurm_common/get_slurm_config.py +1 -1
- fractal_server/runner/executors/slurm_common/slurm_config.py +14 -17
- {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a4.dist-info}/METADATA +1 -1
- {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a4.dist-info}/RECORD +13 -14
- fractal_server/config/_init_data.py +0 -27
- {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a4.dist-info}/WHEEL +0 -0
- {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a4.dist-info}/entry_points.txt +0 -0
- {fractal_server-2.17.0a3.dist-info → fractal_server-2.17.0a4.dist-info}/licenses/LICENSE +0 -0
fractal_server/__init__.py
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
__VERSION__ = "2.17.
|
|
1
|
+
__VERSION__ = "2.17.0a4"
|
fractal_server/__main__.py
CHANGED
|
@@ -62,14 +62,26 @@ init_db_data_parser = subparsers.add_parser(
|
|
|
62
62
|
init_db_data_parser.add_argument(
|
|
63
63
|
"--resource",
|
|
64
64
|
type=str,
|
|
65
|
-
help=
|
|
66
|
-
required=
|
|
65
|
+
help="Either `default` or path to the JSON file of the first resource.",
|
|
66
|
+
required=False,
|
|
67
67
|
)
|
|
68
68
|
init_db_data_parser.add_argument(
|
|
69
69
|
"--profile",
|
|
70
70
|
type=str,
|
|
71
|
-
help=
|
|
72
|
-
required=
|
|
71
|
+
help="Either `default` or path to the JSON file of the first profile.",
|
|
72
|
+
required=False,
|
|
73
|
+
)
|
|
74
|
+
init_db_data_parser.add_argument(
|
|
75
|
+
"--admin-email",
|
|
76
|
+
type=str,
|
|
77
|
+
help="Email of the first admin user to create.",
|
|
78
|
+
required=False,
|
|
79
|
+
)
|
|
80
|
+
init_db_data_parser.add_argument(
|
|
81
|
+
"--admin-pwd",
|
|
82
|
+
type=str,
|
|
83
|
+
help="Password of the first admin user to create.",
|
|
84
|
+
required=False,
|
|
73
85
|
)
|
|
74
86
|
|
|
75
87
|
# fractalctl update-db-data
|
|
@@ -124,14 +136,13 @@ def set_db():
|
|
|
124
136
|
|
|
125
137
|
|
|
126
138
|
def init_db_data(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
139
|
+
resource: str | None = None,
|
|
140
|
+
profile: str | None = None,
|
|
141
|
+
admin_email: str | None = None,
|
|
142
|
+
admin_password: str | None = None,
|
|
130
143
|
) -> None:
|
|
131
144
|
from fractal_server.app.security import _create_first_user
|
|
132
145
|
from fractal_server.app.security import _create_first_group
|
|
133
|
-
from fractal_server.syringe import Inject
|
|
134
|
-
from fractal_server.config import get_init_data_settings
|
|
135
146
|
from fractal_server.app.db import get_sync_db
|
|
136
147
|
from sqlalchemy import select, func
|
|
137
148
|
from fractal_server.app.models.security import UserOAuth
|
|
@@ -139,104 +150,112 @@ def init_db_data(
|
|
|
139
150
|
from fractal_server.app.schemas.v2.resource import cast_serialize_resource
|
|
140
151
|
from fractal_server.app.schemas.v2.profile import cast_serialize_profile
|
|
141
152
|
|
|
142
|
-
init_data_settings = Inject(get_init_data_settings)
|
|
143
|
-
|
|
144
153
|
# Create default group and user
|
|
145
154
|
print()
|
|
146
155
|
_create_first_group()
|
|
147
156
|
print()
|
|
148
|
-
asyncio.run(
|
|
149
|
-
_create_first_user(
|
|
150
|
-
email=init_data_settings.FRACTAL_DEFAULT_ADMIN_EMAIL,
|
|
151
|
-
password=(
|
|
152
|
-
init_data_settings.FRACTAL_DEFAULT_ADMIN_PASSWORD.get_secret_value() # noqa E501
|
|
153
|
-
),
|
|
154
|
-
is_superuser=True,
|
|
155
|
-
is_verified=True,
|
|
156
|
-
)
|
|
157
|
-
)
|
|
158
|
-
print()
|
|
159
157
|
|
|
160
|
-
# Create
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
172
|
-
)
|
|
173
|
-
resource_data = {
|
|
174
|
-
"name": "Local resource",
|
|
175
|
-
"type": ResourceType.LOCAL,
|
|
176
|
-
"jobs_local_dir": (Path.cwd() / "data-jobs").as_posix(),
|
|
177
|
-
"tasks_local_dir": (Path.cwd() / "data-tasks").as_posix(),
|
|
178
|
-
"tasks_python_config": {
|
|
179
|
-
"default_version": _python_version,
|
|
180
|
-
"versions": {
|
|
181
|
-
_python_version: sys.executable,
|
|
182
|
-
},
|
|
183
|
-
},
|
|
184
|
-
"jobs_poll_interval": 0,
|
|
185
|
-
"jobs_runner_config": {},
|
|
186
|
-
"tasks_pixi_config": {},
|
|
187
|
-
}
|
|
188
|
-
print("Prepared default resource data.")
|
|
189
|
-
else:
|
|
190
|
-
with open(resource) as f:
|
|
191
|
-
resource_data = json.load(f)
|
|
192
|
-
print(f"Read resource data from {resource}.")
|
|
193
|
-
if profile == "default":
|
|
194
|
-
profile_data = {
|
|
195
|
-
"resource_type": "local",
|
|
196
|
-
"name": "Local profile",
|
|
197
|
-
}
|
|
198
|
-
print("Prepared default profile data.")
|
|
199
|
-
else:
|
|
200
|
-
with open(profile) as f:
|
|
201
|
-
profile_data = json.load(f)
|
|
202
|
-
print(f"Read profile data from {profile}.")
|
|
203
|
-
|
|
204
|
-
# Validate resource/profile data
|
|
205
|
-
try:
|
|
206
|
-
resource_data = cast_serialize_resource(resource_data)
|
|
207
|
-
except ValidationError as e:
|
|
208
|
-
sys.exit(
|
|
209
|
-
f"ERROR: Invalid resource data.\nOriginal error:\n{str(e)}"
|
|
210
|
-
)
|
|
211
|
-
try:
|
|
212
|
-
profile_data = cast_serialize_profile(profile_data)
|
|
213
|
-
except ValidationError as e:
|
|
214
|
-
sys.exit(
|
|
215
|
-
f"ERROR: Invalid profile data.\nOriginal error:\n{str(e)}"
|
|
158
|
+
# Create admin user if requested
|
|
159
|
+
if (admin_email is None) != (admin_password is None):
|
|
160
|
+
print("You must provide both --admin-email and --admin-pwd. Exit.")
|
|
161
|
+
sys.exit(1)
|
|
162
|
+
if admin_password and admin_email:
|
|
163
|
+
asyncio.run(
|
|
164
|
+
_create_first_user(
|
|
165
|
+
email=admin_email,
|
|
166
|
+
password=admin_password,
|
|
167
|
+
is_superuser=True,
|
|
168
|
+
is_verified=True,
|
|
216
169
|
)
|
|
217
|
-
|
|
218
|
-
# Create resource/profile db objects
|
|
219
|
-
resource_obj = Resource(**resource_data)
|
|
220
|
-
db.add(resource_obj)
|
|
221
|
-
db.commit()
|
|
222
|
-
db.refresh(resource_obj)
|
|
223
|
-
profile_data["resource_id"] = resource_obj.id
|
|
224
|
-
profile_obj = Profile(**profile_data)
|
|
225
|
-
db.add(profile_obj)
|
|
226
|
-
db.commit()
|
|
227
|
-
db.refresh(profile_obj)
|
|
228
|
-
|
|
229
|
-
# Associate profile to users
|
|
230
|
-
res = db.execute(select(UserOAuth))
|
|
231
|
-
users = res.unique().scalars().all()
|
|
232
|
-
for user in users:
|
|
233
|
-
print(f"Now set profile_id={profile_obj.id} for {user.email}.")
|
|
234
|
-
user.profile_id = profile_obj.id
|
|
235
|
-
db.add(user)
|
|
236
|
-
db.commit()
|
|
237
|
-
db.expunge_all()
|
|
170
|
+
)
|
|
238
171
|
print()
|
|
239
172
|
|
|
173
|
+
# Create resource and profile if requested
|
|
174
|
+
if (resource is None) != (profile is None):
|
|
175
|
+
print("You must provide both --resource and --profile. Exit.")
|
|
176
|
+
sys.exit(1)
|
|
177
|
+
if resource and profile:
|
|
178
|
+
with next(get_sync_db()) as db:
|
|
179
|
+
# Preliminary check
|
|
180
|
+
num_resources = db.execute(
|
|
181
|
+
select(func.count(Resource.id))
|
|
182
|
+
).scalar()
|
|
183
|
+
if num_resources != 0:
|
|
184
|
+
print(f"There exist already {num_resources=} resources. Exit.")
|
|
185
|
+
sys.exit(1)
|
|
186
|
+
|
|
187
|
+
# Get resource/profile data
|
|
188
|
+
if resource == "default":
|
|
189
|
+
_python_version = (
|
|
190
|
+
f"{sys.version_info.major}.{sys.version_info.minor}"
|
|
191
|
+
)
|
|
192
|
+
resource_data = {
|
|
193
|
+
"name": "Local resource",
|
|
194
|
+
"type": ResourceType.LOCAL,
|
|
195
|
+
"jobs_local_dir": (Path.cwd() / "data-jobs").as_posix(),
|
|
196
|
+
"tasks_local_dir": (Path.cwd() / "data-tasks").as_posix(),
|
|
197
|
+
"tasks_python_config": {
|
|
198
|
+
"default_version": _python_version,
|
|
199
|
+
"versions": {
|
|
200
|
+
_python_version: sys.executable,
|
|
201
|
+
},
|
|
202
|
+
},
|
|
203
|
+
"jobs_poll_interval": 0,
|
|
204
|
+
"jobs_runner_config": {},
|
|
205
|
+
"tasks_pixi_config": {},
|
|
206
|
+
}
|
|
207
|
+
print("Prepared default resource data.")
|
|
208
|
+
else:
|
|
209
|
+
with open(resource) as f:
|
|
210
|
+
resource_data = json.load(f)
|
|
211
|
+
print(f"Read resource data from {resource}.")
|
|
212
|
+
if profile == "default":
|
|
213
|
+
profile_data = {
|
|
214
|
+
"resource_type": "local",
|
|
215
|
+
"name": "Local profile",
|
|
216
|
+
}
|
|
217
|
+
print("Prepared default profile data.")
|
|
218
|
+
else:
|
|
219
|
+
with open(profile) as f:
|
|
220
|
+
profile_data = json.load(f)
|
|
221
|
+
print(f"Read profile data from {profile}.")
|
|
222
|
+
|
|
223
|
+
# Validate resource/profile data
|
|
224
|
+
try:
|
|
225
|
+
resource_data = cast_serialize_resource(resource_data)
|
|
226
|
+
except ValidationError as e:
|
|
227
|
+
sys.exit(
|
|
228
|
+
f"ERROR: Invalid resource data.\nOriginal error:\n{str(e)}"
|
|
229
|
+
)
|
|
230
|
+
try:
|
|
231
|
+
profile_data = cast_serialize_profile(profile_data)
|
|
232
|
+
except ValidationError as e:
|
|
233
|
+
sys.exit(
|
|
234
|
+
f"ERROR: Invalid profile data.\nOriginal error:\n{str(e)}"
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
# Create resource/profile db objects
|
|
238
|
+
resource_obj = Resource(**resource_data)
|
|
239
|
+
db.add(resource_obj)
|
|
240
|
+
db.commit()
|
|
241
|
+
db.refresh(resource_obj)
|
|
242
|
+
profile_data["resource_id"] = resource_obj.id
|
|
243
|
+
profile_obj = Profile(**profile_data)
|
|
244
|
+
db.add(profile_obj)
|
|
245
|
+
db.commit()
|
|
246
|
+
db.refresh(profile_obj)
|
|
247
|
+
|
|
248
|
+
# Associate profile to users
|
|
249
|
+
res = db.execute(select(UserOAuth))
|
|
250
|
+
users = res.unique().scalars().all()
|
|
251
|
+
for user in users:
|
|
252
|
+
print(f"Now set profile_id={profile_obj.id} for {user.email}.")
|
|
253
|
+
user.profile_id = profile_obj.id
|
|
254
|
+
db.add(user)
|
|
255
|
+
db.commit()
|
|
256
|
+
db.expunge_all()
|
|
257
|
+
print()
|
|
258
|
+
|
|
240
259
|
|
|
241
260
|
def update_db_data():
|
|
242
261
|
"""
|
|
@@ -328,6 +347,8 @@ def run():
|
|
|
328
347
|
init_db_data(
|
|
329
348
|
resource=args.resource,
|
|
330
349
|
profile=args.profile,
|
|
350
|
+
admin_email=args.admin_email,
|
|
351
|
+
admin_password=args.admin_pwd,
|
|
331
352
|
)
|
|
332
353
|
elif args.cmd == "update-db-data":
|
|
333
354
|
update_db_data()
|
|
@@ -13,7 +13,9 @@ from fractal_server.app.db import AsyncSession
|
|
|
13
13
|
from fractal_server.app.db import get_async_db
|
|
14
14
|
from fractal_server.app.models import UserOAuth
|
|
15
15
|
from fractal_server.app.models.v2 import Profile
|
|
16
|
+
from fractal_server.app.models.v2 import ProjectV2
|
|
16
17
|
from fractal_server.app.models.v2 import Resource
|
|
18
|
+
from fractal_server.app.models.v2 import TaskGroupV2
|
|
17
19
|
from fractal_server.app.routes.auth import current_active_superuser
|
|
18
20
|
from fractal_server.app.schemas.v2 import ProfileCreate
|
|
19
21
|
from fractal_server.app.schemas.v2 import ProfileRead
|
|
@@ -166,6 +168,38 @@ async def delete_resource(
|
|
|
166
168
|
),
|
|
167
169
|
)
|
|
168
170
|
|
|
171
|
+
# Fail if at least one Project is associated with the Resource.
|
|
172
|
+
res = await db.execute(
|
|
173
|
+
select(func.count(ProjectV2.id)).where(
|
|
174
|
+
ProjectV2.resource_id == resource_id
|
|
175
|
+
)
|
|
176
|
+
)
|
|
177
|
+
associated_project_count = res.scalar()
|
|
178
|
+
if associated_project_count > 0:
|
|
179
|
+
raise HTTPException(
|
|
180
|
+
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
181
|
+
detail=(
|
|
182
|
+
f"Cannot delete Resource {resource_id} because it's associated"
|
|
183
|
+
f" with {associated_project_count} Projects."
|
|
184
|
+
),
|
|
185
|
+
)
|
|
186
|
+
|
|
187
|
+
# Fail if at least one TaskGroupV2 is associated with the Resource.
|
|
188
|
+
res = await db.execute(
|
|
189
|
+
select(func.count(TaskGroupV2.id)).where(
|
|
190
|
+
TaskGroupV2.resource_id == resource_id
|
|
191
|
+
)
|
|
192
|
+
)
|
|
193
|
+
associated_taskgroup_count = res.scalar()
|
|
194
|
+
if associated_taskgroup_count > 0:
|
|
195
|
+
raise HTTPException(
|
|
196
|
+
status_code=status.HTTP_422_UNPROCESSABLE_CONTENT,
|
|
197
|
+
detail=(
|
|
198
|
+
f"Cannot delete Resource {resource_id} because it's associated"
|
|
199
|
+
f" with {associated_taskgroup_count} TaskGroupV2."
|
|
200
|
+
),
|
|
201
|
+
)
|
|
202
|
+
|
|
169
203
|
# Delete
|
|
170
204
|
await db.delete(resource)
|
|
171
205
|
await db.commit()
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from ._database import DatabaseSettings
|
|
2
2
|
from ._email import EmailSettings
|
|
3
3
|
from ._email import PublicEmailSettings # noqa F401
|
|
4
|
-
from ._init_data import InitDataSettings
|
|
5
4
|
from ._main import Settings
|
|
6
5
|
from ._oauth import OAuthSettings
|
|
7
6
|
|
|
@@ -18,11 +17,5 @@ def get_email_settings(email_settings=EmailSettings()) -> EmailSettings:
|
|
|
18
17
|
return email_settings
|
|
19
18
|
|
|
20
19
|
|
|
21
|
-
def get_init_data_settings(
|
|
22
|
-
init_data_settings=InitDataSettings(),
|
|
23
|
-
) -> InitDataSettings:
|
|
24
|
-
return init_data_settings
|
|
25
|
-
|
|
26
|
-
|
|
27
20
|
def get_oauth_settings(oauth_settings=OAuthSettings()) -> OAuthSettings:
|
|
28
21
|
return oauth_settings
|
|
@@ -3,6 +3,7 @@ from typing import Annotated
|
|
|
3
3
|
from pydantic import AfterValidator
|
|
4
4
|
from pydantic import BaseModel
|
|
5
5
|
from pydantic import ConfigDict
|
|
6
|
+
from pydantic import Field
|
|
6
7
|
from pydantic.types import PositiveInt
|
|
7
8
|
|
|
8
9
|
from fractal_server.runner.config.slurm_mem_to_MB import slurm_mem_to_MB
|
|
@@ -44,7 +45,7 @@ class _SlurmConfigSet(BaseModel):
|
|
|
44
45
|
nodelist: NonEmptyStr | None = None
|
|
45
46
|
time: NonEmptyStr | None = None
|
|
46
47
|
account: NonEmptyStr | None = None
|
|
47
|
-
extra_lines: list[NonEmptyStr]
|
|
48
|
+
extra_lines: list[NonEmptyStr] = Field(default_factory=list)
|
|
48
49
|
gpus: NonEmptyStr | None = None
|
|
49
50
|
|
|
50
51
|
|
|
@@ -125,4 +126,4 @@ class JobRunnerConfigSLURM(BaseModel):
|
|
|
125
126
|
default_slurm_config: _SlurmConfigSet
|
|
126
127
|
gpu_slurm_config: _SlurmConfigSet | None = None
|
|
127
128
|
batching_config: _BatchingConfigSet
|
|
128
|
-
user_local_exports: DictStrStr
|
|
129
|
+
user_local_exports: DictStrStr = Field(default_factory=dict)
|
|
@@ -252,7 +252,7 @@ class BaseSlurmRunner(BaseRunner):
|
|
|
252
252
|
f"Add {self.common_script_lines} to "
|
|
253
253
|
f"{new_slurm_config.extra_lines=}."
|
|
254
254
|
)
|
|
255
|
-
current_extra_lines = new_slurm_config.extra_lines
|
|
255
|
+
current_extra_lines = new_slurm_config.extra_lines
|
|
256
256
|
new_slurm_config.extra_lines = (
|
|
257
257
|
current_extra_lines + self.common_script_lines
|
|
258
258
|
)
|
|
@@ -77,7 +77,7 @@ def _get_slurm_config_internal(
|
|
|
77
77
|
else:
|
|
78
78
|
needs_gpu = False
|
|
79
79
|
logger.debug(f"[get_slurm_config] {needs_gpu=}")
|
|
80
|
-
if needs_gpu:
|
|
80
|
+
if needs_gpu and shared_config.gpu_slurm_config is not None:
|
|
81
81
|
for key, value in shared_config.gpu_slurm_config.model_dump(
|
|
82
82
|
exclude_unset=True, exclude={"mem"}
|
|
83
83
|
).items():
|
|
@@ -83,10 +83,10 @@ class SlurmConfig(BaseModel):
|
|
|
83
83
|
|
|
84
84
|
# Free-field attribute for extra lines to be added to the SLURM job
|
|
85
85
|
# preamble
|
|
86
|
-
extra_lines: list[str]
|
|
86
|
+
extra_lines: list[str] = Field(default_factory=list)
|
|
87
87
|
|
|
88
88
|
# Variables that will be `export`ed in the SLURM submission script
|
|
89
|
-
user_local_exports: dict[str, str]
|
|
89
|
+
user_local_exports: dict[str, str] = Field(default_factory=dict)
|
|
90
90
|
|
|
91
91
|
# Metaparameters needed to combine multiple tasks in each SLURM job
|
|
92
92
|
tasks_per_job: int | None = None
|
|
@@ -152,9 +152,8 @@ class SlurmConfig(BaseModel):
|
|
|
152
152
|
"SlurmConfig.sbatch_preamble requires that "
|
|
153
153
|
f"{self.parallel_tasks_per_job=} is not None."
|
|
154
154
|
)
|
|
155
|
-
if self.extra_lines:
|
|
156
|
-
|
|
157
|
-
raise ValueError(f"{self.extra_lines=} contains repetitions")
|
|
155
|
+
if len(self.extra_lines) != len(set(self.extra_lines)):
|
|
156
|
+
raise ValueError(f"{self.extra_lines=} contains repetitions")
|
|
158
157
|
|
|
159
158
|
mem_per_job_MB = self.parallel_tasks_per_job * self.mem_per_task_MB
|
|
160
159
|
lines = [
|
|
@@ -187,18 +186,16 @@ class SlurmConfig(BaseModel):
|
|
|
187
186
|
option = key.replace("_", "-")
|
|
188
187
|
lines.append(f"{self.prefix} --{option}={value}")
|
|
189
188
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
tmp_value = str(Path(remote_export_dir) / value)
|
|
201
|
-
lines.append(f"export {key}={tmp_value}")
|
|
189
|
+
for line in self._sorted_extra_lines():
|
|
190
|
+
lines.append(line)
|
|
191
|
+
|
|
192
|
+
if self.user_local_exports != {} and remote_export_dir is None:
|
|
193
|
+
raise ValueError(
|
|
194
|
+
f"{remote_export_dir=} but {self.user_local_exports=}"
|
|
195
|
+
)
|
|
196
|
+
for key, value in self.user_local_exports.items():
|
|
197
|
+
tmp_value = str(Path(remote_export_dir) / value)
|
|
198
|
+
lines.append(f"export {key}={tmp_value}")
|
|
202
199
|
|
|
203
200
|
"""
|
|
204
201
|
FIXME export SRUN_CPUS_PER_TASK
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
fractal_server/__init__.py,sha256=
|
|
2
|
-
fractal_server/__main__.py,sha256=
|
|
1
|
+
fractal_server/__init__.py,sha256=Km-7IFlZnTXL2BNs_1wfkjKQe7Fj63edH31p1rDJIlg,25
|
|
2
|
+
fractal_server/__main__.py,sha256=sPwlrhE7utCWYUaQ7D9Z1wC0L-7dd-9tlFtBeYoEg_M,11721
|
|
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=sttX0mHVV0ESI1SJ1kcxUKiuEwqeP-BWsst0o_9Yo44,2810
|
|
@@ -29,7 +29,7 @@ fractal_server/app/routes/admin/v2/impersonate.py,sha256=gc4lshfEPFR6W2asH7aKu6h
|
|
|
29
29
|
fractal_server/app/routes/admin/v2/job.py,sha256=6NG93I-yQTlJZ1AIhMPwuizQcQvFlvI7kGJ8jG94Igg,8595
|
|
30
30
|
fractal_server/app/routes/admin/v2/profile.py,sha256=yK42jYTo2cEETx6oWbe3ZJCORtZHqCVS2uQq91H6wG8,2745
|
|
31
31
|
fractal_server/app/routes/admin/v2/project.py,sha256=MA_LdoEuSuisSGRO43TapMuJ080y5iaUGSAUgKuuKOg,1188
|
|
32
|
-
fractal_server/app/routes/admin/v2/resource.py,sha256=
|
|
32
|
+
fractal_server/app/routes/admin/v2/resource.py,sha256=jSI8TruayQHgdzpchbp-KlUBpgsUCQpbGDKHv4TU1j0,7820
|
|
33
33
|
fractal_server/app/routes/admin/v2/task.py,sha256=e1UxsA6CWeYqvnHqxySE78ckRuE0EK60X02VMnkG2gg,4309
|
|
34
34
|
fractal_server/app/routes/admin/v2/task_group.py,sha256=7-Axk5SG6Nw02p7pc6Q6_EtO9Ncy74pVXvt2GCG-Iuc,6043
|
|
35
35
|
fractal_server/app/routes/admin/v2/task_group_lifecycle.py,sha256=h3OYIwhzG8eCaXFGTZlAIQlpgvlaknrskbVVaTBwCp8,10006
|
|
@@ -98,10 +98,9 @@ fractal_server/app/security/__init__.py,sha256=eiYSoUA0XrRGKGKnBOK1KxLhQT9gK0H11
|
|
|
98
98
|
fractal_server/app/security/signup_email.py,sha256=RgU9ia092778j35W4Iil3Ke9wNpPzKH6rjpE0zM9Zb4,1486
|
|
99
99
|
fractal_server/app/shutdown.py,sha256=ViSNJyXWU_iWPSDOOMGNh_iQdUFrdPh_jvf8vVKLpAo,1950
|
|
100
100
|
fractal_server/app/user_settings.py,sha256=5thFLR6de-CiaUyDZG9Bpn-P97vraDk4TP85eDuh8io,898
|
|
101
|
-
fractal_server/config/__init__.py,sha256=
|
|
101
|
+
fractal_server/config/__init__.py,sha256=WvcoE3qiY1qnkumv3qspcemCFw5iFG5NkSFR78vN4ks,562
|
|
102
102
|
fractal_server/config/_database.py,sha256=YOBi3xuJno5wLGw1hKsjLm-bftaxVWiBNIQWVTMX3Ag,1661
|
|
103
103
|
fractal_server/config/_email.py,sha256=iiUP5Be9AzDDJmVsWfTFzLt9XreTFt9pRcX7f9eRNvw,5682
|
|
104
|
-
fractal_server/config/_init_data.py,sha256=w4fUSFhQtCeN_HiUnLldLBL19Yvawva5iUV-vJcdvcA,838
|
|
105
104
|
fractal_server/config/_main.py,sha256=NaKnNjkGZQdHjWPRuwa42I2a024Yqg3zuFUM0vMJzlo,3630
|
|
106
105
|
fractal_server/config/_oauth.py,sha256=OYWqJnL0yn8ymagKb4fK-2zNqXVBbumRWwZrr9TFUms,1926
|
|
107
106
|
fractal_server/config/_settings_config.py,sha256=tsyXQOnn9QKCFJD6hRo_dJXlQQyl70DbqgHMJoZ1xnY,144
|
|
@@ -168,7 +167,7 @@ fractal_server/runner/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
|
|
|
168
167
|
fractal_server/runner/components.py,sha256=-Ii5l8d_V6f5DFOd-Zsr8VYmOsyqw0Hox9fEFQiuqxY,66
|
|
169
168
|
fractal_server/runner/config/__init__.py,sha256=a-vSrvWBeMVnxTtYoy-f5Ibt_mM8MM3F7jqnPvvjHSY,108
|
|
170
169
|
fractal_server/runner/config/_local.py,sha256=_t3s56MAfg5jI8ZOiRSdbvCJLqvQK6kjyAzJ_Fh0KqY,603
|
|
171
|
-
fractal_server/runner/config/_slurm.py,sha256=
|
|
170
|
+
fractal_server/runner/config/_slurm.py,sha256=g8zv-r2aP3vfkY-orKRGO6JbC6yxprR4yOwtpP3uKcg,3633
|
|
172
171
|
fractal_server/runner/config/slurm_mem_to_MB.py,sha256=twtBHIyY3SITe9q1uvH5rQx0QbY_AzexgYB9gaMkVok,2004
|
|
173
172
|
fractal_server/runner/exceptions.py,sha256=N8DLn7tuV8zMSdr8xdJN0aIdytPveSCeQ1Y5IoxXW-8,1778
|
|
174
173
|
fractal_server/runner/executors/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -180,10 +179,10 @@ fractal_server/runner/executors/local/runner.py,sha256=cwQyPfSXyvLTigU4hfyQuCTps
|
|
|
180
179
|
fractal_server/runner/executors/slurm_common/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
181
180
|
fractal_server/runner/executors/slurm_common/_batching.py,sha256=la_FXt4ErYU63vkmk2SGZcSOqq-Jzp_L9tZfzBY7rlU,8806
|
|
182
181
|
fractal_server/runner/executors/slurm_common/_job_states.py,sha256=nuV-Zba38kDrRESOVB3gaGbrSPZc4q7YGichQaeqTW0,238
|
|
183
|
-
fractal_server/runner/executors/slurm_common/base_slurm_runner.py,sha256=
|
|
184
|
-
fractal_server/runner/executors/slurm_common/get_slurm_config.py,sha256=
|
|
182
|
+
fractal_server/runner/executors/slurm_common/base_slurm_runner.py,sha256=MiyRBurrSuvqMdyZd7uPj_hOcEp_HPCB32mps-1X0P0,41008
|
|
183
|
+
fractal_server/runner/executors/slurm_common/get_slurm_config.py,sha256=kQQtc4o5Ya3gLMB6x9xuuyDX6jKpa0bSqkHeiAz7lTM,7071
|
|
185
184
|
fractal_server/runner/executors/slurm_common/remote.py,sha256=2ByWIHFKL1bW6CS04ijrJvX4jH8CpX2Pp-QhAncc-Hs,3806
|
|
186
|
-
fractal_server/runner/executors/slurm_common/slurm_config.py,sha256=
|
|
185
|
+
fractal_server/runner/executors/slurm_common/slurm_config.py,sha256=5P-kd2DejimRrZISJ6DGkTJwb0oX94JO6z6nvwrOnxc,8048
|
|
187
186
|
fractal_server/runner/executors/slurm_common/slurm_job_task_models.py,sha256=wOVtACSFLulc0gUwXlj_SXJHIQmgHpseohw-SahT1DM,3517
|
|
188
187
|
fractal_server/runner/executors/slurm_ssh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
189
188
|
fractal_server/runner/executors/slurm_ssh/run_subprocess.py,sha256=SyW6t4egvbiARph2YkFjc88Hj94fCamZVi50L7ph8VM,996
|
|
@@ -259,8 +258,8 @@ fractal_server/types/validators/_workflow_task_arguments_validators.py,sha256=HL
|
|
|
259
258
|
fractal_server/urls.py,sha256=QjIKAC1a46bCdiPMu3AlpgFbcv6a4l3ABcd5xz190Og,471
|
|
260
259
|
fractal_server/utils.py,sha256=SYVVUuXe_nWyrJLsy7QA-KJscwc5PHEXjvsW4TK7XQI,2180
|
|
261
260
|
fractal_server/zip_tools.py,sha256=H0w7wS5yE4ebj7hw1_77YQ959dl2c-L0WX6J_ro1TY4,4884
|
|
262
|
-
fractal_server-2.17.
|
|
263
|
-
fractal_server-2.17.
|
|
264
|
-
fractal_server-2.17.
|
|
265
|
-
fractal_server-2.17.
|
|
266
|
-
fractal_server-2.17.
|
|
261
|
+
fractal_server-2.17.0a4.dist-info/METADATA,sha256=ZMzqbkf3Z7bm6P9mWPHsIWpwt1FUEIxSSe3sgbqXNMQ,4319
|
|
262
|
+
fractal_server-2.17.0a4.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
263
|
+
fractal_server-2.17.0a4.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
|
|
264
|
+
fractal_server-2.17.0a4.dist-info/licenses/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
|
|
265
|
+
fractal_server-2.17.0a4.dist-info/RECORD,,
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
from pydantic import SecretStr
|
|
2
|
-
from pydantic_settings import BaseSettings
|
|
3
|
-
from pydantic_settings import SettingsConfigDict
|
|
4
|
-
|
|
5
|
-
from ._settings_config import SETTINGS_CONFIG_DICT
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
class InitDataSettings(BaseSettings):
|
|
9
|
-
model_config = SettingsConfigDict(**SETTINGS_CONFIG_DICT)
|
|
10
|
-
|
|
11
|
-
FRACTAL_DEFAULT_ADMIN_EMAIL: str = "admin@fractal.xy"
|
|
12
|
-
"""
|
|
13
|
-
Admin default email, used upon creation of the first superuser during
|
|
14
|
-
server startup.
|
|
15
|
-
|
|
16
|
-
⚠️ **IMPORTANT**: After the server startup, you should always edit the
|
|
17
|
-
default admin credentials.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
FRACTAL_DEFAULT_ADMIN_PASSWORD: SecretStr = "1234"
|
|
21
|
-
"""
|
|
22
|
-
Admin default password, used upon creation of the first superuser during
|
|
23
|
-
server startup.
|
|
24
|
-
|
|
25
|
-
⚠️ **IMPORTANT**: After the server startup, you should always edit the
|
|
26
|
-
default admin credentials.
|
|
27
|
-
"""
|
|
File without changes
|
|
File without changes
|
|
File without changes
|