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 Jan 17, 2025
1 parent a599583 commit 2a816e9
Show file tree
Hide file tree
Showing 3 changed files with 141 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 @@
"""Add service tables
Revision ID: 3d0994430da7
Revises: 2e82f33ee37d
Create Date: 2025-01-17 10:05:48.699316
"""

import sqlalchemy_utils
import sqlalchemy as sa
from alembic import op


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


def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
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="servicestatus",
),
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",
)


def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_table("workflow_service", schema="__reana")
op.drop_table("service", schema="__reana")
sa.Enum(name="servicestatus").drop(op.get_bind())
sa.Enum(name="servicetype").drop(op.get_bind())
64 changes: 64 additions & 0 deletions reana_db/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -470,6 +470,63 @@ 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}>"


class ServiceStatus(CleanUpDependingOnStatusMixin, enum.Enum):
"""Enumeration of possible run statuses."""

created = 0
running = 1
finished = 2
failed = 3
deleted = 4
stopped = 5
queued = 6
pending = 7


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(ServiceStatus), nullable=False, default=ServiceStatus.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})>"


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

Expand Down Expand Up @@ -510,6 +567,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 2a816e9

Please sign in to comment.