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_launch_keypairlist_error(self): image = self.images.first() self.mox.StubOutWithMock(api, 'image_get') self.mox.StubOutWithMock(api, 'tenant_quota_usages') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'keypair_list') self.mox.StubOutWithMock(api, 'security_group_list') self.mox.StubOutWithMock(api, 'volume_snapshot_list') self.mox.StubOutWithMock(api, 'volume_list') api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) api.image_get(IsA(http.HttpRequest), image.id).AndReturn(image) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn( self.quota_usages.first()) api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.keypair_list(IsA(http.HttpRequest)).AndRaise(self.exceptions.nova) api.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(self.security_groups.list()) self.mox.ReplayAll() url = reverse('horizon:nova:images_and_snapshots:images:launch', args=[image.id]) res = self.client.get(url) self.assertTemplateUsed(res, 'nova/images_and_snapshots/images/launch.html') self.assertEqual(len(res.context['form'].fields['keypair'].choices), 1)
def test_create_instance_snapshot(self): server = self.servers.first() snapshot_server = deepcopy(server) setattr(snapshot_server, 'OS-EXT-STS:task_state', "IMAGE_SNAPSHOT") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.snapshot_create(IsA(http.HttpRequest), server.id, "snapshot1") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) 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([]) api.server_list(IsA(http.HttpRequest)).AndReturn([snapshot_server]) api.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) self.mox.ReplayAll() formData = {'instance_id': server.id, 'method': 'CreateSnapshot', 'tenant_id': server.tenant_id, 'name': 'snapshot1'} url = reverse('horizon:nova:images_and_snapshots:snapshots:create', args=[server.id]) redir_url = reverse('horizon:nova:images_and_snapshots:index') res = self.client.post(url, formData) self.assertRedirects(res, redir_url) res = self.client.get(INDEX_URL) self.assertContains(res, '<td class="status_unknown sortable">' 'Snapshotting</td>', 1)
def test_create_volume(self): volume = self.volumes.first() usage = {'gigabytes': {'available': 250}, 'volumes': {'available': 6}} formData = { 'name': u'A Volume I Am Making', 'description': u'This is a volume I am making for a test.', 'method': u'CreateForm', 'size': 50, 'snapshot_source': '' } api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=None).AndReturn(volume) self.mox.ReplayAll() url = reverse('horizon:project:volumes:create') res = self.client.post(url, formData) redirect_url = reverse('horizon:project:volumes:index') self.assertRedirectsNoFollow(res, redirect_url)
def test_create_instance_snapshot(self): server = self.servers.first() snapshot_server = deepcopy(server) setattr(snapshot_server, 'OS-EXT-STS:task_state', "IMAGE_SNAPSHOT") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.snapshot_create(IsA(http.HttpRequest), server.id, "snapshot1") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) 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([]) api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.server_list(IsA(http.HttpRequest)).AndReturn([snapshot_server]) api.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) self.mox.ReplayAll() formData = {'instance_id': server.id, 'method': 'CreateSnapshot', 'tenant_id': server.tenant_id, 'name': 'snapshot1'} url = reverse('horizon:nova:images_and_snapshots:snapshots:create', args=[server.id]) redir_url = reverse('horizon:nova:images_and_snapshots:index') res = self.client.post(url, formData) self.assertRedirects(res, redir_url) res = self.client.get(INDEX_URL) self.assertContains(res, '<td class="status_unknown sortable">' 'Snapshotting</td>', 1)
def test_create_volume_number_over_alloted_quota(self): usage = { 'gigabytes': { 'available': 100, 'used': 20 }, 'volumes': { 'available': 0 } } formData = { 'name': u'Too Many...', 'description': u'We have no volumes left!', 'method': u'CreateForm', 'size': 10 } api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) self.mox.ReplayAll() url = reverse('horizon:project:volumes:create') res = self.client.post(url, formData) expected_error = [ u'You are already using all of your available' ' volumes.' ] self.assertEqual(res.context['form'].errors['__all__'], expected_error)
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_launch_post(self): flavor = self.flavors.first() image = self.images.first() keypair = self.keypairs.first() server = self.servers.first() volume = self.volumes.first() sec_group = self.security_groups.first() USER_DATA = 'user data' device_name = u'vda' volume_choice = "%s:vol" % volume.id block_device_mapping = {device_name: u"%s::0" % volume_choice} self.mox.StubOutWithMock(api, 'image_get') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'keypair_list') self.mox.StubOutWithMock(api, 'security_group_list') self.mox.StubOutWithMock(api, 'server_create') self.mox.StubOutWithMock(api, 'volume_list') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs.list()) api.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(self.security_groups.list()) api.image_get(IsA(http.HttpRequest), image.id).AndReturn(image) api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.server_create(IsA(http.HttpRequest), server.name, image.id, flavor.id, keypair.name, USER_DATA, [sec_group.name], block_device_mapping, instance_count=IsA(int)) self.mox.ReplayAll() form_data = {'method': 'LaunchForm', 'flavor': flavor.id, 'image_id': image.id, 'keypair': keypair.name, 'name': server.name, 'user_data': USER_DATA, 'tenant_id': self.tenants.first().id, 'security_groups': sec_group.name, 'volume': volume_choice, 'device_name': device_name, 'count': 1} url = reverse('horizon:nova:images_and_snapshots:images:launch', args=[image.id]) res = self.client.post(url, form_data) self.assertNoFormErrors(res) self.assertRedirectsNoFollow(res, reverse('horizon:nova:instances_and_volumes:index'))
def test_index_error(self): self.mox.StubOutWithMock(api, "image_list_detailed") self.mox.StubOutWithMock(api, "snapshot_list_detailed") self.mox.StubOutWithMock(api, "volume_snapshot_list") api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.image_list_detailed(IsA(http.HttpRequest)).AndRaise(self.exceptions.glance) api.snapshot_list_detailed(IsA(http.HttpRequest)).AndReturn(self.snapshots.list()) self.mox.ReplayAll() res = self.client.get(INDEX_URL) self.assertTemplateUsed(res, "nova/images_and_snapshots/index.html")
def test_create_volume_from_snapshot(self): volume = self.volumes.first() usage = {'gigabytes': {'available': 250}, 'volumes': {'available': 6}} snapshot = self.volume_snapshots.first() formData = { 'name': u'A Volume I Am Making', 'description': u'This is a volume I am making for a test.', 'method': u'CreateForm', 'size': 50, 'snapshot_source': snapshot.id } # first call- with url param api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=snapshot.id).\ AndReturn(volume) # second call- with dropdown api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=snapshot.id).\ AndReturn(volume) self.mox.ReplayAll() # get snapshot from url url = reverse('horizon:project:volumes:create') res = self.client.post( "?".join([url, "snapshot_id=" + str(snapshot.id)]), formData) redirect_url = reverse('horizon:project:volumes:index') self.assertRedirectsNoFollow(res, redirect_url) # get snapshot from dropdown list url = reverse('horizon:project:volumes:create') res = self.client.post(url, formData) redirect_url = reverse('horizon:project:volumes:index') self.assertRedirectsNoFollow(res, redirect_url)
def test_index_no_images(self): self.mox.StubOutWithMock(api, 'snapshot_list_detailed') self.mox.StubOutWithMock(api, 'image_list_detailed') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) 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, 'nova/images_and_snapshots/index.html')
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_create_volume_from_snapshot(self): volume = self.volumes.first() usage = {'gigabytes': {'available': 250}, 'volumes': {'available': 6}} snapshot = self.volume_snapshots.first() formData = {'name': u'A Volume I Am Making', 'description': u'This is a volume I am making for a test.', 'method': u'CreateForm', 'size': 50, 'snapshot_source': snapshot.id} # first call- with url param api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=snapshot.id).\ AndReturn(volume) # second call- with dropdown api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=snapshot.id).\ AndReturn(volume) self.mox.ReplayAll() # get snapshot from url url = reverse('horizon:nova:volumes:create') res = self.client.post("?".join([url, "snapshot_id=" + str(snapshot.id)]), formData) redirect_url = reverse('horizon:nova:volumes:index') self.assertRedirectsNoFollow(res, redirect_url) # get snapshot from dropdown list url = reverse('horizon:nova:volumes:create') res = self.client.post(url, formData) redirect_url = reverse('horizon:nova:volumes:index') self.assertRedirectsNoFollow(res, redirect_url)
def test_launch_form_keystone_exception(self): flavor = self.flavors.first() image = self.images.first() keypair = self.keypairs.first() server = self.servers.first() sec_group = self.security_groups.first() USER_DATA = 'userData' self.mox.StubOutWithMock(api, 'image_get') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'keypair_list') self.mox.StubOutWithMock(api, 'security_group_list') self.mox.StubOutWithMock(api, 'server_create') self.mox.StubOutWithMock(api, 'volume_list') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) api.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) api.keypair_list(IgnoreArg()).AndReturn(self.keypairs.list()) api.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(self.security_groups.list()) api.image_get(IgnoreArg(), image.id).AndReturn(image) api.volume_list(IgnoreArg()).AndReturn(self.volumes.list()) api.server_create(IsA(http.HttpRequest), server.name, image.id, flavor.id, keypair.name, USER_DATA, [sec_group.name], None, instance_count=IsA(int)) \ .AndRaise(self.exceptions.keystone) self.mox.ReplayAll() form_data = {'method': 'LaunchForm', 'flavor': flavor.id, 'image_id': image.id, 'keypair': keypair.name, 'name': server.name, 'tenant_id': self.tenant.id, 'user_data': USER_DATA, 'count': 1, 'security_groups': sec_group.name} url = reverse('horizon:nova:images_and_snapshots:images:launch', args=[image.id]) res = self.client.post(url, form_data) self.assertRedirectsNoFollow(res, IMAGES_INDEX_URL)
def test_index_client_conn_error(self): self.mox.StubOutWithMock(api, 'image_list_detailed') self.mox.StubOutWithMock(api, 'snapshot_list_detailed') exc = glance_exception.ClientConnectionError('clientConnError') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndRaise(exc) 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 __init__(self, request, *args, **kwargs): super(CreateForm, self).__init__(request, *args, **kwargs) if ("snapshot_id" in request.GET): try: snapshot = self.get_snapshot(request, request.GET["snapshot_id"]) self.fields['name'].initial = snapshot.display_name self.fields['size'].initial = snapshot.size self.fields['snapshot_source'].choices = ((snapshot.id, snapshot),) self.fields['size'].help_text = _('Volume size must be equal ' 'to or greater than the snapshot size (%sGB)' % snapshot.size) except: exceptions.handle(request, _('Unable to load the specified snapshot.')) else: try: snapshots = api.volume_snapshot_list(request) if snapshots: choices = [('', _("Choose a snapshot"))] + \ [(s.id, s) for s in snapshots] self.fields['snapshot_source'].choices = choices else: del self.fields['snapshot_source'] except: exceptions.handle(request, _("Unable to retrieve " "volume snapshots."))
def test_launch_form_instance_count_error(self): flavor = self.flavors.first() image = self.images.first() keypair = self.keypairs.first() server = self.servers.first() volume = self.volumes.first() sec_group = self.security_groups.first() USER_DATA = 'user data' device_name = u'vda' volume_choice = "%s:vol" % volume.id self.mox.StubOutWithMock(api, 'image_get_meta') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'keypair_list') self.mox.StubOutWithMock(api, 'security_group_list') self.mox.StubOutWithMock(api, 'volume_list') self.mox.StubOutWithMock(api, 'volume_snapshot_list') self.mox.StubOutWithMock(api, 'tenant_quota_usages') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs.list()) api.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(self.security_groups.list()) api.image_get_meta(IsA(http.HttpRequest), image.id).AndReturn(image) api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([]) api.tenant_quota_usages(IsA(http.HttpRequest)) \ .AndReturn(self.quota_usages.first()) self.mox.ReplayAll() form_data = {'method': 'LaunchForm', 'flavor': flavor.id, 'image_id': image.id, 'keypair': keypair.name, 'name': server.name, 'user_data': USER_DATA, 'tenant_id': self.tenants.first().id, 'security_groups': sec_group.name, 'volume': volume_choice, 'device_name': device_name, 'count': 0} url = reverse('horizon:nova:images_and_snapshots:images:launch', args=[image.id]) res = self.client.post(url, form_data) self.assertFormErrors(res, count=1)
def test_launch_form_instance_count_error(self): flavor = self.flavors.first() image = self.images.first() keypair = self.keypairs.first() server = self.servers.first() volume = self.volumes.first() sec_group = self.security_groups.first() USER_DATA = 'user data' device_name = u'vda' volume_choice = "%s:vol" % volume.id self.mox.StubOutWithMock(api, 'image_get_meta') self.mox.StubOutWithMock(api, 'flavor_list') self.mox.StubOutWithMock(api, 'keypair_list') self.mox.StubOutWithMock(api, 'security_group_list') self.mox.StubOutWithMock(api, 'volume_list') self.mox.StubOutWithMock(api, 'volume_snapshot_list') self.mox.StubOutWithMock(api, 'tenant_quota_usages') api.flavor_list(IsA(http.HttpRequest)).AndReturn(self.flavors.list()) api.keypair_list(IsA(http.HttpRequest)).AndReturn(self.keypairs.list()) api.security_group_list(IsA(http.HttpRequest)) \ .AndReturn(self.security_groups.list()) api.image_get_meta(IsA(http.HttpRequest), image.id).AndReturn(image) api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn([]) api.tenant_quota_usages(IsA(http.HttpRequest)) \ .AndReturn(self.quota_usages.first()) self.mox.ReplayAll() form_data = { 'method': 'LaunchForm', 'flavor': flavor.id, 'image_id': image.id, 'keypair': keypair.name, 'name': server.name, 'user_data': USER_DATA, 'tenant_id': self.tenants.first().id, 'security_groups': sec_group.name, 'volume': volume_choice, 'device_name': device_name, 'count': 0 } url = reverse('horizon:nova:images_and_snapshots:images:launch', args=[image.id]) res = self.client.post(url, form_data) self.assertFormErrors(res, count=1)
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 get_volume_snapshots_data(self): try: snapshots = api.volume_snapshot_list(self.request) except: snapshots = [] exceptions.handle(self.request, _("Unable to retrieve " "volume snapshots.")) return snapshots
def test_index(self): images = self.images.list() snapshots = self.snapshots.list() self.mox.StubOutWithMock(api, "image_list_detailed") self.mox.StubOutWithMock(api, "snapshot_list_detailed") self.mox.StubOutWithMock(api, "volume_snapshot_list") api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.image_list_detailed(IsA(http.HttpRequest)).AndReturn(images) api.snapshot_list_detailed(IsA(http.HttpRequest)).AndReturn(snapshots) 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_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_queued_snapshot_actions(self): images = self.images.list() snapshots = self.snapshots.list() snapshot1 = deepcopy(snapshots[0]) snapshot1.status = 'active' snapshot1.owner = None snapshot2 = deepcopy(snapshots[0]) snapshot2.id = 4 snapshot2.name = "snap2" snapshot2.status = "queued" snapshot2.owner = '1' new_snapshots = [snapshot1, snapshot2] self.mox.StubOutWithMock(api, 'image_list_detailed') self.mox.StubOutWithMock(api, 'snapshot_list_detailed') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) api.image_list_detailed(IsA(http.HttpRequest), marker=None).AndReturn([images, False]) api.snapshot_list_detailed(IsA(http.HttpRequest), marker=None) \ .AndReturn([new_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()), 2) row_actions = snaps.get_row_actions(snaps.data[0]) #first instance - status active, not owned self.assertEqual(row_actions[0].verbose_name, u"Launch") self.assertEqual(len(row_actions), 1) row_actions = snaps.get_row_actions(snaps.data[1]) #first instance - status queued, but editable self.assertEqual(unicode(row_actions[0].verbose_name), u"Edit") self.assertEqual(str(row_actions[1]), "<DeleteSnapshot: delete>") self.assertEqual(len(row_actions), 2)
def test_create_volume_gb_used_over_alloted_quota(self): usage = {"gigabytes": {"available": 100, "used": 20}} formData = { "name": u"This Volume Is Huge!", "description": u"This is a volume that is just too big!", "method": u"CreateForm", "size": 5000, } api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volume_snapshots.list()) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) self.mox.ReplayAll() url = reverse("horizon:nova:volumes:create") res = self.client.post(url, formData) expected_error = [u"A volume of 5000GB cannot be created as you only" " have 100GB of your quota available."] self.assertEqual(res.context["form"].errors["__all__"], expected_error)
def test_create_volume_number_over_alloted_quota(self): usage = {"gigabytes": {"available": 100, "used": 20}, "volumes": {"available": 0}} formData = { "name": u"Too Many...", "description": u"We have no volumes left!", "method": u"CreateForm", "size": 10, } api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volume_snapshots.list()) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) self.mox.ReplayAll() url = reverse("horizon:nova:volumes:create") res = self.client.post(url, formData) expected_error = [u"You are already using all of your available" " volumes."] self.assertEqual(res.context["form"].errors["__all__"], expected_error)
def get_volume_snapshots_data(self): if is_service_enabled(self.request, 'volume'): try: snapshots = api.volume_snapshot_list(self.request) except: snapshots = [] exceptions.handle(self.request, _("Unable to retrieve " "volume snapshots.")) else: snapshots = [] return snapshots
def test_create_volume_gb_used_over_alloted_quota(self): usage = {'gigabytes': {'available': 100, 'used': 20}} formData = {'name': u'This Volume Is Huge!', 'description': u'This is a volume that is just too big!', 'method': u'CreateForm', 'size': 5000} api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:create') res = self.client.post(url, formData) expected_error = [u'A volume of 5000GB cannot be created as you only' ' have 100GB of your quota available.'] self.assertEqual(res.context['form'].errors['__all__'], expected_error)
def test_create_volume_from_snapshot(self): volume = self.volumes.first() usage = {"gigabytes": {"available": 250}, "volumes": {"available": 6}} snapshot = self.volume_snapshots.first() formData = { "name": u"A Volume I Am Making", "description": u"This is a volume I am making for a test.", "method": u"CreateForm", "size": 50, "snapshot_source": snapshot.id, } # first call- with url param api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create( IsA(http.HttpRequest), formData["size"], formData["name"], formData["description"], snapshot_id=snapshot.id ).AndReturn(volume) # second call- with dropdown api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volume_snapshots.list()) api.nova.volume_snapshot_get(IsA(http.HttpRequest), str(snapshot.id)).AndReturn(snapshot) api.volume_create( IsA(http.HttpRequest), formData["size"], formData["name"], formData["description"], snapshot_id=snapshot.id ).AndReturn(volume) self.mox.ReplayAll() # get snapshot from url url = reverse("horizon:nova:volumes:create") res = self.client.post("?".join([url, "snapshot_id=" + str(snapshot.id)]), formData) redirect_url = reverse("horizon:nova:volumes:index") self.assertRedirectsNoFollow(res, redirect_url) # get snapshot from dropdown list url = reverse("horizon:nova:volumes:create") res = self.client.post(url, formData) redirect_url = reverse("horizon:nova:volumes:index") self.assertRedirectsNoFollow(res, redirect_url)
def test_queued_snapshot_actions(self): images = self.images.list() snapshots = self.snapshots.list() snapshot1 = deepcopy(snapshots[0]) snapshot1.status = "active" snapshot1.owner = None snapshot2 = deepcopy(snapshots[0]) snapshot2.id = 4 snapshot2.name = "snap2" snapshot2.status = "queued" snapshot2.owner = "1" new_snapshots = [snapshot1, snapshot2] self.mox.StubOutWithMock(api, "image_list_detailed") self.mox.StubOutWithMock(api, "snapshot_list_detailed") self.mox.StubOutWithMock(api, "volume_snapshot_list") api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.image_list_detailed(IsA(http.HttpRequest)).AndReturn(images) api.snapshot_list_detailed(IsA(http.HttpRequest)).AndReturn(new_snapshots) 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()), 2) row_actions = snaps.get_row_actions(snaps.data[0]) # first instance - status active, not owned self.assertEqual(row_actions[0].verbose_name, u"Launch") self.assertEqual(len(row_actions), 1) row_actions = snaps.get_row_actions(snaps.data[1]) # first instance - status queued, but editable self.assertEqual(row_actions[0].verbose_name, u"Edit") self.assertEqual(str(row_actions[1]), "<DeleteSnapshot: delete>") self.assertEqual(len(row_actions), 2)
def test_index(self): images = self.images.list() snapshots = self.snapshots.list() self.mox.StubOutWithMock(api, 'image_list_detailed') self.mox.StubOutWithMock(api, 'snapshot_list_detailed') self.mox.StubOutWithMock(api, 'volume_snapshot_list') api.volume_snapshot_list(IsA(http.HttpRequest)) \ .AndReturn(self.volumes.list()) 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_create_volume_number_over_alloted_quota(self): usage = {'gigabytes': {'available': 100, 'used': 20}, 'volumes': {'available': 0}} formData = {'name': u'Too Many...', 'description': u'We have no volumes left!', 'method': u'CreateForm', 'size': 10} api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:create') res = self.client.post(url, formData) expected_error = [u'You are already using all of your available' ' volumes.'] self.assertEqual(res.context['form'].errors['__all__'], expected_error)
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_create_instance_snapshot(self): server = self.servers.first() snapshot_server = deepcopy(server) setattr(snapshot_server, "OS-EXT-STS:task_state", "IMAGE_SNAPSHOT") self.mox.StubOutWithMock(api, "server_get") self.mox.StubOutWithMock(api, "snapshot_create") self.mox.StubOutWithMock(api, "snapshot_list_detailed") self.mox.StubOutWithMock(api, "image_list_detailed") self.mox.StubOutWithMock(api, "volume_snapshot_list") self.mox.StubOutWithMock(api, "server_list") self.mox.StubOutWithMock(api, "flavor_list") self.mox.StubOutWithMock(api, "server_delete") self.mox.StubOutWithMock(api, "volume_list") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) api.snapshot_create(IsA(http.HttpRequest), server.id, "snapshot1") api.server_get(IsA(http.HttpRequest), server.id).AndReturn(server) 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([]) api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list()) api.server_list(IsA(http.HttpRequest)).AndReturn([snapshot_server]) api.flavor_list(IgnoreArg()).AndReturn(self.flavors.list()) self.mox.ReplayAll() formData = { "instance_id": server.id, "method": "CreateSnapshot", "tenant_id": server.tenant_id, "name": "snapshot1", } url = reverse("horizon:nova:images_and_snapshots:snapshots:create", args=[server.id]) redir_url = reverse("horizon:nova:images_and_snapshots:index") res = self.client.post(url, formData) self.assertRedirects(res, redir_url) res = self.client.get(INDEX_URL) self.assertContains(res, '<td class="status_unknown">' "Snapshotting</td>", 1)
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:nova:images_and_snapshots:snapshots:create', args=[server.id]) redir_url = reverse('horizon:nova:images_and_snapshots:index') res = self.client.post(url, formData) self.assertRedirects(res, redir_url)
def test_create_volume(self): volume = self.volumes.first() usage = {"gigabytes": {"available": 250}, "volumes": {"available": 6}} formData = { "name": u"A Volume I Am Making", "description": u"This is a volume I am making for a test.", "method": u"CreateForm", "size": 50, "snapshot_source": "", } api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).AndReturn(self.volume_snapshots.list()) api.volume_create( IsA(http.HttpRequest), formData["size"], formData["name"], formData["description"], snapshot_id=None ).AndReturn(volume) self.mox.ReplayAll() url = reverse("horizon:nova:volumes:create") res = self.client.post(url, formData) redirect_url = reverse("horizon:nova:volumes:index") self.assertRedirectsNoFollow(res, redirect_url)
def test_create_volume(self): volume = self.volumes.first() usage = {'gigabytes': {'available': 250}, 'volumes': {'available': 6}} formData = {'name': u'A Volume I Am Making', 'description': u'This is a volume I am making for a test.', 'method': u'CreateForm', 'size': 50, 'snapshot_source': ''} api.tenant_quota_usages(IsA(http.HttpRequest)).AndReturn(usage) api.volume_snapshot_list(IsA(http.HttpRequest)).\ AndReturn(self.volume_snapshots.list()) api.volume_create(IsA(http.HttpRequest), formData['size'], formData['name'], formData['description'], snapshot_id=None).AndReturn(volume) self.mox.ReplayAll() url = reverse('horizon:nova:volumes:create') res = self.client.post(url, formData) redirect_url = reverse('horizon:nova:volumes:index') self.assertRedirectsNoFollow(res, redirect_url)
def volume_list(self): volume_options = [("", _("Select Volume"))] def _get_volume_select_item(volume): if hasattr(volume, "volume_id"): vol_type = "snap" visible_label = _("Snapshot") else: vol_type = "vol" visible_label = _("Volume") return (("%s:%s" % (volume.id, vol_type)), ("%s - %s GB (%s)" % (volume.display_name, volume.size, visible_label))) # First add volumes to the list try: volumes = [v for v in api.volume_list(self.request) \ if v.status == api.VOLUME_STATE_AVAILABLE] volume_options.extend( [_get_volume_select_item(vol) for vol in volumes]) except: exceptions.handle(self.request, _('Unable to retrieve list of volumes')) # Next add volume snapshots to the list try: snapshots = api.volume_snapshot_list(self.request) snapshots = [s for s in snapshots \ if s.status == api.VOLUME_STATE_AVAILABLE] volume_options.extend( [_get_volume_select_item(snap) for snap in snapshots]) except: exceptions.handle(self.request, _('Unable to retrieve list of volumes')) return volume_options