Skip to content
Snippets Groups Projects
experimentDsApi.py 8.4 KiB
Newer Older
#!/usr/bin/env python

import os
import urllib

from dm.common.utility.encoder import Encoder
from dm.common.exceptions.dmException import DmException
from dm.common.objects.experiment import Experiment
from dm.common.objects.experimentType import ExperimentType
from dsRestApi import DsRestApi

class ExperimentDsApi(DsRestApi):
    '''
    Data Management API for accessing experiment interface provided by the
    DS service.
    '''
    
    def __init__(self, username=None, password=None, host=None, port=None, protocol=None):
        '''
        Constructor.

        :param username: DM username
        :type username: str

        :param password: DM password
        :type password: str

        :param host: DM service host
        :type host: str

        :param port: DM service port
        :type port: int

        :param protocol: DM service protocol
        :type protocol: str

        >>> api = ExperimentDsApi(username='dm', password='XYZ', host='bluegill1', port=22236, protocol='https')
        '''
        DsRestApi.__init__(self, username, password, host, port, protocol)

    @DsRestApi.execute2
        '''
        Get list of allowed experiment types.

        :returns: list of ExperimentType objects

        :raises AuthorizationError: in case user is not logged in

        :raises DmException: in case of any other errors

        >>> experimentTypeList = api.getExperimentTypes()
        >>> for experimentType in experimentTypeList:
        >>>     print experimentType['id'], experimentType['name']
        '''

        url = '%s/experimentTypes' % (self.getContextRoot())
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, ExperimentType)

    @DsRestApi.execute2
        '''
        Get list of known experiments.

        :returns: list of Experiment objects

        :raises AuthorizationError: in case user does not have DM administrator role

        :raises DmException: in case of any other errors

        >>> experimentList = api.getExperiments()
        >>> for experiment in experimentList:
        >>>     print experiment['id'], experiment['name']
        '''

        url = '%s/experiments' % (self.getContextRoot())
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, Experiment)

    @DsRestApi.execute2
    def getExperimentsByStation(self, stationName):
        '''
        Get list of experiments on a given station.

        :param stationName: DM station name
        :type stationName: str

        :returns: list of Experiment objects

sveseli's avatar
sveseli committed
        :raises InvalidRequest: if station name is empty or None

        :raises AuthorizationError: in case user is not authorized to manage the given DM station

        :raises DmException: in case of any other errors

sveseli's avatar
sveseli committed
        >>> experimentList = api.getExperimentsByStation()
        >>> for experiment in experimentList:
        >>>     print experiment['id'], experiment['name']
        '''

        url = '%s/experimentsByStation/%s' % (self.getContextRoot(), stationName)
        if not stationName:
            raise InvalidRequest('Experiment station name must be provided.')
        responseData = self.sendSessionRequest(url=url, method='GET')
        return self.toDmObjectList(responseData, Experiment)

sveseli's avatar
sveseli committed
    @DsRestApi.execute2
sveseli's avatar
sveseli committed
        '''
        Get experiment.

        :param name: experiment name
        :type name: str

        :returns: Experiment object

        :raises InvalidRequest: if experiment name is empty or None

        :raises AuthorizationError: in case user is not authorized to manage the DM station to which this experiment belongs

        :raises DmException: in case of any other errors

        >>> experiment = api.getExperimentByName('test01')
        >>> print experiment['id']
        '''

        url = '%s/experimentsByName/%s' % (self.getContextRoot(), name)
        if name is None or not len(name):
            raise InvalidRequest('Experiment name must be provided.')
        responseDict = self.sendSessionRequest(url=url, method='GET')
        return Experiment(responseDict)

sveseli's avatar
sveseli committed
    @DsRestApi.execute2
sveseli's avatar
sveseli committed
        '''
        Get experiment.

        :param id: experiment id
        :type id: int

        :returns: Experiment object

        :raises InvalidRequest: if experiment id is None

        :raises AuthorizationError: in case user is not authorized to manage the DM station to which this experiment belongs

        :raises DmException: in case of any other errors

        >>> experiment = api.getExperimentById(123)
        >>> print experiment['name']
        '''

        url = '%s/experimentsById/%s' % (self.getContextRoot(), id)
        if id is None:
            raise InvalidRequest('Experiment id must be provided.')
        responseDict = self.sendSessionRequest(url=url, method='GET')
        return Experiment(responseDict)

    @DsRestApi.execute
    def startExperiment(self, name):
        url = '%s/experiments/start' % (self.getContextRoot())
        if name is None or not len(name):
            raise InvalidRequest('Experiment name must be provided.')
        url += '?name=%s' % Encoder.encode(name)
        responseDict = self.sendSessionRequest(url=url, method='PUT')
        return Experiment(responseDict)

    @DsRestApi.execute
    def updateExperiment(self, name):
        url = '%s/experiments/update' % (self.getContextRoot())
        if name is None or not len(name):
            raise InvalidRequest('Experiment name must be provided.')
        url += '?name=%s' % Encoder.encode(name)
        responseDict = self.sendSessionRequest(url=url, method='PUT')
        return Experiment(responseDict)

    @DsRestApi.execute
    def stopExperiment(self, name):
        url = '%s/experiments/stop' % (self.getContextRoot())
        if name is None or not len(name):
            raise InvalidRequest('Experiment name must be provided.')
        url += '?name=%s' % Encoder.encode(name)
        responseDict = self.sendSessionRequest(url=url, method='PUT')
        return Experiment(responseDict)

sveseli's avatar
sveseli committed
    @DsRestApi.execute2
    def addExperiment(self, name, stationName, typeName, description, startDate, endDate):
sveseli's avatar
sveseli committed
        '''
        Add experiment.

        :param name: experiment name 
        :type name: str

        :param stationName: DM station name 
        :type stationName: str

        :param typeName: experiment type
        :type typeName: str

        :param description: experiment description
        :type description: str

        :param startDate: experiment start date
        :type startDate: str

        :param endDate: experiment end date
        :type endDate: str

        :returns: Experiment object

        :raises InvalidRequest: if one of the required arguments (experiment name, station name and experiment type) is empty or None

        :raises AuthorizationError: in case user is not authorized to manage the DM station to which this experiment belongs

        :raises ObjectAlreadyExists: if experiment with a given name already exists

        :raises DmException: in case of any other errors

        >>> experiment = api.addExperiment(name='test01', stationName='TEST', typeName='TEST')
        >>> print experiment['id']
        '''

        url = '%s/experiments' % (self.getContextRoot())
            raise InvalidRequest('Experiment name must be provided.')
        url += '?name=%s' % Encoder.encode(name)
        if not stationName:
            raise InvalidRequest('Experiment station name must be provided.')
        url += '&stationName=%s' % Encoder.encode(stationName)
        if not typeName:
            raise InvalidRequest('Experiment type must be provided.')
        url += '&typeName=%s' % Encoder.encode(typeName)
        if description is not None:
            url += '&description=%s' % Encoder.encode(description)
        if startDate is not None:
            url += '&startDate=%s' % Encoder.encode(startDate)
        if endDate is not None:
            url += '&endDate=%s' % Encoder.encode(endDate)
        responseDict = self.sendSessionRequest(url=url, method='POST')
        return Experiment(responseDict)

#######################################################################
# Testing.

if __name__ == '__main__':
    api = ExperimentDsApi('sveseli', 'sveseli', 'zagreb.svdev.net', 33336, 'http')