fractal-server 2.6.0a1__py3-none-any.whl → 2.6.2__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.
@@ -1 +1 @@
1
- __VERSION__ = "2.6.0a1"
1
+ __VERSION__ = "2.6.2"
@@ -15,7 +15,6 @@ from typing import Optional
15
15
  from pydantic import EmailStr
16
16
  from sqlalchemy import Column
17
17
  from sqlalchemy.types import DateTime
18
- from sqlalchemy.types import JSON
19
18
  from sqlmodel import Field
20
19
  from sqlmodel import Relationship
21
20
  from sqlmodel import SQLModel
@@ -93,11 +92,6 @@ class UserOAuth(SQLModel, table=True):
93
92
  is_superuser: bool = Field(False, nullable=False)
94
93
  is_verified: bool = Field(False, nullable=False)
95
94
 
96
- slurm_user: Optional[str]
97
- slurm_accounts: list[str] = Field(
98
- sa_column=Column(JSON, server_default="[]", nullable=False)
99
- )
100
- cache_dir: Optional[str]
101
95
  username: Optional[str]
102
96
 
103
97
  oauth_accounts: list["OAuthAccount"] = Relationship(
@@ -69,14 +69,19 @@ def valint(attribute: str, min_val: int = 1):
69
69
  return val
70
70
 
71
71
 
72
- def val_absolute_path(attribute: str):
72
+ def val_absolute_path(attribute: str, accept_none: bool = False):
73
73
  """
74
74
  Check that a string attribute is an absolute path
75
75
  """
76
76
 
77
77
  def val(string: Optional[str]) -> str:
78
78
  if string is None:
79
- raise ValueError(f"String attribute '{attribute}' cannot be None")
79
+ if accept_none:
80
+ return string
81
+ else:
82
+ raise ValueError(
83
+ f"String attribute '{attribute}' cannot be None"
84
+ )
80
85
  s = string.strip()
81
86
  if not s:
82
87
  raise ValueError(f"String attribute '{attribute}' cannot be empty")
@@ -47,23 +47,25 @@ class UserSettingsUpdate(BaseModel, extra=Extra.forbid):
47
47
  slurm_accounts: Optional[list[StrictStr]] = None
48
48
  cache_dir: Optional[str] = None
49
49
 
50
- _ssh_host = validator("ssh_host", allow_reuse=True)(valstr("ssh_host"))
50
+ _ssh_host = validator("ssh_host", allow_reuse=True)(
51
+ valstr("ssh_host", accept_none=True)
52
+ )
51
53
  _ssh_username = validator("ssh_username", allow_reuse=True)(
52
- valstr("ssh_username")
54
+ valstr("ssh_username", accept_none=True)
53
55
  )
54
56
  _ssh_private_key_path = validator(
55
57
  "ssh_private_key_path", allow_reuse=True
56
- )(val_absolute_path("ssh_private_key_path"))
58
+ )(val_absolute_path("ssh_private_key_path", accept_none=True))
57
59
 
58
60
  _ssh_tasks_dir = validator("ssh_tasks_dir", allow_reuse=True)(
59
- val_absolute_path("ssh_tasks_dir")
61
+ val_absolute_path("ssh_tasks_dir", accept_none=True)
60
62
  )
61
63
  _ssh_jobs_dir = validator("ssh_jobs_dir", allow_reuse=True)(
62
- val_absolute_path("ssh_jobs_dir")
64
+ val_absolute_path("ssh_jobs_dir", accept_none=True)
63
65
  )
64
66
 
65
67
  _slurm_user = validator("slurm_user", allow_reuse=True)(
66
- valstr("slurm_user")
68
+ valstr("slurm_user", accept_none=True)
67
69
  )
68
70
 
69
71
  @validator("slurm_accounts")
@@ -76,6 +78,8 @@ class UserSettingsUpdate(BaseModel, extra=Extra.forbid):
76
78
 
77
79
  @validator("cache_dir")
78
80
  def cache_dir_validator(cls, value):
81
+ if value is None:
82
+ return None
79
83
  validate_cmd(value)
80
84
  return val_absolute_path("cache_dir")(value)
81
85
 
@@ -90,5 +94,7 @@ class UserSettingsUpdateStrict(BaseModel, extra=Extra.forbid):
90
94
 
91
95
  @validator("cache_dir")
92
96
  def cache_dir_validator(cls, value):
97
+ if value is None:
98
+ return value
93
99
  validate_cmd(value)
94
100
  return val_absolute_path("cache_dir")(value)
@@ -13,6 +13,7 @@ from .._validators import valdictkeys
13
13
  from .._validators import valstr
14
14
  from fractal_server.app.schemas._validators import valutc
15
15
  from fractal_server.app.schemas.v2 import ManifestV2
16
+ from fractal_server.string_tools import validate_cmd
16
17
 
17
18
 
18
19
  class CollectionStatusV2(str, Enum):
@@ -144,13 +145,13 @@ class TaskCollectCustomV2(BaseModel):
144
145
  return values
145
146
 
146
147
  @validator("package_name")
147
- def package_name_prevent_injection(cls, value: str):
148
+ def package_name_validator(cls, value: str):
148
149
  """
149
- Remove all whitespace characters, and reject values containing `;`.
150
+ Remove all whitespace characters, then check for invalid code.
150
151
  """
151
152
  if value is not None:
152
- if ";" in value:
153
- raise ValueError(f"Invalid package_name: {value}")
153
+ validate_cmd(value)
154
+ value = valstr("package_name")(value)
154
155
  value = value.replace(" ", "")
155
156
  return value
156
157
 
fractal_server/config.py CHANGED
@@ -512,25 +512,6 @@ class Settings(BaseSettings):
512
512
  `JobExecutionError`.
513
513
  """
514
514
 
515
- FRACTAL_SLURM_SSH_HOST: Optional[str] = None
516
- """
517
- SSH-reachable host where a SLURM client is available.
518
- """
519
- FRACTAL_SLURM_SSH_USER: Optional[str] = None
520
- """
521
- User on `FRACTAL_SLURM_SSH_HOST`.
522
- """
523
- FRACTAL_SLURM_SSH_PRIVATE_KEY_PATH: Optional[str] = None
524
- """
525
- Private key for connecting to `FRACTAL_SLURM_SSH_HOST` as
526
- `FRACTAL_SLURM_SSH_USER`.
527
- """
528
- # FIXME SSH: Split this into two folders (for tasks and for jobs)
529
- FRACTAL_SLURM_SSH_WORKING_BASE_DIR: Optional[str] = None
530
- """
531
- Remote folder on `FRACTAL_SLURM_SSH_HOST`.
532
- """
533
-
534
515
  FRACTAL_API_SUBMIT_RATE_LIMIT: int = 2
535
516
  """
536
517
  Interval to wait (in seconds) to be allowed to call again
@@ -0,0 +1,52 @@
1
+ """remove cache_dir slurm_user and slurm_accounts from user
2
+
3
+ Revision ID: 94a47ea2d3ff
4
+ Revises: 9c5ae74c9b98
5
+ Create Date: 2024-09-25 09:33:18.014831
6
+
7
+ """
8
+ import sqlalchemy as sa
9
+ from alembic import op
10
+ from sqlalchemy.dialects import postgresql
11
+
12
+ # revision identifiers, used by Alembic.
13
+ revision = "94a47ea2d3ff"
14
+ down_revision = "9c5ae74c9b98"
15
+ branch_labels = None
16
+ depends_on = None
17
+
18
+
19
+ def upgrade() -> None:
20
+ # ### commands auto generated by Alembic - please adjust! ###
21
+ with op.batch_alter_table("user_oauth", schema=None) as batch_op:
22
+ batch_op.drop_column("slurm_user")
23
+ batch_op.drop_column("slurm_accounts")
24
+ batch_op.drop_column("cache_dir")
25
+
26
+ # ### end Alembic commands ###
27
+
28
+
29
+ def downgrade() -> None:
30
+ # ### commands auto generated by Alembic - please adjust! ###
31
+ with op.batch_alter_table("user_oauth", schema=None) as batch_op:
32
+ batch_op.add_column(
33
+ sa.Column(
34
+ "cache_dir", sa.VARCHAR(), autoincrement=False, nullable=True
35
+ )
36
+ )
37
+ batch_op.add_column(
38
+ sa.Column(
39
+ "slurm_accounts",
40
+ postgresql.JSON(astext_type=sa.Text()),
41
+ server_default=sa.text("'[]'::json"),
42
+ autoincrement=False,
43
+ nullable=False,
44
+ )
45
+ )
46
+ batch_op.add_column(
47
+ sa.Column(
48
+ "slurm_user", sa.VARCHAR(), autoincrement=False, nullable=True
49
+ )
50
+ )
51
+
52
+ # ### end Alembic commands ###
@@ -305,21 +305,21 @@ class FractalSSH(object):
305
305
  safe_root: If `folder` is not a subfolder of the absolute
306
306
  `safe_root` path, raise an error.
307
307
  """
308
- invalid_characters = {" ", "\n", ";", "$", "`"}
309
-
310
- if (
311
- not isinstance(folder, str)
312
- or not isinstance(safe_root, str)
313
- or len(invalid_characters.intersection(folder)) > 0
314
- or len(invalid_characters.intersection(safe_root)) > 0
315
- or not Path(folder).is_absolute()
316
- or not Path(safe_root).is_absolute()
317
- or not Path(folder).resolve().is_relative_to(safe_root)
308
+ validate_cmd(folder)
309
+ validate_cmd(safe_root)
310
+
311
+ if " " in folder:
312
+ raise ValueError(f"folder='{folder}' includes whitespace.")
313
+ elif " " in safe_root:
314
+ raise ValueError(f"safe_root='{safe_root}' includes whitespace.")
315
+ elif not Path(folder).is_absolute():
316
+ raise ValueError(f"{folder=} is not an absolute path.")
317
+ elif not Path(safe_root).is_absolute():
318
+ raise ValueError(f"{safe_root=} is not an absolute path.")
319
+ elif not (
320
+ Path(folder).resolve().is_relative_to(Path(safe_root).resolve())
318
321
  ):
319
- raise ValueError(
320
- f"{folder=} argument is invalid or it is not "
321
- f"relative to {safe_root=}."
322
- )
322
+ raise ValueError(f"{folder=} is not a subfolder of {safe_root=}.")
323
323
  else:
324
324
  cmd = f"rm -r {folder}"
325
325
  self.run_command(cmd=cmd)
@@ -60,6 +60,8 @@ def validate_cmd(command: str, allow_char: Optional[str] = None):
60
60
  command: command to validate.
61
61
  allow_char: chars to accept among the forbidden ones
62
62
  """
63
+ if not isinstance(command, str):
64
+ raise ValueError(f"{command=} is not a string.")
63
65
  forbidden = set(__NOT_ALLOWED_FOR_COMMANDS__)
64
66
  if allow_char is not None:
65
67
  forbidden = forbidden - set(allow_char)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: fractal-server
3
- Version: 2.6.0a1
3
+ Version: 2.6.2
4
4
  Summary: Server component of the Fractal analytics platform
5
5
  Home-page: https://github.com/fractal-analytics-platform/fractal-server
6
6
  License: BSD-3-Clause
@@ -1,4 +1,4 @@
1
- fractal_server/__init__.py,sha256=V37BdMJAncuN7d1NxAYcAAW3NwjqA3Vl-LqN_PhaVrc,24
1
+ fractal_server/__init__.py,sha256=zk2Mr_vPWXiYjT0KF9CbddwUnuJ011NmmqEbItcDUz4,22
2
2
  fractal_server/__main__.py,sha256=WcBAkmVE9aH5mDI6wGkVmPAql2N5Vyk0A-7zuUl8WX0,6122
3
3
  fractal_server/alembic.ini,sha256=MWwi7GzjzawI9cCAK1LW7NxIBQDUqD12-ptJoq5JpP0,3153
4
4
  fractal_server/app/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -6,7 +6,7 @@ fractal_server/app/db/__init__.py,sha256=81rK9w1__Z6PJ5cEcChPVc-wI9YOK4fN--_5Opr
6
6
  fractal_server/app/models/__init__.py,sha256=aG7mf1zZbsgzDSp7GHEcZhdjHfW3TGPOLCI8MrvYhPw,500
7
7
  fractal_server/app/models/linkusergroup.py,sha256=ufthlbLFAWMU_dJmsVZzVlQa_D9C9SmgydxypQ2Xq1U,309
8
8
  fractal_server/app/models/linkuserproject.py,sha256=eQaourbGRshvlMVlKzLYJKHEjfsW1CbWws9yW4eHXhA,567
9
- fractal_server/app/models/security.py,sha256=DY1JGS11pdlFXTValt86hNcL6a6kLRZ5xkOhhZJ8c1U,3831
9
+ fractal_server/app/models/security.py,sha256=xeR_3Wb5Epn2fvNgEuTKibzMkMybVogACpUvrP1J1b8,3625
10
10
  fractal_server/app/models/user_settings.py,sha256=0YXCAwoAVGqI2irRLdXgr9-JS0STtHhSaoFENigAnrk,1312
11
11
  fractal_server/app/models/v1/__init__.py,sha256=hUI7dEbPaiZGN0IbHW4RSmSicyvtn_xeuevoX7zvUwI,466
12
12
  fractal_server/app/models/v1/dataset.py,sha256=99GDgt7njx8yYQApkImqp_7bHA5HH3ElvbR6Oyj9kVI,2017
@@ -125,10 +125,10 @@ fractal_server/app/runner/v2/runner_functions_low_level.py,sha256=1fWvQ6YZUUnDhO
125
125
  fractal_server/app/runner/v2/task_interface.py,sha256=myS-kT0DsJ8xIJZBVEzgD8g54VbiwL6i7Im3e1zcVHQ,1866
126
126
  fractal_server/app/runner/versions.py,sha256=dSaPRWqmFPHjg20kTCHmi_dmGNcCETflDtDLronNanU,852
127
127
  fractal_server/app/schemas/__init__.py,sha256=stURAU_t3AOBaH0HSUbV-GKhlPKngnnIMoqWc3orFyI,135
128
- fractal_server/app/schemas/_validators.py,sha256=1dTOYr1IZykrxuQSV2-zuEMZbKe_nGwrfS7iUrsh-sE,3461
128
+ fractal_server/app/schemas/_validators.py,sha256=XKEGEHxp3H6YSJewtFWXe_2Nh7SDdNtAXmlEmJO6Vb0,3606
129
129
  fractal_server/app/schemas/user.py,sha256=VNnAPnAVK6X0PZlw7XehocAshVNuUHdDwiZVWCCor6Y,2156
130
130
  fractal_server/app/schemas/user_group.py,sha256=2f9XQ6kIar6NMY4UCN0yOnve6ZDHUVZaHv1dna1Vfjg,1446
131
- fractal_server/app/schemas/user_settings.py,sha256=E9O4NAyxr1NpnO39MZ-AlYvEe-pielFYmerVLNJR9Do,2879
131
+ fractal_server/app/schemas/user_settings.py,sha256=UEST1MSmd9w2YypCji3SONSFlJcr2u4uG3bTczZy_Pk,3102
132
132
  fractal_server/app/schemas/v1/__init__.py,sha256=CrBGgBhoemCvmZ70ZUchM-jfVAICnoa7AjZBAtL2UB0,1852
133
133
  fractal_server/app/schemas/v1/applyworkflow.py,sha256=uuIh7fHlHEL4yLqL-dePI6-nfCsqgBYATmht7w_KITw,4302
134
134
  fractal_server/app/schemas/v1/dataset.py,sha256=n71lNUO3JLy2K3IM9BZM2Fk1EnKQOTU7pm2s2rJ1FGY,3444
@@ -147,13 +147,12 @@ fractal_server/app/schemas/v2/manifest.py,sha256=N37IWohcfO3_y2l8rVM0h_1nZq7m4Iz
147
147
  fractal_server/app/schemas/v2/project.py,sha256=u7S4B-bote1oGjzAGiZ-DuQIyeRAGqJsI71Tc1EtYE0,736
148
148
  fractal_server/app/schemas/v2/status.py,sha256=SQaUpQkjFq5c5k5J4rOjNhuQaDOEg8lksPhkKmPU5VU,332
149
149
  fractal_server/app/schemas/v2/task.py,sha256=XsN8w1Szs8BrxxRtKyWCHKjN4Od-Kmlhi769JEplL-M,4804
150
- fractal_server/app/schemas/v2/task_collection.py,sha256=8PG1bOqkfQqORMN0brWf6mHDmijt0bBW-mZsF7cSxUs,6129
150
+ fractal_server/app/schemas/v2/task_collection.py,sha256=_utBv7_kcRJCbPdWezasU8GrikI_QFPKeIl4vyAgDd4,6155
151
151
  fractal_server/app/schemas/v2/workflow.py,sha256=Zzx3e-qgkH8le0FUmAx9UrV5PWd7bj14PPXUh_zgZXM,1827
152
152
  fractal_server/app/schemas/v2/workflowtask.py,sha256=TN-mdkuE_EWet9Wk-xFrUwIt_tXYcw88WOKMnUcchKk,5665
153
153
  fractal_server/app/security/__init__.py,sha256=V1NOWlmaFZHMR6SrkMl62jyAuqYONyo8lyGvR6UZesM,12312
154
154
  fractal_server/app/user_settings.py,sha256=aZgQ3i0JkHfgwLGW1ee6Gzr1ae3IioFfJKKSsSS8Svk,1312
155
- fractal_server/config.py,sha256=NucdVswA4MJpgeePDqSsU01I893Bn_hqWUrxrax83Ls,24257
156
- fractal_server/data_migrations/2_6_0.py,sha256=Vl17mFiOF5jQsktOnog5vnaXXcUXOJRa-ljas9kUX0E,1863
155
+ fractal_server/config.py,sha256=gX0aYwDwbC5y7JNorifON84YMveubb7XTb4sH14N3KM,23667
157
156
  fractal_server/data_migrations/README.md,sha256=_3AEFvDg9YkybDqCLlFPdDmGJvr6Tw7HRI14aZ3LOIw,398
158
157
  fractal_server/data_migrations/tools.py,sha256=LeMeASwYGtEqd-3wOLle6WARdTGAimoyMmRbbJl-hAM,572
159
158
  fractal_server/gunicorn_fractal.py,sha256=u6U01TLGlXgq1v8QmEpLih3QnsInZD7CqphgJ_GrGzc,1230
@@ -176,6 +175,7 @@ fractal_server/migrations/versions/70e77f1c38b0_add_applyworkflow_first_task_ind
176
175
  fractal_server/migrations/versions/71eefd1dd202_add_slurm_accounts.py,sha256=mbWuCkTpRAdGbRhW7lhXs_e5S6O37UAcCN6JfoY5H8A,1353
177
176
  fractal_server/migrations/versions/84bf0fffde30_add_dumps_to_applyworkflow.py,sha256=NSCuhANChsg76vBkShBl-9tQ4VEHubOjtAv1etHhlvY,2684
178
177
  fractal_server/migrations/versions/8f79bd162e35_add_docs_info_and_docs_link_to_task_.py,sha256=6pgODDtyAxevZvAJBj9IJ41inhV1RpwbpZr_qfPPu1A,1115
178
+ fractal_server/migrations/versions/94a47ea2d3ff_remove_cache_dir_slurm_user_and_slurm_.py,sha256=yL3-Hvzw5jBLKj4LFP1z5ofZE9L9W3tLwYtPNW7z4ko,1508
179
179
  fractal_server/migrations/versions/97f444d47249_add_applyworkflow_project_dump.py,sha256=eKTZm3EgUgapXBxO0RuHkEfTKic-TZG3ADaMpGLuc0k,1057
180
180
  fractal_server/migrations/versions/99ea79d9e5d2_add_dataset_history.py,sha256=0im6TxDr53sKKcjiPgeH4ftVRGnRXZSh2lPbRQ1Ir9w,883
181
181
  fractal_server/migrations/versions/9c5ae74c9b98_add_user_settings_table.py,sha256=syONdZNf4-OnAcWIsbzXpYwpXPsXZ4SsmjwVvmVG0PU,2256
@@ -187,8 +187,8 @@ fractal_server/migrations/versions/efa89c30e0a4_add_project_timestamp_created.py
187
187
  fractal_server/migrations/versions/f384e1c0cf5d_drop_task_default_args_columns.py,sha256=9BwqUS9Gf7UW_KjrzHbtViC880qhD452KAytkHWWZyk,746
188
188
  fractal_server/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
189
189
  fractal_server/ssh/__init__.py,sha256=sVUmzxf7_DuXG1xoLQ1_00fo5NPhi2LJipSmU5EAkPs,124
190
- fractal_server/ssh/_fabric.py,sha256=B9C7Cj9ibrT1_OGlu38Jz94elNofLvkP1pxf0Tv8Eic,16140
191
- fractal_server/string_tools.py,sha256=YyopB2ZZ8iL9JLDXUA8PI0hahivqLiohir2HsAlEzqE,2170
190
+ fractal_server/ssh/_fabric.py,sha256=Fw6NZl8YnlShYTL-jmuPpbJ_Kn2pDRAIRY3bbDcnMA8,16214
191
+ fractal_server/string_tools.py,sha256=bEcGNzlZJ3fj4IjRBXM34Klt25Amfx5AbeTHqPwnAqM,2264
192
192
  fractal_server/syringe.py,sha256=3qSMW3YaMKKnLdgnooAINOPxnCOxP7y2jeAQYB21Gdo,2786
193
193
  fractal_server/tasks/__init__.py,sha256=kadmVUoIghl8s190_Tt-8f-WBqMi8u8oU4Pvw39NHE8,23
194
194
  fractal_server/tasks/utils.py,sha256=wucz57I7G0Vd8hvtmvonlryACx9zIVlqfxG5I87MJ80,1820
@@ -213,8 +213,8 @@ fractal_server/tasks/v2/utils.py,sha256=JOyCacb6MNvrwfLNTyLwcz8y79J29YuJeJ2MK5kq
213
213
  fractal_server/urls.py,sha256=5o_qq7PzKKbwq12NHSQZDmDitn5RAOeQ4xufu-2v9Zk,448
214
214
  fractal_server/utils.py,sha256=b7WwFdcFZ8unyT65mloFToYuEDXpQoHRcmRNqrhd_dQ,2115
215
215
  fractal_server/zip_tools.py,sha256=xYpzBshysD2nmxkD5WLYqMzPYUcCRM3kYy-7n9bJL-U,4426
216
- fractal_server-2.6.0a1.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
217
- fractal_server-2.6.0a1.dist-info/METADATA,sha256=vgfTZcfqQkzjshalFqzIv5UXRWGbsd5rRLbxyJkFbL4,4630
218
- fractal_server-2.6.0a1.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
219
- fractal_server-2.6.0a1.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
220
- fractal_server-2.6.0a1.dist-info/RECORD,,
216
+ fractal_server-2.6.2.dist-info/LICENSE,sha256=QKAharUuhxL58kSoLizKJeZE3mTCBnX6ucmz8W0lxlk,1576
217
+ fractal_server-2.6.2.dist-info/METADATA,sha256=hlWGMOKcA-SXQpW1tlXMo9zfn6lKs31rl-byf88u8Bs,4628
218
+ fractal_server-2.6.2.dist-info/WHEEL,sha256=sP946D7jFCHeNz5Iq4fL4Lu-PrWrFsgfLXbbkciIZwg,88
219
+ fractal_server-2.6.2.dist-info/entry_points.txt,sha256=8tV2kynvFkjnhbtDnxAqImL6HMVKsopgGfew0DOp5UY,58
220
+ fractal_server-2.6.2.dist-info/RECORD,,
@@ -1,49 +0,0 @@
1
- import logging
2
-
3
- from sqlalchemy import select
4
-
5
- from fractal_server.app.db import get_sync_db
6
- from fractal_server.app.models import UserOAuth
7
- from fractal_server.app.models import UserSettings
8
- from fractal_server.config import get_settings
9
- from fractal_server.data_migrations.tools import _check_current_version
10
- from fractal_server.syringe import Inject
11
-
12
-
13
- def fix_db():
14
- logger = logging.getLogger("fix_db")
15
- logger.warning("START execution of fix_db function")
16
- _check_current_version("2.6.0")
17
-
18
- global_settings = Inject(get_settings)
19
-
20
- with next(get_sync_db()) as db:
21
- users = db.execute(select(UserOAuth)).scalars().unique().all()
22
- for user in sorted(users, key=lambda x: x.id):
23
- logger.warning(f"START handling user {user.id}: '{user.email}'")
24
- user_settings = UserSettings(
25
- # SSH
26
- ssh_host=global_settings.FRACTAL_SLURM_SSH_HOST,
27
- ssh_username=global_settings.FRACTAL_SLURM_SSH_USER,
28
- ssh_private_key_path=(
29
- global_settings.FRACTAL_SLURM_SSH_PRIVATE_KEY_PATH
30
- ),
31
- ssh_tasks_dir=(
32
- global_settings.FRACTAL_SLURM_SSH_WORKING_BASE_DIR
33
- ),
34
- ssh_jobs_dir=(
35
- global_settings.FRACTAL_SLURM_SSH_WORKING_BASE_DIR
36
- ),
37
- # SUDO
38
- slurm_user=user.slurm_user,
39
- slurm_accounts=user.slurm_accounts,
40
- cache_dir=user.cache_dir,
41
- )
42
- user.settings = user_settings
43
- db.add(user)
44
- db.commit()
45
- db.refresh(user)
46
- logger.warning(f"New user {user.id} settings:\n{user.settings}")
47
- logger.warning(f"END handling user {user.id}: '{user.email}'")
48
-
49
- logger.warning("END of execution of fix_db function")