def test_edit_attachments(self): volume = self.volumes.first() servers = self.servers.list() self.mox.StubOutWithMock(api, 'volume_get') self.mox.StubOutWithMock(api.nova, 'server_list') api.volume_get(IsA(http.HttpRequest), volume.id) \ .AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse('horizon:nova:instances_and_volumes:volumes:attach', args=[volume.id]) res = self.client.get(url) self.assertEqual(res.status_code, 200)
def test_edit_attachments(self): volume = self.volumes.first() servers = self.servers.list() api.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse("horizon:nova:instances_and_volumes:volumes:attach", args=[volume.id]) res = self.client.get(url) # Asserting length of 2 accounts for the one instance option, # and the one 'Choose Instance' option. self.assertEqual(len(res.context["form"].fields["instance"]._choices), 2) self.assertEqual(res.status_code, 200)
def test_edit_attachments_attached_volume(self): server = self.servers.first() volume = self.volumes.list()[0] api.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list()) self.mox.ReplayAll() url = reverse("horizon:nova:instances_and_volumes:volumes:attach", args=[volume.id]) res = self.client.get(url) self.assertEqual(res.context["form"].fields["instance"]._choices[0][1], "Select an instance") self.assertEqual(len(res.context["form"].fields["instance"].choices), 2) self.assertEqual(res.context["form"].fields["instance"]._choices[1][0], server.id) self.assertEqual(res.status_code, 200)
def handle(self, request, data): instance_choices = dict(self.fields['instance'].choices) instance_name = instance_choices.get(data['instance'], _("Unknown instance (None)")) # The name of the instance in the choices list has the ID appended to # it, so let's slice that off... instance_name = instance_name.rsplit(" (")[0] try: vol = api.volume_attach(request, data['volume_id'], data['instance'], data.get('device', '')) vol_name = api.volume_get(request, data['volume_id']).display_name message = _('Attaching volume %(vol)s to instance ' '%(inst)s on %(dev)s.') % {"vol": vol_name, "inst": instance_name, "dev": vol.device} messages.info(request, message) return True except: redirect = reverse("horizon:nova:volumes:index") exceptions.handle(request, _('Unable to attach volume.'), redirect=redirect)
def test_edit_attachments(self): volume = self.volumes.first() servers = self.servers.list() api.volume_get(IsA(http.HttpRequest), volume.id) \ .AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:attach', args=[volume.id]) res = self.client.get(url) # Asserting length of 2 accounts for the one instance option, # and the one 'Choose Instance' option. self.assertEqual(len(res.context['form'].fields['instance']._choices), 2) self.assertEqual(res.status_code, 200)
def test_edit_attachments_cannot_set_mount_point(self): PREV = settings.OPENSTACK_HYPERVISOR_FEATURES["can_set_mount_point"] settings.OPENSTACK_HYPERVISOR_FEATURES["can_set_mount_point"] = False volume = self.volumes.first() servers = self.servers.list() api.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse("horizon:nova:volumes:attach", args=[volume.id]) res = self.client.get(url) # Assert the device field is hidden. form = res.context["form"] self.assertTrue(isinstance(form.fields["device"].widget, widgets.HiddenInput)) settings.OPENSTACK_HYPERVISOR_FEATURES["can_set_mount_point"] = PREV
def test_edit_attachments_cannot_set_mount_point(self): PREV = settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = False volume = self.volumes.first() servers = self.servers.list() api.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:attach', args=[volume.id]) res = self.client.get(url) # Assert the device field is hidden. form = res.context['form'] self.assertTrue(isinstance(form.fields['device'].widget, widgets.HiddenInput)) settings.OPENSTACK_HYPERVISOR_FEATURES['can_set_mount_point'] = PREV
def test_edit_attachments(self): volume = self.volumes.first() servers = self.servers.list() api.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:attach', args=[volume.id]) res = self.client.get(url) # Asserting length of 2 accounts for the one instance option, # and the one 'Choose Instance' option. form = res.context['form'] self.assertEqual(len(form.fields['instance']._choices), 2) self.assertEqual(res.status_code, 200) self.assertTrue(isinstance(form.fields['device'].widget, widgets.TextInput))
def get_object(self): if not hasattr(self, "_object"): volume_id = self.kwargs["volume_id"] try: self._object = api.volume_get(self.request, volume_id) except: self._object = None exceptions.handle(self.request, _("Unable to retrieve volume information.")) return self._object
def get_object(self): if not hasattr(self, "_object"): volume_id = self.kwargs['volume_id'] try: self._object = api.volume_get(self.request, volume_id) except: self._object = None exceptions.handle(self.request, _('Unable to retrieve volume information.')) return self._object
def get_data(self): volume_id = self.kwargs["volume_id"] try: self.object = api.volume_get(self.request, volume_id) attachments = [att for att in self.object.attachments if att] except: self.object = None attachments = [] exceptions.handle(self.request, _("Unable to retrieve volume information.")) return attachments
def detail(request, volume_id): try: volume = api.volume_get(request, volume_id) attachment = volume.attachments[0] if attachment: instance = api.server_get(request, volume.attachments[0]["serverId"]) else: instance = None except novaclient_exceptions.ClientException, e: LOG.exception("ClientException in volume get") messages.error(request, _("Error fetching volume: %s") % e.message) return shortcuts.redirect("horizon:nova:instances_and_volumes:volumes:index")
def test_edit_attachments_attached_volume(self): server = self.servers.first() volume = self.volumes.list()[0] api.volume_get(IsA(http.HttpRequest), volume.id) \ .AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)) \ .AndReturn(self.servers.list()) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:attach', args=[volume.id]) res = self.client.get(url) self.assertEqual(res.context['form'].fields['instance']._choices[0][1], "Select an instance") self.assertEqual(len(res.context['form'].fields['instance'].choices), 2) self.assertEqual(res.context['form'].fields['instance']._choices[1][0], server.id) self.assertEqual(res.status_code, 200)
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, 'nova/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_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, "nova/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_edit_attachments_attached_volume(self): server = self.servers.first() servers = deepcopy(self.servers) active_server = deepcopy(self.servers.first()) active_server.status = 'ACTIVE' active_server.id = "3" servers.add(active_server) volumes = deepcopy(self.volumes) volume = deepcopy(self.volumes.first()) volume.id = "2" volume.status = "in-use" volume.attachments = [{"id": "1", "server_id": server.id, "device": "/dev/hdn"}] volumes.add(volume) self.mox.StubOutWithMock(api, 'volume_get') self.mox.StubOutWithMock(api.nova, 'server_list') self.mox.StubOutWithMock(api.nova, 'server_get') api.nova.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.volume_get(IsA(http.HttpRequest), volume.id) \ .AndReturn(volume) api.nova.server_list(IsA(http.HttpRequest)).AndReturn(servers.list()) self.mox.ReplayAll() url = reverse('horizon:nova:instances_and_volumes:volumes:attach', args=[volume.id]) res = self.client.get(url) # Asserting length of 1 instance (plus 'Select ..' item). # The other instance is already attached to this volume self.assertEqual(len(res.context['form'].fields['instance']._choices), 2) self.assertEqual(res.context['form'].\ fields['instance']._choices[0][1], "Select an instance") # The instance choice should not be server_id = 3 self.assertNotEqual(res.context['form'].\ fields['instance']._choices[1][0], volume.attachments[0]['server_id']) self.assertEqual(res.status_code, 200)
def detail(request, volume_id): try: volume = api.volume_get(request, volume_id) attachment = volume.attachments[0] if attachment: instance = api.server_get(request, volume.attachments[0]['serverId']) else: instance = None except novaclient_exceptions.ClientException, e: LOG.exception("ClientException in volume get") messages.error(request, _('Error fetching volume: %s') % e.message) return shortcuts.redirect('horizon:nova:volumes:index')
def handle(self, request, data): try: api.volume_attach(request, data['volume_id'], data['instance'], data['device']) vol_name = api.volume_get(request, data['volume_id']).displayName message = (_('Attaching volume %s to instance %s at %s') % (vol_name, data['instance'], data['device'])) LOG.info(message) messages.info(request, message) except novaclient_exceptions.ClientException, e: LOG.exception("ClientException in AttachVolume") messages.error(request, _('Error attaching volume: %s') % e.message)
def handle(self, request, data): try: api.volume_attach(request, data["volume_id"], data["instance"], data["device"]) vol_name = api.volume_get(request, data["volume_id"]).displayName message = ( _( "Attaching volume %(vol)s to instance \ %(inst)s at %(dev)s" ) % {"vol": vol_name, "inst": data["instance"], "dev": data["device"]} ) LOG.info(message) messages.info(request, message) except novaclient_exceptions.ClientException, e: LOG.exception("ClientException in AttachVolume") messages.error(request, _("Error attaching volume: %s") % e.message)
def handle(self, request, data): instance_choices = dict(self.fields["instance"].choices) instance_name = instance_choices.get(data["instance"], _("Unknown instance (None)")) # The name of the instance in the choices list has the ID appended to # it, so let's slice that off... instance_name = instance_name.rsplit(" (")[0] try: api.volume_attach(request, data["volume_id"], data["instance"], data["device"]) vol_name = api.volume_get(request, data["volume_id"]).display_name message = _("Attaching volume %(vol)s to instance " "%(inst)s on %(dev)s.") % { "vol": vol_name, "inst": instance_name, "dev": data["device"], } messages.info(request, message) except: exceptions.handle(request, _("Unable to attach volume.")) return shortcuts.redirect("horizon:nova:volumes:index")
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, 'nova/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_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, "nova/images_and_snapshots/index.html")
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, 'nova/images_and_snapshots/index.html')
def get_data(self, request, volume_id): volume = api.volume_get(request, volume_id) return volume
def get_raw_data(self, snapshot): request = self.table.request volume_name = api.volume_get(request, snapshot.volume_id).display_name return safestring.mark_safe(volume_name)
def get_link_url(self, snapshot): volume_id = api.volume_get(self.table.request, snapshot.volume_id).id return reverse(self.link, args=(volume_id, ))
def get_link_url(self, snapshot): volume_id = api.volume_get(self.table.request, snapshot.volume_id).id return reverse(self.link, args=(volume_id,))