From bc9de4abb5d84c58d90176b53a15ed9649a9d83f Mon Sep 17 00:00:00 2001 From: wanghong Date: Thu, 26 Dec 2013 11:53:40 +0800 Subject: [PATCH] V3 xml responses should use v3 namespace. Currently, all v3 xml responses use v2 namespace, But v2 and v3 are incompatible. This change will fix it. Change-Id: I5818bb0a268ae0e48263d5ea5795fdebeae9c388 Closes-Bug: #1195813 --- etc/keystone-paste.ini | 12 +++++++++--- keystone/middleware/core.py | 19 ++++++++++++++++++- keystone/tests/test_versions.py | 3 ++- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/etc/keystone-paste.ini b/etc/keystone-paste.ini index 71de7d40a..cd1329716 100644 --- a/etc/keystone-paste.ini +++ b/etc/keystone-paste.ini @@ -15,6 +15,12 @@ paste.filter_factory = keystone.middleware:AdminTokenAuthMiddleware.factory [filter:xml_body] paste.filter_factory = keystone.middleware:XmlBodyMiddleware.factory +[filter:xml_body_v2] +paste.filter_factory = keystone.middleware:XmlBodyMiddlewareV2.factory + +[filter:xml_body_v3] +paste.filter_factory = keystone.middleware:XmlBodyMiddlewareV3.factory + [filter:json_body] paste.filter_factory = keystone.middleware:JsonBodyMiddleware.factory @@ -73,13 +79,13 @@ paste.app_factory = keystone.service:v3_app_factory paste.app_factory = keystone.service:admin_app_factory [pipeline:public_api] -pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension user_crud_extension public_service +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body_v2 json_body ec2_extension user_crud_extension public_service [pipeline:admin_api] -pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension s3_extension crud_extension admin_service +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body_v2 json_body ec2_extension s3_extension crud_extension admin_service [pipeline:api_v3] -pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body json_body ec2_extension_v3 s3_extension simple_cert_extension service_v3 +pipeline = sizelimit url_normalize build_auth_context token_auth admin_token_auth xml_body_v3 json_body ec2_extension_v3 s3_extension simple_cert_extension service_v3 [app:public_version_service] paste.app_factory = keystone.service:public_version_app_factory diff --git a/keystone/middleware/core.py b/keystone/middleware/core.py index dbd9933aa..997ae985a 100644 --- a/keystone/middleware/core.py +++ b/keystone/middleware/core.py @@ -151,6 +151,7 @@ class XmlBodyMiddleware(wsgi.Middleware): remove_in=+2) def __init__(self, *args, **kwargs): super(XmlBodyMiddleware, self).__init__(*args, **kwargs) + self.xmlns = None def process_request(self, request): """Transform the request from XML to JSON.""" @@ -173,13 +174,29 @@ class XmlBodyMiddleware(wsgi.Middleware): response.content_type = 'application/xml' try: body_obj = jsonutils.loads(response.body) - response.body = serializer.to_xml(body_obj) + response.body = serializer.to_xml(body_obj, xmlns=self.xmlns) except Exception: LOG.exception('Serializer failed') raise exception.Error(message=response.body) return response +class XmlBodyMiddlewareV2(XmlBodyMiddleware): + """De/serializes XML to/from JSON for v2.0 API.""" + + def __init__(self, *args, **kwargs): + super(XmlBodyMiddlewareV2, self).__init__(*args, **kwargs) + self.xmlns = 'http://docs.openstack.org/identity/api/v2.0' + + +class XmlBodyMiddlewareV3(XmlBodyMiddleware): + """De/serializes XML to/from JSON for v3 API.""" + + def __init__(self, *args, **kwargs): + super(XmlBodyMiddlewareV3, self).__init__(*args, **kwargs) + self.xmlns = 'http://docs.openstack.org/identity/api/v3' + + class NormalizingFilter(wsgi.Middleware): """Middleware filter to handle URL normalization.""" diff --git a/keystone/tests/test_versions.py b/keystone/tests/test_versions.py index 1e8ed4f57..7058585ff 100644 --- a/keystone/tests/test_versions.py +++ b/keystone/tests/test_versions.py @@ -268,6 +268,7 @@ class XmlVersionTestCase(tests.TestCase): DOC_INTRO = '' XML_NAMESPACE_ATTR = 'xmlns="http://docs.openstack.org/identity/api/v2.0"' + XML_NAMESPACE_V3 = 'xmlns="http://docs.openstack.org/identity/api/v3"' v2_VERSION_DATA = """ """ v3_VERSION_RESPONSE = ((DOC_INTRO + v3_VERSION_DATA) % - dict(v3_namespace=XML_NAMESPACE_ATTR)) + dict(v3_namespace=XML_NAMESPACE_V3)) VERSIONS_RESPONSE = ((DOC_INTRO + """