diff --git a/nova/auth/ldapdriver.py b/nova/auth/ldapdriver.py index 1591c88e..055e8332 100644 --- a/nova/auth/ldapdriver.py +++ b/nova/auth/ldapdriver.py @@ -120,10 +120,13 @@ class LdapDriver(object): '(objectclass=novaKeyPair)') return [self.__to_key_pair(uid, attr) for attr in attrs] - def get_projects(self): + def get_projects(self, uid=None): """Retrieve list of projects""" + filter = '(objectclass=novaProject)' + if uid: + filter = "(&%s(member=%s))" % (filter, self.__uid_to_dn(uid)) attrs = self.__find_objects(FLAGS.ldap_project_subtree, - '(objectclass=novaProject)') + filter) return [self.__to_project(attr) for attr in attrs] def create_user(self, name, access_key, secret_key, is_admin): diff --git a/nova/auth/manager.py b/nova/auth/manager.py index 4beb1c2f..7307f673 100644 --- a/nova/auth/manager.py +++ b/nova/auth/manager.py @@ -547,11 +547,10 @@ class AuthManager(object): if project_dict: return Project(**project_dict) - def get_projects(self): - """Retrieves list of all projects""" - # TODO(devcamcar): Implement filter by user. + def get_projects(self, user=None): + """Retrieves list of projects, optionally filtered by user""" with self.driver() as drv: - project_list = drv.get_projects() + project_list = drv.get_projects(User.safe_id(user)) if not project_list: return [] return [Project(**project_dict) for project_dict in project_list] diff --git a/nova/tests/auth_unittest.py b/nova/tests/auth_unittest.py index 0cd377b7..6f35bab4 100644 --- a/nova/tests/auth_unittest.py +++ b/nova/tests/auth_unittest.py @@ -193,9 +193,15 @@ class AuthTestCase(test.BaseTestCase): for vpn in vpns: vpn.destroy() + def test_214_can_retrieve_project_by_user(self): + project = self.manager.create_project('testproj2', 'test2', 'Another test project', ['test2']) + self.assert_(len(self.manager.get_projects()) > 1) + self.assertEqual(len(self.manager.get_projects('test2')), 1) + def test_299_can_delete_project(self): self.manager.delete_project('testproj') self.assertFalse(filter(lambda p: p.name == 'testproj', self.manager.get_projects())) + self.manager.delete_project('testproj2') def test_999_can_delete_users(self): self.manager.delete_user('test1')