Merge "Adds community image loading for instance index view"

This commit is contained in:
Zuul 2019-06-19 11:18:00 +00:00 committed by Gerrit Code Review
commit d254dac067
2 changed files with 101 additions and 71 deletions

View File

@ -75,6 +75,30 @@ class InstanceTestHelperMixin(object):
class InstanceTestBase(helpers.ResetImageAPIVersionMixin,
InstanceTestHelperMixin,
helpers.TestCase):
def _assert_mock_image_list_detailed_calls(self):
expected_calls = [
mock.call(helpers.IsHttpRequest()),
mock.call(
helpers.IsHttpRequest(),
filters={'visibility': 'community'}
)
]
self.mock_image_list_detailed.assert_has_calls(expected_calls, False)
def _assert_mock_image_list_detailed_calls_double(self):
expected_calls = [
mock.call(helpers.IsHttpRequest()),
mock.call(
helpers.IsHttpRequest(),
filters={'visibility': 'community'}
),
mock.call(helpers.IsHttpRequest()),
mock.call(
helpers.IsHttpRequest(),
filters={'visibility': 'community'}
)
]
self.mock_image_list_detailed.assert_has_calls(expected_calls, False)
def setUp(self):
super(InstanceTestBase, self).setUp()
@ -216,8 +240,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_is_feature_available, expected_feature_count,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -285,10 +309,9 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertTemplateUsed(res, INDEX_TEMPLATE)
self.assertEqual(len(res.context['instances_table'].data), 0)
self.assertMessageCount(res, error=1)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
sort_dir='desc',
@ -345,8 +368,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_tenant_absolute_limits, 2,
mock.call(helpers.IsHttpRequest(), reserved=True))
@ -401,8 +424,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -476,8 +499,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@ -512,8 +535,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@ -547,8 +569,7 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@ -580,8 +601,7 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -620,8 +640,7 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -660,8 +679,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -701,8 +720,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -736,8 +755,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -771,8 +790,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -806,8 +825,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.assertRedirectsNoFollow(res, INDEX_URL)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -849,8 +868,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
'AdminActions', helpers.IsHttpRequest())
self.mock_flavor_list.assert_called_once_with(
helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -895,8 +914,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
sort_dir='desc',
@ -935,8 +954,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -976,8 +995,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1017,8 +1036,8 @@ 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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1056,8 +1075,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_extension_supported.assert_called_once_with(
'Shelve', helpers.IsHttpRequest())
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1096,8 +1115,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_extension_supported.assert_called_once_with(
'Shelve', helpers.IsHttpRequest())
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1137,8 +1156,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_extension_supported.assert_called_once_with(
'Shelve', helpers.IsHttpRequest())
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1178,8 +1197,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
self.mock_extension_supported.assert_called_once_with(
'Shelve', helpers.IsHttpRequest())
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1220,8 +1239,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1264,8 +1283,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
helpers.IsHttpRequest(), 'locked_attribute')
self.mock_flavor_list.assert_called_once_with(
helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1306,8 +1325,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
helpers.IsHttpRequest(), 'locked_attribute')
self.mock_flavor_list.assert_called_once_with(
helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1348,8 +1367,8 @@ class InstanceTableTests(InstanceTestBase, InstanceTableTestMixin):
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_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -1875,8 +1894,8 @@ class InstanceTests(InstanceTestBase):
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -4171,8 +4190,8 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -4236,8 +4255,8 @@ class InstanceLaunchInstanceTests(InstanceTestBase,
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -4419,8 +4438,8 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_is_feature_available, 8,
mock.call(helpers.IsHttpRequest(), 'locked_attribute'))
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
search_opts = {'marker': None, 'paginate': True}
self.mock_server_list_paged.assert_called_once_with(
helpers.IsHttpRequest(),
@ -5019,9 +5038,7 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_flavor_list, 2,
mock.call(helpers.IsHttpRequest()))
self.assert_mock_multiple_calls_with_same_arguments(
self.mock_image_list_detailed, 2,
mock.call(helpers.IsHttpRequest()))
self._assert_mock_image_list_detailed_calls_double()
self.mock_server_list_paged.assert_has_calls([
mock.call(helpers.IsHttpRequest(),
@ -5090,8 +5107,8 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers[page_size:])
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_delete.assert_called_once_with(
helpers.IsHttpRequest(), server.id)
@ -5205,8 +5222,8 @@ class InstanceTests2(InstanceTestBase, InstanceTableTestMixin):
self.mock_servers_update_addresses.assert_called_once_with(
helpers.IsHttpRequest(), servers)
self.mock_flavor_list.assert_called_once_with(helpers.IsHttpRequest())
self.mock_image_list_detailed.assert_called_once_with(
helpers.IsHttpRequest())
self._assert_mock_image_list_detailed_calls()
self.mock_server_unrescue.assert_called_once_with(
helpers.IsHttpRequest(), server.id)

View File

@ -81,9 +81,22 @@ class IndexView(tables.PagedTableMixin, tables.DataTableView):
def _get_images(self):
# Gather our images to correlate our instances to them
try:
# Community images have to be retrieved separately and merged,
# because their visibility has to be explicitly defined in the
# API call and the Glance API currently does not support filtering
# by multiple values in the visibility field.
# TODO(gabriel): Handle pagination.
images = api.glance.image_list_detailed(self.request)[0]
return dict((str(image.id), image) for image in images)
community_images = api.glance.image_list_detailed(
self.request, filters={'visibility': 'community'})[0]
image_map = {
image.id: image for image in images
}
# Images have to be filtered by their uuids; some users
# have default access to certain community images.
for image in community_images:
image_map.setdefault(image.id, image)
return image_map
except Exception:
exceptions.handle(self.request, ignore=True)
return {}