Beispiel #1
0
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'))
Beispiel #2
0
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))
Beispiel #3
0
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
            })
Beispiel #4
0
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)
Beispiel #5
0
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)
Beispiel #6
0
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')
Beispiel #7
0
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)