diff --git a/src/python/dm/daq_web_service/service/impl/daqTracker.py b/src/python/dm/daq_web_service/service/impl/daqTracker.py new file mode 100755 index 0000000000000000000000000000000000000000..a035f912ae5432ce337096ced313802459ad5845 --- /dev/null +++ b/src/python/dm/daq_web_service/service/impl/daqTracker.py @@ -0,0 +1,88 @@ +#!/usr/bin/env python + +import os +import uuid +import time + +from dm.common.objects.daqInfo import DaqInfo +from dm.common.utility.objectTracker import ObjectTracker +from dm.common.utility.timeUtility import TimeUtility +from dm.common.exceptions.objectAlreadyExists import ObjectAlreadyExists +from dm.common.exceptions.objectNotFound import ObjectNotFound + +class DaqTracker(ObjectTracker): + + # Cache configuration + objectClass = DaqInfo + cacheSize = 100 + + def __init__(self, *args, **kwargs): + ObjectTracker.__init__(self, args, kwargs) + self.activeDaqDict = {} + + def startDaq(self, experiment, dataDirectory, daqInfo={}): + # Prevent second daq to be started in the same directory + experimentName = experiment.get('name') + dataDir = os.path.normpath(dataDirectory) + activeDaqKey = experimentName + dataDir + oldDaqInfo = self.activeDaqDict.get(activeDaqKey) + if oldDaqInfo: + raise ObjectAlreadyExists('DAQ is already active for experiment %s in data directory %s.' % (experimentName, dataDirectory)) + daqId = str(uuid.uuid4()) + daqInfo['id'] = daqId + daqInfo['experimentName'] = experimentName + daqInfo['storageDirectory'] = experiment.get('storageDirectory') + daqInfo['storageHost'] = experiment.get('storageHost') + daqInfo['dataDirectory'] = dataDirectory + daqInfo2 = DaqInfo(daqInfo) + + startTime = time.time() + daqInfo2['startTime'] = startTime + daqInfo2['startTimestamp'] = TimeUtility.formatLocalTimeStamp(startTime) + + self.activeDaqDict[activeDaqKey] = daqInfo2 + self.put(daqId, daqInfo2) + return daqInfo2 + + def stopDaq(self, experiment, dataDirectory): + experimentName = experiment.get('name') + dataDir = os.path.normpath(dataDirectory) + activeDaqKey = experimentName + dataDir + daqInfo = self.activeDaqDict.get(activeDaqKey) + if not daqInfo: + raise ObjectNotFound('DAQ is not active for experiment %s in data directory %s.' % (experimentName, dataDirectory)) + endTime = time.time() + daqInfo['endTime'] = endTime + daqInfo['endTimestamp'] = TimeUtility.formatLocalTimeStamp(endTime) + daqInfo.updateStatus() + del self.activeDaqDict[activeDaqKey] + return daqInfo + + def getDaqInfo(self, id): + return self.get(id) + + def getDaqInfoByExperimentAndDataDirectory(self, experiment, dataDirectory): + experimentName = experiment.get('name') + dataDir = os.path.normpath(dataDirectory) + activeDaqKey = experimentName + dataDir + return self.activeDaqDict.get(activeDaqKey) + +#################################################################### +# Testing + +if __name__ == '__main__': + tracker = DaqTracker.getInstance() + print tracker + experiment = {'name' : 'e1', 'owner' : 'sv'} + dataDirectory = 'ftp://wolf:2811/data/e1' + daqInfo = tracker.startDaq(experiment, dataDirectory) + daqId = daqInfo['id'] + print 'DAQ ID: ', daqId + print 'DAQ INFO: ', tracker.getDaqInfo(daqId) + print 'REMOVED DAQ: ', tracker.stopDaq(experiment, dataDirectory) + dataDirectory = 'ftp:///wolf:2811///data/e1' + daqId = tracker.startDaq(experiment, dataDirectory) + print 'DAQ ID: ', daqId + + +