From d2d4317e1a31f6ac40c5f29b57cd4ea196dc8780 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Fri, 4 Oct 2019 16:58:17 +0100 Subject: [PATCH] fixtures: Handle iterable params for 'NeutronFixture.list_*' It turns out it's possible to filter on multiple possible values using by using an iterable query value. We're going to need this for proper subnet mocking, so add it now. There's no impact on tests. Change-Id: Ia02ff34ec94a911906e2e812ab6503d4a2118bce Signed-off-by: Stephen Finucane --- nova/tests/fixtures.py | 40 +++++++++++++++++++++++++--------------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/nova/tests/fixtures.py b/nova/tests/fixtures.py index 64ab2fe9a0..87320b9cd6 100644 --- a/nova/tests/fixtures.py +++ b/nova/tests/fixtures.py @@ -1650,6 +1650,25 @@ class NeutronFixture(fixtures.Fixture): else: return None + def _list_resource(self, resources, retrieve_all, **_params): + # If 'fields' is passed we need to strip that out since it will mess + # up the filtering as 'fields' is not a filter parameter. + _params.pop('fields', None) + result = [] + for resource in resources.values(): + for key, val in _params.items(): + # params can be strings or lists/tuples and these need to be + # handled differently + if isinstance(val, list) or isinstance(val, tuple): + if not any(resource.get(key) == v for v in val): + break + else: + if resource.get(key) != val: + break + else: # triggers if we didn't hit a break above + result.append(copy.deepcopy(resource)) + return result + def list_extensions(self, *args, **kwargs): return { 'extensions': [ @@ -1674,27 +1693,18 @@ class NeutronFixture(fixtures.Fixture): if port_id in self._ports: del self._ports[port_id] + def list_ports(self, retrieve_all=True, **_params): + return {'ports': self._list_resource( + self._ports, retrieve_all, **_params)} + def show_network(self, network_id, **_params): if network_id not in self._networks: raise neutron_client_exc.NetworkNotFoundClient() return {'network': copy.deepcopy(self._networks[network_id])} def list_networks(self, retrieve_all=True, **_params): - networks = self._networks.values() - if 'id' in _params: - networks = [x for x in networks if x['id'] in _params['id']] - _params.pop('id') - networks = [n for n in networks - if all(n.get(opt) == _params[opt] for opt in _params)] - return {'networks': copy.deepcopy(networks)} - - def list_ports(self, retrieve_all=True, **_params): - # If 'fields' is passed we need to strip that out since it will mess - # up the filtering as 'fields' is not a filter parameter. - _params.pop('fields', None) - ports = [p for p in self._ports.values() - if all(p.get(opt) == _params[opt] for opt in _params)] - return {'ports': copy.deepcopy(ports)} + return {'networks': self._list_resource( + self._networks, retrieve_all, **_params)} def list_subnets(self, retrieve_all=True, **_params): # NOTE(gibi): The fixture does not support filtering for subnets