summaryrefslogtreecommitdiff
path: root/openstack_dashboard/dashboards/project/instances
diff options
context:
space:
mode:
authorFerenc Cserepkei <ferenc.cserepkei@ericsson.com>2017-08-25 19:53:42 +0200
committerAkihiro Motoki <amotoki@gmail.com>2018-12-28 20:46:11 +0900
commit467669417979ec7443d5195d4b4635d5596cdc08 (patch)
tree7b4782a1e8fa55d3df239743f2619041337cfcb0 /openstack_dashboard/dashboards/project/instances
parent87e2cf67fa6f71b77e70915539b93f4b86382eab (diff)
downloadhorizon-467669417979ec7443d5195d4b4635d5596cdc08.tar.gz
Add "prev" link to instance page list pagination
Currently there is no link to previous page at paginated instances table. This patch resolves that issue by re-using the pagination code for flavors. It also supports Ying Zuo's scenario: After I set only 1 item per page and deleted the instance on the first page, the expected behavior is showing the next instance in the table after one is deleted. xxxIndexView uses PagedTableMixin's _get_marker() from now instead of GET()- ing the markers Closes-Bug: #1274427 Co-Authored-By: Dmitry Ratushnyy <dratushn@cisco.com> Co-Authored-By: Akihiro Motoki <amotoki@gmail.com> Change-Id: Id8eaae6bf1b5d6f42291291655e14b8715c08bc8 Signed-off-by: Ferenc Cserepkei <ferenc.cserepkei@ericsson.com>
Diffstat (limited to 'openstack_dashboard/dashboards/project/instances')
-rw-r--r--openstack_dashboard/dashboards/project/instances/tests.py396
-rw-r--r--openstack_dashboard/dashboards/project/instances/views.py19
2 files changed, 253 insertions, 162 deletions
diff --git a/openstack_dashboard/dashboards/project/instances/tests.py b/openstack_dashboard/dashboards/project/instances/tests.py
index d2bbcfdad..7f1d68158 100644
--- a/openstack_dashboard/dashboards/project/instances/tests.py
+++ b/openstack_dashboard/dashboards/project/instances/tests.py
@@ -172,7 +172,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
@helpers.create_mocks({
api.nova: (
'flavor_list',
- 'server_list',
+ 'server_list_paged',
'tenant_absolute_limits',
'extension_supported',
'is_feature_available',
@@ -194,13 +194,12 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = \
(self.images.list(), False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_tenant_absolute_limits.return_value = \
self.limits['absolute']
self.mock_floating_ip_supported.return_value = True
self.mock_floating_ip_simple_associate_supported.return_value = True
-
return self.client.get(INDEX_URL)
def _check_get_index(self, use_servers_update_address=True,
@@ -219,8 +218,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(
- helpers.IsHttpRequest(), search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
if use_servers_update_address:
servers = self.servers.list()
self.mock_servers_update_addresses.assert_called_once_with(
@@ -263,17 +264,18 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self._check_get_index(use_servers_update_address=False)
@helpers.create_mocks({
- api.nova: ('server_list', 'tenant_absolute_limits', 'flavor_list'),
+ api.nova: ('server_list_paged',
+ 'tenant_absolute_limits',
+ 'flavor_list'),
api.glance: ('image_list_detailed',),
})
def test_index_server_list_exception(self):
search_opts = {'marker': None, 'paginate': True}
flavors = self.flavors.list()
images = self.images.list()
-
self.mock_flavor_list.return_value = flavors
self.mock_image_list_detailed.return_value = (images, False, False)
- self.mock_server_list.side_effect = self.exceptions.nova
+ self.mock_server_list_paged.side_effect = self.exceptions.nova
self.mock_tenant_absolute_limits.return_value = self.limits['absolute']
res = self.client.get(INDEX_URL)
@@ -285,15 +287,20 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_tenant_absolute_limits, 2,
mock.call(helpers.IsHttpRequest(), reserved=True))
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'flavor_get',
- 'tenant_absolute_limits', 'extension_supported',
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'flavor_get',
+ 'tenant_absolute_limits',
+ 'extension_supported',
'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
@@ -307,7 +314,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self._mock_extension_supported({'AdminActions': True,
'Shelve': True})
self.mock_is_feature_available.return_value = True
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.side_effect = self.exceptions.nova
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -328,8 +335,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
@@ -346,8 +355,11 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
mock.call(helpers.IsHttpRequest()))
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -363,7 +375,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self._mock_extension_supported({'AdminActions': True,
'Shelve': True})
self.mock_is_feature_available.return_value = True
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -388,8 +400,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.assert_mock_multiple_calls_with_same_arguments(
@@ -429,7 +443,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertNotIsInstance(action, tables.ConsoleLink)
self._check_get_index(multiplier=8)
- @helpers.create_mocks({api.nova: ('server_list',
+ @helpers.create_mocks({api.nova: ('server_list_paged',
'flavor_list',
'server_delete',),
api.glance: ('image_list_detailed',),
@@ -438,21 +452,22 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
servers = self.servers.list()
server = servers[0]
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
self.mock_server_delete.return_value = None
-
formData = {'action': 'instances__delete__%s' % server.id}
res = self.client.post(INDEX_URL, formData)
self.assertRedirectsNoFollow(res, INDEX_URL)
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
@@ -461,7 +476,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
- @helpers.create_mocks({api.nova: ('server_list',
+ @helpers.create_mocks({api.nova: ('server_list_paged',
'flavor_list',
'server_delete',),
api.glance: ('image_list_detailed',),
@@ -471,7 +486,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
server = servers[0]
server.status = 'ERROR'
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -484,8 +499,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
@@ -494,7 +511,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
- @helpers.create_mocks({api.nova: ('server_list',
+ @helpers.create_mocks({api.nova: ('server_list_paged',
'flavor_list',
'server_delete',),
api.glance: ('image_list_detailed',),
@@ -503,7 +520,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
servers = self.servers.list()
server = servers[0]
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -516,8 +533,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
@@ -527,7 +546,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_pause',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -541,7 +560,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_pause.return_value = None
@@ -556,15 +575,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_pause.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_pause',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -578,7 +599,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_pause.side_effect = self.exceptions.nova
@@ -593,15 +614,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_pause.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unpause',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -615,7 +638,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unpause.return_value = None
@@ -630,15 +653,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unpause.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unpause',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -653,7 +678,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unpause.side_effect = self.exceptions.nova
@@ -668,15 +693,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unpause.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_reboot',
- 'server_list',
+ 'server_list_paged',
'flavor_list',),
api.glance: ('image_list_detailed',),
api.network: ('servers_update_addresses',)})
@@ -687,7 +714,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_reboot.return_value = None
@@ -700,15 +727,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_reboot.assert_called_once_with(
helpers.IsHttpRequest(), server.id, soft_reboot=False)
@helpers.create_mocks({api.nova: ('server_reboot',
- 'server_list',
+ 'server_list_paged',
'flavor_list',),
api.glance: ('image_list_detailed',),
api.network: ('servers_update_addresses',)})
@@ -719,7 +748,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_reboot.side_effect = self.exceptions.nova
@@ -732,15 +761,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_reboot.assert_called_once_with(
helpers.IsHttpRequest(), server.id, soft_reboot=False)
@helpers.create_mocks({api.nova: ('server_reboot',
- 'server_list',
+ 'server_list_paged',
'flavor_list',),
api.glance: ('image_list_detailed',),
api.network: ('servers_update_addresses',)})
@@ -751,7 +782,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_reboot.return_value = None
@@ -764,15 +795,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_reboot.assert_called_once_with(
helpers.IsHttpRequest(), server.id, soft_reboot=True)
@helpers.create_mocks({api.nova: ('server_suspend',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -786,7 +819,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_suspend.return_value = None
@@ -799,12 +832,15 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_extension_supported.assert_called_once_with(
'AdminActions', helpers.IsHttpRequest())
- self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
+ self.mock_flavor_list.assert_called_once_with(
+ helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_suspend.assert_called_once_with(
@@ -812,7 +848,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
@django.test.utils.override_settings(API_RESULT_PAGE_SIZE=2)
@helpers.create_mocks({api.nova: ('server_suspend',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -826,7 +862,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers[page_size:], False]
+ self.mock_server_list_paged.return_value = [
+ servers[page_size:], False, True]
self.mock_servers_update_addresses.return_value = None
self.mock_server_suspend.return_value = None
@@ -844,8 +881,9 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
- self.mock_server_list.assert_called_once_with(
+ self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
+ sort_dir='desc',
search_opts={'marker': servers[page_size - 1].id,
'paginate': True})
self.mock_servers_update_addresses.assert_called_once_with(
@@ -854,7 +892,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
helpers.IsHttpRequest(), servers[-1].id)
@helpers.create_mocks({api.nova: ('server_suspend',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -868,7 +906,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_suspend.side_effect = self.exceptions.nova
@@ -883,15 +921,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_suspend.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_resume',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -906,7 +946,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_resume.return_value = None
@@ -921,15 +961,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_resume.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_resume',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available'),
@@ -944,7 +986,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_resume.side_effect = self.exceptions.nova
@@ -959,15 +1001,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_resume.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_shelve',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -981,10 +1025,9 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_shelve.return_value = None
-
formData = {'action': 'instances__shelve__%s' % server.id}
res = self.client.post(INDEX_URL, formData)
@@ -996,15 +1039,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_shelve.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_shelve',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -1018,7 +1063,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_shelve.side_effect = self.exceptions.nova
@@ -1033,15 +1078,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_shelve.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unshelve',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -1056,7 +1103,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unshelve.return_value = None
@@ -1071,15 +1118,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unshelve.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unshelve',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -1094,7 +1143,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unshelve.side_effect = self.exceptions.nova
@@ -1109,15 +1158,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unshelve.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_lock',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -1132,10 +1183,9 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_lock.return_value = None
-
formData = {'action': 'instances__lock__%s' % server.id}
res = self.client.post(INDEX_URL, formData)
@@ -1149,15 +1199,17 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_lock.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_lock',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available',),
@@ -1172,7 +1224,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_lock.side_effect = self.exceptions.nova
@@ -1185,19 +1237,22 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
'AdminActions', helpers.IsHttpRequest())
self.mock_is_feature_available.assert_called_once_with(
helpers.IsHttpRequest(), 'locked_attribute')
- self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
+ self.mock_flavor_list.assert_called_once_with(
+ helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_lock.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unlock',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available'),
@@ -1211,10 +1266,9 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unlock.return_value = None
-
formData = {'action': 'instances__unlock__%s' % server.id}
res = self.client.post(INDEX_URL, formData)
@@ -1224,19 +1278,22 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
'AdminActions', helpers.IsHttpRequest())
self.mock_is_feature_available.assert_called_once_with(
helpers.IsHttpRequest(), 'locked_attribute')
- self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
+ self.mock_flavor_list.assert_called_once_with(
+ helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unlock.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@helpers.create_mocks({api.nova: ('server_unlock',
- 'server_list',
+ 'server_list_paged',
'flavor_list',
'extension_supported',
'is_feature_available'),
@@ -1245,13 +1302,12 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
def test_unlock_instance_exception(self):
servers = self.servers.list()
server = servers[0]
-
self.mock_extension_supported.return_value = True
self.mock_is_feature_available.return_value = True
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_server_unlock.side_effect = self.exceptions.nova
@@ -1268,8 +1324,10 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_server_unlock.assert_called_once_with(
@@ -1745,8 +1803,11 @@ class InstanceTests(InstanceTestBase):
self._test_instances_index_retrieve_password_action()
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -1761,7 +1822,7 @@ class InstanceTests(InstanceTestBase):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_tenant_absolute_limits.return_value = self.limits['absolute']
self.mock_floating_ip_supported.return_value = True
@@ -1789,8 +1850,10 @@ class InstanceTests(InstanceTestBase):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.assert_mock_multiple_calls_with_same_arguments(
@@ -4030,8 +4093,11 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
msg, 0)
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -4047,7 +4113,7 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_tenant_absolute_limits.return_value = limits
self.mock_floating_ip_supported.return_value = True
@@ -4074,8 +4140,10 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.assert_mock_multiple_calls_with_same_arguments(
@@ -4089,8 +4157,11 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
mock.call(helpers.IsHttpRequest()))
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -4107,7 +4178,7 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_tenant_absolute_limits.return_value = limits
self.mock_floating_ip_supported.return_value = True
@@ -4133,8 +4204,10 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.assert_mock_multiple_calls_with_same_arguments(
@@ -4273,8 +4346,11 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -4291,7 +4367,7 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_tenant_absolute_limits.return_value = self.limits['absolute']
self.mock_floating_ip_supported.return_value = True
@@ -4310,8 +4386,10 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(
- helpers.IsHttpRequest(), search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.assert_mock_multiple_calls_with_same_arguments(
@@ -4844,8 +4922,11 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
@django.test.utils.override_settings(API_RESULT_PAGE_SIZE=2)
@helpers.create_mocks({
- api.nova: ('flavor_list', 'server_list', 'tenant_absolute_limits',
- 'extension_supported', 'is_feature_available',),
+ api.nova: ('flavor_list',
+ 'server_list_paged',
+ 'tenant_absolute_limits',
+ 'extension_supported',
+ 'is_feature_available',),
api.glance: ('image_list_detailed',),
api.neutron: ('floating_ip_simple_associate_supported',
'floating_ip_supported',),
@@ -4865,9 +4946,9 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed.return_value = (self.images.list(),
False, False)
- self.mock_server_list.side_effect = [
- [servers[:page_size], True],
- [servers[page_size:], False]
+ self.mock_server_list_paged.side_effect = [
+ [servers[:page_size], True, False],
+ [servers[page_size:], False, False]
]
self.mock_servers_update_addresses.return_value = None
@@ -4905,14 +4986,16 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_image_list_detailed, 2,
mock.call(helpers.IsHttpRequest()))
- self.mock_server_list.assert_has_calls([
+ self.mock_server_list_paged.assert_has_calls([
mock.call(helpers.IsHttpRequest(),
+ sort_dir='desc',
search_opts={'marker': None, 'paginate': True}),
mock.call(helpers.IsHttpRequest(),
+ sort_dir='desc',
search_opts={'marker': servers[page_size - 1].id,
'paginate': True}),
])
- self.assertEqual(2, self.mock_server_list.call_count)
+ self.assertEqual(2, self.mock_server_list_paged.call_count)
self.mock_servers_update_addresses.assert_has_calls([
mock.call(helpers.IsHttpRequest(), servers[:page_size]),
mock.call(helpers.IsHttpRequest(), servers[page_size:]),
@@ -4930,7 +5013,7 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
mock.call(helpers.IsHttpRequest()))
@django.test.utils.override_settings(API_RESULT_PAGE_SIZE=2)
- @helpers.create_mocks({api.nova: ('server_list',
+ @helpers.create_mocks({api.nova: ('server_list_paged',
'flavor_list',
'server_delete',),
api.glance: ('image_list_detailed',),
@@ -4942,7 +5025,8 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
servers = self.servers.list()[:3]
server = servers[-1]
- self.mock_server_list.return_value = [servers[page_size:], False]
+ self.mock_server_list_paged.return_value = [
+ servers[page_size:], False, True]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -4961,8 +5045,10 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.assertMessageCount(success=1)
search_opts = {'marker': servers[page_size - 1].id, 'paginate': True}
- self.mock_server_list.assert_called_once_with(
- helpers.IsHttpRequest(), search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers[page_size:])
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
@@ -5050,7 +5136,7 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
helpers.IsHttpRequest(), server.id, image=image.id,
password=password)
- @helpers.create_mocks({api.nova: ('server_list',
+ @helpers.create_mocks({api.nova: ('server_list_paged',
'flavor_list',
'server_unrescue',),
api.glance: ('image_list_detailed',),
@@ -5060,7 +5146,7 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
server = servers[0]
server.status = "RESCUE"
- self.mock_server_list.return_value = [servers, False]
+ self.mock_server_list_paged.return_value = [servers, False, False]
self.mock_servers_update_addresses.return_value = None
self.mock_flavor_list.return_value = self.flavors.list()
self.mock_image_list_detailed.return_value = (self.images.list(),
@@ -5073,8 +5159,10 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
search_opts = {'marker': None, 'paginate': True}
- self.mock_server_list.assert_called_once_with(helpers.IsHttpRequest(),
- search_opts=search_opts)
+ self.mock_server_list_paged.assert_called_once_with(
+ helpers.IsHttpRequest(),
+ sort_dir='desc',
+ search_opts=search_opts)
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
diff --git a/openstack_dashboard/dashboards/project/instances/views.py b/openstack_dashboard/dashboards/project/instances/views.py
index fa2e833b7..f17da0412 100644
--- a/openstack_dashboard/dashboards/project/instances/views.py
+++ b/openstack_dashboard/dashboards/project/instances/views.py
@@ -59,10 +59,13 @@ from openstack_dashboard.views import get_url_with_pagination
LOG = logging.getLogger(__name__)
-class IndexView(tables.DataTableView):
+class IndexView(tables.PagedTableMixin, tables.DataTableView):
table_class = project_tables.InstancesTable
page_title = _("Instances")
+ def has_prev_data(self, table):
+ return getattr(self, "_prev", False)
+
def has_more_data(self, table):
return self._more
@@ -85,13 +88,14 @@ class IndexView(tables.DataTableView):
exceptions.handle(self.request, ignore=True)
return {}
- def _get_instances(self, search_opts):
+ def _get_instances(self, search_opts, sort_dir):
try:
- instances, self._more = api.nova.server_list(
+ instances, self._more, self._prev = api.nova.server_list_paged(
self.request,
- search_opts=search_opts)
+ search_opts=search_opts,
+ sort_dir=sort_dir)
except Exception:
- self._more = False
+ self._more = self._prev = False
instances = []
exceptions.handle(self.request,
_('Unable to retrieve instances.'))
@@ -122,8 +126,7 @@ class IndexView(tables.DataTableView):
return instances
def get_data(self):
- marker = self.request.GET.get(
- project_tables.InstancesTable._meta.pagination_param, None)
+ marker, sort_dir = self._get_marker()
search_opts = self.get_filters({'marker': marker, 'paginate': True})
image_dict, flavor_dict = futurist_utils.call_functions_parallel(
@@ -137,7 +140,7 @@ class IndexView(tables.DataTableView):
self._more = False
return []
- instances = self._get_instances(search_opts)
+ instances = self._get_instances(search_opts, sort_dir)
# Loop through instances to get flavor info.
for instance in instances: