diff --git a/openstackclient/identity/v3/role.py b/openstackclient/identity/v3/role.py index 5b4ceb1da5..faff906293 100644 --- a/openstackclient/identity/v3/role.py +++ b/openstackclient/identity/v3/role.py @@ -25,6 +25,87 @@ from cliff import show from openstackclient.common import utils +class AddRole(command.Command): + """Add role command""" + + api = 'identity' + log = logging.getLogger(__name__ + '.AddRole') + + def get_parser(self, prog_name): + parser = super(AddRole, self).get_parser(prog_name) + parser.add_argument( + 'role', + metavar='<role>', + help='Name or ID of role to add', + ) + user_or_group = parser.add_mutually_exclusive_group() + user_or_group.add_argument( + '--user', + metavar='<user>', + help='Name or ID of user to assign a role', + ) + user_or_group.add_argument( + '--group', + metavar='<group>', + help='Name or ID of group to assign a role', + ) + domain_or_project = parser.add_mutually_exclusive_group() + domain_or_project.add_argument( + '--domain', + metavar='<domain>', + help='Name or ID of domain where user or group resides', + ) + domain_or_project.add_argument( + '--project', + metavar='<project>', + help='Name or ID of project where user or group resides', + ) + return parser + + def take_action(self, parsed_args): + self.log.debug('take_action(%s)' % parsed_args) + identity_client = self.app.client_manager.identity + + if (not parsed_args.user and not parsed_args.domain + and not parsed_args.group and not parsed_args.project): + sys.stdout.write("Role not updated, no arguments present \n") + return + + role_id = utils.find_resource(identity_client.roles, + parsed_args.role).id + + if (parsed_args.user and parsed_args.domain): + user = utils.find_resource(identity_client.users, + parsed_args.user) + domain = utils.find_resource(identity_client.domains, + parsed_args.domain) + identity_client.roles.grant(role_id, user=user, domain=domain) + return + elif (parsed_args.user and parsed_args.project): + user = utils.find_resource(identity_client.users, + parsed_args.user) + project = utils.find_resource(identity_client.projects, + parsed_args.project) + identity_client.roles.grant(role_id, user=user, project=project) + return + elif (parsed_args.group and parsed_args.project): + group = utils.find_resource(identity_client.group, + parsed_args.group) + project = utils.find_resource(identity_client.projects, + parsed_args.project) + identity_client.roles.grant(role_id, group=group, project=project) + return + elif (parsed_args.group and parsed_args.domain): + group = utils.find_resource(identity_client.group, + parsed_args.group) + domain = utils.find_resource(identity_client.domains, + parsed_args.domain) + identity_client.roles.grant(role_id, group=group, domain=domain) + return + else: + return + + class CreateRole(show.ShowOne): """Create new role""" diff --git a/setup.py b/setup.py index 04466a5179..d7926f0773 100644 --- a/setup.py +++ b/setup.py @@ -139,6 +139,7 @@ setuptools.setup( 'list_role=openstackclient.identity.v3.role:ListRole', 'show_role=openstackclient.identity.v3.role:ShowRole', 'set_role=openstackclient.identity.v3.role:SetRole', + 'add_role=openstackclient.identity.v3.role:AddRole', ], 'openstack.image.v2': [ 'list_image=openstackclient.image.v2.image:ListImage',