diff --git a/lower-constraints.txt b/lower-constraints.txt index 39460437f9d..2dd851e37b8 100644 --- a/lower-constraints.txt +++ b/lower-constraints.txt @@ -50,7 +50,7 @@ msgpack-python==0.4.0 munch==2.1.0 netaddr==0.7.18 netifaces==0.10.4 -neutron-lib==2.13.0 +neutron-lib==2.15.0 openstacksdk==0.31.2 os-client-config==1.28.0 os-ken==2.0.0 diff --git a/neutron/extensions/network_ip_availability.py b/neutron/extensions/network_ip_availability.py index 1636f58c892..1eeea381a2e 100644 --- a/neutron/extensions/network_ip_availability.py +++ b/neutron/extensions/network_ip_availability.py @@ -34,7 +34,10 @@ class Network_ip_availability(api_extensions.APIExtensionDescriptor): apidef.RESOURCE_PLURAL, apidef.RESOURCE_NAME, plugin.NetworkIPAvailabilityPlugin.get_instance(), - resource_attributes) + resource_attributes, + allow_pagination=True, + allow_sorting=True, + ) return [extensions.ResourceExtension(apidef.COLLECTION_NAME, controller, attr_map=resource_attributes)] diff --git a/neutron/tests/unit/extensions/test_network_ip_availability.py b/neutron/tests/unit/extensions/test_network_ip_availability.py index 231fbf46064..833ee89c956 100644 --- a/neutron/tests/unit/extensions/test_network_ip_availability.py +++ b/neutron/tests/unit/extensions/test_network_ip_availability.py @@ -407,3 +407,34 @@ class TestNetworkIPAvailabilityAPI( avails_list, net_v6_2, 2, cidr_ipv6_net.size - 1) self._validate_from_availabilities( avails_list, net_v4_2, 2, 253) + + def test_usages_query_limit(self): + with self.network() as net1, self.network() as net2, \ + self.network() as net3, self.network() as net4: + networks = (net1, net2, net3, net4) + for idx in range(1, len(networks) + 1): + params = 'limit=%s' % idx + request = self.new_list_request(API_RESOURCE, params=params) + response = self.deserialize(self.fmt, + request.get_response(self.ext_api)) + self.assertEqual(idx, len(response[IP_AVAILS_KEY])) + + def test_usages_query_sorting(self): + with self.network() as net1, self.network() as net2, \ + self.network() as net3, self.network() as net4: + networks = (net1, net2, net3, net4) + network_ids = sorted([net['network']['id'] for net in networks]) + + params = 'sort_key=network_id;sort_dir=asc' + request = self.new_list_request(API_RESOURCE, params=params) + response = self.deserialize(self.fmt, + request.get_response(self.ext_api)) + res = [net['network_id'] for net in response[IP_AVAILS_KEY]] + self.assertEqual(network_ids, res) + + params = 'sort_key=network_id;sort_dir=desc' + request = self.new_list_request(API_RESOURCE, params=params) + response = self.deserialize(self.fmt, + request.get_response(self.ext_api)) + res = [net['network_id'] for net in response[IP_AVAILS_KEY]] + self.assertEqual(list(reversed(network_ids)), res) diff --git a/requirements.txt b/requirements.txt index afac60823e7..7b96f35325f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,7 +16,7 @@ Jinja2>=2.10 # BSD License (3 clause) keystonemiddleware>=5.1.0 # Apache-2.0 netaddr>=0.7.18 # BSD netifaces>=0.10.4 # MIT -neutron-lib>=2.13.0 # Apache-2.0 +neutron-lib>=2.15.0 # Apache-2.0 python-neutronclient>=6.7.0 # Apache-2.0 tenacity>=6.0.0 # Apache-2.0 SQLAlchemy>=1.3.23 # MIT