Support filtering servers in list_servers using arbitrary parameters

Any parameter recognized by Nova API server can now be used, such as
'changes-since', 'deleted', etc., without having to define it in Shade.

Change-Id: I4949a0baee08534f1b4822cb26793b2316c87333
This commit is contained in:
Daniel Speichert
2017-09-24 21:25:52 -04:00
committed by Monty Taylor
parent d9ce1c1a41
commit 240f5911d2
2 changed files with 30 additions and 4 deletions

View File

@@ -2033,7 +2033,8 @@ class OpenStackCloud(_normalize.Normalizer):
return self._normalize_secgroups(
self._get_and_munchify('security_groups', data))
def list_servers(self, detailed=False, all_projects=False, bare=False):
def list_servers(self, detailed=False, all_projects=False, bare=False,
filters=None):
"""List all available servers.
:param detailed: Whether or not to add detailed additional information.
@@ -2044,6 +2045,7 @@ class OpenStackCloud(_normalize.Normalizer):
server record. Defaults to False, meaning the addresses
dict will be populated as needed from neutron. Setting
to True implies detailed = False.
:param filters: Additional query parameters passed to the API server.
:returns: A list of server ``munch.Munch``.
@@ -2063,18 +2065,20 @@ class OpenStackCloud(_normalize.Normalizer):
self._servers = self._list_servers(
detailed=detailed,
all_projects=all_projects,
bare=bare)
bare=bare,
filters=filters)
self._servers_time = time.time()
finally:
self._servers_lock.release()
return self._servers
def _list_servers(self, detailed=False, all_projects=False, bare=False):
def _list_servers(self, detailed=False, all_projects=False, bare=False,
filters=None):
error_msg = "Error fetching server list on {cloud}:{region}:".format(
cloud=self.name,
region=self.region_name)
params = {}
params = filters or {}
if all_projects:
params['all_tenants'] = True
data = self._compute_client.get(

View File

@@ -167,6 +167,28 @@ class TestShade(base.RequestsMockTestCase):
self.assert_calls()
def test_list_servers_filters(self):
'''This test verifies that when list_servers is called with
`filters` dict that it passes it to nova.'''
self.register_uris([
dict(method='GET',
uri=self.get_mock_url(
'compute', 'public', append=['servers', 'detail'],
qs_elements=[
'deleted=True',
'changes-since=2014-12-03T00:00:00Z'
]),
complete_qs=True,
json={'servers': []}),
])
self.cloud.list_servers(filters={
'deleted': True,
'changes-since': '2014-12-03T00:00:00Z'
})
self.assert_calls()
def test_iterate_timeout_bad_wait(self):
with testtools.ExpectedException(
exc.OpenStackCloudException,