def test_delete_volume_snapshot(self): vol_snapshots = self.volume_snapshots.list() snapshot = self.volume_snapshots.first() api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.volume_snapshot_list(IsA(http.HttpRequest)). \ AndReturn(vol_snapshots) api.volume_snapshot_delete(IsA(http.HttpRequest), snapshot.id) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.volume_snapshot_list(IsA(http.HttpRequest)). \ AndReturn([]) self.mox.ReplayAll() formData = {'action': 'volume_snapshots__delete__%s' % snapshot.id} res = self.client.post(INDEX_URL, formData, follow=True) self.assertIn("Scheduled deletion of Volume Snapshot: test snapshot", [m.message for m in res.context['messages']])
def test_index(self): images = self.images.list() snapshots = self.snapshots.list() volumes = self.volumes.list() for volume in volumes: volume.volume_id = volume.id for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) api.volume_get(IsA(http.HttpRequest), volume.volume_id) api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(volumes) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([images, False]) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([snapshots, False]) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'project/images_and_snapshots/index.html') self.assertIn('images_table', res.context) images = res.context['images_table'].data filter_func = lambda im: im.container_format not in ['aki', 'ari'] filtered_images = filter(filter_func, images) self.assertItemsEqual(images, filtered_images)
def test_create_instance_snapshot(self): server = self.servers.first() api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.snapshot_create(IsA(http.HttpRequest), server.id, "snapshot1").AndReturn(self.snapshots.first()) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([[], False]) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([[], False]) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([]) self.mox.ReplayAll() formData = { 'instance_id': server.id, 'method': 'CreateSnapshot', 'name': 'snapshot1' } url = reverse('horizon:project:images_and_snapshots:snapshots:create', args=[server.id]) redir_url = reverse('horizon:project:images_and_snapshots:index') res = self.client.post(url, formData) self.assertRedirects(res, redir_url)
def test_images_list(self): api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list(), False]) self.mox.ReplayAll() res = self.client.get(reverse('horizon:admin:images:index')) self.assertTemplateUsed(res, 'admin/images/index.html') self.assertEqual(len(res.context['images_table'].data), len(self.images.list()))
def test_images_list(self): api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list(), False]) self.mox.ReplayAll() res = self.client.get( reverse('horizon:admin:images:index')) self.assertTemplateUsed(res, 'admin/images/index.html') self.assertEqual(len(res.context['images_table'].data), len(self.images.list()))
def test_images_list_get_pagination(self): api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list(), True]) api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list()[:2], True]) api.image_list_detailed(IsA(http.HttpRequest), marker=self.images.list()[2].id) \ .AndReturn([self.images.list()[2:4], True]) api.image_list_detailed(IsA(http.HttpRequest), marker=self.images.list()[4].id) \ .AndReturn([self.images.list()[4:], True]) self.mox.ReplayAll() url = reverse('horizon:admin:images:index') res = self.client.get(url) # get all self.assertEqual(len(res.context['images_table'].data), len(self.images.list())) self.assertTemplateUsed(res, 'admin/images/index.html') page_size = getattr(settings, "API_RESULT_PAGE_SIZE", None) settings.API_RESULT_PAGE_SIZE = 2 res = self.client.get(url) # get first page with 2 items self.assertEqual(len(res.context['images_table'].data), settings.API_RESULT_PAGE_SIZE) url = "?".join([ reverse('horizon:admin:images:index'), "=".join([ AdminImagesTable._meta.pagination_param, self.images.list()[2].id ]) ]) res = self.client.get(url) # get second page (items 2-4) self.assertEqual(len(res.context['images_table'].data), settings.API_RESULT_PAGE_SIZE) url = "?".join([ reverse('horizon:admin:images:index'), "=".join([ AdminImagesTable._meta.pagination_param, self.images.list()[4].id ]) ]) res = self.client.get(url) # get third page (item 5) self.assertEqual(len(res.context['images_table'].data), 1) # restore API_RESULT_PAGE_SIZE if page_size: settings.API_RESULT_PAGE_SIZE = page_size else: del settings.API_RESULT_PAGE_SIZE
def test_queued_snapshot_actions(self): images = self.images.list() snapshots = self.snapshots.list() volumes = self.volumes.list() for volume in volumes: volume.volume_id = volume.id for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) api.volume_get(IsA(http.HttpRequest), volume.volume_id) api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(volumes) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([images, False]) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([snapshots, False]) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'project/images_and_snapshots/index.html') self.assertIn('snapshots_table', res.context) snaps = res.context['snapshots_table'] self.assertEqual(len(snaps.get_rows()), 3) row_actions = snaps.get_row_actions(snaps.data[0]) # first instance - status active, owned self.assertEqual(len(row_actions), 3) self.assertEqual(row_actions[0].verbose_name, u"Launch") self.assertEqual(row_actions[1].verbose_name, u"Edit") self.assertEqual(row_actions[2].verbose_name, u"Delete Snapshot") row_actions = snaps.get_row_actions(snaps.data[1]) # second instance - status active, not owned self.assertEqual(len(row_actions), 1) self.assertEqual(row_actions[0].verbose_name, u"Launch") row_actions = snaps.get_row_actions(snaps.data[2]) # third instance - status queued, only delete is available self.assertEqual(len(row_actions), 1) self.assertEqual(unicode(row_actions[0].verbose_name), u"Delete Snapshot") self.assertEqual(str(row_actions[0]), "<DeleteSnapshot: delete>")
def test_create_instance_snapshot(self): server = self.servers.first() api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.snapshot_create(IsA(http.HttpRequest), server.id, "snapshot1").AndReturn(self.snapshots.first()) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([[], False]) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([[], False]) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([]) self.mox.ReplayAll() formData = {"instance_id": server.id, "method": "CreateSnapshot", "name": "snapshot1"} url = reverse("horizon:project:images_and_snapshots:snapshots:create", args=[server.id]) redir_url = reverse("horizon:project:images_and_snapshots:index") res = self.client.post(url, formData) self.assertRedirects(res, redir_url)
def test_images_list_get_pagination(self): api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list(), True]) api.image_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.images.list()[:2], True]) api.image_list_detailed(IsA(http.HttpRequest), marker=self.images.list()[2].id) \ .AndReturn([self.images.list()[2:4], True]) api.image_list_detailed(IsA(http.HttpRequest), marker=self.images.list()[4].id) \ .AndReturn([self.images.list()[4:], True]) self.mox.ReplayAll() url = reverse('horizon:admin:images:index') res = self.client.get(url) # get all self.assertEqual(len(res.context['images_table'].data), len(self.images.list())) self.assertTemplateUsed(res, 'admin/images/index.html') page_size = getattr(settings, "API_RESULT_PAGE_SIZE", None) settings.API_RESULT_PAGE_SIZE = 2 res = self.client.get(url) # get first page with 2 items self.assertEqual(len(res.context['images_table'].data), settings.API_RESULT_PAGE_SIZE) url = "?".join([reverse('horizon:admin:images:index'), "=".join([AdminImagesTable._meta.pagination_param, self.images.list()[2].id])]) res = self.client.get(url) # get second page (items 2-4) self.assertEqual(len(res.context['images_table'].data), settings.API_RESULT_PAGE_SIZE) url = "?".join([reverse('horizon:admin:images:index'), "=".join([AdminImagesTable._meta.pagination_param, self.images.list()[4].id])]) res = self.client.get(url) # get third page (item 5) self.assertEqual(len(res.context['images_table'].data), 1) # restore API_RESULT_PAGE_SIZE if page_size: settings.API_RESULT_PAGE_SIZE = page_size else: del settings.API_RESULT_PAGE_SIZE
def get_data(self): images = [] marker = self.request.GET.get(AdminImagesTable._meta.pagination_param, None) try: images, self._more = api.image_list_detailed(self.request, marker=marker) except: self._more = False msg = _('Unable to retrieve image list.') exceptions.handle(self.request, msg) return images
def test_index_no_images(self): volumes = self.volumes.list() for volume in volumes: volume.volume_id = volume.id for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) api.volume_get(IsA(http.HttpRequest), volume.volume_id) api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(volumes) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([(), False]) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.snapshots.list(), False]) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'project/images_and_snapshots/index.html')
def test_index_error(self): volumes = self.volumes.list() for volume in volumes: volume.volume_id = volume.id for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) for volume in volumes: api.volume_get(IsA(http.HttpRequest), volume.volume_id) \ .AndReturn(volume) api.volume_get(IsA(http.HttpRequest), volume.volume_id) api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(volumes) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndRaise(self.exceptions.glance) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([self.snapshots.list(), False]) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, 'project/images_and_snapshots/index.html')
def get_images_data(self): marker = self.request.GET.get(ImagesTable._meta.pagination_param, None) try: # FIXME(gabriel): The paging is going to be strange here due to # our filtering after the fact. (all_images, self._more_images) = api.image_list_detailed(self.request, marker=marker) images = [im for im in all_images if im.container_format not in ['aki', 'ari'] and im.properties.get("image_type", '') != "snapshot"] except: images = [] exceptions.handle(self.request, _("Unable to retrieve images.")) return images
def test_delete_volume_snapshot(self): vol_snapshots = self.volume_snapshots.list() snapshot = self.volume_snapshots.first() api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn( ([], False)) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.volume_snapshot_list(IsA(http.HttpRequest)). \ AndReturn(vol_snapshots) api.volume_snapshot_delete(IsA(http.HttpRequest), snapshot.id) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn( ([], False)) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn(([], False)) api.volume_snapshot_list(IsA(http.HttpRequest)). \ AndReturn([]) self.mox.ReplayAll() formData = {'action': 'volume_snapshots__delete__%s' % snapshot.id} res = self.client.post(INDEX_URL, formData, follow=True) self.assertIn("Scheduled deletion of Volume Snapshot: test snapshot", [m.message for m in res.context['messages']])
def get_images_data(self): marker = self.request.GET.get(ImagesTable._meta.pagination_param, None) try: # FIXME(gabriel): The paging is going to be strange here due to # our filtering after the fact. (all_images, self._more_images) = api.image_list_detailed(self.request, marker=marker) images = [ im for im in all_images if im.container_format not in ['aki', 'ari'] and im.properties.get("image_type", '') != "snapshot" ] except: images = [] exceptions.handle(self.request, _("Unable to retrieve images.")) return images
def index(request): for f in (DeleteImage, ToggleImage): _, handled = f.maybe_handle(request) if handled: return handled # We don't have any way of showing errors for these, so don't bother # trying to reuse the forms from above delete_form = DeleteImage() toggle_form = ToggleImage() images = [] try: images = api.image_list_detailed(request) if not images: messages.info(request, "There are currently no images.") except glance_exception.ClientConnectionError, e: LOG.error("Error connecting to glance", exc_info=True) messages.error(request, "Error connecting to glance: %s" % e.message)
def index(request, tenant_id): tenant = {} try: tenant = api.token_get_tenant(request, request.user.tenant) except api_exceptions.ApiException, e: messages.error( request, "Unable to retrienve tenant info\ from keystone: %s" % e.message, ) all_images = [] try: all_images = api.image_list_detailed(request) if not all_images: messages.info(request, "There are currently no images.") except glance_exception.ClientConnectionError, e: LOG.error("Error connecting to glance", exc_info=True) messages.error(request, "Error connecting to glance: %s" % str(e)) except glance_exception.Error, e: LOG.error("Error retrieving image list", exc_info=True) messages.error(request, "Error retrieving image list: %s" % str(e)) images = [im for im in all_images if im["container_format"] not in ["aki", "ari"]] return render_to_response( topbar + "/image_view.html", {"tenant": tenant, "images": images}, context_instance=template.RequestContext(request),