Skip to content
Snippets Groups Projects
experimentSessionController.py 6.36 KiB
Newer Older
from dm.common.constants import dmProcessingMode
from dm.common.constants import dmProcessingStatus
from dm.common.service.dmSessionController import DmSessionController
from dm.common.exceptions.invalidRequest import InvalidRequest
from dm.common.utility.encoder import Encoder
from dm.common.utility.dictUtility import DictUtility

from dm.daq_web_service.service.impl.experimentSessionControllerImpl import ExperimentSessionControllerImpl


class ExperimentSessionController(DmSessionController):

    def __init__(self):
        DmSessionController.__init__(self)
        self.experimentSessionControllerImpl = ExperimentSessionControllerImpl()

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    def startDaq(self, experimentName, dataDirectory, **kwargs):
sveseli's avatar
sveseli committed
        if not experimentName:
            raise InvalidRequest('Missing experiment name.')
        experimentName = Encoder.decode(experimentName)
sveseli's avatar
sveseli committed
        if not dataDirectory:
            raise InvalidRequest('Missing data directory.')
sveseli's avatar
sveseli committed
        if not dataDirectory.startswith('/') and not dataDirectory.count('://'):
            raise InvalidRequest('Data directory must be an absolute path.')

        daqInfo = {}
        encodedDaqInfo = kwargs.get('daqInfo')
        if encodedDaqInfo is not None:
            daqInfo = json.loads(Encoder.decode(encodedDaqInfo))
        response = self.experimentSessionControllerImpl.startDaq(experimentName, dataDirectory, daqInfo).getFullJsonRep()
        self.logger.debug('Returning: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    def stopDaq(self, experimentName, dataDirectory, **kwargs):
        if not experimentName:
            raise InvalidRequest('Missing experiment name.')
        experimentName = Encoder.decode(experimentName)
        if not dataDirectory:
            raise InvalidRequest('Missing data directory.')
        dataDirectory = Encoder.decode(dataDirectory)
        response = self.experimentSessionControllerImpl.stopDaq(experimentName, dataDirectory).getFullJsonRep()
        self.logger.debug('Returning: %s' % response)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def getDaqInfo(self, id, **kwargs):
        response = self.experimentSessionControllerImpl.getDaqInfo(id).getFullJsonRep()
        self.logger.debug('Returning: %s' % response)
        return response
    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def listDaqs(self, status=dmProcessingStatus.DM_PROCESSING_STATUS_ANY, **kwargs):
        if not status:
            status = dmProcessingStatus.DM_PROCESSING_STATUS_ANY
        if status not in dmProcessingStatus.DM_ALLOWED_PROCESSING_STATUS_LIST:
            raise InvalidRequest('Invalid processing status "%s". Status must be one of %s.' % (status,dmProcessingStatus.DM_ALLOWED_PROCESSING_STATUS_LIST))
        return self.listToJson(self.experimentSessionControllerImpl.listDaqs(status))

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def upload(self, experimentName, dataDirectory, **kwargs):
        if not experimentName:
            raise InvalidRequest('Missing experiment name.')
        experimentName = Encoder.decode(experimentName)
        if not dataDirectory:
            raise InvalidRequest('Missing data directory.')
        dataDirectory = Encoder.decode(dataDirectory)
sveseli's avatar
sveseli committed
        if not dataDirectory.startswith('/') and not dataDirectory.count('://'):
            raise InvalidRequest('Data directory must be an absolute path.')

        daqInfo = {}
        encodedDaqInfo = kwargs.get('daqInfo')
        if encodedDaqInfo:
            daqInfo = json.loads(Encoder.decode(encodedDaqInfo))
        processingMode = DictUtility.getAndRemoveKey(daqInfo, 'processingMode', dmProcessingMode.DM_PROCESSING_MODE_FILES)
        if processingMode not in dmProcessingMode.DM_ALLOWED_PROCESSING_MODE_LIST:
            raise InvalidRequest('Allowed processing modes: %s' % dmProcessingMode.DM_ALLOWED_PROCESSING_MODE_LIST)
        if processingMode == dmProcessingMode.DM_PROCESSING_MODE_FILES:
            response = self.experimentSessionControllerImpl.uploadFiles(experimentName, dataDirectory, daqInfo).getFullJsonRep()
        else:
            response = self.experimentSessionControllerImpl.uploadDirectory(experimentName, dataDirectory, daqInfo).getFullJsonRep()
sveseli's avatar
sveseli committed
        self.logger.debug('Returning upload info for directory %s' % dataDirectory)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def getUploadInfo(self, id, **kwargs):
        response = self.experimentSessionControllerImpl.getUploadInfo(id).getFullJsonRep()
sveseli's avatar
sveseli committed
        self.logger.debug('Returning info for upload id %s' % id)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def listUploads(self, status=dmProcessingStatus.DM_PROCESSING_STATUS_ANY, **kwargs):
        if not status:
            status = dmProcessingStatus.DM_PROCESSING_STATUS_ANY
        if status not in dmProcessingStatus.DM_ALLOWED_PROCESSING_STATUS_LIST:
            raise InvalidRequest('Invalid processing status "%s". Status must be one of %s.' % (status,dmProcessingStatus.DM_ALLOWED_PROCESSING_STATUS_LIST))
        return self.listToJson(self.experimentSessionControllerImpl.listUploads(status))

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def stopUpload(self, id, **kwargs):
        response = self.experimentSessionControllerImpl.stopUpload(id).getFullJsonRep()
        self.logger.debug('Stopped upload id %s' % id)
        return response

    @cherrypy.expose
    @DmSessionController.require(DmSessionController.isAdministrator())
    @DmSessionController.execute
    def getProcessingPlugins(self, **kwargs):
        return self.listToJson(self.experimentSessionControllerImpl.getProcessingPlugins())