From 20fc0967d751c8cf4fa9b924c221511ea3a93873 Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Thu, 8 Oct 2015 07:10:16 +0000
Subject: [PATCH] added stat interface; separate user management

---
 .../service/impl/experimentManager.py         | 52 +++++++++++++++----
 1 file changed, 41 insertions(+), 11 deletions(-)

diff --git a/src/python/dm/ds_web_service/service/impl/experimentManager.py b/src/python/dm/ds_web_service/service/impl/experimentManager.py
index 586f2a2e..1649e744 100755
--- a/src/python/dm/ds_web_service/service/impl/experimentManager.py
+++ b/src/python/dm/ds_web_service/service/impl/experimentManager.py
@@ -11,8 +11,10 @@ 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.utility.fileUtility import FileUtility
 from dm.common.db.api.experimentDbApi import ExperimentDbApi
 from dm.common.processing.fileProcessingManager import FileProcessingManager
+from dm.common.exceptions.objectNotFound import ObjectNotFound
 
 class ExperimentManager(Singleton):
 
@@ -75,6 +77,29 @@ class ExperimentManager(Singleton):
             experiment['storageHost'] = ConfigurationManager.getInstance().getHost()
         return storageDirectory
 
+    def addUserToGroup(self, username, experimentName):
+        experiment = self.experimentDbApi.getExperimentWithUsers(experimentName)
+        storageDirectory = self.__getExperimentStorageDataDirectory(experiment)
+        if os.path.exists(storageDirectory):
+            self.platformUtility.addUserToGroup(username, experimentName)
+
+    def createExperimentGroup(self, experiment):
+        experimentName = experiment.get('name')
+        storageDirectory = experiment.get('storageDirectory')
+
+        # 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)
+        self.logger.debug('Changing group owner for %s to %s' % (storageDirectory, experimentName))
+        self.platformUtility.changePathGroupOwner(storageDirectory, experimentName)
+
+        # Add users to group
+        experimentUsers = experiment.get('experimentUsernameList', [])
+        self.logger.debug('Found experiment users: %s', experimentUsers)
+        for username in experimentUsers:
+            self.platformUtility.addUserToGroup(username, experimentName)
+      
     @ThreadingUtility.synchronize
     def createExperimentDataDirectory(self, experiment):
         experimentName = experiment.get('name')
@@ -87,17 +112,7 @@ class ExperimentManager(Singleton):
         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)
-            self.logger.debug('Changing group owner for %s to %s' % (storageDirectory, experimentName))
-            self.platformUtility.changePathGroupOwner(storageDirectory, experimentName)
-
-            experimentUsers = experiment.get('experimentUsernameList', [])
-            self.logger.debug('Found experiment users: %s', experimentUsers)
-            for username in experimentUsers:
-                self.platformUtility.addUserToGroup(username, experimentName)
+            self.createExperimentGroup(experiment)
       
     @ThreadingUtility.synchronize
     def processExperimentFile(self, experimentFilePath, experiment, fileInfo={}):
@@ -119,6 +134,21 @@ class ExperimentManager(Singleton):
         else:
             self.logger.debug('File path %s does not exist' % filePath)
 
+    def statExperimentFile(self, experimentFilePath, experiment, fileInfo={}):
+        experimentName = experiment.get('name')
+        self.updateExperimentWithStorageDataDirectory(experiment)
+        storageDirectory = experiment.get('storageDirectory')
+        filePath = os.path.join(storageDirectory, experimentFilePath)
+        fileInfo['filePath'] = filePath
+        if os.path.exists(filePath):
+            self.logger.debug('Getting stat for file path %s' % (filePath))
+            FileUtility.statFile(filePath, fileInfo)
+            FileUtility.getMd5Sum(filePath, fileInfo)
+            self.logger.debug('File Info after stat: %s' % (fileInfo))
+        else:
+            self.logger.debug('File path %s does not exist' % filePath)
+            raise ObjectNotFound('File %s does not exist' % filePath)
+
     @ThreadingUtility.synchronize
     def start(self):
         self.logger.debug('Started experiment manager')
-- 
GitLab