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