From e7d47f53fd4a6edb3ec0621503469f7398234b87 Mon Sep 17 00:00:00 2001 From: armando-migliaccio Date: Fri, 21 Mar 2014 14:48:19 -0700 Subject: [PATCH] NSX: Fix pagination support Add pagination support to the base plugin, leaving the service plugin unaltered. Minor tweaks to the UT where required to avoid intermittent failures caused by random ordering. Closes-bug: 1295854 Change-Id: I03e9e104967716046909d6120426e879f714a5c8 --- neutron/plugins/vmware/dbexts/networkgw_db.py | 23 +++++++++++++++---- neutron/plugins/vmware/dbexts/qos_db.py | 9 ++++++-- .../plugins/vmware/extensions/networkgw.py | 8 +++++-- neutron/plugins/vmware/extensions/qos.py | 3 ++- neutron/plugins/vmware/plugins/base.py | 22 +++++++++++------- neutron/plugins/vmware/plugins/service.py | 3 +++ .../unit/vmware/extensions/test_networkgw.py | 13 ++++++----- 7 files changed, 58 insertions(+), 23 deletions(-) diff --git a/neutron/plugins/vmware/dbexts/networkgw_db.py b/neutron/plugins/vmware/dbexts/networkgw_db.py index 6a1c3c21b3..17773d9636 100644 --- a/neutron/plugins/vmware/dbexts/networkgw_db.py +++ b/neutron/plugins/vmware/dbexts/networkgw_db.py @@ -294,10 +294,17 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase): context.session.delete(gw_db) LOG.debug(_("Network gateway '%s' was destroyed."), id) - def get_network_gateways(self, context, filters=None, fields=None): + def get_network_gateways(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): + marker_obj = self._get_marker_obj( + context, 'network_gateway', limit, marker) return self._get_collection(context, NetworkGateway, self._make_network_gateway_dict, - filters=filters, fields=fields) + filters=filters, fields=fields, + sorts=sorts, limit=limit, + marker_obj=marker_obj, + page_reverse=page_reverse) def connect_network(self, context, network_gateway_id, network_mapping_info): @@ -437,10 +444,18 @@ class NetworkGatewayMixin(networkgw.NetworkGatewayPluginBase): fields, include_nsx_id) def get_gateway_devices(self, context, filters=None, fields=None, - include_nsx_id=False): + sorts=None, limit=None, marker=None, + page_reverse=False, include_nsx_id=False): + marker_obj = self._get_marker_obj( + context, 'gateway_device', limit, marker) query = self._get_collection_query(context, NetworkGatewayDevice, - filters=filters) + filters=filters, + fields=fields, + sorts=sorts, + limit=limit, + marker_obj=marker_obj, + page_reverse=page_reverse) return [self._make_gateway_device_dict(row, fields, include_nsx_id) for row in query] diff --git a/neutron/plugins/vmware/dbexts/qos_db.py b/neutron/plugins/vmware/dbexts/qos_db.py index 4f9ff316e5..b094a2293f 100644 --- a/neutron/plugins/vmware/dbexts/qos_db.py +++ b/neutron/plugins/vmware/dbexts/qos_db.py @@ -98,10 +98,15 @@ class QoSDbMixin(qos.QueuePluginBase): except exc.NoResultFound: raise qos.QueueNotFound(id=queue_id) - def get_qos_queues(self, context, filters=None, fields=None): + def get_qos_queues(self, context, filters=None, fields=None, sorts=None, + limit=None, marker=None, page_reverse=False): + marker_obj = self._get_marker_obj(context, 'qos_queue', limit, marker) return self._get_collection(context, QoSQueue, self._make_qos_queue_dict, - filters=filters, fields=fields) + filters=filters, fields=fields, + sorts=sorts, limit=limit, + marker_obj=marker_obj, + page_reverse=page_reverse) def delete_qos_queue(self, context, queue_id): qos_queue = self._get_qos_queue(context, queue_id) diff --git a/neutron/plugins/vmware/extensions/networkgw.py b/neutron/plugins/vmware/extensions/networkgw.py index 3d8ea8807a..8280cc273b 100644 --- a/neutron/plugins/vmware/extensions/networkgw.py +++ b/neutron/plugins/vmware/extensions/networkgw.py @@ -213,7 +213,9 @@ class NetworkGatewayPluginBase(object): pass @abstractmethod - def get_network_gateways(self, context, filters=None, fields=None): + def get_network_gateways(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): pass @abstractmethod @@ -243,5 +245,7 @@ class NetworkGatewayPluginBase(object): pass @abstractmethod - def get_gateway_devices(self, context, filters=None, fields=None): + def get_gateway_devices(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): pass diff --git a/neutron/plugins/vmware/extensions/qos.py b/neutron/plugins/vmware/extensions/qos.py index c300473aa8..c9df11b1bf 100644 --- a/neutron/plugins/vmware/extensions/qos.py +++ b/neutron/plugins/vmware/extensions/qos.py @@ -218,5 +218,6 @@ class QueuePluginBase(object): pass @abstractmethod - def get_qos_queues(self, context, filters=None, fields=None): + def get_qos_queues(self, context, filters=None, fields=None, sorts=None, + limit=None, marker=None, page_reverse=False): pass diff --git a/neutron/plugins/vmware/plugins/base.py b/neutron/plugins/vmware/plugins/base.py index 457fa8bc04..4e8fcb697d 100644 --- a/neutron/plugins/vmware/plugins/base.py +++ b/neutron/plugins/vmware/plugins/base.py @@ -117,6 +117,8 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, "security-group"] __native_bulk_support = True + __native_pagination_support = True + __native_sorting_support = True # Map nova zones to cluster for easy retrieval novazone_cluster_map = {} @@ -1082,10 +1084,15 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, self._extend_network_dict_provider(context, net_result) return self._fields(net_result, fields) - def get_networks(self, context, filters=None, fields=None): + def get_networks(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): filters = filters or {} with context.session.begin(subtransactions=True): - networks = super(NsxPluginV2, self).get_networks(context, filters) + networks = ( + super(NsxPluginV2, self).get_networks( + context, filters, fields, sorts, + limit, marker, page_reverse)) for net in networks: self._extend_network_dict_provider(context, net) return [self._fields(network, fields) for network in networks] @@ -2052,15 +2059,14 @@ class NsxPluginV2(addr_pair_db.AllowedAddressPairsMixin, return super(NsxPluginV2, self).get_network_gateway(context, id, fields) - def get_network_gateways(self, context, filters=None, fields=None): + def get_network_gateways(self, context, filters=None, fields=None, + sorts=None, limit=None, marker=None, + page_reverse=False): # Ensure the default gateway in the config file is in sync with the db self._ensure_default_network_gateway() # Ensure the tenant_id attribute is populated on returned gateways - net_gateways = super(NsxPluginV2, - self).get_network_gateways(context, - filters, - fields) - return net_gateways + return super(NsxPluginV2, self).get_network_gateways( + context, filters, fields, sorts, limit, marker, page_reverse) def update_network_gateway(self, context, id, network_gateway): # Ensure the default gateway in the config file is in sync with the db diff --git a/neutron/plugins/vmware/plugins/service.py b/neutron/plugins/vmware/plugins/service.py index b181baf599..24be47f6f6 100644 --- a/neutron/plugins/vmware/plugins/service.py +++ b/neutron/plugins/vmware/plugins/service.py @@ -92,6 +92,9 @@ class NsxAdvancedPlugin(sr_db.ServiceRouter_mixin, "lbaas", "vpnaas" ]) + # The service plugin cannot currently support pagination + __native_pagination_support = False + __native_sorting_support = False def __init__(self): super(NsxAdvancedPlugin, self).__init__() diff --git a/neutron/tests/unit/vmware/extensions/test_networkgw.py b/neutron/tests/unit/vmware/extensions/test_networkgw.py index 6c81f9c33c..d77b777fde 100644 --- a/neutron/tests/unit/vmware/extensions/test_networkgw.py +++ b/neutron/tests/unit/vmware/extensions/test_networkgw.py @@ -939,14 +939,15 @@ class TestNetworkGateway(NsxPluginV2TestCase, with self._network_gateway(name='test_gw_2') as gw2: req = self.new_list_request(networkgw.NETWORK_GATEWAYS) res = self.deserialize('json', req.get_response(self.ext_api)) + # Ensure we always get the list in the same order + gateways = sorted( + res[self.gw_resource + 's'], key=lambda k: k['name']) + self.assertEqual(len(gateways), 3) # We expect the default gateway too - key = self.gw_resource + 's' - self.assertEqual(len(res[key]), 3) - self.assertEqual(res[key][0]['default'], - True) - self.assertEqual(res[key][1]['name'], + self.assertEqual(gateways[0]['default'], True) + self.assertEqual(gateways[1]['name'], gw1[self.gw_resource]['name']) - self.assertEqual(res[key][2]['name'], + self.assertEqual(gateways[2]['name'], gw2[self.gw_resource]['name']) def test_list_network_gateway_with_multiple_connections(self):