Add specific list method for NovaServer res
Nova API returns limited number of resources by one call. To clean all nova servers, we should: - list all pages(via marker option) [old novaclient]. - use limit=-1 and novaclient will list all pages for us. Closes-Bug: #1490940 Change-Id: Ic4d2852d9fd7602ac99b08654d2f99c52adf1cfe
This commit is contained in:
parent
513668403a
commit
720eff5472
@ -61,6 +61,31 @@ _nova_order = get_order(200)
|
|||||||
|
|
||||||
@base.resource("nova", "servers", order=next(_nova_order))
|
@base.resource("nova", "servers", order=next(_nova_order))
|
||||||
class NovaServer(base.ResourceManager):
|
class NovaServer(base.ResourceManager):
|
||||||
|
def list(self):
|
||||||
|
"""List all servers."""
|
||||||
|
|
||||||
|
if hasattr(self._manager().api, "api_version"):
|
||||||
|
# NOTE(andreykurilin): novaclient v2.27.0 includes ability to
|
||||||
|
# return all servers(see https://review.openstack.org/#/c/217101
|
||||||
|
# for more details). This release can be identified by presence
|
||||||
|
# of "api_version" property of ``novaclient.client.Client`` cls.
|
||||||
|
return self._manager().list(limit=-1)
|
||||||
|
else:
|
||||||
|
# FIXME(andreykurilin): Remove code below, when minimum version of
|
||||||
|
# novaclient in requirements will allow it.
|
||||||
|
# NOTE(andreykurilin): Nova API returns only limited number(
|
||||||
|
# 'osapi_max_limit' option in nova.conf) of servers, so we need
|
||||||
|
# to use 'marker' option to list all pages of servers.
|
||||||
|
result = []
|
||||||
|
marker = None
|
||||||
|
while True:
|
||||||
|
servers = self._manager().list(marker=marker)
|
||||||
|
if not servers:
|
||||||
|
break
|
||||||
|
result.extend(servers)
|
||||||
|
marker = servers[-1].id
|
||||||
|
return result
|
||||||
|
|
||||||
def delete(self):
|
def delete(self):
|
||||||
if getattr(self.raw_resource, "OS-EXT-STS:locked", False):
|
if getattr(self.raw_resource, "OS-EXT-STS:locked", False):
|
||||||
self.raw_resource.unlock()
|
self.raw_resource.unlock()
|
||||||
|
@ -84,6 +84,29 @@ class QuotaMixinTestCase(test.TestCase):
|
|||||||
|
|
||||||
class NovaServerTestCase(test.TestCase):
|
class NovaServerTestCase(test.TestCase):
|
||||||
|
|
||||||
|
def test_list(self):
|
||||||
|
server = resources.NovaServer()
|
||||||
|
server._manager = mock.MagicMock()
|
||||||
|
|
||||||
|
server.list()
|
||||||
|
|
||||||
|
server._manager.return_value.list.assert_called_once_with(limit=-1)
|
||||||
|
|
||||||
|
def test_list_old_novaclient(self):
|
||||||
|
servers = [mock.MagicMock(), mock.MagicMock(), mock.MagicMock(),
|
||||||
|
mock.MagicMock()]
|
||||||
|
server = resources.NovaServer()
|
||||||
|
server._manager = mock.MagicMock()
|
||||||
|
server._manager.return_value.api = None
|
||||||
|
server._manager.return_value.list.side_effect = (
|
||||||
|
servers[:2], servers[2:4], [])
|
||||||
|
|
||||||
|
self.assertEqual(servers, server.list())
|
||||||
|
self.assertEqual(
|
||||||
|
[mock.call(marker=None), mock.call(marker=servers[1].id),
|
||||||
|
mock.call(marker=servers[3].id)],
|
||||||
|
server._manager.return_value.list.call_args_list)
|
||||||
|
|
||||||
def test_delete(self):
|
def test_delete(self):
|
||||||
server = resources.NovaServer()
|
server = resources.NovaServer()
|
||||||
server.raw_resource = mock.Mock()
|
server.raw_resource = mock.Mock()
|
||||||
|
Loading…
Reference in New Issue
Block a user