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)
def getExperimentTypes(self):
'''
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)
def getExperiments(self):
'''
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)
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
: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
>>> 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)
def getExperimentByName(self, name):
'''
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)
def getExperimentById(self, id):
'''
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)
def addExperiment(self, name, stationName, typeName, description, startDate, endDate):
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
'''
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)
Barbara B. Frosik
committed
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')
print api.startExperiment('experiment1')