WIP - its just caos right now.

This commit is contained in:
Dan 2022-02-07 12:59:48 -05:00
parent ad095aaaf5
commit 056f901f9a
6 changed files with 59 additions and 51 deletions

View File

@ -1,4 +1,4 @@
from crc import session, WorkflowSpecService from crc import session
from crc.api.common import ApiError from crc.api.common import ApiError
from crc.models.file import FileSchema, FileType from crc.models.file import FileSchema, FileType
from crc.services.spec_file_service import SpecFileService from crc.services.spec_file_service import SpecFileService
@ -8,12 +8,15 @@ from flask import send_file
import io import io
import connexion import connexion
from crc.services.workflow_spec_service import WorkflowSpecService
workflow_spec_service = WorkflowSpecService()
def get_files(spec_id, include_libraries=False): def get_files(spec_id, include_libraries=False):
if spec_id is None: if spec_id is None:
raise ApiError(code='missing_spec_id', raise ApiError(code='missing_spec_id',
message='Please specify the workflow_spec_id.') message='Please specify the workflow_spec_id.')
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
if workflow_spec is None: if workflow_spec is None:
raise ApiError(code='unknown_spec', raise ApiError(code='unknown_spec',
message=f'Unknown Spec: {spec_id}') message=f'Unknown Spec: {spec_id}')
@ -23,7 +26,7 @@ def get_files(spec_id, include_libraries=False):
def get_file(spec_id, file_name): def get_file(spec_id, file_name):
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
files = SpecFileService.get_files(workflow_spec, file_name) files = SpecFileService.get_files(workflow_spec, file_name)
if len(files) == 0: if len(files) == 0:
raise ApiError(code='unknown file', raise ApiError(code='unknown file',
@ -33,7 +36,7 @@ def get_file(spec_id, file_name):
def add_file(spec_id): def add_file(spec_id):
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
file = connexion.request.files['file'] file = connexion.request.files['file']
file = SpecFileService.add_file(workflow_spec, file.filename, file.stream.read()) file = SpecFileService.add_file(workflow_spec, file.filename, file.stream.read())
if not workflow_spec.primary_process_name and file.type == FileType.bpmn: if not workflow_spec.primary_process_name and file.type == FileType.bpmn:
@ -42,7 +45,7 @@ def add_file(spec_id):
def update(spec_id, file_name, is_primary): def update(spec_id, file_name, is_primary):
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
files = SpecFileService.get_files(workflow_spec, file_name) files = SpecFileService.get_files(workflow_spec, file_name)
if len(files) < 1: if len(files) < 1:
raise ApiError(code='unknown file', raise ApiError(code='unknown file',
@ -55,7 +58,7 @@ def update(spec_id, file_name, is_primary):
def update_data(spec_id, file_name): def update_data(spec_id, file_name):
workflow_spec_model = WorkflowSpecService.get_spec(spec_id) workflow_spec_model = workflow_spec_service.get_spec(spec_id)
if workflow_spec_model is None: if workflow_spec_model is None:
raise ApiError(code='missing_spec', raise ApiError(code='missing_spec',
message=f'The workflow spec for id {spec_id} does not exist.') message=f'The workflow spec for id {spec_id} does not exist.')
@ -65,7 +68,7 @@ def update_data(spec_id, file_name):
def get_data(spec_id, file_name): def get_data(spec_id, file_name):
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
file_data = SpecFileService.get_data(workflow_spec, file_name) file_data = SpecFileService.get_data(workflow_spec, file_name)
if file_data is not None: if file_data is not None:
file_info = SpecFileService.get_files(workflow_spec, file_name)[0] file_info = SpecFileService.get_files(workflow_spec, file_name)[0]
@ -82,5 +85,5 @@ def get_data(spec_id, file_name):
def delete(spec_id, file_name): def delete(spec_id, file_name):
workflow_spec = WorkflowSpecService.get_spec(spec_id) workflow_spec = workflow_spec_service.get_spec(spec_id)
SpecFileService.delete_file(workflow_spec, file_name) SpecFileService.delete_file(workflow_spec, file_name)

View File

@ -2,7 +2,7 @@ import uuid
from flask import g from flask import g
from crc import session, WorkflowSpecService from crc import session
from crc.api.common import ApiError, ApiErrorSchema from crc.api.common import ApiError, ApiErrorSchema
from crc.models.api_models import WorkflowApiSchema from crc.models.api_models import WorkflowApiSchema
from crc.models.study import StudyModel, WorkflowMetadata, StudyStatus from crc.models.study import StudyModel, WorkflowMetadata, StudyStatus
@ -18,20 +18,22 @@ from crc.services.task_logging_service import TaskLoggingService
from crc.services.user_service import UserService from crc.services.user_service import UserService
from crc.services.workflow_processor import WorkflowProcessor from crc.services.workflow_processor import WorkflowProcessor
from crc.services.workflow_service import WorkflowService from crc.services.workflow_service import WorkflowService
from crc.services.workflow_spec_service import WorkflowSpecService
workflow_spec_service = WorkflowSpecService()
def all_specifications(libraries=False,standalone=False): def all_specifications(libraries=False,standalone=False):
if libraries and standalone: if libraries and standalone:
raise ApiError('inconceivable!', 'You should specify libraries or standalone, but not both') raise ApiError('inconceivable!', 'You should specify libraries or standalone, but not both')
if libraries: if libraries:
return WorkflowSpecService.get_libraries() return workflow_spec_service.get_libraries()
if standalone: if standalone:
return WorkflowSpecService.get_standalones() return workflow_spec_service.get_standalones()
# return standard workflows (not library, not standalone) # return standard workflows (not library, not standalone)
categories = WorkflowSpecService.get_categories() categories = workflow_spec_service.get_categories()
workflows = [] workflows = []
for cat in categories: for cat in categories:
workflows.extend(cat.workflows) workflows.extend(cat.workflows)
@ -47,14 +49,14 @@ def add_workflow_specification(body):
if body['library'] is True or body['standalone'] is True: if body['library'] is True or body['standalone'] is True:
body['category_id'] = None body['category_id'] = None
new_spec = WorkflowSpecService.add_spec(body) new_spec = workflow_spec_service.add_spec(body)
return new_spec return new_spec
def get_workflow_specification(spec_id): def get_workflow_specification(spec_id):
if spec_id is None: if spec_id is None:
raise ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.') raise ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
if spec is None: if spec is None:
raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.') raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.')
@ -67,8 +69,8 @@ def validate_spec_and_library(spec_id,library_id):
if library_id is None: if library_id is None:
raise ApiError('unknown_spec', 'Please provide a valid Library Specification ID.') raise ApiError('unknown_spec', 'Please provide a valid Library Specification ID.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
library = WorkflowSpecService.get_library(library_id); library = workflow_spec_service.get_library(library_id);
if spec is None: if spec is None:
raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.') raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.')
if library is None: if library is None:
@ -79,27 +81,27 @@ def validate_spec_and_library(spec_id,library_id):
def add_workflow_spec_library(spec_id, library_id): def add_workflow_spec_library(spec_id, library_id):
validate_spec_and_library(spec_id, library_id) validate_spec_and_library(spec_id, library_id)
libraries: WorkflowSpecService.get_libraries() libraries: workflow_spec_service.get_libraries()
libraryids = [x.library_spec_id for x in libraries] libraryids = [x.library_spec_id for x in libraries]
if library_id in libraryids: if library_id in libraryids:
raise ApiError('unknown_spec', 'The Library Specification "' + library_id + '" is already attached.') raise ApiError('unknown_spec', 'The Library Specification "' + library_id + '" is already attached.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
library = WorkflowSpecService.get_spec(library_id) library = workflow_spec_service.get_spec(library_id)
spec.libraries.push(library) spec.libraries.push(library)
WorkflowSpecService.update_spec(spec_id) workflow_spec_service.update_spec(spec_id)
return spec return spec
def drop_workflow_spec_library(spec_id, library_id): def drop_workflow_spec_library(spec_id, library_id):
validate_spec_and_library(spec_id, library_id) validate_spec_and_library(spec_id, library_id)
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
# heres a piece of code that certainly wont work # heres a piece of code that certainly wont work
library = WorkflowSpecService.get_spec(library_id) library = workflow_spec_service.get_spec(library_id)
if library in spec.libraries: if library in spec.libraries:
spec.libraries.pop(library) spec.libraries.pop(library)
WorkflowSpecService.update_spec(spec_id) workflow_spec_service.update_spec(spec_id)
return spec return spec
@ -118,7 +120,7 @@ def validate_workflow_specification(spec_id, study_id=None, test_until=None):
def update_workflow_specification(spec_id, body): def update_workflow_specification(spec_id, body):
if spec_id is None: if spec_id is None:
raise ApiError('unknown_spec', 'Please provide a valid Workflow Spec ID.') raise ApiError('unknown_spec', 'Please provide a valid Workflow Spec ID.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
if spec is None: if spec is None:
raise ApiError('unknown_study', 'The spec "' + spec_id + '" is not recognized.') raise ApiError('unknown_study', 'The spec "' + spec_id + '" is not recognized.')
@ -131,7 +133,7 @@ def update_workflow_specification(spec_id, body):
if body['library'] is True or body['standalone'] is True: if body['library'] is True or body['standalone'] is True:
body['category_id'] = None body['category_id'] = None
spec = WorkflowSpecService.update_spec(spec_id, body) spec = workflow_spec_service.update_spec(spec_id, body)
return spec return spec
@ -139,7 +141,7 @@ def delete_workflow_specification(spec_id):
if spec_id is None: if spec_id is None:
raise ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.') raise ApiError('unknown_spec', 'Please provide a valid Workflow Specification ID.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
if spec is None: if spec is None:
raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.') raise ApiError('unknown_spec', 'The Workflow Specification "' + spec_id + '" is not recognized.')
@ -155,7 +157,7 @@ def delete_workflow_specification(spec_id):
WorkflowService.delete_workflow_spec_task_events(spec_id) WorkflowService.delete_workflow_spec_task_events(spec_id)
# .delete() doesn't work when we need a cascade. Must grab the record, and explicitly delete # .delete() doesn't work when we need a cascade. Must grab the record, and explicitly delete
WorkflowSpecService.delete_spec(spec_id) workflow_spec_service.delete_spec(spec_id)
# Reorder the remaining specs # Reorder the remaining specs
WorkflowService.cleanup_workflow_spec_display_order(spec.category_id) WorkflowService.cleanup_workflow_spec_display_order(spec.category_id)
@ -165,9 +167,9 @@ def reorder_workflow_specification(spec_id, direction):
if direction not in ('up', 'down'): if direction not in ('up', 'down'):
raise ApiError(code='bad_direction', raise ApiError(code='bad_direction',
message='The direction must be `up` or `down`.') message='The direction must be `up` or `down`.')
spec = WorkflowSpecService.get_spec(spec_id) spec = workflow_spec_service.get_spec(spec_id)
if spec: if spec:
ordered_specs = WorkflowSpecService.reorder_spec(spec, direction) ordered_specs = workflow_spec_service.reorder_spec(spec, direction)
else: else:
raise ApiError(code='bad_spec_id', raise ApiError(code='bad_spec_id',
message=f'The spec_id {spec_id} did not return a specification. Please check that it is valid.') message=f'The spec_id {spec_id} did not return a specification. Please check that it is valid.')
@ -322,22 +324,22 @@ def __update_task(processor, task, data, user):
def list_workflow_spec_categories(): def list_workflow_spec_categories():
return WorkflowSpecService.get_workflow_categories() return workflow_spec_service.get_workflow_categories()
def get_workflow_spec_category(cat_id): def get_workflow_spec_category(cat_id):
return WorkflowSpecService.get_workflow_category(cat_id) return workflow_spec_service.get_workflow_category(cat_id)
def add_workflow_spec_category(body): def add_workflow_spec_category(body):
return WorkflowSpecService.add_category(body) return workflow_spec_service.add_category(body)
def update_workflow_spec_category(cat_id, body): def update_workflow_spec_category(cat_id, body):
if cat_id is None: if cat_id is None:
raise ApiError('unknown_category', 'Please provide a valid Workflow Spec Category ID.') raise ApiError('unknown_category', 'Please provide a valid Workflow Spec Category ID.')
category = WorkflowSpecService.update_category(cat_id, body) category = workflow_spec_service.update_category(cat_id, body)
if category is None: if category is None:
raise ApiError('unknown_category', 'The category "' + cat_id + '" is not recognized.') raise ApiError('unknown_category', 'The category "' + cat_id + '" is not recognized.')
@ -358,9 +360,9 @@ def reorder_workflow_spec_category(cat_id, direction):
raise ApiError(code='bad_direction', raise ApiError(code='bad_direction',
message='The direction must be `up` or `down`.') message='The direction must be `up` or `down`.')
WorkflowService.cleanup_workflow_spec_category_display_order() WorkflowService.cleanup_workflow_spec_category_display_order()
category = WorkflowSpecService.get_category(cat_id) category = workflow_spec_service.get_category(cat_id)
if category: if category:
ordered_categories = WorkflowSpecService.reorder_workflow_spec_category(category, direction) ordered_categories = workflow_spec_service.reorder_workflow_spec_category(category, direction)
return ordered_categories return ordered_categories
else: else:
raise ApiError(code='bad_category_id', raise ApiError(code='bad_category_id',

View File

@ -29,7 +29,6 @@ class WorkflowSpecService(FileSystemService):
self.master_spec = None self.master_spec = None
self.libraries = {} self.libraries = {}
self.standalone = {} self.standalone = {}
self.scan_file_system()
def add_spec(self, spec: WorkflowSpecInfo): def add_spec(self, spec: WorkflowSpecInfo):
self.update_spec(spec) self.update_spec(spec)

View File

@ -12,7 +12,7 @@ import datetime
import shutil import shutil
from flask import g from flask import g
from crc import app, db, session, WorkflowSpecService from crc import app, db, session
from crc.models.api_models import WorkflowApiSchema, MultiInstanceType from crc.models.api_models import WorkflowApiSchema, MultiInstanceType
from crc.models.file import FileModel, CONTENT_TYPES from crc.models.file import FileModel, CONTENT_TYPES
from crc.models.task_event import TaskEventModel from crc.models.task_event import TaskEventModel
@ -26,7 +26,7 @@ from crc.services.user_service import UserService
from crc.services.workflow_service import WorkflowService from crc.services.workflow_service import WorkflowService
from crc.services.document_service import DocumentService from crc.services.document_service import DocumentService
from example_data import ExampleDataLoader from example_data import ExampleDataLoader
from crc.services.user_file_service import UserFileService from crc.services.workflow_spec_service import WorkflowSpecService
# UNCOMMENT THIS FOR DEBUGGING SQL ALCHEMY QUERIES # UNCOMMENT THIS FOR DEBUGGING SQL ALCHEMY QUERIES
import logging import logging

View File

@ -1,3 +1,5 @@
2022-01-26 15:05:47,955 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/workflow_sync/pullall 2022-01-26 15:05:47,955 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/workflow_sync/pullall
2022-01-26 15:06:36,303 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/workflow_sync/pullall 2022-01-26 15:06:36,303 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/workflow_sync/pullall
2022-01-26 15:08:01,978 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/file/{md5_hash}/hash_data 2022-01-26 15:08:01,978 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/file/{md5_hash}/hash_data
2022-02-07 12:46:21,875 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/ldap
2022-02-07 12:49:13,793 - connexion.apis.abstract - ERROR - Failed to add operation for GET /v1.0/ldap

View File

@ -7,13 +7,15 @@ from tests.base_test import BaseTest
from crc.models.workflow import WorkflowSpecInfo, WorkflowSpecCategory from crc.models.workflow import WorkflowSpecInfo, WorkflowSpecCategory
from crc.services.file_system_service import FileSystemService from crc.services.file_system_service import FileSystemService
from crc.services.spec_file_service import SpecFileService from crc.services.spec_file_service import SpecFileService
from crc import db, app, workflow_spec_service from crc.services.workflow_spec_service import WorkflowSpecService
from crc import db, app
class TestWorkflowSync(BaseTest): class TestWorkflowSync(BaseTest):
spec_path = FileSystemService.root_path() spec_path = FileSystemService.root_path()
import_spec_path = os.path.join(app.root_path, '..', 'tests', 'data', 'IMPORT_TEST') import_spec_path = os.path.join(app.root_path, '..', 'tests', 'data', 'IMPORT_TEST')
service = WorkflowSpecService()
def copy_files_to_file_system(self): def copy_files_to_file_system(self):
"""Some tests rely on a well populated file system """ """Some tests rely on a well populated file system """
@ -34,24 +36,24 @@ class TestWorkflowSync(BaseTest):
self.load_test_spec('email', category_id=c1.id, library=True) self.load_test_spec('email', category_id=c1.id, library=True)
def test_from_file_system_blank_slate(self): def test_from_file_system_blank_slate(self):
self.assertEquals(0, len(workflow_spec_service.get_categories())) self.assertEquals(0, len(self.service.get_categories()))
self.assertEquals(0, len(workflow_spec_service.get_specs())) self.assertEquals(0, len(self.service.get_specs()))
self.copy_files_to_file_system() self.copy_files_to_file_system()
workflow_spec_service.scan_file_system() self.service.scan_file_system()
self.assertEquals(2, len(workflow_spec_service.get_categories())) self.assertEquals(2, len(self.service.get_categories()))
self.assertEquals(5, len(workflow_spec_service.get_specs())) self.assertEquals(5, len(self.service.get_specs()))
self.assertEquals(1, len(workflow_spec_service.get_category('Category Number One').workflows)) self.assertEquals(1, len(self.service.get_category('Category Number One').workflows))
self.assertEquals(2, len(workflow_spec_service.get_category('Category Number Two').workflows)) self.assertEquals(2, len(self.service.get_category('Category Number Two').workflows))
self.assertIsNotNone(workflow_spec_service.master_spec) self.assertIsNotNone(self.service.master_spec)
self.assertEquals(1, len(workflow_spec_service.get_libraries())) self.assertEquals(1, len(self.service.get_libraries()))
self.assertEquals(1, len(workflow_spec_service.master_spec.libraries)) self.assertEquals(1, len(self.service.master_spec.libraries))
def test_delete_category_and_workflows(self): def test_delete_category_and_workflows(self):
self.copy_files_to_file_system() self.copy_files_to_file_system()
cat_path = SpecFileService().category_path('Category Number One') cat_path = SpecFileService().category_path('Category Number One')
shutil.rmtree(cat_path) # Remove the path, as if from a git pull and the path was removed. shutil.rmtree(cat_path) # Remove the path, as if from a git pull and the path was removed.
self.assertEquals(3, len(workflow_spec_service.get_categories())) self.assertEquals(3, len(self.service.get_categories()))
self.assertEquals(4, len(workflow_spec_service.get_specs())) self.assertEquals(4, len(self.service.get_specs()))