diff --git a/nova/adminclient.py b/nova/adminclient.py index 7ef3497b..3a2ce2f0 100644 --- a/nova/adminclient.py +++ b/nova/adminclient.py @@ -59,16 +59,18 @@ class UserInfo(object): class ProjectInfo(object): """ Information about a Nova project, as parsed through SAX - fields include: + Fields include: projectname description - member_ids + projectManagerId + memberIds """ - def __init__(self, connection=None, projectname=None, endpoint=None): + def __init__(self, connection=None): self.connection = connection - self.projectname = projectname - self.endpoint = endpoint + self.projectname = None + self.description = None + self.projectManagerId = None self.memberIds = [] def __repr__(self): @@ -78,11 +80,40 @@ class ProjectInfo(object): return None def endElement(self, name, value, connection): - if name == 'item': + if name == 'projectname': + self.projectname = value + elif name == 'description': + self.description = value + elif name == 'projectManagerId': + self.projectManagerId = value + elif name == 'memberId': self.memberIds.append(value) - elif name != 'memberIds': + else: setattr(self, name, str(value)) +class ProjectMember(object): + """ + Information about a Nova project member, as parsed through SAX. + Fields include: + memberId + """ + def __init__(self, connection=None): + self.connection = connection + self.memberId = None + + def __repr__(self): + return 'ProjectMember:%s' % self.memberId + + def startElement(self, name, attrs, connection): + return None + + def endElement(self, name, value, connection): + if name == 'member': + self.memberId = value + else: + setattr(self, name, str(value)) + + class HostInfo(object): """ Information about a Nova Host, as parsed through SAX: @@ -193,11 +224,16 @@ class NovaAdminClient(object): } return self.apiconn.get_status('ModifyUserRole', params) - def get_projects(self): + def get_projects(self, user=None): """ Returns a list of all projects. """ - return self.apiconn.get_list('DescribeProjects', {}, + if user: + params = {'User': user} + else: + params = {} + return self.apiconn.get_list('DescribeProjects', + params, [('item', ProjectInfo)]) def get_project(self, name): @@ -232,8 +268,27 @@ class NovaAdminClient(object): {'Name': projectname}, ProjectInfo) - def modify_project_user(self, user, project, operation='add', - **kwargs): + def get_project_members(self, name): + """ + Returns a list of members of a project. + """ + return self.apiconn.get_list('DescribeProjectMembers', + {'Name': name}, + [('item', ProjectMember)]) + + def add_project_member(self, user, project): + """ + Adds a user to a project. + """ + return self.modify_project_member(user, project, operation='add') + + def remove_project_member(self, user, project): + """ + Removes a user from a project. + """ + return self.modify_project_member(user, project, operation='remove') + + def modify_project_member(self, user, project, operation='add'): """ Adds or removes a user from a project. """ @@ -242,7 +297,7 @@ class NovaAdminClient(object): 'Project': project, 'Operation': operation } - return self.apiconn.get_status('ModifyProjectUser', params) + return self.apiconn.get_status('ModifyProjectMember', params) def get_zip(self, username): """ returns the content of a zip file containing novarc and access credentials. """ diff --git a/nova/endpoint/admin.py b/nova/endpoint/admin.py index 120396b4..db1d319f 100644 --- a/nova/endpoint/admin.py +++ b/nova/endpoint/admin.py @@ -44,7 +44,6 @@ def project_dict(project): 'projectname': project.id, 'project_manager_id': project.project_manager_id, 'description': project.description, - 'member_ids': project.member_ids } else: return {} @@ -137,10 +136,9 @@ class AdminController(object): @admin_only def describe_projects(self, context, user=None, **kwargs): """Returns all projects - should be changed to deal with a list.""" - # TODO(devcamcar): Implement filter by user. return {'projectSet': [project_dict(u) for u in - manager.AuthManager().get_projects()]} + manager.AuthManager().get_projects(user=user)]} @admin_only def register_project(self, context, name, manager_user, description=None, @@ -162,7 +160,15 @@ class AdminController(object): return True @admin_only - def modify_project_user(self, context, user, project, operation, **kwargs): + def describe_project_members(self, context, name, **kwargs): + project = manager.AuthManager().get_project(name) + result = { + 'members': [{'member': m} for m in project.member_ids] + } + return result + + @admin_only + def modify_project_member(self, context, user, project, operation, **kwargs): """Add or remove a user from a project.""" if operation =='add': manager.AuthManager().add_to_project(user, project) @@ -170,6 +176,7 @@ class AdminController(object): manager.AuthManager().remove_from_project(user, project) else: raise exception.ApiError('operation must be add or remove') + return True @admin_only def describe_hosts(self, _context, **_kwargs):