From d1cdc515aefd3fc53e6eabaa14ee84e9b191e1b8 Mon Sep 17 00:00:00 2001
From: Sinisa Veseli <sveseli@aps.anl.gov>
Date: Wed, 4 Nov 2015 14:08:56 +0000
Subject: [PATCH] added DB and DS web service interfaces for deleting user
 experiment role; added new delete-user-experiment-role command

---
 bin/dm-delete-user-experiment-role            | 17 +++++++
 bin/dm-update-experiment                      | 17 +++++++
 .../dm/ds_web_service/api/userRestApi.py      | 12 +++++
 .../cli/deleteUserExperimentRoleCli.py        | 49 +++++++++++++++++++
 .../service/impl/experimentManager.py         |  9 +++-
 .../impl/userInfoSessionControllerImpl.py     |  5 ++
 .../service/userInfoSessionController.py      | 13 +++++
 .../service/userRouteDescriptor.py            |  8 +++
 8 files changed, 128 insertions(+), 2 deletions(-)
 create mode 100755 bin/dm-delete-user-experiment-role
 create mode 100755 bin/dm-update-experiment
 create mode 100755 src/python/dm/ds_web_service/cli/deleteUserExperimentRoleCli.py

diff --git a/bin/dm-delete-user-experiment-role b/bin/dm-delete-user-experiment-role
new file mode 100755
index 00000000..43b771d4
--- /dev/null
+++ b/bin/dm-delete-user-experiment-role
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Run command
+
+if [ -z $DM_ROOT_DIR ]; then
+    cd `dirname $0` && myDir=`pwd`
+    setupFile=$myDir/../setup.sh
+    if [ ! -f $setupFile ]; then
+        echo "Cannot find setup file: $setupFile"
+        exit 1
+    fi
+    source $setupFile > /dev/null
+fi
+
+$DM_ROOT_DIR/src/python/dm/ds_web_service/cli/deleteUserExperimentRoleCli.py $@
+
+
diff --git a/bin/dm-update-experiment b/bin/dm-update-experiment
new file mode 100755
index 00000000..787567b4
--- /dev/null
+++ b/bin/dm-update-experiment
@@ -0,0 +1,17 @@
+#!/bin/sh
+
+# Run command
+
+if [ -z $DM_ROOT_DIR ]; then
+    cd `dirname $0` && myDir=`pwd`
+    setupFile=$myDir/../setup.sh
+    if [ ! -f $setupFile ]; then
+        echo "Cannot find setup file: $setupFile"
+        exit 1
+    fi
+    source $setupFile > /dev/null
+fi
+
+$DM_ROOT_DIR/src/python/dm/ds_web_service/cli/updateExperimentCli.py $@
+
+
diff --git a/src/python/dm/ds_web_service/api/userRestApi.py b/src/python/dm/ds_web_service/api/userRestApi.py
index 901182c1..95dccf5a 100755
--- a/src/python/dm/ds_web_service/api/userRestApi.py
+++ b/src/python/dm/ds_web_service/api/userRestApi.py
@@ -49,6 +49,18 @@ class UserRestApi(DsRestApi):
         responseData = self.sendSessionRequest(url=url, method='POST')
         return UserExperimentRole(responseData)
 
+    @DsRestApi.execute
+    def deleteUserExperimentRole(self, username, experimentName, roleName):
+        if not username:
+            raise InvalidRequest('Username must be provided.')
+        if not experimentName:
+            raise InvalidRequest('Experiment name must be provided.')
+        if not roleName:
+            raise InvalidRequest('Role name must be provided.')
+        url = '%s/usersByExperiment/%s/%s/%s' % (self.getContextRoot(), username, experimentName, roleName)
+        responseData = self.sendSessionRequest(url=url, method='DELETE')
+        return UserExperimentRole(responseData)
+
 #######################################################################
 # Testing.
 
diff --git a/src/python/dm/ds_web_service/cli/deleteUserExperimentRoleCli.py b/src/python/dm/ds_web_service/cli/deleteUserExperimentRoleCli.py
new file mode 100755
index 00000000..52098452
--- /dev/null
+++ b/src/python/dm/ds_web_service/cli/deleteUserExperimentRoleCli.py
@@ -0,0 +1,49 @@
+#!/usr/bin/env python
+
+from dm.common.exceptions.invalidRequest import InvalidRequest
+from dm.ds_web_service.api.userRestApi import UserRestApi
+from dsWebServiceSessionCli import DsWebServiceSessionCli
+
+class DeleteUserExperimentRoleCli(DsWebServiceSessionCli):
+    def __init__(self):
+        DsWebServiceSessionCli.__init__(self)
+        self.addOption('', '--username', dest='username', help='User username.')
+        self.addOption('', '--experiment', dest='experimentName', help='Experiment name.')
+        self.addOption('', '--role', dest='roleName', help='Role name.')
+
+    def checkArgs(self):
+        if not self.options.username:
+            raise InvalidRequest('Username must be provided.')
+        if not self.options.experimentName:
+            raise InvalidRequest('Experiment name must be provided.')
+        if not self.options.roleName:
+            raise InvalidRequest('Role name must be provided.')
+
+    def getUsername(self):
+        return self.options.username
+
+    def getExperimentName(self):
+        return self.options.experimentName
+
+    def getRoleName(self):
+        return self.options.roleName
+
+    def runCommand(self):
+        self.parseArgs(usage="""
+    dm-delete-user-experiment-role --username=USERNAME 
+        --experiment=EXPERIMENTNAME --role=ROLENAME
+
+Description:
+    Deletes experiment role from the given user.
+        """)
+        self.checkArgs()
+        api = UserRestApi(self.getLoginUsername(), self.getLoginPassword(), self.getServiceHost(), self.getServicePort(), self.getServiceProtocol())
+        userExperimentRole = api.deleteUserExperimentRole(self.getUsername(), self.getExperimentName(), self.getRoleName())
+        #print 'Deleted User Experiment Role:\n\t%s' % userExperimentRole.getDisplayString(self.getDisplayKeys(), self.getDisplayFormat())
+
+#######################################################################
+# Run command.
+if __name__ == '__main__':
+    cli = DeleteUserExperimentRoleCli()
+    cli.run()
+
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 55ada380..3dbeda7e 100755
--- a/src/python/dm/ds_web_service/service/impl/experimentManager.py
+++ b/src/python/dm/ds_web_service/service/impl/experimentManager.py
@@ -83,6 +83,13 @@ class ExperimentManager(Singleton):
         if os.path.exists(storageDirectory):
             self.platformUtility.addUserToGroup(username, experimentName)
 
+    def deleteUserFromGroup(self, username, experimentName):
+        experiment = self.experimentDbApi.getExperimentWithUsers(experimentName)
+        storageDirectory = self.__getExperimentStorageDataDirectory(experiment)
+        if os.path.exists(storageDirectory):
+            experimentUsers = experiment.get('experimentUsernameList', [])
+            self.platformUtility.setGroupUsers(experimentName, experimentUsers)
+
     def createExperimentGroup(self, experiment):
         experimentName = experiment.get('name')
         storageDirectory = experiment.get('storageDirectory')
@@ -98,8 +105,6 @@ class ExperimentManager(Singleton):
         experimentUsers = experiment.get('experimentUsernameList', [])
         self.logger.debug('Found experiment users: %s', experimentUsers)
         self.platformUtility.setGroupUsers(experimentName, experimentUsers)
-        #for username in experimentUsers:
-        #    self.platformUtility.addUserToGroup(username, experimentName)
       
     def updateExperimentGroupUsers(self, experiment):
         experimentName = experiment.get('name')
diff --git a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
index efcb8676..1cc0aec6 100755
--- a/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
+++ b/src/python/dm/ds_web_service/service/impl/userInfoSessionControllerImpl.py
@@ -30,3 +30,8 @@ class UserInfoSessionControllerImpl(DmObjectManager):
         ExperimentManager.getInstance().addUserToGroup(username, experimentName)
         return userInfo
 
+    def deleteUserExperimentRole(self, username, experimentName, roleName):
+        userInfo = self.userDbApi.deleteUserExperimentRole(username, experimentName, roleName)
+        ExperimentManager.getInstance().deleteUserFromGroup(username, experimentName)
+        return userInfo
+
diff --git a/src/python/dm/ds_web_service/service/userInfoSessionController.py b/src/python/dm/ds_web_service/service/userInfoSessionController.py
index 2b9849a0..533c2080 100755
--- a/src/python/dm/ds_web_service/service/userInfoSessionController.py
+++ b/src/python/dm/ds_web_service/service/userInfoSessionController.py
@@ -49,3 +49,16 @@ class UserInfoSessionController(DmSessionController):
         response = self.userInfoSessionControllerImpl.addUserExperimentRole(username, experimentName, roleName).getFullJsonRep()
         return response
 
+    @cherrypy.expose
+    @DmSessionController.require(DmSessionController.isAdministrator())
+    @DmSessionController.execute
+    def deleteUserExperimentRole(self, username, experimentName, roleName, **kwargs):
+        if not username:
+            raise InvalidRequest('Invalid username provided.')
+        if not experimentName:
+            raise InvalidRequest('Invalid experiment name provided.')
+        if not roleName:
+            raise InvalidRequest('Invalid role name provided.')
+        response = self.userInfoSessionControllerImpl.deleteUserExperimentRole(username, experimentName, roleName).getFullJsonRep()
+        return response
+
diff --git a/src/python/dm/ds_web_service/service/userRouteDescriptor.py b/src/python/dm/ds_web_service/service/userRouteDescriptor.py
index eac2dbbd..cb1e7595 100755
--- a/src/python/dm/ds_web_service/service/userRouteDescriptor.py
+++ b/src/python/dm/ds_web_service/service/userRouteDescriptor.py
@@ -55,6 +55,14 @@ class UserRouteDescriptor:
                 'method' : ['POST']
             },
 
+            # Delete user experiment role
+            {
+                'name' : 'deleteUserExperimentRole',
+                'path' : '%s/usersByExperiment/:(username)/:(experimentName)/:(roleName)' % contextRoot,
+                'controller' : userInfoSessionController,
+                'action' : 'deleteUserExperimentRole',
+                'method' : ['DELETE']
+            },
         ]
        
         return routes
-- 
GitLab