diff options
author | Ferenc Cserepkei <ferenc.cserepkei@ericsson.com> | 2017-08-25 19:53:42 +0200 |
---|---|---|
committer | Akihiro Motoki <amotoki@gmail.com> | 2018-12-28 20:46:11 +0900 |
commit | 467669417979ec7443d5195d4b4635d5596cdc08 (patch) | |
tree | 7b4782a1e8fa55d3df239743f2619041337cfcb0 /openstack_dashboard/dashboards/project/instances | |
parent | 87e2cf67fa6f71b77e70915539b93f4b86382eab (diff) | |
download | horizon-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.py | 396 | ||||
-rw-r--r-- | openstack_dashboard/dashboards/project/instances/views.py | 19 |
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: |