bug lp:882233 Code changes to support API calls to fetch services/roles by name.

Change-Id: Iac3687940c3dac6e0d4924ff9dc7cf50d1f31e74
This commit is contained in:
Yogeshwar Srikrishnan 2011-10-26 15:09:22 -05:00
parent c18c093573
commit f09d84a0ef
7 changed files with 229 additions and 15 deletions

View File

@ -109,7 +109,8 @@
<resource id="role-service-OS-KSADM" path="OS-KSADM">
<resource id="roles" path="roles">
<method href="#listRoles"/>
<method href="#getRoleByName"/>
<method href="#listRoles"/>
<method href="#addRole"/>
<resource id="roleId" path="{roleId}">
<param name="roleId" style="template" type="xsd:string"/>
@ -120,7 +121,7 @@
<resource id="services" path="services">
<method href="#listServices"/>
<method href="#addService"/>
<method href="#getServiceByName"/>
<resource id="serviceId" path="{serviceId}">
<param name="serviceId" style="template" type="xsd:int"/>
<method href="#getService"/>
@ -348,9 +349,6 @@
<method name="POST" id="updateUser">
<doc xml:lang="EN" title="Update user">
<p xmlns="http://www.w3.org/1999/xhtml">Update a user.</p>
</doc>
<request>
<representation mediaType="application/xml" element="identity:user">
@ -679,13 +677,50 @@
&getFaults;
</method>
<method name="GET" id="getRoleByName">
<doc xml:lang="EN" title="Get Role By Name">
<p xmlns="http://www.w3.org/1999/xhtml">Get a role by Name.</p>
</doc>
<request>
<param name="name" style="query" type="xsd:string" required="true"/>
</request>
<response status="200 203">
<representation mediaType="application/xml" element="identity:role">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/role.xml"/>
</doc>
<param name="Location" type="xsd:anyURI" style="header"/>
</representation>
<representation mediaType="application/json">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/role.json"/>
</doc>
<param name="Location" type="xsd:anyURI" style="header"/>
</representation>
</response>
&commonFaults;
&postPutFaults;
&getFaults;
</method>
<method name="GET" id="getRole">
<doc xml:lang="EN" title="Get Role">
<p xmlns="http://www.w3.org/1999/xhtml">Get a role.</p>
</doc>
<response status="200 203">
<representation mediaType="application/xml" element="identity:role"/>
<representation mediaType="application/json"/>
<representation mediaType="application/xml" element="identity:role">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/role.xml"/>
</doc>
<param name="Location" type="xsd:anyURI" style="header"/>
</representation>
<representation mediaType="application/json">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/role.json"/>
</doc>
<param name="Location" type="xsd:anyURI" style="header"/>
</representation>
</response>
&commonFaults;
&postPutFaults;
@ -725,6 +760,28 @@
&commonFaults;
&getFaults;
</method>
<method name="GET" id="getServiceByName">
<doc xml:lang="EN" title="Get Service">
<p xmlns="http://www.w3.org/1999/xhtml">Get a service by name.</p>
</doc>
<request>
<param name="name" style="query" type="xsd:string" required="true"/>
</request>
<response status="200 203">
<representation mediaType="application/xml" element="OS-KSADM:service">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/service.xml"/>
</doc>
</representation>
<representation mediaType="application/json">
<doc xml:lang="EN">
<xsdxt:code href="../common/samples/service.json"/>
</doc>
</representation>
</response>
&commonFaults;
&getFaults;
</method>
<method name="GET" id="getService">
<doc xml:lang="EN" title="Get Service">
<p xmlns="http://www.w3.org/1999/xhtml">Get a service.</p>

View File

@ -25,10 +25,16 @@ class RolesController(wsgi.Controller):
@utils.wrap_error
def get_roles(self, req):
marker, limit, url = get_marker_limit_and_url(req)
roles = config.SERVICE.get_roles(
utils.get_auth_token(req), marker, limit, url)
return utils.send_result(200, req, roles)
role_name = req.GET["name"] if "name" in req.GET else None
if role_name:
tenant = config.SERVICE.get_role_by_name(
utils.get_auth_token(req), role_name)
return utils.send_result(200, req, tenant)
else:
marker, limit, url = get_marker_limit_and_url(req)
roles = config.SERVICE.get_roles(
utils.get_auth_token(req), marker, limit, url)
return utils.send_result(200, req, roles)
@utils.wrap_error
def get_role(self, req, role_id):

View File

@ -19,10 +19,16 @@ class ServicesController(wsgi.Controller):
@utils.wrap_error
def get_services(self, req):
marker, limit, url = get_marker_limit_and_url(req)
services = config.SERVICE.get_services(
utils.get_auth_token(req), marker, limit, url)
return utils.send_result(200, req, services)
service_name = req.GET["name"] if "name" in req.GET else None
if service_name:
tenant = config.SERVICE.get_service_by_name(
utils.get_auth_token(req), service_name)
return utils.send_result(200, req, tenant)
else:
marker, limit, url = get_marker_limit_and_url(req)
services = config.SERVICE.get_services(
utils.get_auth_token(req), marker, limit, url)
return utils.send_result(200, req, services)
@utils.wrap_error
def get_service(self, req, service_id):

View File

@ -739,6 +739,14 @@ class IdentityService(object):
raise fault.ItemNotFoundFault("The role could not be found")
return Role(drole.id, drole.name, drole.desc, drole.service_id)
def get_role_by_name(self, admin_token, role_name):
self.__validate_service_or_keystone_admin_token(admin_token)
drole = api.ROLE.get_by_name(role_name)
if not drole:
raise fault.ItemNotFoundFault("The role could not be found")
return Role(drole.id, drole.name, drole.desc, drole.service_id)
def delete_role(self, admin_token, role_id):
self.__validate_service_or_keystone_admin_token(admin_token)
drole = api.ROLE.get(role_id)
@ -1105,6 +1113,14 @@ class IdentityService(object):
return Service(dservice.id, dservice.name, dservice.type,
dservice.desc)
def get_service_by_name(self, admin_token, service_name):
self.__validate_service_or_keystone_admin_token(admin_token)
dservice = api.SERVICE.get_by_name(service_name)
if not dservice:
raise fault.ItemNotFoundFault("The service could not be found")
return Service(dservice.id, dservice.name, dservice.type,
dservice.desc)
def delete_service(self, admin_token, service_id):
self.__validate_service_or_keystone_admin_token(admin_token)
dservice = api.SERVICE.get(service_id)

View File

@ -329,6 +329,11 @@ class ApiTestCase(RestfulTestCase):
return self.admin_request(method='GET',
path='/OS-KSADM/roles/%s' % (role_id,), **kwargs)
def get_role_by_name(self, role_name, **kwargs):
"""GET /roles?name={role_name}"""
return self.admin_request(method='GET',
path='/OS-KSADM/roles?name=%s' % (role_name,), **kwargs)
def delete_role(self, role_id, **kwargs):
"""DELETE /roles/{role_id}"""
return self.admin_request(method='DELETE',
@ -409,6 +414,11 @@ class ApiTestCase(RestfulTestCase):
return self.admin_request(method='GET',
path='/OS-KSADM/services/%s' % (service_id,), **kwargs)
def get_service_by_name(self, service_name, **kwargs):
"""GET /services?name={service_name}"""
return self.admin_request(method='GET',
path='/OS-KSADM/services?name=%s' % (service_name,), **kwargs)
def delete_service(self, service_id, **kwargs):
"""DELETE /services/{service_id}"""
return self.admin_request(method='DELETE',
@ -725,6 +735,10 @@ class FunctionalTestCase(ApiTestCase):
role_id = optional_str(role_id)
return self.get_role(role_id, **kwargs)
def fetch_role_by_name(self, role_name=None, **kwargs):
role_name = optional_str(role_name)
return self.get_role_by_name(role_name, **kwargs)
def remove_role(self, role_id=None, **kwargs):
role_id = optional_str(role_id)
return self.delete_role(role_id, **kwargs)
@ -748,6 +762,10 @@ class FunctionalTestCase(ApiTestCase):
service_id = optional_str(service_id)
return self.get_service(service_id, **kwargs)
def fetch_service_by_name(self, service_name=None, **kwargs):
service_name = optional_str(service_name)
return self.get_service_by_name(service_name, **kwargs)
def remove_service(self, service_id=None, **kwargs):
service_id = optional_str(service_id)
self.delete_service(service_id, **kwargs)

View File

@ -226,6 +226,74 @@ class GetRoleTest(RolesTest):
'Accept': 'application/xml'})
class GetRoleByNameTest(RolesTest):
def setUp(self, *args, **kwargs):
super(GetRoleByNameTest, self).setUp(*args, **kwargs)
self.role = self.create_role().json['role']
def test_get_role(self):
role = self.fetch_role_by_name(
self.role['name'], assert_status=200).json['role']
self.assertEqual(role['id'], self.role['id'])
self.assertEqual(role['name'], self.role['name'])
self.assertEqual(role['description'], self.role['description'])
self.assertEqual(role.get('serviceId'), self.role.get('serviceId'))
def test_get_role_xml(self):
r = self.get_role_by_name(self.role['name'],
assert_status=200, headers={
'Accept': 'application/xml'})
self.assertEqual(r.xml.tag, '{%s}role' % self.xmlns)
self.assertEqual(r.xml.get('id'), self.role['id'])
self.assertEqual(r.xml.get('name'), self.role['name'])
self.assertEqual(r.xml.get('description'), self.role['description'])
self.assertEqual(r.xml.get('serviceId'), self.role.get('serviceId'))
def test_get_role_bad(self):
self.fetch_role_by_name(common.unique_str(), assert_status=404)
def test_get_role_xml_bad(self):
self.get_role_by_name(common.unique_str(), assert_status=404, headers={
'Accept': 'application/xml'})
def test_get_role_expired_token(self):
self.admin_token = self.expired_admin_token
self.fetch_role_by_name(self.role['name'], assert_status=403)
def test_get_role_xml_using_expired_token(self):
self.admin_token = self.expired_admin_token
self.get_role_by_name(self.role['name'], assert_status=403, headers={
'Accept': 'application/xml'})
def test_get_role_using_disabled_token(self):
self.admin_token = self.disabled_admin_token
self.fetch_role_by_name(self.role['name'], assert_status=403)
def test_get_role_xml_using_disabled_token(self):
self.admin_token = self.disabled_admin_token
self.get_role_by_name(self.role['name'], assert_status=403, headers={
'Accept': 'application/xml'})
def test_get_role_using_missing_token(self):
self.admin_token = ''
self.fetch_role_by_name(self.role['name'], assert_status=401)
def test_get_role_xml_using_missing_token(self):
self.admin_token = ''
self.get_role_by_name(self.role['name'], assert_status=401, headers={
'Accept': 'application/xml'})
def test_get_role_using_invalid_token(self):
self.admin_token = common.unique_str()
self.fetch_role_by_name(self.role['name'], assert_status=401)
def test_get_role_xml_using_invalid_token(self):
self.admin_token = common.unique_str()
self.get_role_by_name(self.role['name'], assert_status=401, headers={
'Accept': 'application/xml'})
class CreateRoleAssignmentTest(RolesTest):
def setUp(self, *args, **kwargs):
super(CreateRoleAssignmentTest, self).setUp(*args, **kwargs)

View File

@ -112,6 +112,49 @@ class GetServiceTest(ServicesTest):
self.fetch_service(service_id=self.service['id'], assert_status=401)
class GetServiceByNameTest(ServicesTest):
def setUp(self, *args, **kwargs):
super(GetServiceByNameTest, self).setUp(*args, **kwargs)
self.service = self.create_service().json['OS-KSADM:service']
def test_service_get_json(self):
service = self.fetch_service_by_name(service_name=self.service['name'],
assert_status=200).json['OS-KSADM:service']
self.assertIsNotNone(service['id'])
self.assertIsNotNone(service['name'])
self.assertIsNotNone(service['description'])
def test_service_get_xml(self):
service = self.fetch_service_by_name(service_name=self.service['name'],
assert_status=200, headers={'Accept': 'application/xml'}).xml
self.assertEqual(service.tag, '{%s}service' % self.xmlns_ksadm)
self.assertIsNotNone(service.get('id'))
self.assertIsNotNone(service.get('name'))
self.assertIsNotNone(service.get('description'))
def test_get_service_using_disabled_token(self):
self.admin_token = self.disabled_admin_token
self.fetch_service_by_name(
service_name=self.service['name'], assert_status=403)
def test_get_service_using_missing_token(self):
self.admin_token = ''
self.fetch_service_by_name(
service_name=self.service['name'], assert_status=401)
def test_get_service_using_expired_token(self):
self.admin_token = self.expired_admin_token
self.fetch_service_by_name(
service_name=self.service['name'], assert_status=403)
def test_get_service_using_invalid_token(self):
self.admin_token = common.unique_str()
self.fetch_service_by_name(
service_name=self.service['name'], assert_status=401)
class CreateServiceTest(ServicesTest):
def test_service_create_json(self):
name = common.unique_str()