class ImageStorageResource(StorageBaseResource): @swagger.doc({ 'tags': ['computation'], 'description': 'Submit a image storage request', 'security': { SEC_ISSUER_KEY: [], SEC_CMPT_KEY: [], }, 'parameters': [ ISSUER_KEY_PARAM, CMPT_KEY_PARAM, { 'name': 'body', 'description': 'Expected payload', 'in': 'body', 'type': 'object', 'schema': ModalityImageModel, 'required': True, } ], 'responses': { '200': { 'description': 'Image storage request success', 'schema': ComputationModel, }, '400': { 'description': 'Bad request, see details' }, '401': { 'description': 'Authentication failed' }, '503': { 'description': 'Service is busy' } } }) @bpm_flask_mixin(get_validation_schema(ModalityImageModel)) @bpm_flask_sqlalchemy_mixin @bpm_flask_component_access def post(self): with self.storage_context() as storage_manager: issuer = request.headers.get(HEADER_ISSUER_KEY) computation = storage_manager.store_image(issuer, request.form) with self.broker_context() as broker: image_metadata = request.form # Drop pixel data for broker del image_metadata['image'] produce_processing_task(broker, computation.get('image'), image_metadata) return ComputationModel(exam_uid=computation.get('exam'), procedure_uid=computation.get('procedure'), image_uid=computation.get('image'))
class IssuersResource(BPMDBResource): @swagger.doc({ 'tags': ['issuer'], 'description': 'Returns a list of issuers', 'parameters': [], 'responses': { '200': { 'description': 'Issuers', 'schema': { 'type': 'array', 'items': IssuerModel } } } }) @bpm_flask_mixin() @bpm_flask_sqlalchemy_mixin def get(self): with self.em_context() as em: return em.all_issuer() @swagger.doc({ 'tags': ['issuer'], 'description': 'Creates an issuer', 'parameters': [{ 'name': 'body', 'description': 'Issuer payload', 'in': 'body', 'type': 'object', 'schema': IssuerModelWithoutPrimary, 'required': True }], 'responses': { '200': { 'description': 'Issuer', 'schema': IssuerModel, }, '400': { 'description': 'Bad request, see details' }, '409': { 'description': 'Already exists' }, } }) @bpm_flask_mixin(get_validation_schema(IssuerModelWithoutPrimary)) @bpm_flask_sqlalchemy_mixin def post(self): data = request.form with self.em_context() as em: return em.add_issuer(IssuerModelWithoutPrimary(**data))
class RepositoryRegistrationResource(BPMDBResource): @swagger.doc({ 'tags': ['repository'], 'description': 'Register a repository', 'security': { SEC_CMPT_KEY: [] }, 'parameters': [ CMPT_KEY_PARAM, { 'name': 'body', 'description': 'Expected payload', 'in': 'body', 'type': 'object', 'schema': RepositoryModelWithoutPrimary, 'required': True, } ], 'responses': { '200': { 'description': 'Repository registered', 'schema': RepositoryModel, }, '400': { 'description': 'Bad request, see details' }, '401': { 'description': 'Authentication failed' }, '503': { 'description': 'Service is busy' } } }) @bpm_flask_mixin(get_validation_schema(RepositoryModelWithoutPrimary)) @bpm_flask_sqlalchemy_mixin @bpm_flask_component_access def post(self): with self.em_context() as em: name = request.form.get('name') host = request.form.get('host') use_ssl = request.form.get('use_ssl') repo = em.get_repository('name', name) if repo: updater = RepositoryUpdateResource() data = json.loads(updater.patch(repo.uid).data.decode('utf-8')) return RepositoryModel(**data) return em.add_repository({ 'name': name, 'host': host, 'use_ssl': use_ssl })
class ComputationResource(BPMDBResource): @swagger.doc({ 'tags': ['computation'], 'description': 'Submit a computation request', 'security': { SEC_ISSUER_KEY: [], SEC_ROLE_KEY: [], }, 'parameters': [ ISSUER_KEY_PARAM, ROLE_KEY_PARAM, { 'name': 'body', 'description': 'Expected payload', 'in': 'body', 'type': 'object', 'schema': ModalityImageModel, 'required': True, } ], 'responses': { '200': { 'description': 'Computation request success', 'schema': ComputationModel, }, '400': { 'description': 'Bad request, see details' }, '401': { 'description': 'Authentication failed' }, '503': { 'description': 'Service is busy' } } }) @bpm_flask_mixin(get_validation_schema(ModalityImageModel)) @bpm_flask_connectivity_mixin @bpm_flask_sqlalchemy_mixin @bpm_flask_authentication_mixin @bpm_flask_public_access def post(self): expected_ct = request.headers.get('Content-Type', 'application/json').lower() headers = { 'Content-Type': expected_ct, HEADER_ISSUER_KEY: request.headers.get(HEADER_ISSUER_KEY), } req = StorageClient.post_computation_request( headers, request.data.decode('utf-8')) return ResponseData(req.json(), req.status_code)
class SystemResource(BPMDBResource): @swagger.doc({ 'tags': ['system'], 'description': 'Register a system', 'security': { SEC_ROLE_KEY: [] }, 'parameters': [ ROLE_KEY_PARAM, { 'name': 'body', 'description': 'Expected payload', 'in': 'body', 'type': 'object', 'schema': SystemIDModel, 'required': True, } ], 'responses': { '200': { 'description': 'System registered', 'schema': IssuerModel, }, '400': { 'description': 'Bad request, see details' }, '401': { 'description': 'Authentication failed' }, '409': { 'description': 'Already exists' }, '503': { 'description': 'Service is busy' } } }) @bpm_flask_mixin(get_validation_schema(SystemIDModel)) @bpm_flask_sqlalchemy_mixin @bpm_flask_public_access def post(self): with self.em_context() as em: key = uuid.uuid4() while em.get_issuer('key', str(key)) is not None: key = uuid.uuid4() data = { 'identifier': request.form.get('identifier'), 'key': str(key) } return em.add_issuer(data)
class MetricsImageStorageResource(StorageBaseResource): @swagger.doc({ 'tags': ['computation'], 'description': 'Submit a metrics image storage request', 'security': { SEC_CMPT_KEY: [], }, 'parameters': [ CMPT_KEY_PARAM, { 'name': 'body', 'description': 'Expected payload', 'in': 'body', 'type': 'object', 'schema': ProcessingImageModel, 'required': True, } ], 'responses': { '200': { 'description': 'Metrics image storage request success', 'schema': StatusModel, }, '400': { 'description': 'Bad request, see details' }, '401': { 'description': 'Authentication failed' }, '503': { 'description': 'Service is busy' } } }) @bpm_flask_mixin(get_validation_schema(ProcessingImageModel)) @bpm_flask_sqlalchemy_mixin @bpm_flask_component_access def post(self): with self.storage_context() as storage_manager: computation = storage_manager.store_metrics_image( request.form.get('metrics_uid'), request.form.get('image')) return StatusModel(message='success')
class IssuerResource(BPMDBResource): @swagger.doc({ 'tags': ['issuer'], 'description': 'Returns an issuer', 'parameters': [{ 'name': 'uid', 'description': 'Issuer uid', 'in': 'path', 'type': BigIntModel.get('type'), 'format': BigIntModel.get('format'), 'required': True }], 'responses': { '200': { 'description': 'Requester', 'schema': IssuerModel } } }) @bpm_flask_mixin() @bpm_flask_sqlalchemy_mixin def get(self, uid): with self.em_context() as em: issuer = em.get_issuer('uid', uid) if issuer is None: abort(404) return issuer @swagger.doc({ 'tags': ['issuer'], 'description': 'Returns an issuer', 'parameters': [{ 'name': 'uid', 'description': 'Issuer id', 'in': 'path', 'type': BigIntModel.get('type'), 'format': BigIntModel.get('format'), 'required': True }], 'responses': { '200': { 'description': 'Issuer deleted' }, '404': { 'description': 'Item does not exist' } } }) @bpm_flask_mixin() @bpm_flask_sqlalchemy_mixin def delete(self, uid): with self.em_context() as em: em.del_issuer('uid', uid) return StatusModel(message='success') @swagger.doc({ 'tags': ['issuer'], 'description': 'Updates an issuer', 'parameters': [{ 'name': 'uid', 'description': 'Issuer uid', 'in': 'path', 'type': BigIntModel.get('type'), 'format': BigIntModel.get('format'), 'required': True }, { 'name': 'body', 'description': 'Issuer payload', 'in': 'body', 'type': 'object', 'schema': IssuerModelWithoutPrimary, 'required': True }], 'responses': { '200': { 'description': 'Updated issuer', 'schema': IssuerModel }, '400': { 'description': 'Bad request, see details' }, '404': { 'description': 'Item does not exist' }, '409': { 'description': 'Already exists' }, } }) @bpm_flask_mixin(get_validation_schema(IssuerModelWithoutPrimary)) @bpm_flask_sqlalchemy_mixin def patch(self, uid): with self.em_context() as em: data = IssuerModelWithoutPrimary(**request.form) return em.upd_issuer('uid', uid, data)