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