diff --git a/src/python/dm/ds_web_service/service/impl/experimentManager.py b/src/python/dm/ds_web_service/service/impl/experimentManager.py new file mode 100755 index 0000000000000000000000000000000000000000..e5af7d686584acec6f6bc17e0e2540c05a6b3eb3 --- /dev/null +++ b/src/python/dm/ds_web_service/service/impl/experimentManager.py @@ -0,0 +1,121 @@ +#!/usr/bin/env python + +import threading +import time +import os + +from dm.common.utility.loggingManager import LoggingManager +from dm.common.utility.configurationManager import ConfigurationManager +from dm.common.utility.singleton import Singleton +from dm.common.utility.osUtility import OsUtility +from dm.common.utility.valueUtility import ValueUtility +from dm.common.utility.objectUtility import ObjectUtility +from dm.common.utility.threadingUtility import ThreadingUtility +from dm.common.db.api.experimentDbApi import ExperimentDbApi + +class ExperimentManager(Singleton): + + CONFIG_SECTION_NAME = 'ExperimentManager' + STORAGE_DIRECTORY_KEY = 'storagedirectory' + MANAGE_STORAGE_PERMISSIONS_KEY = 'managestoragepermissions' + PLATFORM_UTILITY_KEY = 'platformutility' + + FILE_PERMISSIONS_MODE = 0640 + DIR_PERMISSIONS_MODE = 0750 + + # Singleton. + __instanceLock = threading.RLock() + __instance = None + + def __init__(self): + ExperimentManager.__instanceLock.acquire() + try: + if ExperimentManager.__instance: + return + ExperimentManager.__instance = self + self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__) + + self.logger.debug('Initializing') + self.lock = threading.RLock() + self.experimentDbApi = ExperimentDbApi() + self.platformUtility = None + self.__configure() + self.logger.debug('Initialization complete') + finally: + ExperimentManager.__instanceLock.release() + + def __configure(self): + cm = ConfigurationManager.getInstance() + configItems = cm.getConfigItems(ExperimentManager.CONFIG_SECTION_NAME) + self.logger.debug('Got config items: %s' % configItems) + self.storageDirectory =cm.getConfigOption(ExperimentManager.CONFIG_SECTION_NAME, ExperimentManager.STORAGE_DIRECTORY_KEY) + self.manageStoragePermissions = ValueUtility.toBoolean(cm.getConfigOption(ExperimentManager.CONFIG_SECTION_NAME, ExperimentManager.MANAGE_STORAGE_PERMISSIONS_KEY)) + platformUtility = cm.getConfigOption(ExperimentManager.CONFIG_SECTION_NAME, ExperimentManager.PLATFORM_UTILITY_KEY) + if platformUtility: + (moduleName,className,constructor) = cm.getModuleClassConstructorTuple(platformUtility) + self.logger.debug('Creating platform utility class %s' % className) + self.platformUtility = ObjectUtility.createObjectInstance(moduleName, className, constructor) + + self.logger.debug('Manage storage permissions: %s' % self.manageStoragePermissions) + + def __getExperimentStorageDataDirectory(self, experiment): + experimentTypeName = experiment.get('experimentType').get('rootDataPath') + experimentName = experiment.get('name') + storageDirectory = '%s/%s/%s' % (self.storageDirectory, experimentTypeName, experimentName) + storageDirectory = os.path.normpath(storageDirectory) + return storageDirectory + + @ThreadingUtility.synchronize + def updateExperimentWithStorageDataDirectory(self, experiment): + storageDirectory = self.__getExperimentStorageDataDirectory(experiment) + if os.path.exists(storageDirectory): + experiment['storageDirectory'] = storageDirectory + experiment['storageHost'] = ConfigurationManager.getInstance().getHost() + return storageDirectory + + @ThreadingUtility.synchronize + def createExperimentDataDirectory(self, experiment): + experimentName = experiment.get('name') + storageDirectory = self.__getExperimentStorageDataDirectory(experiment) + if os.path.exists(storageDirectory): + self.logger.debug('Data directory %s for experiment %s already exists' % (storageDirectory, experimentName)) + else: + self.logger.debug('Creating data directory for experiment %s: %s' % (experimentName, storageDirectory)) + OsUtility.createDir(storageDirectory) + experiment['storageDirectory'] = storageDirectory + experiment['storageHost'] = ConfigurationManager.getInstance().getHost() + if self.manageStoragePermissions: + # Create experiment group + self.platformUtility.createGroup(experimentName) + self.logger.debug('Setting permissions for %s to %s' % (storageDirectory, self.DIR_PERMISSIONS_MODE)) + OsUtility.chmodPath(storageDirectory, dirMode=self.DIR_PERMISSIONS_MODE) + experimentUsers = experiment.get('experimentUsernameList', []) + for username in experimentUsers: + self.platformUtility.addUserToGroup(username, experimentName) + + @ThreadingUtility.synchronize + def processExperimentFile(self, fileName, filePath, experiment): + experimentName = experiment.get('name') + if os.path.exists(filePath): + self.logger.debug('Processing file %s' % filePath) + if self.manageStoragePermissions: + self.logger.debug('Modifying permissions for %s' % filePath) + OsUtility.chmodPath(filePath, fileMode=self.FILE_PERMISSIONS_MODE) + else: + self.logger.debug('File path %s does not exist' % filePath) + + @ThreadingUtility.synchronize + def start(self): + self.logger.debug('Started experiment manager') + + @ThreadingUtility.synchronize + def stop(self): + self.logger.debug('Stopped experiment manager') + +#################################################################### +# Testing + +if __name__ == '__main__': + em = ExperimentManager.getInstance() + print em + 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 f19c114de85fc75b442be16867076b70e148a125..426f26117b9e7f9b19986f94ec054230ebefe76a 100755 --- a/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py +++ b/src/python/dm/ds_web_service/service/impl/experimentSessionControllerImpl.py @@ -10,7 +10,7 @@ from dm.common.objects.experiment import Experiment from dm.common.objects.dmObjectManager import DmObjectManager from dm.common.exceptions.invalidRequest import InvalidRequest from dm.common.db.api.experimentDbApi import ExperimentDbApi -from dm.ds_web_service.service.impl.storageManager import StorageManager +from dm.ds_web_service.service.impl.experimentManager import ExperimentManager class ExperimentSessionControllerImpl(DmObjectManager): """ Experiment session controller implementation class. """ @@ -29,12 +29,12 @@ class ExperimentSessionControllerImpl(DmObjectManager): def getExperimentByName(self, name): experiment = self.experimentDbApi.getExperimentByName(name) - StorageManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) + ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) return experiment def getExperimentById(self, id): experiment = self.experimentDbApi.getExperimentById(id) - StorageManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) + ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) return experiment def addExperiment(self, name, experimentTypeId, description): @@ -42,18 +42,16 @@ class ExperimentSessionControllerImpl(DmObjectManager): return experiment def startExperiment(self, name): - experiment = self.experimentDbApi.getExperimentByName(name) + experiment = self.experimentDbApi.getExperimentWithUsers(name) if experiment.get('startDate') is None: experiment = self.experimentDbApi.setExperimentStartDateToNow(name) - StorageManager.getInstance().createExperimentDataDirectory(experiment) - else: - StorageManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) + ExperimentManager.getInstance().createExperimentDataDirectory(experiment) return experiment def stopExperiment(self, name): experiment = self.experimentDbApi.getExperimentByName(name) if experiment.get('endDate') is None: experiment = self.experimentDbApi.setExperimentEndDateToNow(name) - StorageManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) + ExperimentManager.getInstance().updateExperimentWithStorageDataDirectory(experiment) return experiment diff --git a/src/python/dm/ds_web_service/service/impl/fileSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/fileSessionControllerImpl.py new file mode 100755 index 0000000000000000000000000000000000000000..cbe325326b37ed70b654e14240373243b0a55b44 --- /dev/null +++ b/src/python/dm/ds_web_service/service/impl/fileSessionControllerImpl.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python + +# +# Implementation for file session controller. +# + +import time + +from dm.common.objects.dmObjectManager import DmObjectManager +from dm.common.exceptions.invalidRequest import InvalidRequest +from dm.common.objects.fileMetadata import FileMetadata +from dm.common.db.api.experimentDbApi import ExperimentDbApi +from dm.ds_web_service.service.impl.experimentManager import ExperimentManager + +class FileSessionControllerImpl(DmObjectManager): + """ File session controller implementation class. """ + + def __init__(self): + DmObjectManager.__init__(self) + self.experimentDbApi = ExperimentDbApi() + + def processFile(self, fileName, filePath, experimentName, **kwargs): + experiment = self.experimentDbApi.getExperimentByName(experimentName) + ExperimentManager.getInstance().processExperimentFile(fileName, filePath, experiment) + return FileMetadata({'fileName' : fileName}) diff --git a/src/python/dm/ds_web_service/service/impl/storageManager.py b/src/python/dm/ds_web_service/service/impl/storageManager.py deleted file mode 100755 index 36d7181212bd8eec8488924dface83052215e233..0000000000000000000000000000000000000000 --- a/src/python/dm/ds_web_service/service/impl/storageManager.py +++ /dev/null @@ -1,85 +0,0 @@ -#!/usr/bin/env python - -import threading -import time -import os - -from dm.common.utility.loggingManager import LoggingManager -from dm.common.utility.configurationManager import ConfigurationManager -from dm.common.utility.singleton import Singleton -from dm.common.utility.osUtility import OsUtility -from dm.common.utility.threadingUtility import ThreadingUtility - - -class StorageManager(Singleton): - - CONFIG_SECTION_NAME = 'StorageManager' - STORAGE_DIRECTORY_KEY = 'storagedirectory' - - # Singleton. - __instanceLock = threading.RLock() - __instance = None - - def __init__(self): - StorageManager.__instanceLock.acquire() - try: - if StorageManager.__instance: - return - StorageManager.__instance = self - self.logger = LoggingManager.getInstance().getLogger(self.__class__.__name__) - - self.logger.debug('Initializing') - self.lock = threading.RLock() - self.__configure() - self.logger.debug('Initialization complete') - finally: - StorageManager.__instanceLock.release() - - def __configure(self): - cm = ConfigurationManager.getInstance() - configItems = cm.getConfigItems(StorageManager.CONFIG_SECTION_NAME) - self.logger.debug('Got config items: %s' % configItems) - self.storageDirectory = cm.getConfigOption(StorageManager.CONFIG_SECTION_NAME, StorageManager.STORAGE_DIRECTORY_KEY) - - def __getExperimentStorageDataDirectory(self, experiment): - experimentTypeName = experiment.get('experimentType').get('rootDataPath') - experimentName = experiment.get('name') - storageDirectory = '%s/%s/%s' % (self.storageDirectory, experimentTypeName, experimentName) - storageDirectory = os.path.normpath(storageDirectory) - return storageDirectory - - @ThreadingUtility.synchronize - def updateExperimentWithStorageDataDirectory(self, experiment): - storageDirectory = self.__getExperimentStorageDataDirectory(experiment) - if os.path.exists(storageDirectory): - experiment['storageDirectory'] = storageDirectory - experiment['storageHost'] = ConfigurationManager.getInstance().getHost() - return storageDirectory - - @ThreadingUtility.synchronize - def createExperimentDataDirectory(self, experiment): - experimentName = experiment.get('name') - storageDirectory = self.__getExperimentStorageDataDirectory(experiment) - if os.path.exists(storageDirectory): - self.logger.debug('Data directory %s for experiment %s already exists' % (storageDirectory, experimentName)) - else: - self.logger.debug('Creating data directory for experiment %s: %s' % (experimentName, storageDirectory)) - OsUtility.createDir(storageDirectory) - experiment['storageDirectory'] = storageDirectory - experiment['storageHost'] = ConfigurationManager.getInstance().getHost() - - @ThreadingUtility.synchronize - def start(self): - self.logger.debug('Started storage manager') - - @ThreadingUtility.synchronize - def stop(self): - self.logger.debug('Stopped storage manager') - -#################################################################### -# Testing - -if __name__ == '__main__': - sm = StorageManager.getInstance() - print sm -