Skip to content

Commit

Permalink
feat(models): add service tables (#241)
Browse files Browse the repository at this point in the history
  • Loading branch information
Alputer committed Nov 20, 2024
1 parent 05a34ba commit 441a391
Show file tree
Hide file tree
Showing 3 changed files with 128 additions and 0 deletions.
1 change: 1 addition & 0 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

The list of contributors in alphabetical order:

- [Alp Tuna](https://orcid.org/0009-0001-1915-3993)
- [Audrius Mecionis](https://orcid.org/0000-0002-3759-1663)
- [Camila Diaz](https://orcid.org/0000-0001-5543-797X)
- [Daan Rosendal](https://orcid.org/0000-0002-3447-9000)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
"""Service tables.
Revision ID: 8da6ccf08af9
Revises: 2e82f33ee37d
Create Date: 2024-11-19 10:51:51.199670
"""

import sqlalchemy_utils
import sqlalchemy as sa
from alembic import op


# revision identifiers, used by Alembic.
revision = "8da6ccf08af9"
down_revision = "2e82f33ee37d"
branch_labels = None
depends_on = None


def upgrade():
"""Upgrade to 8da6ccf08af9 revision."""
op.create_table(
"service",
sa.Column("id_", sqlalchemy_utils.types.uuid.UUIDType(), nullable=False),
sa.Column("name", sa.String(length=255), nullable=True),
sa.Column("uri", sa.Text(), nullable=True),
sa.Column(
"status",
sa.Enum(
"created",
"running",
"finished",
"failed",
"deleted",
"stopped",
"queued",
"pending",
name="runstatus",
),
nullable=False,
),
sa.Column("owner_id", sqlalchemy_utils.types.uuid.UUIDType(), nullable=True),
sa.Column("type_", sa.Enum("dask", name="servicetype"), nullable=False),
sa.ForeignKeyConstraint(
["owner_id"], ["__reana.user_.id_"], name=op.f("fk_service_owner_id_user_")
),
sa.PrimaryKeyConstraint("id_", name=op.f("pk_service")),
sa.UniqueConstraint("name", "uri", name=op.f("uq_service_name")),
schema="__reana",
)
op.create_table(
"workflow_service",
sa.Column("workflow_id", sqlalchemy_utils.types.uuid.UUIDType(), nullable=True),
sa.Column("service_id", sqlalchemy_utils.types.uuid.UUIDType(), nullable=False),
sa.ForeignKeyConstraint(
["service_id"],
["__reana.service.id_"],
name=op.f("fk_workflow_service_service_id_service"),
),
sa.ForeignKeyConstraint(
["workflow_id"],
["__reana.workflow.id_"],
name=op.f("fk_workflow_service_workflow_id_workflow"),
),
sa.PrimaryKeyConstraint("service_id", name=op.f("pk_workflow_service")),
schema="__reana",
)
# ### end Alembic commands ###


def downgrade():
"""Downgrade to 2e82f33ee37d revision."""
op.drop_table("workflow_service", schema="__reana")
op.drop_table("service", schema="__reana")
# ### end Alembic commands ###
51 changes: 51 additions & 0 deletions reana_db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -460,6 +460,50 @@ def __repr__(self):
return "<InteractiveSession %r>" % self.name


class WorkflowService(Base):
"""Workflow Service table."""

__tablename__ = "workflow_service"
__table_args__ = {"schema": "__reana"}

workflow_id = Column(UUIDType, ForeignKey("__reana.workflow.id_"), nullable=True)
service_id = Column(UUIDType, ForeignKey("__reana.service.id_"), primary_key=True)

def __repr__(self):
"""Workflow Service string representation."""
return f"<WorkflowService {self.service_id} {self.workflow_id}>"

Check warning on line 474 in reana_db/models.py

View check run for this annotation

Codecov / codecov/patch

reana_db/models.py#L474

Added line #L474 was not covered by tests


class ServiceType(enum.Enum):
"""Enumeration of service types."""

dask = 0


class Service(Base):
"""Service table."""

__tablename__ = "service"
id_ = Column(UUIDType, primary_key=True, default=generate_uuid)
name = Column(String(255))
uri = Column(Text) # uri to access the service
status = Column(Enum(RunStatus), nullable=False, default=RunStatus.created)
owner_id = Column(UUIDType, ForeignKey("__reana.user_.id_"))
type_ = Column(
Enum(ServiceType),
nullable=False,
)

__table_args__ = (
UniqueConstraint("name", "uri"),
{"schema": "__reana"},
)

def __repr__(self):
"""Service string representation."""
return f"<Service(name={self.name}, type={self.type_}, uri={self.uri})>"

Check warning on line 504 in reana_db/models.py

View check run for this annotation

Codecov / codecov/patch

reana_db/models.py#L504

Added line #L504 was not covered by tests


class Workflow(Base, Timestamp, QuotaBase):
"""Workflow table."""

Expand Down Expand Up @@ -500,6 +544,13 @@ class Workflow(Base, Timestamp, QuotaBase):
backref="workflow",
cascade="all, delete",
)
services = relationship(
"Service",
secondary="__reana.workflow_service",
lazy="dynamic",
backref="workflow",
cascade="all, delete",
)
retention_rules = relationship(
"WorkspaceRetentionRule", backref="workflow", lazy="dynamic"
)
Expand Down

0 comments on commit 441a391

Please sign in to comment.