From 4f6081769454f4a6e2c42cb8a5f90df2d425afc3 Mon Sep 17 00:00:00 2001 From: Daniel K Lyons <dlyons@nrao.edu> Date: Thu, 8 Oct 2020 11:33:40 -0600 Subject: [PATCH] Adding request versions, still don't have success with generating a request and saving it though --- .../57c38b5f012e_capabilities_init.py | 26 ++++++++++- .../src/workspaces/capability_interfaces.py | 45 +++++++------------ shared/workspaces/src/workspaces/schema.py | 29 ++++++++++-- 3 files changed, 67 insertions(+), 33 deletions(-) diff --git a/schema/versions/57c38b5f012e_capabilities_init.py b/schema/versions/57c38b5f012e_capabilities_init.py index 4c3902b02..acc5231d4 100644 --- a/schema/versions/57c38b5f012e_capabilities_init.py +++ b/schema/versions/57c38b5f012e_capabilities_init.py @@ -17,6 +17,7 @@ depends_on = None def upgrade(): + print('creating capabilities') op.create_table('capabilities', sa.Column('capability_id', sa.Integer, primary_key=True), sa.Column('capability_name', sa.String), @@ -24,14 +25,35 @@ def upgrade(): sa.Column('max_jobs', sa.Integer)) op.create_table('capability_requests', - sa.Column('request_id', sa.Integer, primary_key=True), + sa.Column('capability_request_id', sa.Integer, primary_key=True), sa.Column('state', sa.String), - sa.Column('capability', sa.Integer, sa.ForeignKey('capabilities.capability_id')), + sa.Column('capability_id', sa.Integer, sa.ForeignKey('capabilities.capability_id')), sa.Column('parameters', sa.String)) + op.create_table('capability_versions', + sa.Column('capability_request_id', + sa.Integer, + sa.ForeignKey('capability_requests.capability_request_id'), + primary_key=True), + sa.Column('version_number', + sa.Integer, + primary_key=True)) + + op.create_table('capability_executions', + sa.Column('execution_id', sa.Integer, primary_key=True), + sa.Column('state', sa.String), + sa.Column('capability_request_id', sa.Integer), + sa.Column('capability_version_number', sa.Integer), + sa.Column('current_step', sa.Integer), + sa.ForeignKeyConstraint(['capability_request_id', 'capability_version_number'], + ['capability_versions.capability_request_id', 'capability_versions.version_number'])) + op.execute("INSERT INTO capabilities (capability_name, capability_steps, max_jobs) " "VALUES ('null', 'PREPARE AND EXECUTE WORKFLOW null\nAWAIT WORKFLOW', 2)") + def downgrade(): + op.drop_table('capability_executions') + op.drop_table('capability_versions') op.drop_table('capability_requests') op.drop_table('capabilities') diff --git a/shared/workspaces/src/workspaces/capability_interfaces.py b/shared/workspaces/src/workspaces/capability_interfaces.py index 047bde99f..7ebf3fbbc 100644 --- a/shared/workspaces/src/workspaces/capability_interfaces.py +++ b/shared/workspaces/src/workspaces/capability_interfaces.py @@ -13,45 +13,34 @@ CapabilityName = str class CapabilityIF: - @property - def id(self) -> int: raise NotImplementedError - - @property - def name(self) -> str: raise NotImplementedError - - @property - def steps(self) -> List["CapabilityStepIF"]: raise NotImplementedError - - @property - def max_jobs(self) -> int: raise NotImplementedError + id: int + name: str + steps: List["CapabilityStepIF"] + max_jobs: int def create_request(self, parameters: "ParameterIF", future_products: FutureProductIF) -> "CapabilityRequestIF": raise NotImplementedError class CapabilityRequestIF: - @property - def id(self) -> int: raise NotImplementedError - - @property - def state(self) -> str: raise NotImplementedError + id: int + state: str + capability: CapabilityIF + parameters: str + future_products: str + versions: List["CapabilityVersionIF"] - @property - def capability(self) -> CapabilityIF: raise NotImplementedError - @property - def parameters(self) -> str: raise NotImplementedError - - @property - def future_products(self) -> str: raise NotImplementedError - - @property - def versions(self) -> List["CapabilityVersionIF"]: raise NotImplementedError +class CapabilityVersionIF: + capability_request: CapabilityRequestIF + version_number: int + # eventually, the parameters should go here class CapabilityExecutionIF: - pass - + capability_version: CapabilityVersionIF + state: str + current_step: int """ diff --git a/shared/workspaces/src/workspaces/schema.py b/shared/workspaces/src/workspaces/schema.py index 4e850276d..f403943aa 100644 --- a/shared/workspaces/src/workspaces/schema.py +++ b/shared/workspaces/src/workspaces/schema.py @@ -14,7 +14,7 @@ from sqlalchemy.orm import relationship, sessionmaker from sqlalchemy.ext.declarative import declarative_base from .capability_interfaces import CapabilityIF, CapabilityRequestIF, CapabilityExecutionIF, \ - CapabilitySequenceIF, ParameterIF + CapabilitySequenceIF, ParameterIF, CapabilityVersionIF from .helpers import CapabilityStepType, CapabilityStep, CapabilitySequence from .product_interfaces import FutureProductIF @@ -223,7 +223,7 @@ class CapabilityRequest(Base, CapabilityRequestIF): the expectation of a new product given a set of parameters """ __tablename__ = 'capability_requests' - id = sa.Column('request_id', sa.Integer, primary_key=True) + id = sa.Column('capability_request_id', sa.Integer, primary_key=True) state = sa.Column('state', sa.String) capability = sa.Column( 'capability', @@ -233,7 +233,7 @@ class CapabilityRequest(Base, CapabilityRequestIF): parameters = sa.Column('parameters', sa.String) # FIXME: This needs to be changed to properly keep track of product locators. #future_products = sa.Column('future_products', sa.String) - #versions = sa.Column('versions', sa.String) + versions = relationship("CapabilityVersion", back_populates="capability_request") def update_status(self, status: str): # TODO: create field in table @@ -243,11 +243,28 @@ class CapabilityRequest(Base, CapabilityRequestIF): return f"CapabilityRequest object: {self.__dict__}" +class CapabilityVersion(Base, CapabilityVersionIF): + """ + Schema representation of a capability version + """ + __tablename__ = 'capability_versions' + capability_request_id = sa.Column('capability_request_id', + sa.Integer, + sa.ForeignKey('capability_requests.capability_request_id'), + primary_key=True) + version_number = sa.Column('version_number', + sa.Integer, + primary_key=True) + capability_request = relationship(CapabilityRequest, back_populates="versions") + executions = relationship("CapabilityExecution", back_populates="capability_version") + + class CapabilityExecution(Base, CapabilityExecutionIF): """ Schema representation of a capability request's execution record """ __tablename__ = 'capability_executions' + id = sa.Column('execution_id', sa.Integer, primary_key=True) state = sa.Column('state', sa.String) capability_request = sa.Column( @@ -255,7 +272,13 @@ class CapabilityExecution(Base, CapabilityExecutionIF): sa.Integer, sa.ForeignKey('capability_requests.capability_request_id') ) + version_number = sa.Column('capability_version_number', sa.Integer) current_step = sa.Column('current_step', sa.Integer) + capability_version = relationship(CapabilityVersion, back_populates="executions") + + __table_args__ = (sa.ForeignKeyConstraint([capability_request, version_number], + [CapabilityVersion.capability_request_id, + CapabilityVersion.version_number]),) class Workflow(Base): -- GitLab