From 3392bcec2186fdd5817d3c701e311a4a4d4d6918 Mon Sep 17 00:00:00 2001
From: Daniel K Lyons <dlyons@nrao.edu>
Date: Fri, 4 Sep 2020 11:53:46 -0600
Subject: [PATCH] Add Marshmallow, set up WorkflowEvent schema with it

---
 environment.yml                          |  1 +
 services/workflow/src/workflow/server.py | 22 ++--------------------
 shared/workspaces/setup.py               |  1 +
 shared/workspaces/src/workspaces/json.py | 19 +++++++++++++++++++
 4 files changed, 23 insertions(+), 20 deletions(-)
 create mode 100644 shared/workspaces/src/workspaces/json.py

diff --git a/environment.yml b/environment.yml
index 7db446c17..db6fd6093 100644
--- a/environment.yml
+++ b/environment.yml
@@ -14,6 +14,7 @@ dependencies:
   - funcsigs=1.0.2
   - jxmlease=1.0
   - lxml=4.5
+  - marshmallow=3.7.1
   - mysqlclient=1.4
   - paramiko
   - pandas=1.0
diff --git a/services/workflow/src/workflow/server.py b/services/workflow/src/workflow/server.py
index 457015ac0..ef17dffcb 100644
--- a/services/workflow/src/workflow/server.py
+++ b/services/workflow/src/workflow/server.py
@@ -1,32 +1,14 @@
 import zope.sqlalchemy
-from pycapo import CapoConfig
-from pyramid.view import view_config, view_defaults
 from pyramid.config import Configurator
-from pyramid_beaker import session_factory_from_settings
 from pyramid.renderers import JSONP
-from sqlalchemy import create_engine
-from sqlalchemy.orm import sessionmaker
+from pyramid.view import view_config, view_defaults
+from pyramid_beaker import session_factory_from_settings
 from workspaces.services import WorkflowInfo, WorkflowService, get_session_factory, get_engine
 
 """
-Work done:
-
- ☑ Initial sketch of using SQL Alchemy with Pyramid
- ☑ Sketch of first routes we need
- ☑ Bring over interfaces from wksp0 project
- ☑ Need to flesh out the object model—requests have their own files, workflows have templates
- ☑ Separate REST hierarchy for workflow definitions
-
-Work to do:
-
- ☐ Actually do the work, preferably in model classes, not REST API directly
- ☐ Separate this into separate modules, once it makes sense to people how it works
- ☐ Workflow initiation CLI
-
 To consider:
  ☐ Do we want to use Marshmallow to validate inputs/generate API documentation?
  ☐ Do we want to have a separate package with interfaces/model? Or perhaps only JSON schemas?
-
 """
 
 
diff --git a/shared/workspaces/setup.py b/shared/workspaces/setup.py
index 533470dd8..c015bfe24 100644
--- a/shared/workspaces/setup.py
+++ b/shared/workspaces/setup.py
@@ -9,6 +9,7 @@ README = Path('README.md').read_text()
 
 requires = [
     'pycapo',
+    'marshmallow',
     'schema',
     'sqlalchemy',
 ]
diff --git a/shared/workspaces/src/workspaces/json.py b/shared/workspaces/src/workspaces/json.py
new file mode 100644
index 000000000..3da6d556d
--- /dev/null
+++ b/shared/workspaces/src/workspaces/json.py
@@ -0,0 +1,19 @@
+from marshmallow import Schema, fields
+
+
+class WorkflowEventSchema(Schema):
+    """
+    Default schema for serializing WorkflowEvent.
+    """
+    job_name = fields.String()
+    type = fields.Method("get_type", deserialize="load_type")
+    timestamp = fields.DateTime()
+    log = fields.String()
+    retval = fields.Integer()
+
+    # Enums apparently are not a first-class field type in Marshmallow
+    def get_type(self, obj: "EventType") -> str:
+        return obj.type.value
+
+    def load_type(self, value: str) -> "EventType":
+        return EventType[value]
-- 
GitLab