diff --git a/etc/dm.deploy.conf b/etc/dm.deploy.conf index 3248a75417e4225466e56dac974175af2e9582fa..444319ce23636ce2958cccaedd1aae2bb83be020 100644 --- a/etc/dm.deploy.conf +++ b/etc/dm.deploy.conf @@ -15,5 +15,5 @@ DM_DAQ_WEB_SERVICE_HOST=DM_HOSTNAME DM_DAQ_WEB_SERVICE_PORT=33336 DM_CAT_WEB_SERVICE_HOST=DM_HOSTNAME DM_CAT_WEB_SERVICE_PORT=44436 -DM_SOFTWARE_VERSION="0.5 (DM_DATE)" +DM_SOFTWARE_VERSION="0.6 (DM_DATE)" diff --git a/src/python/dm/__init__.py b/src/python/dm/__init__.py index 3c1013ed6b3c8419c2cca228d71503797a14e224..5010cdf402a47e35582a0eaed250b96bc38f99ad 100644 --- a/src/python/dm/__init__.py +++ b/src/python/dm/__init__.py @@ -1 +1 @@ -__version__ = "0.3 (2015.09.21)" +__version__ = "0.6 (2015.11.06)" diff --git a/src/python/dm/common/processing/plugins/fileTransferPlugin.py b/src/python/dm/common/processing/plugins/fileTransferPlugin.py index 196377f8ae298b45125dda2697f378b5e71bbf31..0c23098327e96cc080e72cf53657eef0910f0a1e 100755 --- a/src/python/dm/common/processing/plugins/fileTransferPlugin.py +++ b/src/python/dm/common/processing/plugins/fileTransferPlugin.py @@ -27,12 +27,12 @@ class FileTransferPlugin(FileProcessor): storageHost = experiment.get('storageHost') storageDirectory = experiment.get('storageDirectory') destUrl = self.getDestUrl(storageHost, storageDirectory) - # Use relative path with respect to data directory as a source - os.chdir(dataDirectory) srcUrl = self.getSrcUrl(filePath, dataDirectory) self.start(srcUrl, destUrl) def getSrcUrl(self, filePath, dataDirectory): + # Use relative path with respect to data directory as a source + os.chdir(dataDirectory) srcUrl = os.path.relpath(filePath, dataDirectory) return srcUrl diff --git a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py index abf5f2cd4184c8f6e92f797ec0bc5434f84174df..6999ccdfd114a7cfe4bb5318491b5af3c9ed5823 100755 --- a/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py +++ b/src/python/dm/common/processing/plugins/gridftpFileTransferPlugin.py @@ -1,18 +1,19 @@ #!/usr/bin/env python from fileTransferPlugin import FileTransferPlugin + class GridftpFileTransferPlugin(FileTransferPlugin): COMMAND = 'globus-url-copy -c -cd -r -vb -tcp-bs 512K -p 1 -sync -sync-level 2' - def __init__(self, src=None, dest=None, command=GridftpFileTransferPlugin.COMMAND): + def __init__(self, src=None, dest=None, command=COMMAND): FileTransferPlugin.__init__(self, command, src, dest) def getSrcUrl(self, filePath, dataDirectory): if self.src is None: srcUrl = 'file://%s' % filePath else: - srcUrl = '%s/%s' % filePath + srcUrl = '%s/%s' % (self.src,filePath) return srcUrl def getDestUrl(self, storageHost, storageDirectory): diff --git a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py index 5f42e727ec93c53d88a8db904cc4705b82203715..ecc2d56b5fdd82934009bfc4c07f051d8f802723 100755 --- a/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py +++ b/src/python/dm/daq_web_service/service/impl/experimentSessionControllerImpl.py @@ -10,7 +10,6 @@ import time from dm.common.objects.experiment import Experiment from dm.common.objects.dmObjectManager import DmObjectManager from dm.common.exceptions.invalidRequest import InvalidRequest -from dm.common.utility.osUtility import OsUtility from dm.common.objects.observedFile import ObservedFile from dm.common.processing.fileProcessingManager import FileProcessingManager from dm.ds_web_service.api.dsRestApiFactory import DsRestApiFactory @@ -20,14 +19,12 @@ from fileSystemObserver import FileSystemObserver class ExperimentSessionControllerImpl(DmObjectManager): """ Experiment session controller implementation class. """ - DAQ_PERMISSIONS_MODE = 0777 - def __init__(self): DmObjectManager.__init__(self) self.dsExperimentApi = DsRestApiFactory.getExperimentRestApi() def startDaq(self, experimentName, dataDirectory, daqInfo): - OsUtility.createDir(dataDirectory, mode=self.DAQ_PERMISSIONS_MODE) + FileSystemObserver.getInstance().createDirectory(dataDirectory) if daqInfo is None: daqInfo={} daqInfo['experimentName'] = experimentName @@ -69,7 +66,7 @@ class ExperimentSessionControllerImpl(DmObjectManager): if storageDirectory is None: raise InvalidRequest('Experiment %s has not been started.' % experimentName) dataDirectory = daqInfo.get('dataDirectory') - filePaths = OsUtility.findFiles(dataDirectory) + filePaths = FileSystemObserver.getInstance().getFiles(dataDirectory) fileProcessingManager = FileProcessingManager.getInstance() for filePath in filePaths: fileInfo = ObservedFile(filePath=filePath, dataDirectory=dataDirectory, experiment=experiment) diff --git a/src/python/dm/daq_web_service/service/impl/fileSystemObserver.py b/src/python/dm/daq_web_service/service/impl/fileSystemObserver.py index c9e4bfda185491db1e0e10cdce73c0da6f945cd0..6613f8202e4c09da0fc8992a9565c142d2bef1b4 100755 --- a/src/python/dm/daq_web_service/service/impl/fileSystemObserver.py +++ b/src/python/dm/daq_web_service/service/impl/fileSystemObserver.py @@ -63,6 +63,15 @@ class FileSystemObserver(threading.Thread,Singleton): self.fileSystemObserverAgent = ObjectUtility.createObjectInstance(moduleName, className, constructor) self.fileSystemObserverAgent.setFileSystemObserver(self) + @ThreadingUtility.synchronize + def createDirectory(self, dataDirectory): + self.fileSystemObserverAgent.createDirectory(dataDirectory) + + @ThreadingUtility.synchronize + def getFiles(self, dataDirectory): + self.logger.debug('Agent is retrieving files for %s' % dataDirectory) + return self.fileSystemObserverAgent.getFiles(dataDirectory) + @ThreadingUtility.synchronize def startObservingPath(self, dataDirectory, experiment): self.logger.debug('Agent is starting observer for %s' % dataDirectory) diff --git a/src/python/dm/daq_web_service/service/impl/fileSystemObserverAgent.py b/src/python/dm/daq_web_service/service/impl/fileSystemObserverAgent.py index 3603f19dfad70bc8b9ceb7ddd1f5725e35428aa0..6077a8044546579d92d0f9c3c7bd158f46928b2d 100644 --- a/src/python/dm/daq_web_service/service/impl/fileSystemObserverAgent.py +++ b/src/python/dm/daq_web_service/service/impl/fileSystemObserverAgent.py @@ -11,6 +11,12 @@ class FileSystemObserverAgent: def setFileSystemObserver(self, fileSystemObserver): self.fileSystemObserver = fileSystemObserver + def createDirectory(self, dataDirectory): + pass + + def getFiles(self, dataDirectory): + pass + def startObservingPath(self, dataDirectory, experiment): pass diff --git a/src/python/dm/daq_web_service/service/impl/watchdogFileSystemObserverAgent.py b/src/python/dm/daq_web_service/service/impl/watchdogFileSystemObserverAgent.py index 81def9895419d17a872f07c27e3b035bf7a1c7d0..c709367628be90c25dbafed643d8fcdf9227ee85 100644 --- a/src/python/dm/daq_web_service/service/impl/watchdogFileSystemObserverAgent.py +++ b/src/python/dm/daq_web_service/service/impl/watchdogFileSystemObserverAgent.py @@ -1,16 +1,29 @@ #!/usr/bin/env python +from dm.common.utility.osUtility import OsUtility + from watchdog.observers.polling import PollingObserver from fileSystemObserverAgent import FileSystemObserverAgent from dmFileSystemEventHandler import DmFileSystemEventHandler class WatchdogFileSystemObserverAgent(FileSystemObserverAgent): + DAQ_PERMISSIONS_MODE = 0777 + def __init__(self): FileSystemObserverAgent.__init__(self) self.observer = PollingObserver() self.observedWatchDict = {} + def createDirectory(self, dataDirectory): + try: + OsUtility.createDir(dataDirectory, mode=self.DAQ_PERMISSIONS_MODE) + except Exception, ex: + self.logger.warn('Unable to create directory %s: %s' % (dataDirectory, ex)) + + def getFiles(self, dataDirectory): + return OsUtility.findFiles(dataDirectory) + def startObservingPath(self, dataDirectory, experiment): self.logger.debug('Starting observer for %s' % dataDirectory) eventHandler = DmFileSystemEventHandler(self.fileSystemObserver, dataDirectory, experiment) diff --git a/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py index 7958faa7493b4c9d37b86520ddd220428bcd6291..05af7916b994e7192afd89fa2551ed05103f73b2 100755 --- a/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py +++ b/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py @@ -51,9 +51,8 @@ class ExperimentSessionControllerImpl(DmObjectManager): def updateExperiment(self, name): experiment = self.experimentDbApi.getExperimentWithUsers(name) - if experiment.get('startDate') is None: - raise InvalidRequest('Experiment %s has not been started.' % name) - ExperimentManager.getInstance().updateExperimentGroupUsers(experiment) + if experiment.get('startDate') is not None: + ExperimentManager.getInstance().updateExperimentGroupUsers(experiment) return experiment def stopExperiment(self, name):