Skip to content

Commit f99af0a

Browse files
add project_tags to rut
1 parent e6e2c70 commit f99af0a

File tree

7 files changed

+107
-4
lines changed

7 files changed

+107
-4
lines changed

packages/models-library/src/models_library/api_schemas_resource_usage_tracker/service_runs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ServiceRunGet(BaseModel):
2020
user_email: str
2121
project_id: ProjectID
2222
project_name: str
23+
project_tags: list[str]
2324
node_id: NodeID
2425
node_name: str
2526
root_parent_project_id: ProjectID
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
"""enhance projects_tags for RUT
2+
3+
Revision ID: 7b3a1c9a1e78
4+
Revises: 8bfe65a5e294
5+
Create Date: 2024-11-13 15:13:32.262499+00:00
6+
7+
"""
8+
import sqlalchemy as sa
9+
from alembic import op
10+
11+
# revision identifiers, used by Alembic.
12+
revision = "7b3a1c9a1e78"
13+
down_revision = "8bfe65a5e294"
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+
"projects_tags", sa.Column("project_uuid", sa.String(), nullable=False)
22+
)
23+
op.alter_column(
24+
"projects_tags", "project_id", existing_type=sa.BIGINT(), nullable=True
25+
)
26+
op.drop_constraint(
27+
"study_tags_study_id_tag_id_key", "projects_tags", type_="unique"
28+
)
29+
op.create_unique_constraint(None, "projects_tags", ["project_uuid", "tag_id"])
30+
op.drop_constraint("study_tags_study_id_fkey", "projects_tags", type_="foreignkey")
31+
op.create_foreign_key(
32+
None,
33+
"projects_tags",
34+
"projects",
35+
["project_id"],
36+
["id"],
37+
onupdate="CASCADE",
38+
ondelete="SET NULL",
39+
)
40+
# ### end Alembic commands ###
41+
42+
43+
def downgrade():
44+
# ### commands auto generated by Alembic - please adjust! ###
45+
op.drop_constraint(None, "projects_tags", type_="foreignkey")
46+
op.create_foreign_key(
47+
"study_tags_study_id_fkey",
48+
"projects_tags",
49+
"projects",
50+
["project_id"],
51+
["id"],
52+
onupdate="CASCADE",
53+
ondelete="CASCADE",
54+
)
55+
op.drop_constraint(None, "projects_tags", type_="unique")
56+
op.create_unique_constraint(
57+
"study_tags_study_id_tag_id_key", "projects_tags", ["project_id", "tag_id"]
58+
)
59+
op.alter_column(
60+
"projects_tags", "project_id", existing_type=sa.BIGINT(), nullable=False
61+
)
62+
op.drop_column("projects_tags", "project_uuid")
63+
# ### end Alembic commands ###

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
sa.Column(
1414
"project_id",
1515
sa.BigInteger,
16-
sa.ForeignKey(projects.c.id, onupdate="CASCADE", ondelete="CASCADE"),
17-
nullable=False,
16+
sa.ForeignKey(projects.c.id, onupdate="CASCADE", ondelete="SET NULL"),
17+
nullable=True, # <-- NULL means that project was deleted
1818
doc="NOTE that project.c.id != project.c.uuid",
1919
),
2020
sa.Column(
@@ -23,5 +23,10 @@
2323
sa.ForeignKey(tags.c.id, onupdate="CASCADE", ondelete="CASCADE"),
2424
nullable=False,
2525
),
26-
sa.UniqueConstraint("project_id", "tag_id"),
26+
sa.Column(
27+
"project_uuid",
28+
sa.String,
29+
nullable=False,
30+
),
31+
sa.UniqueConstraint("project_uuid", "tag_id"),
2732
)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/models/service_runs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ class Config:
101101
class ServiceRunWithCreditsDB(ServiceRunDB):
102102
osparc_credits: Decimal | None
103103
transaction_status: CreditTransactionStatus | None
104+
project_tags: list[str]
104105

105106
class Config:
106107
orm_mode = True

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/modules/db/repositories/resource_tracker.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
from models_library.users import UserID
2929
from models_library.wallets import WalletID
3030
from pydantic import PositiveInt
31+
from simcore_postgres_database.models.projects_tags import projects_tags
3132
from simcore_postgres_database.models.resource_tracker_credit_transactions import (
3233
resource_tracker_credit_transactions,
3334
)
@@ -46,6 +47,7 @@
4647
from simcore_postgres_database.models.resource_tracker_service_runs import (
4748
resource_tracker_service_runs,
4849
)
50+
from simcore_postgres_database.models.tags import tags
4951
from sqlalchemy.dialects.postgresql import ARRAY, INTEGER
5052

5153
from .....exceptions.errors import (
@@ -212,6 +214,15 @@ async def get_service_run_by_id(
212214
return None
213215
return ServiceRunDB.from_orm(row)
214216

217+
_project_tags_subquery = (
218+
sa.select(
219+
projects_tags.c.project_uuid,
220+
sa.func.array_agg(tags.c.name).label("project_tags"),
221+
)
222+
.select_from(projects_tags.join(tags, projects_tags.c.tag_id == tags.c.id))
223+
.group_by(projects_tags.c.project_uuid)
224+
).subquery("project_tags_subquery")
225+
215226
async def list_service_runs_by_product_and_user_and_wallet(
216227
self,
217228
product_name: ProductName,
@@ -260,6 +271,10 @@ async def list_service_runs_by_product_and_user_and_wallet(
260271
resource_tracker_service_runs.c.missed_heartbeat_counter,
261272
resource_tracker_credit_transactions.c.osparc_credits,
262273
resource_tracker_credit_transactions.c.transaction_status,
274+
sa.func.coalesce(
275+
self._project_tags_subquery.c.tags,
276+
sa.cast(sa.text("'{}'"), sa.ARRAY(sa.String)),
277+
).label("project_tags"),
263278
)
264279
.select_from(
265280
resource_tracker_service_runs.join(
@@ -273,6 +288,11 @@ async def list_service_runs_by_product_and_user_and_wallet(
273288
== resource_tracker_credit_transactions.c.service_run_id
274289
),
275290
isouter=True,
291+
).join(
292+
self._project_tags_subquery,
293+
resource_tracker_service_runs.c.project_id
294+
== self._project_tags_subquery.c.project_uuid,
295+
isouter=True,
276296
)
277297
)
278298
.where(resource_tracker_service_runs.c.product_name == product_name)
@@ -436,7 +456,9 @@ async def export_service_runs_table_to_s3(
436456
resource_tracker_service_runs.c.service_run_id,
437457
resource_tracker_service_runs.c.wallet_name,
438458
resource_tracker_service_runs.c.user_email,
439-
resource_tracker_service_runs.c.project_name,
459+
resource_tracker_service_runs.c.root_parent_project_name.label(
460+
"project_name"
461+
),
440462
resource_tracker_service_runs.c.node_name,
441463
resource_tracker_service_runs.c.service_key,
442464
resource_tracker_service_runs.c.service_version,
@@ -445,13 +467,22 @@ async def export_service_runs_table_to_s3(
445467
resource_tracker_service_runs.c.stopped_at,
446468
resource_tracker_credit_transactions.c.osparc_credits,
447469
resource_tracker_credit_transactions.c.transaction_status,
470+
sa.func.coalesce(
471+
self._project_tags_subquery.c.tags,
472+
sa.cast(sa.text("'{}'"), sa.ARRAY(sa.String)),
473+
).label("project_tags"),
448474
)
449475
.select_from(
450476
resource_tracker_service_runs.join(
451477
resource_tracker_credit_transactions,
452478
resource_tracker_service_runs.c.service_run_id
453479
== resource_tracker_credit_transactions.c.service_run_id,
454480
isouter=True,
481+
).join(
482+
self._project_tags_subquery,
483+
resource_tracker_service_runs.c.project_id
484+
== self._project_tags_subquery.c.project_uuid,
485+
isouter=True,
455486
)
456487
)
457488
.where(resource_tracker_service_runs.c.product_name == product_name)

services/resource-usage-tracker/src/simcore_service_resource_usage_tracker/services/service_runs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ async def list_service_runs(
121121
user_email=service.user_email,
122122
project_id=service.project_id,
123123
project_name=service.project_name,
124+
project_tags=service.project_tags,
124125
root_parent_project_id=service.root_parent_project_id,
125126
root_parent_project_name=service.root_parent_project_name,
126127
node_id=service.node_id,

services/resource-usage-tracker/tests/unit/with_dbs/conftest.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ def mock_env(monkeypatch: pytest.MonkeyPatch) -> EnvVarsDict:
5151
"SC_BOOT_MODE": "production",
5252
"POSTGRES_CLIENT_NAME": "postgres_test_client",
5353
"RESOURCE_USAGE_TRACKER_MISSED_HEARTBEAT_CHECK_ENABLED": "0",
54+
"RESOURCE_USAGE_TRACKER_TRACING": "null",
5455
}
5556
setenvs_from_dict(monkeypatch, env_vars)
5657
return env_vars

0 commit comments

Comments
 (0)