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