diff --git a/neutron/api/extensions.py b/neutron/api/extensions.py index 9c825cbd50..fe075df5af 100644 --- a/neutron/api/extensions.py +++ b/neutron/api/extensions.py @@ -25,7 +25,6 @@ import six import webob.dec import webob.exc -from neutron.api.v2 import attributes from neutron.common import exceptions import neutron.extensions from neutron import manager @@ -479,19 +478,9 @@ class ExtensionManager(object): attr_map[resource].update(resource_attrs) else: attr_map[resource] = resource_attrs - if extended_attrs: - attributes.EXT_NSES[ext.get_alias()] = ( - ext.get_namespace()) except AttributeError: LOG.exception(_("Error fetching extended attributes for " "extension '%s'"), ext.get_name()) - try: - comp_map = ext.get_alias_namespace_compatibility_map() - attributes.EXT_NSES_BC.update(comp_map) - except AttributeError: - LOG.info(_("Extension '%s' provides no backward " - "compatibility map for extended attributes"), - ext.get_name()) processed_exts.add(ext_name) del exts_to_process[ext_name] if len(processed_exts) == processed_ext_count: diff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py index 83471f946e..2292dba12c 100644 --- a/neutron/api/v2/attributes.py +++ b/neutron/api/v2/attributes.py @@ -762,16 +762,3 @@ PLURALS = {NETWORKS: NETWORK, 'allocation_pools': 'allocation_pool', 'fixed_ips': 'fixed_ip', 'extensions': 'extension'} -EXT_NSES = {} - -# Namespaces to be added for backward compatibility -# when existing extended resource attributes are -# provided by other extension than original one. -EXT_NSES_BC = {} - - -def get_attr_metadata(): - return {'plurals': PLURALS, - 'xmlns': constants.XML_NS_V20, - constants.EXT_NS: EXT_NSES, - constants.EXT_NS_COMP: EXT_NSES_BC} diff --git a/neutron/api/v2/resource.py b/neutron/api/v2/resource.py index d65a95d1c4..273930da7d 100644 --- a/neutron/api/v2/resource.py +++ b/neutron/api/v2/resource.py @@ -24,7 +24,6 @@ import six import webob.dec import webob.exc -from neutron.api.v2 import attributes from neutron.common import exceptions from neutron.openstack.common import gettextutils from neutron.openstack.common import log as logging @@ -42,14 +41,9 @@ def Resource(controller, faults=None, deserializers=None, serializers=None): """Represents an API entity resource and the associated serialization and deserialization logic """ - xml_deserializer = wsgi.XMLDeserializer(attributes.get_attr_metadata()) - default_deserializers = {'application/xml': xml_deserializer, - 'application/json': wsgi.JSONDeserializer()} - xml_serializer = wsgi.XMLDictSerializer(attributes.get_attr_metadata()) - default_serializers = {'application/xml': xml_serializer, - 'application/json': wsgi.JSONDictSerializer()} - format_types = {'xml': 'application/xml', - 'json': 'application/json'} + default_deserializers = {'application/json': wsgi.JSONDeserializer()} + default_serializers = {'application/json': wsgi.JSONDictSerializer()} + format_types = {'json': 'application/json'} action_status = dict(create=201, delete=204) default_deserializers.update(deserializers or {}) diff --git a/neutron/api/v2/router.py b/neutron/api/v2/router.py index f1b5787d9d..85790d44bc 100644 --- a/neutron/api/v2/router.py +++ b/neutron/api/v2/router.py @@ -36,7 +36,7 @@ RESOURCES = {'network': 'networks', SUB_RESOURCES = {} COLLECTION_ACTIONS = ['index', 'create'] MEMBER_ACTIONS = ['show', 'update', 'delete'] -REQUIREMENTS = {'id': attributes.UUID_PATTERN, 'format': 'xml|json'} +REQUIREMENTS = {'id': attributes.UUID_PATTERN, 'format': 'json'} class Index(wsgi.Application): @@ -45,9 +45,7 @@ class Index(wsgi.Application): @webob.dec.wsgify(RequestClass=wsgi.Request) def __call__(self, req): - metadata = {'application/xml': {'attributes': { - 'resource': ['name', 'collection'], - 'link': ['href', 'rel']}}} + metadata = {} layout = [] for name, collection in self.resources.iteritems(): diff --git a/neutron/api/versions.py b/neutron/api/versions.py index cdfa1e081b..814c20778a 100644 --- a/neutron/api/versions.py +++ b/neutron/api/versions.py @@ -49,14 +49,7 @@ class Versions(object): builder = versions_view.get_view_builder(req) versions = [builder.build(version) for version in version_objs] response = dict(versions=versions) - metadata = { - "application/xml": { - "attributes": { - "version": ["status", "id"], - "link": ["rel", "href"], - } - } - } + metadata = {} content_type = req.best_match_content_type() body = (wsgi.Serializer(metadata=metadata). diff --git a/neutron/common/constants.py b/neutron/common/constants.py index 59066903b1..e424450d25 100644 --- a/neutron/common/constants.py +++ b/neutron/common/constants.py @@ -72,19 +72,6 @@ MAX_VXLAN_VNI = 2 ** 24 - 1 FLOODING_ENTRY = ['00:00:00:00:00:00', '0.0.0.0'] -EXT_NS_COMP = '_backward_comp_e_ns' -EXT_NS = '_extension_ns' -XML_NS_V20 = 'http://openstack.org/quantum/api/v2.0' -XSI_NAMESPACE = "http://www.w3.org/2001/XMLSchema-instance" -XSI_ATTR = "xsi:nil" -XSI_NIL_ATTR = "xmlns:xsi" -ATOM_NAMESPACE = "http://www.w3.org/2005/Atom" -ATOM_XMLNS = "xmlns:atom" -ATOM_LINK_NOTATION = "{%s}link" % ATOM_NAMESPACE -TYPE_XMLNS = "xmlns:quantum" -TYPE_ATTR = "quantum:type" -VIRTUAL_ROOT_KEY = "_v_root" - TYPE_BOOL = "bool" TYPE_INT = "int" TYPE_LONG = "long" diff --git a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py index 23c8f6fb5c..b926b76be5 100644 --- a/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py +++ b/neutron/tests/unit/cisco/l3/test_l3_router_appliance_plugin.py @@ -203,10 +203,6 @@ class L3RouterApplianceVMTestCase( 'neutron.db.l3_db.L3_NAT_dbonly_mixin._check_and_get_fip_assoc') -class L3RouterApplianceVMTestCaseXML(L3RouterApplianceVMTestCase): - fmt = 'xml' - - class CfgAgentRouterApplianceVMTestCase(L3RouterApplianceTestCaseBase, test_l3_plugin.L3AgentDbTestCaseBase): diff --git a/neutron/tests/unit/db/firewall/test_db_firewall.py b/neutron/tests/unit/db/firewall/test_db_firewall.py index efd9936693..64f2365071 100644 --- a/neutron/tests/unit/db/firewall/test_db_firewall.py +++ b/neutron/tests/unit/db/firewall/test_db_firewall.py @@ -1237,7 +1237,3 @@ class TestFirewallDBPlugin(FirewallPluginDbTestCase): expected_code=webob.exc.HTTPNotFound.code, expected_body=None, body_data={'firewall_rule_id': None}) - - -class TestFirewallDBPluginXML(TestFirewallDBPlugin): - fmt = 'xml' diff --git a/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py b/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py index 68aa517ae6..e3f3a3d8cf 100644 --- a/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py +++ b/neutron/tests/unit/db/loadbalancer/test_db_loadbalancer.py @@ -1584,7 +1584,3 @@ class TestLoadBalancer(LoadBalancerPluginDbTestCase): SystemExit, loadbalancer_plugin.LoadBalancerPlugin ) - - -class TestLoadBalancerXML(TestLoadBalancer): - fmt = 'xml' diff --git a/neutron/tests/unit/db/metering/test_db_metering.py b/neutron/tests/unit/db/metering/test_db_metering.py index 1e1ca985bc..40dab4d54a 100644 --- a/neutron/tests/unit/db/metering/test_db_metering.py +++ b/neutron/tests/unit/db/metering/test_db_metering.py @@ -294,7 +294,3 @@ class TestMetering(MeteringPluginDbTestCase): self._test_list_resources('metering-label-rule', metering_label_rule) - - -class TestMeteringDbXML(TestMetering): - fmt = 'xml' diff --git a/neutron/tests/unit/db/vpn/test_db_vpnaas.py b/neutron/tests/unit/db/vpn/test_db_vpnaas.py index 6f641df6d1..4859b39509 100644 --- a/neutron/tests/unit/db/vpn/test_db_vpnaas.py +++ b/neutron/tests/unit/db/vpn/test_db_vpnaas.py @@ -1596,7 +1596,3 @@ class TestVpnaas(VPNPluginDbTestCase): ) delete_res = delete_req.get_response(self.ext_api) self.assertEqual(409, delete_res.status_int) - - -class TestVpnaasXML(TestVpnaas): - fmt = 'xml' diff --git a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py index 2f355f6a37..38b60b8ef9 100644 --- a/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py +++ b/neutron/tests/unit/ml2/drivers/cisco/nexus/test_cisco_mech.py @@ -752,15 +752,3 @@ class TestCiscoSubnetsV2(CiscoML2MechanismTestCase, res, 'subnets', wexc.HTTPInternalServerError.code) - - -class TestCiscoPortsV2XML(TestCiscoPortsV2): - fmt = 'xml' - - -class TestCiscoNetworksV2XML(TestCiscoNetworksV2): - fmt = 'xml' - - -class TestCiscoSubnetsV2XML(TestCiscoSubnetsV2): - fmt = 'xml' diff --git a/neutron/tests/unit/ml2/test_security_group.py b/neutron/tests/unit/ml2/test_security_group.py index 39c3cc2bae..5fa8063f3f 100644 --- a/neutron/tests/unit/ml2/test_security_group.py +++ b/neutron/tests/unit/ml2/test_security_group.py @@ -89,17 +89,7 @@ class TestMl2SecurityGroups(Ml2SecurityGroupsTestCase, self.assertIsNone(port_dict) -class TestMl2SecurityGroupsXML(TestMl2SecurityGroups): - fmt = 'xml' - - class TestMl2SGServerRpcCallBack( Ml2SecurityGroupsTestCase, test_sg_rpc.SGServerRpcCallBackTestCase): pass - - -class TestMl2SGServerRpcCallBackXML( - Ml2SecurityGroupsTestCase, - test_sg_rpc.SGServerRpcCallBackTestCaseXML): - pass diff --git a/neutron/tests/unit/mlnx/test_mlnx_security_group.py b/neutron/tests/unit/mlnx/test_mlnx_security_group.py index 347de62c87..fc303d99c1 100644 --- a/neutron/tests/unit/mlnx/test_mlnx_security_group.py +++ b/neutron/tests/unit/mlnx/test_mlnx_security_group.py @@ -56,10 +56,6 @@ class TestMlnxSecurityGroups(MlnxSecurityGroupsTestCase, pass -class TestMlnxSecurityGroupsXML(TestMlnxSecurityGroups): - fmt = 'xml' - - class TestMlnxSecurityGroupsDB(MlnxSecurityGroupsTestCase): def test_security_group_get_port_from_device(self): with self.network() as n: @@ -94,7 +90,3 @@ class TestMlnxSecurityGroupsDB(MlnxSecurityGroupsTestCase): def test_security_group_get_port_from_device_with_no_port(self): port_dict = mlnx_db.get_port_from_device('bad_device_id') self.assertIsNone(port_dict) - - -class TestMlnxSecurityGroupsDBXML(TestMlnxSecurityGroupsDB): - fmt = 'xml' diff --git a/neutron/tests/unit/nec/test_security_group.py b/neutron/tests/unit/nec/test_security_group.py index 1d961fa650..2b29b59da1 100644 --- a/neutron/tests/unit/nec/test_security_group.py +++ b/neutron/tests/unit/nec/test_security_group.py @@ -56,12 +56,6 @@ class TestNecSGServerRpcCallBack( pass -class TestNecSGServerRpcCallBackXML( - test_sg_rpc.SGServerRpcCallBackTestCaseXML, - NecSecurityGroupsTestCase): - pass - - class TestNecSecurityGroups(NecSecurityGroupsTestCase, test_sg.TestSecurityGroups, test_sg_rpc.SGNotificationTestMixin): @@ -92,7 +86,3 @@ class TestNecSecurityGroups(NecSecurityGroupsTestCase, self.assertEqual([fixed_ips[0]['ip_address']], port_dict['fixed_ips']) self._delete('ports', port_id) - - -class TestNecSecurityGroupsXML(TestNecSecurityGroups): - fmt = 'xml' diff --git a/neutron/tests/unit/oneconvergence/test_security_group.py b/neutron/tests/unit/oneconvergence/test_security_group.py index f3be849973..db245509ab 100644 --- a/neutron/tests/unit/oneconvergence/test_security_group.py +++ b/neutron/tests/unit/oneconvergence/test_security_group.py @@ -70,12 +70,6 @@ class TestOneConvergenceSGServerRpcCallBack( pass -class TestOneConvergenceSGServerRpcCallBackXML( - OneConvergenceSecurityGroupsTestCase, - test_sg_rpc.SGServerRpcCallBackTestCaseXML): - pass - - class TestOneConvergenceSecurityGroups(OneConvergenceSecurityGroupsTestCase, test_sg.TestSecurityGroups, test_sg_rpc.SGNotificationTestMixin): @@ -113,7 +107,3 @@ class TestOneConvergenceSecurityGroups(OneConvergenceSecurityGroupsTestCase, plugin = manager.NeutronManager.get_plugin() port_dict = plugin.get_port_from_device('bad_device_id') self.assertIsNone(port_dict) - - -class TestOneConvergenceSecurityGroupsXML(TestOneConvergenceSecurityGroups): - fmt = 'xml' diff --git a/neutron/tests/unit/openvswitch/test_agent_scheduler.py b/neutron/tests/unit/openvswitch/test_agent_scheduler.py index 0fdf9fdbe1..7bd18da1b5 100644 --- a/neutron/tests/unit/openvswitch/test_agent_scheduler.py +++ b/neutron/tests/unit/openvswitch/test_agent_scheduler.py @@ -1413,7 +1413,3 @@ class OvsL3AgentNotifierTestCase(test_l3_plugin.L3NatTestCaseMixin, mock.ANY, l3_notifier.make_msg( 'agent_updated', payload={'admin_state_up': False}), topic='l3_agent.hosta') - - -class OvsAgentSchedulerTestCaseXML(OvsAgentSchedulerTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/plumgrid/extensions/test_securitygroups.py b/neutron/tests/unit/plumgrid/extensions/test_securitygroups.py index 702549d6d5..482c1b06bb 100644 --- a/neutron/tests/unit/plumgrid/extensions/test_securitygroups.py +++ b/neutron/tests/unit/plumgrid/extensions/test_securitygroups.py @@ -60,8 +60,3 @@ class SecurityGroupsTestCase(ext_sg.SecurityGroupDBTestCase): class TestSecurityGroups(ext_sg.TestSecurityGroups, SecurityGroupsTestCase): pass - - -class TestSecurityGroupsXML(TestSecurityGroups): - - fmt = 'xml' diff --git a/neutron/tests/unit/ryu/test_ryu_security_group.py b/neutron/tests/unit/ryu/test_ryu_security_group.py index 8939c79b06..5a8656542a 100644 --- a/neutron/tests/unit/ryu/test_ryu_security_group.py +++ b/neutron/tests/unit/ryu/test_ryu_security_group.py @@ -84,7 +84,3 @@ class TestRyuSecurityGroups(RyuSecurityGroupsTestCase, plugin = manager.NeutronManager.get_plugin() port_dict = plugin.get_port_from_device('bad_device_id') self.assertIsNone(port_dict) - - -class TestRyuSecurityGroupsXML(TestRyuSecurityGroups): - fmt = 'xml' diff --git a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py index 7d083922f6..a08bca63a4 100644 --- a/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py +++ b/neutron/tests/unit/services/loadbalancer/test_agent_scheduler.py @@ -215,7 +215,3 @@ class LBaaSAgentSchedulerTestCase(test_agent_ext_plugin.AgentDBTestMixIn, 'fake_id', expected_code=exc.HTTPForbidden.code, admin_context=False) - - -class LBaaSAgentSchedulerTestCaseXML(LBaaSAgentSchedulerTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/services/loadbalancer/test_loadbalancer_plugin.py b/neutron/tests/unit/services/loadbalancer/test_loadbalancer_plugin.py index b2da02d3cd..8619b98dd5 100644 --- a/neutron/tests/unit/services/loadbalancer/test_loadbalancer_plugin.py +++ b/neutron/tests/unit/services/loadbalancer/test_loadbalancer_plugin.py @@ -456,7 +456,3 @@ class LoadBalancerExtensionTestCase(test_api_v2_extension.ExtensionTestCase): instance.delete_pool_health_monitor.assert_called_with( mock.ANY, health_monitor_id, pool_id='id1') self.assertEqual(res.status_int, exc.HTTPNoContent.code) - - -class LoadBalancerExtensionTestCaseXML(LoadBalancerExtensionTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/services/loadbalancer/test_loadbalancer_quota_ext.py b/neutron/tests/unit/services/loadbalancer/test_loadbalancer_quota_ext.py index e319a1d904..7edbdbb28c 100644 --- a/neutron/tests/unit/services/loadbalancer/test_loadbalancer_quota_ext.py +++ b/neutron/tests/unit/services/loadbalancer/test_loadbalancer_quota_ext.py @@ -127,10 +127,6 @@ class LBaaSQuotaExtensionDbTestCase(LBaaSQuotaExtensionTestCase): self.assertEqual(-1, quota['quota']['health_monitor']) -class LBaaSQuotaExtensionDbTestCaseXML(LBaaSQuotaExtensionDbTestCase): - fmt = 'xml' - - class LBaaSQuotaExtensionCfgTestCase( LBaaSQuotaExtensionTestCase): @@ -160,7 +156,3 @@ class LBaaSQuotaExtensionCfgTestCase( self.serialize(quotas), expect_errors=True) self.assertEqual(403, res.status_int) - - -class LBaaSQuotaExtensionCfgTestCaseXML(LBaaSQuotaExtensionCfgTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/services/vpn/test_vpnaas_extension.py b/neutron/tests/unit/services/vpn/test_vpnaas_extension.py index 1053061d96..f4f25916e9 100644 --- a/neutron/tests/unit/services/vpn/test_vpnaas_extension.py +++ b/neutron/tests/unit/services/vpn/test_vpnaas_extension.py @@ -520,7 +520,3 @@ class VpnaasExtensionTestCase(test_api_v2_extension.ExtensionTestCase): def test_ipsec_site_connection_delete(self): """Test case to delete a ipsec_site_connection.""" self._test_entity_delete('ipsec_site_connection') - - -class VpnaasExtensionTestCaseXML(VpnaasExtensionTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_agent_ext_plugin.py b/neutron/tests/unit/test_agent_ext_plugin.py index ddbf4f02e9..40525f9111 100644 --- a/neutron/tests/unit/test_agent_ext_plugin.py +++ b/neutron/tests/unit/test_agent_ext_plugin.py @@ -251,7 +251,3 @@ class AgentDBTestCase(AgentDBTestMixIn, agents = self._list_agents( query_string='binary=neutron-l3-agent&host=' + L3_HOSTB) self.assertFalse(agents['agents'][0]['alive']) - - -class AgentDBTestCaseXML(AgentDBTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_api_v2.py b/neutron/tests/unit/test_api_v2.py index c38cbaa42f..c52f937ff0 100644 --- a/neutron/tests/unit/test_api_v2.py +++ b/neutron/tests/unit/test_api_v2.py @@ -1196,10 +1196,6 @@ class SubresourceTest(base.BaseTestCase, testlib_plugin.PluginSetupHelper): # Note: since all resources use the same controller and validation # logic, we actually get really good coverage from testing just networks. -class XMLV2TestCase(JSONV2TestCase): - fmt = 'xml' - - class V2Views(base.BaseTestCase): def _view(self, keys, collection, resource): data = dict((key, 'value') for key in keys) diff --git a/neutron/tests/unit/test_api_v2_resource.py b/neutron/tests/unit/test_api_v2_resource.py index 91e24de711..223b05267a 100644 --- a/neutron/tests/unit/test_api_v2_resource.py +++ b/neutron/tests/unit/test_api_v2_resource.py @@ -42,16 +42,15 @@ class RequestTestCase(base.BaseTestCase): self.assertEqual(result, "application/json") def test_content_type_from_accept(self): - for content_type in ('application/xml', - 'application/json'): - request = wsgi.Request.blank('/tests/123') - request.headers["Accept"] = content_type - result = request.best_match_content_type() - self.assertEqual(result, content_type) + content_type = 'application/json' + request = wsgi.Request.blank('/tests/123') + request.headers["Accept"] = content_type + result = request.best_match_content_type() + self.assertEqual(result, content_type) def test_content_type_from_accept_best(self): request = wsgi.Request.blank('/tests/123') - request.headers["Accept"] = "application/xml, application/json" + request.headers["Accept"] = "application/json" result = request.best_match_content_type() self.assertEqual(result, "application/json") @@ -59,13 +58,9 @@ class RequestTestCase(base.BaseTestCase): request.headers["Accept"] = ("application/json; q=0.3, " "application/xml; q=0.9") result = request.best_match_content_type() - self.assertEqual(result, "application/xml") + self.assertEqual(result, "application/json") def test_content_type_from_query_extension(self): - request = wsgi.Request.blank('/tests/123.xml') - result = request.best_match_content_type() - self.assertEqual(result, "application/xml") - request = wsgi.Request.blank('/tests/123.json') result = request.best_match_content_type() self.assertEqual(result, "application/json") @@ -75,10 +70,10 @@ class RequestTestCase(base.BaseTestCase): self.assertEqual(result, "application/json") def test_content_type_accept_and_query_extension(self): - request = wsgi.Request.blank('/tests/123.xml') - request.headers["Accept"] = "application/json" + request = wsgi.Request.blank('/tests/123.json') + request.headers["Accept"] = "application/xml" result = request.best_match_content_type() - self.assertEqual(result, "application/xml") + self.assertEqual(result, "application/json") def test_content_type_accept_default(self): request = wsgi.Request.blank('/tests/123.unsupported') @@ -121,10 +116,7 @@ class ResourceTestCase(base.BaseTestCase): @staticmethod def _get_deserializer(req_format): - if req_format == 'json': - return wsgi.JSONDeserializer() - else: - return wsgi.XMLDeserializer() + return wsgi.JSONDeserializer() def test_unmapped_neutron_error_with_json(self): msg = u'\u7f51\u7edc' @@ -148,28 +140,6 @@ class ResourceTestCase(base.BaseTestCase): self.assertEqual(wsgi.JSONDeserializer().deserialize(res.body), expected_res) - def test_unmapped_neutron_error_with_xml(self): - msg = u'\u7f51\u7edc' - - class TestException(n_exc.NeutronException): - message = msg - expected_res = {'body': { - 'NeutronError': { - 'type': 'TestException', - 'message': msg, - 'detail': ''}}} - controller = mock.MagicMock() - controller.test.side_effect = TestException() - - resource = webtest.TestApp(wsgi_resource.Resource(controller)) - - environ = {'wsgiorg.routing_args': (None, {'action': 'test', - 'format': 'xml'})} - res = resource.get('', extra_environ=environ, expect_errors=True) - self.assertEqual(res.status_int, exc.HTTPInternalServerError.code) - self.assertEqual(wsgi.XMLDeserializer().deserialize(res.body), - expected_res) - @mock.patch('neutron.openstack.common.gettextutils.translate') def test_unmapped_neutron_error_localized(self, mock_translation): gettextutils.install('blaa', lazy=True) @@ -216,30 +186,6 @@ class ResourceTestCase(base.BaseTestCase): self.assertEqual(wsgi.JSONDeserializer().deserialize(res.body), expected_res) - def test_mapped_neutron_error_with_xml(self): - msg = u'\u7f51\u7edc' - - class TestException(n_exc.NeutronException): - message = msg - expected_res = {'body': { - 'NeutronError': { - 'type': 'TestException', - 'message': msg, - 'detail': ''}}} - controller = mock.MagicMock() - controller.test.side_effect = TestException() - - faults = {TestException: exc.HTTPGatewayTimeout} - resource = webtest.TestApp(wsgi_resource.Resource(controller, - faults=faults)) - - environ = {'wsgiorg.routing_args': (None, {'action': 'test', - 'format': 'xml'})} - res = resource.get('', extra_environ=environ, expect_errors=True) - self.assertEqual(res.status_int, exc.HTTPGatewayTimeout.code) - self.assertEqual(wsgi.XMLDeserializer().deserialize(res.body), - expected_res) - @mock.patch('neutron.openstack.common.gettextutils.translate') def test_mapped_neutron_error_localized(self, mock_translation): gettextutils.install('blaa', lazy=True) @@ -308,9 +254,6 @@ class ResourceTestCase(base.BaseTestCase): def test_unhandled_error_with_json(self): self._test_unhandled_error() - def test_unhandled_error_with_xml(self): - self._test_unhandled_error(req_format='xml') - def _test_not_implemented_error(self, req_format='json'): expected_res = {'body': {'NeutronError': {'detail': '', @@ -330,9 +273,6 @@ class ResourceTestCase(base.BaseTestCase): def test_not_implemented_error_with_json(self): self._test_not_implemented_error() - def test_not_implemented_error_with_xml(self): - self._test_not_implemented_error(req_format='xml') - def test_status_200(self): controller = mock.MagicMock() controller.test = lambda request: {'foo': 'bar'} diff --git a/neutron/tests/unit/test_db_plugin.py b/neutron/tests/unit/test_db_plugin.py index b4ff7f5835..25099173b9 100644 --- a/neutron/tests/unit/test_db_plugin.py +++ b/neutron/tests/unit/test_db_plugin.py @@ -4061,23 +4061,3 @@ class NeutronDbPluginV2AsMixinTestCase(testlib_api.SqlTestCase): self.net_data['network']['status'] = 'BUILD' net = self.plugin.create_network(self.context, self.net_data) self.assertEqual(net['status'], 'BUILD') - - -class TestBasicGetXML(TestBasicGet): - fmt = 'xml' - - -class TestNetworksV2XML(TestNetworksV2): - fmt = 'xml' - - -class TestPortsV2XML(TestPortsV2): - fmt = 'xml' - - -class TestSubnetsV2XML(TestSubnetsV2): - fmt = 'xml' - - -class TestV2HTTPResponseXML(TestV2HTTPResponse): - fmt = 'xml' diff --git a/neutron/tests/unit/test_extension_allowedaddresspairs.py b/neutron/tests/unit/test_extension_allowedaddresspairs.py index bcaa11b0f3..a4cd042e9c 100644 --- a/neutron/tests/unit/test_extension_allowedaddresspairs.py +++ b/neutron/tests/unit/test_extension_allowedaddresspairs.py @@ -282,7 +282,3 @@ class TestAllowedAddressPairs(AllowedAddressPairDBTestCase): port = self.deserialize(self.fmt, req.get_response(self.api)) self.assertEqual(port['port'][addr_pair.ADDRESS_PAIRS], []) self._delete('ports', port['port']['id']) - - -class TestAllowedAddressPairsXML(TestAllowedAddressPairs): - fmt = 'xml' diff --git a/neutron/tests/unit/test_extension_ext_net.py b/neutron/tests/unit/test_extension_ext_net.py index c25bf91794..9f03e38d51 100644 --- a/neutron/tests/unit/test_extension_ext_net.py +++ b/neutron/tests/unit/test_extension_ext_net.py @@ -180,7 +180,3 @@ class ExtNetDBTestCase(test_db_plugin.NeutronDbPluginV2TestCase): self.assertEqual(res.status_int, exc.HTTPNoContent.code) (l3_mock.delete_disassociated_floatingips .assert_called_once_with(mock.ANY, net['network']['id'])) - - -class ExtNetDBTestCaseXML(ExtNetDBTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_extension_extraroute.py b/neutron/tests/unit/test_extension_extraroute.py index dad220370f..d921f65d96 100644 --- a/neutron/tests/unit/test_extension_extraroute.py +++ b/neutron/tests/unit/test_extension_extraroute.py @@ -469,10 +469,6 @@ class ExtraRouteDBIntTestCase(test_l3.L3NatDBIntTestCase, self.setup_notification_driver() -class ExtraRouteDBIntTestCaseXML(ExtraRouteDBIntTestCase): - fmt = 'xml' - - class ExtraRouteDBSepTestCase(test_l3.L3NatDBSepTestCase, ExtraRouteDBTestCaseBase): def setUp(self): @@ -492,7 +488,3 @@ class ExtraRouteDBSepTestCase(test_l3.L3NatDBSepTestCase, service_plugins=service_plugins) self.setup_notification_driver() - - -class ExtraRouteDBSepTestCaseXML(ExtraRouteDBSepTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_extension_firewall.py b/neutron/tests/unit/test_extension_firewall.py index a986b029f0..6771c63394 100644 --- a/neutron/tests/unit/test_extension_firewall.py +++ b/neutron/tests/unit/test_extension_firewall.py @@ -372,10 +372,6 @@ class FirewallExtensionTestCase(test_api_v2_extension.ExtensionTestCase): self.assertEqual(res, return_value) -class FirewallExtensionTestCaseXML(FirewallExtensionTestCase): - fmt = 'xml' - - class TestFirewallAttributeValidators(base.BaseTestCase): def test_validate_port_range(self): diff --git a/neutron/tests/unit/test_extension_security_group.py b/neutron/tests/unit/test_extension_security_group.py index 4f52ba0807..8643240f7a 100644 --- a/neutron/tests/unit/test_extension_security_group.py +++ b/neutron/tests/unit/test_extension_security_group.py @@ -168,10 +168,6 @@ class SecurityGroupsTestCase(test_db_plugin.NeutronDbPluginV2TestCase): self.assertEqual(security_group_rule[k], v) -class SecurityGroupsTestCaseXML(SecurityGroupsTestCase): - fmt = 'xml' - - class SecurityGroupTestPlugin(db_base_plugin_v2.NeutronDbPluginV2, securitygroups_db.SecurityGroupDbMixin): """Test plugin that implements necessary calls on create/delete port for @@ -1445,7 +1441,3 @@ class TestConvertProtocol(base.BaseTestCase): for val in ['bad', '256', '-1']: self.assertRaises(ext_sg.SecurityGroupRuleInvalidProtocol, ext_sg.convert_protocol, val) - - -class TestSecurityGroupsXML(TestSecurityGroups): - fmt = 'xml' diff --git a/neutron/tests/unit/test_extensions.py b/neutron/tests/unit/test_extensions.py index 686fd41ec0..b865f9c30f 100644 --- a/neutron/tests/unit/test_extensions.py +++ b/neutron/tests/unit/test_extensions.py @@ -627,10 +627,6 @@ class ExtensionControllerTest(testlib_api.WebTestCase): self.assertEqual(response.status_int, 404) -class ExtensionControllerTestXML(ExtensionControllerTest): - fmt = 'xml' - - def app_factory(global_conf, **local_conf): conf = global_conf.copy() conf.update(local_conf) diff --git a/neutron/tests/unit/test_l3_plugin.py b/neutron/tests/unit/test_l3_plugin.py index e81a32028c..98daad2086 100644 --- a/neutron/tests/unit/test_l3_plugin.py +++ b/neutron/tests/unit/test_l3_plugin.py @@ -214,10 +214,6 @@ class L3NatExtensionTestCase(test_api_v2_extension.ExtensionTestCase): self.assertEqual(res['subnet_id'], subnet_id) -class L3NatExtensionTestCaseXML(L3NatExtensionTestCase): - fmt = 'xml' - - # This base plugin class is for tests. class TestL3NatBasePlugin(db_base_plugin_v2.NeutronDbPluginV2, external_net_db.External_net_db_mixin): @@ -2144,11 +2140,3 @@ class L3NatDBSepTestCase(L3BaseForSepTests, L3NatTestCaseBase): """Unit tests for a separate L3 routing service plugin.""" pass - - -class L3NatDBIntTestCaseXML(L3NatDBIntTestCase): - fmt = 'xml' - - -class L3NatDBSepTestCaseXML(L3NatDBSepTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_quota_ext.py b/neutron/tests/unit/test_quota_ext.py index 55096f7d27..b709221c73 100644 --- a/neutron/tests/unit/test_quota_ext.py +++ b/neutron/tests/unit/test_quota_ext.py @@ -320,10 +320,6 @@ class QuotaExtensionDbTestCase(QuotaExtensionTestCase): self.assertEqual(400, res.status_int) -class QuotaExtensionDbTestCaseXML(QuotaExtensionDbTestCase): - fmt = 'xml' - - class QuotaExtensionCfgTestCase(QuotaExtensionTestCase): fmt = 'json' @@ -378,10 +374,6 @@ class QuotaExtensionCfgTestCase(QuotaExtensionTestCase): self.assertEqual(403, res.status_int) -class QuotaExtensionCfgTestCaseXML(QuotaExtensionCfgTestCase): - fmt = 'xml' - - class TestDbQuotaDriver(base.BaseTestCase): """Test for neutron.db.quota_db.DbQuotaDriver.""" diff --git a/neutron/tests/unit/test_security_groups_rpc.py b/neutron/tests/unit/test_security_groups_rpc.py index 58a68bfe60..1c0041537b 100644 --- a/neutron/tests/unit/test_security_groups_rpc.py +++ b/neutron/tests/unit/test_security_groups_rpc.py @@ -970,10 +970,6 @@ class SGServerRpcCallBackTestCase(test_sg.SecurityGroupDBTestCase): self._delete('ports', port_id2) -class SGServerRpcCallBackTestCaseXML(SGServerRpcCallBackTestCase): - fmt = 'xml' - - class SGAgentRpcCallBackMixinTestCase(base.BaseTestCase): def setUp(self): super(SGAgentRpcCallBackMixinTestCase, self).setUp() diff --git a/neutron/tests/unit/test_servicetype.py b/neutron/tests/unit/test_servicetype.py index ede407efe7..6b126acb80 100644 --- a/neutron/tests/unit/test_servicetype.py +++ b/neutron/tests/unit/test_servicetype.py @@ -202,10 +202,6 @@ class ServiceTypeExtensionTestCase(ServiceTypeExtensionTestCaseBase): self.assertEqual(res.status_int, webexc.HTTPOk.code) -class ServiceTypeExtensionTestCaseXML(ServiceTypeExtensionTestCase): - fmt = 'xml' - - class ServiceTypeManagerExtTestCase(ServiceTypeExtensionTestCaseBase): """Tests ServiceTypemanager as a public API.""" def setUp(self): @@ -227,7 +223,3 @@ class ServiceTypeManagerExtTestCase(ServiceTypeExtensionTestCaseBase): data = self.deserialize(res) self.assertIn('service_providers', data) self.assertEqual(len(data['service_providers']), 2) - - -class ServiceTypeManagerExtTestCaseXML(ServiceTypeManagerExtTestCase): - fmt = 'xml' diff --git a/neutron/tests/unit/test_wsgi.py b/neutron/tests/unit/test_wsgi.py index 789b27ce62..49c23fdb5b 100644 --- a/neutron/tests/unit/test_wsgi.py +++ b/neutron/tests/unit/test_wsgi.py @@ -23,8 +23,6 @@ import testtools import webob import webob.exc -from neutron.api.v2 import attributes -from neutron.common import constants from neutron.common import exceptions as exception from neutron.tests import base from neutron import wsgi @@ -154,33 +152,16 @@ class SerializerTest(base.BaseTestCase): """Test serialize with content type json.""" input_data = {'servers': ['test=pass']} content_type = 'application/json' - serializer = wsgi.Serializer(default_xmlns="fake") + serializer = wsgi.Serializer() result = serializer.serialize(input_data, content_type) self.assertEqual('{"servers": ["test=pass"]}', result) - def test_serialize_content_type_xml(self): - """Test serialize with content type xml.""" - input_data = {'servers': ['test=pass']} - content_type = 'application/xml' - serializer = wsgi.Serializer(default_xmlns="fake") - result = serializer.serialize(input_data, content_type) - expected = ( - '\n' - '' - 'test=pass' - ) - - self.assertEqual(expected, result) - def test_deserialize_raise_bad_request(self): """Test serialize verifies that exception is raises.""" content_type = 'application/unknown' data_string = 'test' - serializer = wsgi.Serializer(default_xmlns="fake") + serializer = wsgi.Serializer() self.assertRaises( webob.exc.HTTPBadRequest, @@ -190,100 +171,11 @@ class SerializerTest(base.BaseTestCase): """Test Serializer.deserialize with content type json.""" content_type = 'application/json' data_string = '{"servers": ["test=pass"]}' - serializer = wsgi.Serializer(default_xmlns="fake") + serializer = wsgi.Serializer() result = serializer.deserialize(data_string, content_type) self.assertEqual({'body': {u'servers': [u'test=pass']}}, result) - def test_deserialize_xml_content_type(self): - """Test deserialize with content type xml.""" - content_type = 'application/xml' - data_string = ( - '' - 'test=pass' - '' - ) - serializer = wsgi.Serializer( - default_xmlns="fake", metadata={'xmlns': 'fake'}) - result = serializer.deserialize(data_string, content_type) - expected = {'body': {'servers': {'server': 'test=pass'}}} - - self.assertEqual(expected, result) - - def test_deserialize_xml_content_type_with_meta(self): - """Test deserialize with content type xml with meta.""" - content_type = 'application/xml' - data_string = ( - '' - '' - 'passed' - '' - '' - ) - - metadata = {'plurals': {'servers': 'server'}, 'xmlns': 'fake'} - serializer = wsgi.Serializer( - default_xmlns="fake", metadata=metadata) - result = serializer.deserialize(data_string, content_type) - expected = {'body': {'servers': [{'name': 's1', 'test': 'passed'}]}} - - self.assertEqual(expected, result) - - def test_serialize_xml_root_key_is_dict(self): - """Test Serializer.serialize with content type xml with meta dict.""" - content_type = 'application/xml' - data = {'servers': {'network': (2, 3)}} - metadata = {'xmlns': 'fake'} - - serializer = wsgi.Serializer(default_xmlns="fake", metadata=metadata) - result = serializer.serialize(data, content_type) - result = result.replace('\n', '') - expected = ( - '' - '' - '(2, 3)' - ) - - self.assertEqual(result, expected) - - def test_serialize_xml_root_key_is_list(self): - """Test serialize with content type xml with meta list.""" - input_dict = {'servers': ['test=pass']} - content_type = 'application/xml' - metadata = {'application/xml': { - 'xmlns': 'fake'}} - serializer = wsgi.Serializer(default_xmlns="fake", metadata=metadata) - result = serializer.serialize(input_dict, content_type) - result = result.replace('\n', '').replace(' ', '') - expected = ( - '' - '' - 'test=pass' - ) - - self.assertEqual(result, expected) - - def test_serialize_xml_root_is_None(self): - input_dict = {'test': 'pass'} - content_type = 'application/xml' - serializer = wsgi.Serializer(default_xmlns="fake") - result = serializer.serialize(input_dict, content_type) - result = result.replace('\n', '').replace(' ', '') - expected = ( - '' - '' - 'pass' - ) - - self.assertEqual(result, expected) - class RequestDeserializerTest(testtools.TestCase): def setUp(self): @@ -293,13 +185,7 @@ class RequestDeserializerTest(testtools.TestCase): def deserialize(self, data, action='default'): return 'pew_json' - class XMLDeserializer(object): - def deserialize(self, data, action='default'): - return 'pew_xml' - - self.body_deserializers = { - 'application/json': JSONDeserializer(), - 'application/xml': XMLDeserializer()} + self.body_deserializers = {'application/json': JSONDeserializer()} self.deserializer = wsgi.RequestDeserializer(self.body_deserializers) @@ -307,15 +193,10 @@ class RequestDeserializerTest(testtools.TestCase): """Test RequestDeserializer.get_body_deserializer.""" expected_json_serializer = self.deserializer.get_body_deserializer( 'application/json') - expected_xml_serializer = self.deserializer.get_body_deserializer( - 'application/xml') self.assertEqual( expected_json_serializer, self.body_deserializers['application/json']) - self.assertEqual( - expected_xml_serializer, - self.body_deserializers['application/xml']) def test_get_expected_content_type(self): """Test RequestDeserializer.get_expected_content_type.""" @@ -345,9 +226,9 @@ class RequestDeserializerTest(testtools.TestCase): self.deserializer, 'get_action_args') as mock_method: mock_method.return_value = {'action': 'create'} request = wsgi.Request.blank('/') - request.headers['Accept'] = 'application/xml' + request.headers['Accept'] = 'application/json' deserialized = self.deserializer.deserialize(request) - expected = ('create', {}, 'application/xml') + expected = ('create', {}, 'application/json') self.assertEqual(expected, deserialized) @@ -368,17 +249,11 @@ class ResponseSerializerTest(testtools.TestCase): def serialize(self, data, action='default'): return 'pew_json' - class XMLSerializer(object): - def serialize(self, data, action='default'): - return 'pew_xml' - class HeadersSerializer(object): def serialize(self, response, data, action): response.status_int = 404 - self.body_serializers = { - 'application/json': JSONSerializer(), - 'application/xml': XMLSerializer()} + self.body_serializers = {'application/json': JSONSerializer()} self.serializer = wsgi.ResponseSerializer( self.body_serializers, HeadersSerializer()) @@ -410,13 +285,6 @@ class ResponseSerializerTest(testtools.TestCase): self.assertEqual(response.body, 'pew_json') self.assertEqual(response.status_int, 404) - def test_serialize_xml_response(self): - response = self.serializer.serialize({}, 'application/xml') - - self.assertEqual(response.headers['Content-Type'], 'application/xml') - self.assertEqual(response.body, 'pew_xml') - self.assertEqual(response.status_int, 404) - def test_serialize_response_None(self): response = self.serializer.serialize( None, 'application/json') @@ -455,12 +323,6 @@ class RequestTest(base.BaseTestCase): self.assertIsNone(request.get_content_type()) def test_content_type_from_accept(self): - request = wsgi.Request.blank('/tests/123') - request.headers["Accept"] = "application/xml" - result = request.best_match_content_type() - - self.assertEqual(result, "application/xml") - request = wsgi.Request.blank('/tests/123') request.headers["Accept"] = "application/json" result = request.best_match_content_type() @@ -468,24 +330,12 @@ class RequestTest(base.BaseTestCase): self.assertEqual(result, "application/json") request = wsgi.Request.blank('/tests/123') - request.headers["Accept"] = "application/xml, application/json" + request.headers["Accept"] = ("application/json; q=0.3") result = request.best_match_content_type() self.assertEqual(result, "application/json") - request = wsgi.Request.blank('/tests/123') - request.headers["Accept"] = ("application/json; q=0.3, " - "application/xml; q=0.9") - result = request.best_match_content_type() - - self.assertEqual(result, "application/xml") - def test_content_type_from_query_extension(self): - request = wsgi.Request.blank('/tests/123.xml') - result = request.best_match_content_type() - - self.assertEqual(result, "application/xml") - request = wsgi.Request.blank('/tests/123.json') result = request.best_match_content_type() @@ -497,11 +347,11 @@ class RequestTest(base.BaseTestCase): self.assertEqual(result, "application/json") def test_content_type_accept_and_query_extension(self): - request = wsgi.Request.blank('/tests/123.xml') + request = wsgi.Request.blank('/tests/123.json') request.headers["Accept"] = "application/json" result = request.best_match_content_type() - self.assertEqual(result, "application/xml") + self.assertEqual(result, "application/json") def test_content_type_accept_default(self): request = wsgi.Request.blank('/tests/123.unsupported') @@ -662,39 +512,6 @@ class JSONDeserializerTest(base.BaseTestCase): deserializer.deserialize(data), as_dict) -class XMLDeserializerTest(base.BaseTestCase): - def test_xml_empty(self): - xml = '' - as_dict = {'body': {'a': ''}} - deserializer = wsgi.XMLDeserializer() - - self.assertEqual( - deserializer.deserialize(xml), as_dict) - - def test_initialization(self): - xml = 'test' - deserializer = wsgi.XMLDeserializer() - - self.assertEqual( - {'body': {u'a': {u'b': u'test'}}}, deserializer(xml)) - - def test_default_raise_Malformed_Exception(self): - """Verify that exception MalformedRequestBody is raised.""" - data_string = "" - deserializer = wsgi.XMLDeserializer() - - self.assertRaises( - exception.MalformedRequestBody, deserializer.default, data_string) - - def test_xml_with_utf8(self): - xml = '\xe7\xbd\x91\xe7\xbb\x9c' - as_dict = {'body': {'a': u'\u7f51\u7edc'}} - deserializer = wsgi.XMLDeserializer() - - self.assertEqual( - deserializer.deserialize(xml), as_dict) - - class RequestHeadersDeserializerTest(base.BaseTestCase): def test_default(self): @@ -811,7 +628,7 @@ class ResourceTest(base.BaseTestCase): return 'off' resource = wsgi.Resource(Controller(), my_fault_body_function) request = wsgi.Request.blank( - "/", method='POST', headers={'Content-Type': "xml"}) + "/", method='POST', headers={'Content-Type': "json"}) response = resource.dispatch( request, action='index', action_args='test') @@ -829,7 +646,7 @@ class ResourceTest(base.BaseTestCase): def __init__(self): self.url = 'http://where.no' self.environ = 'environ' - self.body = '{"Content-Type": "xml"}' + self.body = '{"Content-Type": "json"}' def method(self): pass @@ -867,212 +684,6 @@ class FaultTest(base.BaseTestCase): self.assertEqual(415, response.status_int) -class XMLDictSerializerTest(base.BaseTestCase): - def test_xml(self): - NETWORK = {'network': {'test': None, - 'tenant_id': 'test-tenant', - 'name': 'net1', - 'admin_state_up': True, - 'subnets': [], - 'dict': {}, - 'int': 3, - 'long': 4L, - 'float': 5.0, - 'prefix:external': True, - 'tests': [{'test1': 'value1'}, - {'test2': 2, 'test3': 3}]}} - # XML is: - # - # # Empty List - # 3 # Integer text - # 4 # Long text - # 5.0 # Float text - # # Empty Dict - # net1 - # True # Bool - # # None - # test-tenant - # # We must have a namespace defined in root for prefix:external - # True - # # List - # value1 - # 3 - # 2 - # - # - - metadata = attributes.get_attr_metadata() - ns = {'prefix': 'http://xxxx.yy.com'} - metadata[constants.EXT_NS] = ns - metadata['plurals'] = {'tests': 'test'} - serializer = wsgi.XMLDictSerializer(metadata) - result = serializer.serialize(NETWORK) - deserializer = wsgi.XMLDeserializer(metadata) - new_net = deserializer.deserialize(result)['body'] - self.assertEqual(NETWORK, new_net) - - def test_None(self): - data = None - # Since it is None, we use xsi:nil='true'. - # In addition, we use an - # virtual XML root _v_root to wrap the XML doc. - # XML is: - # <_v_root xsi:nil="true" - # xmlns="http://openstack.org/quantum/api/v2.0" - # xmlns:quantum="http://openstack.org/quantum/api/v2.0" - # xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> - serializer = wsgi.XMLDictSerializer(attributes.get_attr_metadata()) - result = serializer.serialize(data) - deserializer = wsgi.XMLDeserializer(attributes.get_attr_metadata()) - new_data = deserializer.deserialize(result)['body'] - self.assertIsNone(new_data) - - def test_empty_dic_xml(self): - data = {} - # Since it is an empty dict, we use quantum:type='dict' and - # an empty XML element to represent it. In addition, we use an - # virtual XML root _v_root to wrap the XML doc. - # XML is: - # <_v_root quantum:type="dict" - # xmlns="http://openstack.org/quantum/api/v2.0" - # xmlns:quantum="http://openstack.org/quantum/api/v2.0" - # xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" /> - serializer = wsgi.XMLDictSerializer(attributes.get_attr_metadata()) - result = serializer.serialize(data) - deserializer = wsgi.XMLDeserializer(attributes.get_attr_metadata()) - new_data = deserializer.deserialize(result)['body'] - self.assertEqual(data, new_data) - - def test_non_root_one_item_dic_xml(self): - data = {'test1': 1} - # We have a key in this dict, and its value is an integer. - # XML is: - # - # 1 - - serializer = wsgi.XMLDictSerializer(attributes.get_attr_metadata()) - result = serializer.serialize(data) - deserializer = wsgi.XMLDeserializer(attributes.get_attr_metadata()) - new_data = deserializer.deserialize(result)['body'] - self.assertEqual(data, new_data) - - def test_non_root_two_items_dic_xml(self): - data = {'test1': 1, 'test2': '2'} - # We have no root element in this data, We will use a virtual - # root element _v_root to wrap the doct. - # The XML is: - # <_v_root xmlns="http://openstack.org/quantum/api/v2.0" - # xmlns:quantum="http://openstack.org/quantum/api/v2.0" - # xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - # 12 - # - - serializer = wsgi.XMLDictSerializer(attributes.get_attr_metadata()) - result = serializer.serialize(data) - deserializer = wsgi.XMLDeserializer(attributes.get_attr_metadata()) - new_data = deserializer.deserialize(result)['body'] - self.assertEqual(data, new_data) - - def test_xml_root_key_is_list(self): - input_dict = {'servers': ['test-pass']} - serializer = wsgi.XMLDictSerializer(xmlns="fake") - result = serializer.default(input_dict) - result = result.replace('\n', '').replace(' ', '') - expected = ( - '' - '' - 'test-pass' - ) - - self.assertEqual(result, expected) - - def test_xml_meta_contains_node_name_list(self): - input_dict = {'servers': ['test-pass']} - servers = {'nodename': 'test', - 'item_name': 'test', - 'item_key': 'test'} - metadata = {'list_collections': {'servers': servers}} - serializer = wsgi.XMLDictSerializer(xmlns="fake", metadata=metadata) - result = serializer.default(input_dict) - result = result.replace('\n', '').replace(' ', '') - expected = ( - '' - '' - 'test-pass' - ) - - self.assertEqual(result, expected) - - def test_xml_meta_contains_node_name_dict(self): - input_dict = {'servers': {'a': {'2': '3'}}} - servers = {'servers': { - 'nodename': 'test', - 'item_name': 'test', - 'item_key': 'test'}} - metadata = {'dict_collections': servers} - serializer = wsgi.XMLDictSerializer(xmlns="fake", metadata=metadata) - result = serializer.default(input_dict) - result = result.replace('\n', '').replace(' ', '') - expected = ( - '' - '' - '<2>3' - ) - - self.assertEqual(result, expected) - - def test_call(self): - data = {'servers': {'a': {'2': '3'}}} - serializer = wsgi.XMLDictSerializer() - expected = ( - '' - '' - '<2>3' - ) - result = serializer(data) - result = result.replace('\n', '').replace(' ', '') - self.assertEqual(expected, result) - - def test_xml_with_utf8(self): - data = {'servers': '\xe7\xbd\x91\xe7\xbb\x9c'} - serializer = wsgi.XMLDictSerializer() - expected = ( - '' - '' - '\xe7\xbd\x91\xe7\xbb\x9c' - ) - result = serializer(data) - result = result.replace('\n', '').replace(' ', '') - self.assertEqual(expected, result) - - def test_xml_with_unicode(self): - data = {'servers': u'\u7f51\u7edc'} - serializer = wsgi.XMLDictSerializer() - expected = ( - '' - '' - '\xe7\xbd\x91\xe7\xbb\x9c' - ) - result = serializer(data) - result = result.replace('\n', '').replace(' ', '') - self.assertEqual(expected, result) - - class TestWSGIServerWithSSL(base.BaseTestCase): """WSGI server tests.""" diff --git a/neutron/tests/unit/testlib_api.py b/neutron/tests/unit/testlib_api.py index 564e0b501f..bb482ababe 100644 --- a/neutron/tests/unit/testlib_api.py +++ b/neutron/tests/unit/testlib_api.py @@ -15,7 +15,6 @@ import testtools -from neutron.api.v2 import attributes from neutron.db import api as db_api # Import all data models from neutron.db.migration.models import head # noqa @@ -81,11 +80,8 @@ class WebTestCase(SqlTestCase): def setUp(self): super(WebTestCase, self).setUp() json_deserializer = wsgi.JSONDeserializer() - xml_deserializer = wsgi.XMLDeserializer( - attributes.get_attr_metadata()) self._deserializers = { 'application/json': json_deserializer, - 'application/xml': xml_deserializer, } def deserialize(self, response): @@ -95,8 +91,7 @@ class WebTestCase(SqlTestCase): def serialize(self, data): ctype = 'application/%s' % self.fmt - result = wsgi.Serializer( - attributes.get_attr_metadata()).serialize(data, ctype) + result = wsgi.Serializer().serialize(data, ctype) return result diff --git a/neutron/wsgi.py b/neutron/wsgi.py index 137dcb96e5..73c3cf476c 100644 --- a/neutron/wsgi.py +++ b/neutron/wsgi.py @@ -24,8 +24,6 @@ import socket import ssl import sys import time -from xml.etree import ElementTree as etree -from xml.parsers import expat import eventlet.wsgi eventlet.patcher.monkey_patch(all=False, socket=True, thread=True) @@ -34,7 +32,6 @@ import routes.middleware import webob.dec import webob.exc -from neutron.common import constants from neutron.common import exceptions as exception from neutron import context from neutron.db import api @@ -313,7 +310,7 @@ class Request(webob.Request): """Determine the most acceptable content-type. Based on: - 1) URI extension (.json/.xml) + 1) URI extension (.json) 2) Content-type header 3) Accept* headers """ @@ -321,21 +318,21 @@ class Request(webob.Request): parts = self.path.rsplit('.', 1) if len(parts) > 1: _format = parts[1] - if _format in ['json', 'xml']: + if _format in ['json']: return 'application/{0}'.format(_format) #Then look up content header type_from_header = self.get_content_type() if type_from_header: return type_from_header - ctypes = ['application/json', 'application/xml'] + ctypes = ['application/json'] #Finally search in Accept-* headers bm = self.accept.best_match(ctypes) return bm or 'application/json' def get_content_type(self): - allowed_types = ("application/xml", "application/json") + allowed_types = ("application/json") if "Content-Type" not in self.headers: LOG.debug(_("Missing Content-Type")) return None @@ -394,154 +391,6 @@ class JSONDictSerializer(DictSerializer): return jsonutils.dumps(data, default=sanitizer) -class XMLDictSerializer(DictSerializer): - - def __init__(self, metadata=None, xmlns=None): - """Object initialization. - - :param metadata: information needed to deserialize xml into - a dictionary. - :param xmlns: XML namespace to include with serialized xml - """ - super(XMLDictSerializer, self).__init__() - self.metadata = metadata or {} - if not xmlns: - xmlns = self.metadata.get('xmlns') - if not xmlns: - xmlns = constants.XML_NS_V20 - self.xmlns = xmlns - - def default(self, data): - """Return data as XML string. - - :param data: expect data to contain a single key as XML root, or - contain another '*_links' key as atom links. Other - case will use 'VIRTUAL_ROOT_KEY' as XML root. - """ - try: - links = None - has_atom = False - if data is None: - root_key = constants.VIRTUAL_ROOT_KEY - root_value = None - else: - link_keys = [k for k in data.iterkeys() or [] - if k.endswith('_links')] - if link_keys: - links = data.pop(link_keys[0], None) - has_atom = True - root_key = (len(data) == 1 and - data.keys()[0] or constants.VIRTUAL_ROOT_KEY) - root_value = data.get(root_key, data) - doc = etree.Element("_temp_root") - used_prefixes = [] - self._to_xml_node(doc, self.metadata, root_key, - root_value, used_prefixes) - if links: - self._create_link_nodes(list(doc)[0], links) - return self.to_xml_string(list(doc)[0], used_prefixes, has_atom) - except AttributeError as e: - LOG.exception(str(e)) - return '' - - def __call__(self, data): - # Provides a migration path to a cleaner WSGI layer, this - # "default" stuff and extreme extensibility isn't being used - # like originally intended - return self.default(data) - - def to_xml_string(self, node, used_prefixes, has_atom=False): - self._add_xmlns(node, used_prefixes, has_atom) - return etree.tostring(node, encoding='UTF-8') - - #NOTE (ameade): the has_atom should be removed after all of the - # xml serializers and view builders have been updated to the current - # spec that required all responses include the xmlns:atom, the has_atom - # flag is to prevent current tests from breaking - def _add_xmlns(self, node, used_prefixes, has_atom=False): - node.set('xmlns', self.xmlns) - node.set(constants.TYPE_XMLNS, self.xmlns) - if has_atom: - node.set(constants.ATOM_XMLNS, constants.ATOM_NAMESPACE) - node.set(constants.XSI_NIL_ATTR, constants.XSI_NAMESPACE) - ext_ns = self.metadata.get(constants.EXT_NS, {}) - ext_ns_bc = self.metadata.get(constants.EXT_NS_COMP, {}) - for prefix in used_prefixes: - if prefix in ext_ns: - node.set('xmlns:' + prefix, ext_ns[prefix]) - if prefix in ext_ns_bc: - node.set('xmlns:' + prefix, ext_ns_bc[prefix]) - - def _to_xml_node(self, parent, metadata, nodename, data, used_prefixes): - """Recursive method to convert data members to XML nodes.""" - result = etree.SubElement(parent, nodename) - if ":" in nodename: - used_prefixes.append(nodename.split(":", 1)[0]) - #TODO(bcwaldon): accomplish this without a type-check - if isinstance(data, list): - if not data: - result.set( - constants.TYPE_ATTR, - constants.TYPE_LIST) - return result - singular = metadata.get('plurals', {}).get(nodename, None) - if singular is None: - if nodename.endswith('s'): - singular = nodename[:-1] - else: - singular = 'item' - for item in data: - self._to_xml_node(result, metadata, singular, item, - used_prefixes) - #TODO(bcwaldon): accomplish this without a type-check - elif isinstance(data, dict): - if not data: - result.set( - constants.TYPE_ATTR, - constants.TYPE_DICT) - return result - attrs = metadata.get('attributes', {}).get(nodename, {}) - for k, v in data.items(): - if k in attrs: - result.set(k, str(v)) - else: - self._to_xml_node(result, metadata, k, v, - used_prefixes) - elif data is None: - result.set(constants.XSI_ATTR, 'true') - else: - if isinstance(data, bool): - result.set( - constants.TYPE_ATTR, - constants.TYPE_BOOL) - elif isinstance(data, int): - result.set( - constants.TYPE_ATTR, - constants.TYPE_INT) - elif isinstance(data, long): - result.set( - constants.TYPE_ATTR, - constants.TYPE_LONG) - elif isinstance(data, float): - result.set( - constants.TYPE_ATTR, - constants.TYPE_FLOAT) - LOG.debug(_("Data %(data)s type is %(type)s"), - {'data': data, - 'type': type(data)}) - if isinstance(data, str): - result.text = unicode(data, 'utf-8') - else: - result.text = unicode(data) - return result - - def _create_link_nodes(self, xml_doc, links): - for link in links: - link_node = etree.SubElement(xml_doc, 'atom:link') - link_node.set('rel', link['rel']) - link_node.set('href', link['href']) - - class ResponseHeaderSerializer(ActionDispatcher): """Default response headers serialization.""" @@ -557,7 +406,6 @@ class ResponseSerializer(object): def __init__(self, body_serializers=None, headers_serializer=None): self.body_serializers = { - 'application/xml': XMLDictSerializer(), 'application/json': JSONDictSerializer(), } self.body_serializers.update(body_serializers or {}) @@ -616,156 +464,6 @@ class JSONDeserializer(TextDeserializer): return {'body': self._from_json(datastring)} -class ProtectedXMLParser(etree.XMLParser): - def __init__(self, *args, **kwargs): - etree.XMLParser.__init__(self, *args, **kwargs) - self._parser.StartDoctypeDeclHandler = self.start_doctype_decl - - def start_doctype_decl(self, name, sysid, pubid, internal): - raise ValueError(_("Inline DTD forbidden")) - - def doctype(self, name, pubid, system): - raise ValueError(_("Inline DTD forbidden")) - - -class XMLDeserializer(TextDeserializer): - - def __init__(self, metadata=None): - """Object initialization. - - :param metadata: information needed to deserialize xml into - a dictionary. - """ - super(XMLDeserializer, self).__init__() - self.metadata = metadata or {} - xmlns = self.metadata.get('xmlns') - if not xmlns: - xmlns = constants.XML_NS_V20 - self.xmlns = xmlns - - def _get_key(self, tag): - tags = tag.split("}", 1) - if len(tags) == 2: - ns = tags[0][1:] - bare_tag = tags[1] - ext_ns = self.metadata.get(constants.EXT_NS, {}) - if ns == self.xmlns: - return bare_tag - for prefix, _ns in ext_ns.items(): - if ns == _ns: - return prefix + ":" + bare_tag - ext_ns_bc = self.metadata.get(constants.EXT_NS_COMP, {}) - for prefix, _ns in ext_ns_bc.items(): - if ns == _ns: - return prefix + ":" + bare_tag - else: - return tag - - def _get_links(self, root_tag, node): - link_nodes = node.findall(constants.ATOM_LINK_NOTATION) - root_tag = self._get_key(node.tag) - link_key = "%s_links" % root_tag - link_list = [] - for link in link_nodes: - link_list.append({'rel': link.get('rel'), - 'href': link.get('href')}) - # Remove link node in order to avoid link node process as - # an item in _from_xml_node - node.remove(link) - return link_list and {link_key: link_list} or {} - - def _parseXML(self, text): - parser = ProtectedXMLParser() - parser.feed(text) - return parser.close() - - def _from_xml(self, datastring): - if datastring is None: - return None - plurals = set(self.metadata.get('plurals', {})) - try: - node = self._parseXML(datastring) - root_tag = self._get_key(node.tag) - # Deserialize link node was needed by unit test for verifying - # the request's response - links = self._get_links(root_tag, node) - result = self._from_xml_node(node, plurals) - # root_tag = constants.VIRTUAL_ROOT_KEY and links is not None - # is not possible because of the way data are serialized. - if root_tag == constants.VIRTUAL_ROOT_KEY: - return result - return dict({root_tag: result}, **links) - except Exception as e: - with excutils.save_and_reraise_exception(): - parseError = False - # Python2.7 - if (hasattr(etree, 'ParseError') and - isinstance(e, getattr(etree, 'ParseError'))): - parseError = True - # Python2.6 - elif isinstance(e, expat.ExpatError): - parseError = True - if parseError: - msg = _("Cannot understand XML") - raise exception.MalformedRequestBody(reason=msg) - - def _from_xml_node(self, node, listnames): - """Convert a minidom node to a simple Python type. - - :param listnames: list of XML node names whose subnodes should - be considered list items. - - """ - attrNil = node.get(str(etree.QName(constants.XSI_NAMESPACE, "nil"))) - attrType = node.get(str(etree.QName( - self.metadata.get('xmlns'), "type"))) - if (attrNil and attrNil.lower() == 'true'): - return None - elif not len(node) and not node.text: - if (attrType and attrType == constants.TYPE_DICT): - return {} - elif (attrType and attrType == constants.TYPE_LIST): - return [] - else: - return '' - elif (len(node) == 0 and node.text): - converters = {constants.TYPE_BOOL: - lambda x: x.lower() == 'true', - constants.TYPE_INT: - lambda x: int(x), - constants.TYPE_LONG: - lambda x: long(x), - constants.TYPE_FLOAT: - lambda x: float(x)} - if attrType and attrType in converters: - return converters[attrType](node.text) - else: - return node.text - elif self._get_key(node.tag) in listnames: - return [self._from_xml_node(n, listnames) for n in node] - else: - result = dict() - for attr in node.keys(): - if (attr == 'xmlns' or - attr.startswith('xmlns:') or - attr == constants.XSI_ATTR or - attr == constants.TYPE_ATTR): - continue - result[self._get_key(attr)] = node.get(attr) - children = list(node) - for child in children: - result[self._get_key(child.tag)] = self._from_xml_node( - child, listnames) - return result - - def default(self, datastring): - return {'body': self._from_xml(datastring)} - - def __call__(self, datastring): - # Adding a migration path to allow us to remove unncessary classes - return self.default(datastring) - - class RequestHeadersDeserializer(ActionDispatcher): """Default request headers deserializer.""" @@ -781,7 +479,6 @@ class RequestDeserializer(object): def __init__(self, body_deserializers=None, headers_deserializer=None): self.body_deserializers = { - 'application/xml': XMLDeserializer(), 'application/json': JSONDeserializer(), } self.body_deserializers.update(body_deserializers or {}) @@ -1057,10 +754,6 @@ class Resource(Application): self.deserializer = deserializer or RequestDeserializer() self.serializer = serializer or ResponseSerializer() self._fault_body_function = fault_body_function - # use serializer's xmlns for populating Fault generator xmlns - xml_serializer = self.serializer.body_serializers['application/xml'] - if hasattr(xml_serializer, 'xmlns'): - self._xmlns = xml_serializer.xmlns @webob.dec.wsgify(RequestClass=Request) def __call__(self, request): @@ -1074,26 +767,21 @@ class Resource(Application): except exception.InvalidContentType: msg = _("Unsupported Content-Type") LOG.exception(_("InvalidContentType: %s"), msg) - return Fault(webob.exc.HTTPBadRequest(explanation=msg), - self._xmlns) + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) except exception.MalformedRequestBody: msg = _("Malformed request body") LOG.exception(_("MalformedRequestBody: %s"), msg) - return Fault(webob.exc.HTTPBadRequest(explanation=msg), - self._xmlns) + return Fault(webob.exc.HTTPBadRequest(explanation=msg)) try: action_result = self.dispatch(request, action, args) except webob.exc.HTTPException as ex: LOG.info(_("HTTP exception thrown: %s"), unicode(ex)) - action_result = Fault(ex, - self._xmlns, - self._fault_body_function) + action_result = Fault(ex, self._fault_body_function) except Exception: LOG.exception(_("Internal error")) # Do not include the traceback to avoid returning it to clients. action_result = Fault(webob.exc.HTTPServerError(), - self._xmlns, self._fault_body_function) if isinstance(action_result, dict) or action_result is None: @@ -1124,8 +812,7 @@ class Resource(Application): return controller_method(request=request, **action_args) except TypeError as exc: LOG.exception(exc) - return Fault(webob.exc.HTTPBadRequest(), - self._xmlns) + return Fault(webob.exc.HTTPBadRequest()) def _default_body_function(wrapped_exc): @@ -1142,11 +829,10 @@ def _default_body_function(wrapped_exc): class Fault(webob.exc.HTTPException): """Generates an HTTP response from a webob HTTP exception.""" - def __init__(self, exception, xmlns=None, body_function=None): + def __init__(self, exception, body_function=None): """Creates a Fault for the given webob.exc.exception.""" self.wrapped_exc = exception self.status_int = self.wrapped_exc.status_int - self._xmlns = xmlns self._body_function = body_function or _default_body_function @webob.dec.wsgify(RequestClass=Request) @@ -1154,10 +840,8 @@ class Fault(webob.exc.HTTPException): """Generate a WSGI response based on the exception passed to ctor.""" # Replace the body with fault details. fault_data, metadata = self._body_function(self.wrapped_exc) - xml_serializer = XMLDictSerializer(metadata, self._xmlns) content_type = req.best_match_content_type() serializer = { - 'application/xml': xml_serializer, 'application/json': JSONDictSerializer(), }[content_type] @@ -1200,8 +884,7 @@ class Controller(object): else: status = 200 content_type = req.best_match_content_type() - default_xmlns = self.get_default_xmlns(req) - body = self._serialize(result, content_type, default_xmlns) + body = self._serialize(result, content_type) response = webob.Response(status=status, content_type=content_type, @@ -1213,7 +896,7 @@ class Controller(object): else: return result - def _serialize(self, data, content_type, default_xmlns): + def _serialize(self, data, content_type): """Serialize the given dict to the provided content_type. Uses self._serialization_metadata if it exists, which is a dict mapping @@ -1222,7 +905,7 @@ class Controller(object): """ _metadata = getattr(type(self), '_serialization_metadata', {}) - serializer = Serializer(_metadata, default_xmlns) + serializer = Serializer(_metadata) try: return serializer.serialize(data, content_type) except exception.InvalidContentType: @@ -1240,17 +923,13 @@ class Controller(object): serializer = Serializer(_metadata) return serializer.deserialize(data, content_type)['body'] - def get_default_xmlns(self, req): - """Provide the XML namespace to use if none is otherwise specified.""" - return None - # NOTE(salvatore-orlando): this class will go once the # extension API framework is updated class Serializer(object): """Serializes and deserializes dictionaries to certain MIME types.""" - def __init__(self, metadata=None, default_xmlns=None): + def __init__(self, metadata=None): """Create a serializer based on the given WSGI environment. 'metadata' is an optional dict mapping MIME types to information @@ -1258,12 +937,10 @@ class Serializer(object): """ self.metadata = metadata or {} - self.default_xmlns = default_xmlns def _get_serialize_handler(self, content_type): handlers = { 'application/json': JSONDictSerializer(), - 'application/xml': XMLDictSerializer(self.metadata), } try: @@ -1290,7 +967,6 @@ class Serializer(object): def get_deserialize_handler(self, content_type): handlers = { 'application/json': JSONDeserializer(), - 'application/xml': XMLDeserializer(self.metadata), } try: