Exemple #1
0
    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']])
Exemple #2
0
    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)
Exemple #3
0
    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)
Exemple #4
0
    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)
Exemple #5
0
    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()))
Exemple #6
0
    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()))
Exemple #7
0
    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
Exemple #8
0
    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>")
Exemple #9
0
    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>")
Exemple #10
0
    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)
Exemple #11
0
    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
Exemple #12
0
 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
Exemple #13
0
 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
Exemple #14
0
    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')
Exemple #15
0
    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')
Exemple #16
0
 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
Exemple #17
0
    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']])
Exemple #18
0
 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),