Skip to content

Commit 936027e

Browse files
Merge branch 'master' into introduce-vip-models-pricing
2 parents f5b73d7 + 0c5a068 commit 936027e

File tree

60 files changed

+4073
-1142
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+4073
-1142
lines changed

.coveragerc

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,25 +7,20 @@ parallel = True
77

88
[report]
99
# Regexes for lines to exclude from consideration
10-
exclude_lines =
11-
# Have to re-enable the standard pragma
12-
pragma: no cover
13-
10+
exclude_also =
1411
# Don't complain about missing debug-only code:
1512
def __repr__
1613
if self\.debug
17-
1814
# Don't complain if tests don't hit defensive assertion code:
1915
raise AssertionError
2016
raise NotImplementedError
21-
2217
# Don't complain if non-runnable code isn't run:
2318
if 0:
2419
if __name__ == .__main__.:
2520
if __name__ == __main__.:
21+
class .*\bProtocol\):
2622
# Don't complain about abstract methods, they aren't run:
2723
@(abc\.)?abstract(((class|static)?method)|property)
28-
2924
# Don't complain about type checking
3025
if TYPE_CHECKING:
3126

packages/models-library/src/models_library/projects_nodes_io.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
UUIDStr: TypeAlias = Annotated[str, StringConstraints(pattern=UUID_RE)]
3636

37-
NodeIDStr = UUIDStr
37+
NodeIDStr: TypeAlias = UUIDStr
3838

3939
LocationID = int
4040
LocationName = str
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
"""add_timezone_comp_tasks
2+
3+
Revision ID: 7ad64e963e0f
4+
Revises: b7f23f6d8aa2
5+
Create Date: 2024-11-27 22:28:51.898433+00:00
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 = "7ad64e963e0f"
14+
down_revision = "b7f23f6d8aa2"
15+
branch_labels = None
16+
depends_on = None
17+
18+
19+
def upgrade():
20+
# ### commands auto generated by Alembic - please adjust! ###
21+
op.alter_column(
22+
"comp_tasks",
23+
"submit",
24+
existing_type=postgresql.TIMESTAMP(),
25+
type_=sa.DateTime(timezone=True),
26+
existing_nullable=True,
27+
)
28+
op.alter_column(
29+
"comp_tasks",
30+
"start",
31+
existing_type=postgresql.TIMESTAMP(),
32+
type_=sa.DateTime(timezone=True),
33+
existing_nullable=True,
34+
)
35+
op.alter_column(
36+
"comp_tasks",
37+
"end",
38+
existing_type=postgresql.TIMESTAMP(),
39+
type_=sa.DateTime(timezone=True),
40+
existing_nullable=True,
41+
)
42+
# ### end Alembic commands ###
43+
44+
45+
def downgrade():
46+
# ### commands auto generated by Alembic - please adjust! ###
47+
op.alter_column(
48+
"comp_tasks",
49+
"end",
50+
existing_type=sa.DateTime(timezone=True),
51+
type_=postgresql.TIMESTAMP(),
52+
existing_nullable=True,
53+
)
54+
op.alter_column(
55+
"comp_tasks",
56+
"start",
57+
existing_type=sa.DateTime(timezone=True),
58+
type_=postgresql.TIMESTAMP(),
59+
existing_nullable=True,
60+
)
61+
op.alter_column(
62+
"comp_tasks",
63+
"submit",
64+
existing_type=sa.DateTime(timezone=True),
65+
type_=postgresql.TIMESTAMP(),
66+
existing_nullable=True,
67+
)
68+
# ### end Alembic commands ###
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
"""added_distributed_comp_scheduler
2+
3+
Revision ID: b7f23f6d8aa2
4+
Revises: c9db8bf5091e
5+
Create Date: 2024-11-26 17:06:27.053774+00:00
6+
7+
"""
8+
import sqlalchemy as sa
9+
from alembic import op
10+
11+
# revision identifiers, used by Alembic.
12+
revision = "b7f23f6d8aa2"
13+
down_revision = "c9db8bf5091e"
14+
branch_labels = None
15+
depends_on = None
16+
17+
18+
def upgrade():
19+
# ### commands auto generated by Alembic - please adjust! ###
20+
op.add_column(
21+
"comp_runs", sa.Column("scheduled", sa.DateTime(timezone=True), nullable=True)
22+
)
23+
op.add_column(
24+
"comp_runs", sa.Column("processed", sa.DateTime(timezone=True), nullable=True)
25+
)
26+
# ### end Alembic commands ###
27+
28+
29+
def downgrade():
30+
# ### commands auto generated by Alembic - please adjust! ###
31+
op.drop_column("comp_runs", "processed")
32+
op.drop_column("comp_runs", "scheduled")
33+
# ### end Alembic commands ###
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
"""add_timezone_comp_runs
2+
3+
Revision ID: e05bdc5b3c7b
4+
Revises: 7ad64e963e0f
5+
Create Date: 2024-11-27 22:51:21.112336+00:00
6+
7+
"""
8+
9+
import sqlalchemy as sa
10+
from alembic import op
11+
from sqlalchemy.dialects import postgresql
12+
13+
# revision identifiers, used by Alembic.
14+
revision = "e05bdc5b3c7b"
15+
down_revision = "7ad64e963e0f"
16+
branch_labels = None
17+
depends_on = None
18+
19+
20+
def upgrade():
21+
# ### commands auto generated by Alembic - please adjust! ###
22+
op.alter_column(
23+
"comp_runs",
24+
"created",
25+
existing_type=postgresql.TIMESTAMP(),
26+
type_=sa.DateTime(timezone=True),
27+
existing_nullable=False,
28+
existing_server_default="now()",
29+
)
30+
op.alter_column(
31+
"comp_runs",
32+
"modified",
33+
existing_type=postgresql.TIMESTAMP(),
34+
type_=sa.DateTime(timezone=True),
35+
existing_nullable=False,
36+
existing_server_default="now()",
37+
)
38+
op.alter_column(
39+
"comp_runs",
40+
"started",
41+
existing_type=postgresql.TIMESTAMP(),
42+
type_=sa.DateTime(timezone=True),
43+
existing_nullable=True,
44+
)
45+
op.alter_column(
46+
"comp_runs",
47+
"ended",
48+
existing_type=postgresql.TIMESTAMP(),
49+
type_=sa.DateTime(timezone=True),
50+
existing_nullable=True,
51+
)
52+
# ### end Alembic commands ###
53+
54+
55+
def downgrade():
56+
# ### commands auto generated by Alembic - please adjust! ###
57+
op.alter_column(
58+
"comp_runs",
59+
"ended",
60+
existing_type=sa.DateTime(timezone=True),
61+
type_=postgresql.TIMESTAMP(),
62+
existing_nullable=True,
63+
)
64+
op.alter_column(
65+
"comp_runs",
66+
"started",
67+
existing_type=sa.DateTime(timezone=True),
68+
type_=postgresql.TIMESTAMP(),
69+
existing_nullable=True,
70+
)
71+
op.alter_column(
72+
"comp_runs",
73+
"modified",
74+
existing_type=sa.DateTime(timezone=True),
75+
type_=postgresql.TIMESTAMP(),
76+
existing_nullable=False,
77+
existing_server_default="now()",
78+
)
79+
op.alter_column(
80+
"comp_runs",
81+
"created",
82+
existing_type=sa.DateTime(timezone=True),
83+
type_=postgresql.TIMESTAMP(),
84+
existing_nullable=False,
85+
existing_server_default="now()",
86+
)
87+
# ### end Alembic commands ###

packages/postgres-database/src/simcore_postgres_database/models/comp_runs.py

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
""" Computational Runs Table
22
33
"""
4+
45
import sqlalchemy as sa
56
from sqlalchemy.dialects.postgresql import JSONB
6-
from sqlalchemy.sql import func
77

8-
from ._common import RefActions
8+
from ._common import RefActions, column_created_datetime, column_modified_datetime
99
from .base import metadata
1010
from .comp_pipeline import StateType
1111

@@ -72,31 +72,18 @@
7272
doc="The result of the run entry",
7373
),
7474
# dag node id and class
75-
sa.Column(
76-
"created",
77-
sa.DateTime(),
78-
nullable=False,
79-
server_default=func.now(),
80-
doc="When the run entry was created",
81-
),
82-
sa.Column(
83-
"modified",
84-
sa.DateTime(),
85-
nullable=False,
86-
server_default=func.now(),
87-
onupdate=func.now(), # this will auto-update on modification
88-
doc="When the run entry was last modified",
89-
),
75+
column_created_datetime(timezone=True),
76+
column_modified_datetime(timezone=True),
9077
# utc timestamps for submission/start/end
9178
sa.Column(
9279
"started",
93-
sa.DateTime,
80+
sa.DateTime(timezone=True),
9481
nullable=True,
9582
doc="When the run was started",
9683
),
9784
sa.Column(
9885
"ended",
99-
sa.DateTime,
86+
sa.DateTime(timezone=True),
10087
nullable=True,
10188
doc="When the run was finished",
10289
),
@@ -106,6 +93,18 @@
10693
nullable=True,
10794
doc="If filled, when cancellation was requested",
10895
),
96+
sa.Column(
97+
"scheduled",
98+
sa.DateTime(timezone=True),
99+
nullable=True,
100+
doc="last time the pipeline was scheduled to be processed",
101+
),
102+
sa.Column(
103+
"processed",
104+
sa.DateTime(timezone=True),
105+
nullable=True,
106+
doc="last time the pipeline was actually processed",
107+
),
109108
sa.Column("metadata", JSONB, nullable=True, doc="the run optional metadata"),
110109
sa.Column(
111110
"use_on_demand_clusters",

packages/postgres-database/src/simcore_postgres_database/models/comp_tasks.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
""" Computational Tasks Table
22
33
"""
4+
45
import enum
56

67
import sqlalchemy as sa
@@ -77,9 +78,15 @@ class NodeClass(enum.Enum):
7778
doc="current progress of the task if available",
7879
),
7980
# utc timestamps for submission/start/end
80-
sa.Column("submit", sa.DateTime, doc="UTC timestamp for task submission"),
81-
sa.Column("start", sa.DateTime, doc="UTC timestamp when task started"),
82-
sa.Column("end", sa.DateTime, doc="UTC timestamp for task completion"),
81+
sa.Column(
82+
"submit", sa.DateTime(timezone=True), doc="UTC timestamp for task submission"
83+
),
84+
sa.Column(
85+
"start", sa.DateTime(timezone=True), doc="UTC timestamp when task started"
86+
),
87+
sa.Column(
88+
"end", sa.DateTime(timezone=True), doc="UTC timestamp for task completion"
89+
),
8390
sa.Column(
8491
"last_heartbeat",
8592
sa.DateTime(timezone=True),

packages/postgres-database/src/simcore_postgres_database/utils_projects_metadata.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ async def get(connection: SAConnection, project_uuid: uuid.UUID) -> ProjectMetad
9393
row: RowProxy | None = await result.first()
9494
if row is None:
9595
raise DBProjectNotFoundError(project_uuid=project_uuid)
96-
return ProjectMetadata.from_orm(row)
96+
return ProjectMetadata.model_validate(row)
9797

9898

9999
def _check_valid_ancestors_combination(
@@ -202,7 +202,7 @@ async def set_project_ancestors(
202202
result: ResultProxy = await connection.execute(upsert_stmt)
203203
row: RowProxy | None = await result.first()
204204
assert row # nosec
205-
return ProjectMetadata.from_orm(row)
205+
return ProjectMetadata.model_validate(row)
206206

207207
except ForeignKeyViolation as err:
208208
assert err.pgerror is not None # nosec # noqa: PT017
@@ -234,7 +234,7 @@ async def set_project_custom_metadata(
234234
result: ResultProxy = await connection.execute(upsert_stmt)
235235
row: RowProxy | None = await result.first()
236236
assert row # nosec
237-
return ProjectMetadata.from_orm(row)
237+
return ProjectMetadata.model_validate(row)
238238

239239
except ForeignKeyViolation as err:
240240
raise DBProjectNotFoundError(project_uuid=project_uuid) from err

packages/postgres-database/src/simcore_postgres_database/utils_projects_nodes.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ async def add(
102102
assert result # nosec
103103
rows = await result.fetchall()
104104
assert rows is not None # nosec
105-
return [ProjectNode.from_orm(r) for r in rows]
105+
return [ProjectNode.model_validate(r) for r in rows]
106106
except ForeignKeyViolation as exc:
107107
# this happens when the project does not exist, as we first check the node exists
108108
raise ProjectNodesProjectNotFoundError(
@@ -128,7 +128,7 @@ async def list(self, connection: SAConnection) -> list[ProjectNode]:
128128
assert result # nosec
129129
rows = await result.fetchall()
130130
assert rows is not None # nosec
131-
return [ProjectNode.from_orm(row) for row in rows]
131+
return [ProjectNode.model_validate(row) for row in rows]
132132

133133
async def get(self, connection: SAConnection, *, node_id: uuid.UUID) -> ProjectNode:
134134
"""get a node in the current project
@@ -154,7 +154,7 @@ async def get(self, connection: SAConnection, *, node_id: uuid.UUID) -> ProjectN
154154
project_uuid=self.project_uuid, node_id=node_id
155155
)
156156
assert row # nosec
157-
return ProjectNode.from_orm(row)
157+
return ProjectNode.model_validate(row)
158158

159159
async def update(
160160
self, connection: SAConnection, *, node_id: uuid.UUID, **values
@@ -184,7 +184,7 @@ async def update(
184184
project_uuid=self.project_uuid, node_id=node_id
185185
)
186186
assert row # nosec
187-
return ProjectNode.from_orm(row)
187+
return ProjectNode.model_validate(row)
188188

189189
async def delete(self, connection: SAConnection, *, node_id: uuid.UUID) -> None:
190190
"""delete a node in the current project

packages/pytest-simcore/src/pytest_simcore/db_entries_mocks.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ async def creator(
9393
.returning(sa.literal_column("*"))
9494
)
9595

96-
inserted_project = ProjectAtDB.from_orm(await result.first())
96+
inserted_project = ProjectAtDB.model_validate(await result.first())
9797
project_nodes_repo = ProjectNodesRepo(project_uuid=project_uuid)
9898
# NOTE: currently no resources is passed until it becomes necessary
9999
default_node_config = {"required_resources": {}}

0 commit comments

Comments
 (0)