Merge "Switch Cinder-related tests to mock"
This commit is contained in:
commit
d9416e84e7
@ -16,10 +16,9 @@ import copy
|
|||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
from django import http
|
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from django.utils.http import urlunquote
|
from django.utils.http import urlunquote
|
||||||
from mox3.mox import IsA
|
import mock
|
||||||
|
|
||||||
from openstack_dashboard import api
|
from openstack_dashboard import api
|
||||||
from openstack_dashboard.api import cinder
|
from openstack_dashboard.api import cinder
|
||||||
@ -44,76 +43,77 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
del att['instance']
|
del att['instance']
|
||||||
super(VolumeTests, self).tearDown()
|
super(VolumeTests, self).tearDown()
|
||||||
|
|
||||||
@test.create_stubs({api.nova: ('server_list', 'server_get'),
|
@mock.patch.object(keystone, 'tenant_list')
|
||||||
cinder: ('volume_list_paged',
|
@mock.patch.object(cinder, 'volume_snapshot_list')
|
||||||
'volume_snapshot_list'),
|
@mock.patch.object(cinder, 'volume_list_paged')
|
||||||
keystone: ('tenant_list',)})
|
@mock.patch.object(api.nova, 'server_list')
|
||||||
def _test_index(self, instanceless_volumes=False):
|
def _test_index(self, instanceless_volumes, mock_server_list,
|
||||||
|
mock_volume_list, mock_snapshot_list, mock_tenant_list):
|
||||||
volumes = self.cinder_volumes.list()
|
volumes = self.cinder_volumes.list()
|
||||||
if instanceless_volumes:
|
if instanceless_volumes:
|
||||||
for volume in volumes:
|
for volume in volumes:
|
||||||
volume.attachments = []
|
volume.attachments = []
|
||||||
else:
|
|
||||||
server = self.servers.first()
|
|
||||||
|
|
||||||
cinder.volume_list_paged(IsA(http.HttpRequest), sort_dir="desc",
|
mock_volume_list.return_value = [volumes, False, False]
|
||||||
marker=None, paginate=True,
|
mock_snapshot_list.return_value = []
|
||||||
search_opts={'all_tenants': True})\
|
|
||||||
.AndReturn([volumes, False, False])
|
|
||||||
cinder.volume_snapshot_list(IsA(http.HttpRequest), search_opts={
|
|
||||||
'all_tenants': True}).AndReturn([])
|
|
||||||
if not instanceless_volumes:
|
if not instanceless_volumes:
|
||||||
api.nova.server_get(IsA(http.HttpRequest),
|
mock_server_list.return_value = [self.servers.list(), False]
|
||||||
server.id).AndReturn(server)
|
|
||||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={
|
mock_tenant_list.return_value = [[self.tenants.list(), False]]
|
||||||
'all_tenants': True}, detailed=False) \
|
|
||||||
.AndReturn([self.servers.list(), False])
|
|
||||||
keystone.tenant_list(IsA(http.HttpRequest)) \
|
|
||||||
.AndReturn([self.tenants.list(), False])
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
res = self.client.get(INDEX_URL)
|
res = self.client.get(INDEX_URL)
|
||||||
|
if not instanceless_volumes:
|
||||||
|
mock_server_list.assert_called_once_with(
|
||||||
|
test.IsHttpRequest(), search_opts={'all_tenants': True})
|
||||||
|
|
||||||
|
mock_volume_list.assert_called_once_with(
|
||||||
|
test.IsHttpRequest(), sort_dir="desc", marker=None, paginate=True,
|
||||||
|
search_opts={'all_tenants': True})
|
||||||
|
mock_snapshot_list.assert_called_once_with(
|
||||||
|
test.IsHttpRequest(), search_opts={'all_tenants': True})
|
||||||
|
mock_tenant_list.assert_called_once()
|
||||||
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
|
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, self.cinder_volumes.list())
|
self.assertItemsEqual(volumes, self.cinder_volumes.list())
|
||||||
|
|
||||||
def test_index_without_attachments(self):
|
def test_index_without_attachments(self):
|
||||||
self._test_index(instanceless_volumes=True)
|
self._test_index(True)
|
||||||
|
|
||||||
def test_index_with_attachments(self):
|
def test_index_with_attachments(self):
|
||||||
self._test_index(instanceless_volumes=False)
|
self._test_index(False)
|
||||||
|
|
||||||
@test.create_stubs({api.nova: ('server_list', 'server_get'),
|
@mock.patch.object(keystone, 'tenant_list')
|
||||||
cinder: ('volume_list_paged',
|
@mock.patch.object(cinder, 'volume_snapshot_list')
|
||||||
'volume_snapshot_list'),
|
@mock.patch.object(cinder, 'volume_list_paged')
|
||||||
keystone: ('tenant_list',)})
|
@mock.patch.object(api.nova, 'server_list')
|
||||||
def _test_index_paginated(self, marker, sort_dir, volumes, url,
|
def _test_index_paginated(self, marker, sort_dir, volumes, url,
|
||||||
has_more, has_prev):
|
has_more, has_prev, mock_server_list,
|
||||||
|
mock_volume_list, mock_snapshot_list,
|
||||||
|
mock_tenant_list):
|
||||||
vol_snaps = self.cinder_volume_snapshots.list()
|
vol_snaps = self.cinder_volume_snapshots.list()
|
||||||
server = self.servers.first()
|
|
||||||
cinder.volume_list_paged(IsA(http.HttpRequest), sort_dir=sort_dir,
|
|
||||||
marker=marker, paginate=True,
|
|
||||||
search_opts={'all_tenants': True}) \
|
|
||||||
.AndReturn([volumes, has_more, has_prev])
|
|
||||||
api.cinder.volume_snapshot_list(
|
|
||||||
IsA(http.HttpRequest), search_opts=None).AndReturn(vol_snaps)
|
|
||||||
api.nova.server_list(IsA(http.HttpRequest), search_opts={
|
|
||||||
'all_tenants': True}, detailed=False) \
|
|
||||||
.AndReturn([self.servers.list(), False])
|
|
||||||
api.nova.server_get(IsA(http.HttpRequest),
|
|
||||||
server.id).AndReturn(server)
|
|
||||||
keystone.tenant_list(IsA(http.HttpRequest)) \
|
|
||||||
.AndReturn([self.tenants.list(), False])
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
mock_volume_list.return_value = [volumes, has_more, has_prev]
|
||||||
|
mock_snapshot_list.return_value = vol_snaps
|
||||||
|
mock_server_list.return_value = [self.servers.list(), False]
|
||||||
|
mock_tenant_list.return_value = [self.tenants.list(), False]
|
||||||
|
|
||||||
res = self.client.get(urlunquote(url))
|
res = self.client.get(urlunquote(url))
|
||||||
|
|
||||||
|
mock_server_list.assert_called_once_with(
|
||||||
|
test.IsHttpRequest(), search_opts={'all_tenants': True})
|
||||||
|
mock_volume_list.assert_called_once_with(test.IsHttpRequest(),
|
||||||
|
sort_dir=sort_dir,
|
||||||
|
marker=marker, paginate=True,
|
||||||
|
search_opts={
|
||||||
|
'all_tenants': True})
|
||||||
|
mock_snapshot_list.assert_called_once_with(
|
||||||
|
test.IsHttpRequest(), search_opts={'all_tenants': True})
|
||||||
|
mock_tenant_list.assert_called_once()
|
||||||
|
|
||||||
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
|
self.assertTemplateUsed(res, 'horizon/common/_data_table_view.html')
|
||||||
self.assertEqual(res.status_code, 200)
|
self.assertEqual(res.status_code, 200)
|
||||||
|
|
||||||
self.mox.UnsetStubs()
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
@override_settings(FILTER_DATA_FIRST={'admin.volumes': True})
|
@override_settings(FILTER_DATA_FIRST={'admin.volumes': True})
|
||||||
@ -123,7 +123,7 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, [])
|
self.assertItemsEqual(volumes, [])
|
||||||
|
|
||||||
def ensure_attachments_exist(self, volumes):
|
def _ensure_attachments_exist(self, volumes):
|
||||||
volumes = copy.copy(volumes)
|
volumes = copy.copy(volumes)
|
||||||
for volume in volumes:
|
for volume in volumes:
|
||||||
if not volume.attachments:
|
if not volume.attachments:
|
||||||
@ -134,14 +134,14 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
@override_settings(API_RESULT_PAGE_SIZE=2)
|
@override_settings(API_RESULT_PAGE_SIZE=2)
|
||||||
def test_index_paginated(self):
|
def test_index_paginated(self):
|
||||||
size = settings.API_RESULT_PAGE_SIZE
|
size = settings.API_RESULT_PAGE_SIZE
|
||||||
mox_volumes = self.ensure_attachments_exist(self.cinder_volumes.list())
|
mox_volumes = self._ensure_attachments_exist(
|
||||||
|
self.cinder_volumes.list())
|
||||||
|
|
||||||
# get first page
|
# get first page
|
||||||
expected_volumes = mox_volumes[:size]
|
expected_volumes = mox_volumes[:size]
|
||||||
url = INDEX_URL
|
url = INDEX_URL
|
||||||
res = self._test_index_paginated(marker=None, sort_dir="desc",
|
res = self._test_index_paginated(None, "desc", expected_volumes, url,
|
||||||
volumes=expected_volumes, url=url,
|
True, False)
|
||||||
has_more=True, has_prev=False)
|
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, expected_volumes)
|
self.assertItemsEqual(volumes, expected_volumes)
|
||||||
|
|
||||||
@ -150,9 +150,8 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
marker = expected_volumes[0].id
|
marker = expected_volumes[0].id
|
||||||
next = volume_tables.VolumesTable._meta.pagination_param
|
next = volume_tables.VolumesTable._meta.pagination_param
|
||||||
url = INDEX_URL + "?%s=%s" % (next, marker)
|
url = INDEX_URL + "?%s=%s" % (next, marker)
|
||||||
res = self._test_index_paginated(marker=marker, sort_dir="desc",
|
res = self._test_index_paginated(marker, "desc", expected_volumes, url,
|
||||||
volumes=expected_volumes, url=url,
|
True, True)
|
||||||
has_more=True, has_prev=True)
|
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, expected_volumes)
|
self.assertItemsEqual(volumes, expected_volumes)
|
||||||
|
|
||||||
@ -161,25 +160,24 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
marker = expected_volumes[0].id
|
marker = expected_volumes[0].id
|
||||||
next = volume_tables.VolumesTable._meta.pagination_param
|
next = volume_tables.VolumesTable._meta.pagination_param
|
||||||
url = INDEX_URL + "?%s=%s" % (next, marker)
|
url = INDEX_URL + "?%s=%s" % (next, marker)
|
||||||
res = self._test_index_paginated(marker=marker, sort_dir="desc",
|
res = self._test_index_paginated(marker, "desc", expected_volumes, url,
|
||||||
volumes=expected_volumes, url=url,
|
False, True)
|
||||||
has_more=False, has_prev=True)
|
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, expected_volumes)
|
self.assertItemsEqual(volumes, expected_volumes)
|
||||||
|
|
||||||
@override_settings(API_RESULT_PAGE_SIZE=2)
|
@override_settings(API_RESULT_PAGE_SIZE=2)
|
||||||
def test_index_paginated_prev(self):
|
def test_index_paginated_prev(self):
|
||||||
size = settings.API_RESULT_PAGE_SIZE
|
size = settings.API_RESULT_PAGE_SIZE
|
||||||
mox_volumes = self.ensure_attachments_exist(self.cinder_volumes.list())
|
mox_volumes = self._ensure_attachments_exist(
|
||||||
|
self.cinder_volumes.list())
|
||||||
|
|
||||||
# prev from some page
|
# prev from some page
|
||||||
expected_volumes = mox_volumes[size:2 * size]
|
expected_volumes = mox_volumes[size:2 * size]
|
||||||
marker = mox_volumes[0].id
|
marker = mox_volumes[0].id
|
||||||
prev = volume_tables.VolumesTable._meta.prev_pagination_param
|
prev = volume_tables.VolumesTable._meta.prev_pagination_param
|
||||||
url = INDEX_URL + "?%s=%s" % (prev, marker)
|
url = INDEX_URL + "?%s=%s" % (prev, marker)
|
||||||
res = self._test_index_paginated(marker=marker, sort_dir="asc",
|
res = self._test_index_paginated(marker, "asc", expected_volumes, url,
|
||||||
volumes=expected_volumes, url=url,
|
False, True)
|
||||||
has_more=False, has_prev=True)
|
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, expected_volumes)
|
self.assertItemsEqual(volumes, expected_volumes)
|
||||||
|
|
||||||
@ -188,35 +186,36 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
marker = mox_volumes[0].id
|
marker = mox_volumes[0].id
|
||||||
prev = volume_tables.VolumesTable._meta.prev_pagination_param
|
prev = volume_tables.VolumesTable._meta.prev_pagination_param
|
||||||
url = INDEX_URL + "?%s=%s" % (prev, marker)
|
url = INDEX_URL + "?%s=%s" % (prev, marker)
|
||||||
res = self._test_index_paginated(marker=marker, sort_dir="asc",
|
res = self._test_index_paginated(marker, "asc", expected_volumes, url,
|
||||||
volumes=expected_volumes, url=url,
|
True, False)
|
||||||
has_more=True, has_prev=False)
|
|
||||||
volumes = res.context['volumes_table'].data
|
volumes = res.context['volumes_table'].data
|
||||||
self.assertItemsEqual(volumes, expected_volumes)
|
self.assertItemsEqual(volumes, expected_volumes)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_reset_state',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_get')})
|
@mock.patch.object(cinder, 'volume_reset_state')
|
||||||
def test_update_volume_status(self):
|
def test_update_volume_status(self, mock_reset, mock_volume_get):
|
||||||
volume = self.volumes.first()
|
volume = self.volumes.first()
|
||||||
formData = {'status': 'error'}
|
formData = {'status': 'error'}
|
||||||
|
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume)
|
mock_volume_get.return_value = volume
|
||||||
cinder.volume_reset_state(IsA(http.HttpRequest),
|
|
||||||
volume.id,
|
|
||||||
formData['status'])
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
res = self.client.post(
|
res = self.client.post(
|
||||||
reverse('horizon:admin:volumes:update_status',
|
reverse('horizon:admin:volumes:update_status',
|
||||||
args=(volume.id,)),
|
args=(volume.id,)),
|
||||||
formData)
|
formData)
|
||||||
|
|
||||||
|
mock_reset.assert_called_once_with(test.IsHttpRequest(),
|
||||||
|
volume.id, formData['status'])
|
||||||
|
mock_volume_get.assert_called_once_with(test.IsHttpRequest(),
|
||||||
|
volume.id)
|
||||||
self.assertNoFormErrors(res)
|
self.assertNoFormErrors(res)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_manage',
|
@mock.patch.object(cinder, 'extension_supported')
|
||||||
'volume_type_list',
|
@mock.patch.object(cinder, 'availability_zone_list')
|
||||||
'availability_zone_list',
|
@mock.patch.object(cinder, 'volume_type_list')
|
||||||
'extension_supported')})
|
@mock.patch.object(cinder, 'volume_manage')
|
||||||
def test_manage_volume(self):
|
def test_manage_volume(self, mock_manage, mock_type_list, mock_az_list,
|
||||||
|
mock_extension):
|
||||||
metadata = {'key': u'k1',
|
metadata = {'key': u'k1',
|
||||||
'value': u'v1'}
|
'value': u'v1'}
|
||||||
formData = {'host': 'host-1',
|
formData = {'host': 'host-1',
|
||||||
@ -228,18 +227,17 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
'availability_zone': 'nova',
|
'availability_zone': 'nova',
|
||||||
'metadata': metadata['key'] + '=' + metadata['value'],
|
'metadata': metadata['key'] + '=' + metadata['value'],
|
||||||
'bootable': False}
|
'bootable': False}
|
||||||
cinder.volume_type_list(
|
|
||||||
IsA(http.HttpRequest)). \
|
mock_type_list.return_value = self.cinder_volume_types.list()
|
||||||
AndReturn(self.cinder_volume_types.list())
|
mock_az_list.return_value = self.availability_zones.list()
|
||||||
cinder.availability_zone_list(
|
mock_extension.return_value = True
|
||||||
IsA(http.HttpRequest)). \
|
|
||||||
AndReturn(self.availability_zones.list())
|
res = self.client.post(
|
||||||
cinder.extension_supported(
|
reverse('horizon:admin:volumes:manage'),
|
||||||
IsA(http.HttpRequest),
|
formData)
|
||||||
'AvailabilityZones'). \
|
|
||||||
AndReturn(True)
|
mock_manage.assert_called_once_with(
|
||||||
cinder.volume_manage(
|
test.IsHttpRequest(),
|
||||||
IsA(http.HttpRequest),
|
|
||||||
host=formData['host'],
|
host=formData['host'],
|
||||||
identifier=formData['identifier'],
|
identifier=formData['identifier'],
|
||||||
id_type=formData['id_type'],
|
id_type=formData['id_type'],
|
||||||
@ -249,15 +247,15 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
availability_zone=formData['availability_zone'],
|
availability_zone=formData['availability_zone'],
|
||||||
metadata={metadata['key']: metadata['value']},
|
metadata={metadata['key']: metadata['value']},
|
||||||
bootable=formData['bootable'])
|
bootable=formData['bootable'])
|
||||||
self.mox.ReplayAll()
|
mock_type_list.assert_called_once()
|
||||||
res = self.client.post(
|
mock_az_list.assert_called_once()
|
||||||
reverse('horizon:admin:volumes:manage'),
|
mock_extension.assert_called_once_with(test.IsHttpRequest(),
|
||||||
formData)
|
'AvailabilityZones')
|
||||||
self.assertNoFormErrors(res)
|
self.assertNoFormErrors(res)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_unmanage',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_get')})
|
@mock.patch.object(cinder, 'volume_unmanage')
|
||||||
def test_unmanage_volume(self):
|
def test_unmanage_volume(self, mock_unmanage, mock_get):
|
||||||
# important - need to get the v2 cinder volume which has host data
|
# important - need to get the v2 cinder volume which has host data
|
||||||
volume_list = [x for x in self.cinder_volumes.list()
|
volume_list = [x for x in self.cinder_volumes.list()
|
||||||
if x.name == 'v2_volume']
|
if x.name == 'v2_volume']
|
||||||
@ -266,111 +264,105 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
'host_name': 'host@backend-name#pool',
|
'host_name': 'host@backend-name#pool',
|
||||||
'volume_id': volume.id}
|
'volume_id': volume.id}
|
||||||
|
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id).AndReturn(volume)
|
mock_get.return_value = volume
|
||||||
cinder.volume_unmanage(IsA(http.HttpRequest), volume.id). \
|
mock_unmanage.return_value = volume
|
||||||
AndReturn(volume)
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
res = self.client.post(
|
res = self.client.post(
|
||||||
reverse('horizon:admin:volumes:unmanage',
|
reverse('horizon:admin:volumes:unmanage',
|
||||||
args=(volume.id,)),
|
args=(volume.id,)),
|
||||||
formData)
|
formData)
|
||||||
|
|
||||||
|
mock_unmanage.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
self.assertNoFormErrors(res)
|
self.assertNoFormErrors(res)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('pool_list',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_get',)})
|
@mock.patch.object(cinder, 'pool_list')
|
||||||
def test_volume_migrate_get(self):
|
def test_volume_migrate_get(self, mock_pool, mock_get):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
|
||||||
.AndReturn(volume)
|
|
||||||
cinder.pool_list(IsA(http.HttpRequest)) \
|
|
||||||
.AndReturn(self.cinder_pools.list())
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
mock_pool.return_value = self.cinder_pools.list()
|
||||||
|
mock_get.return_value = volume
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:migrate',
|
url = reverse('horizon:admin:volumes:migrate',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
|
mock_pool.assert_called_once()
|
||||||
self.assertTemplateUsed(res,
|
self.assertTemplateUsed(res,
|
||||||
'admin/volumes/migrate_volume.html')
|
'admin/volumes/migrate_volume.html')
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_get',)})
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
def test_volume_migrate_get_volume_get_exception(self):
|
def test_volume_migrate_get_volume_get_exception(self, mock_get):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
mock_get.side_effect = self.exceptions.cinder
|
||||||
.AndRaise(self.exceptions.cinder)
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:migrate',
|
url = reverse('horizon:admin:volumes:migrate',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
self.assertRedirectsNoFollow(res, INDEX_URL)
|
self.assertRedirectsNoFollow(res, INDEX_URL)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('pool_list',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_get',)})
|
@mock.patch.object(cinder, 'pool_list')
|
||||||
def test_volume_migrate_list_pool_get_exception(self):
|
def test_volume_migrate_list_pool_get_exception(self, mock_pool, mock_get):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
|
||||||
.AndReturn(volume)
|
|
||||||
cinder.pool_list(IsA(http.HttpRequest)) \
|
|
||||||
.AndRaise(self.exceptions.cinder)
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
mock_get.return_value = volume
|
||||||
|
mock_pool.side_effect = self.exceptions.cinder
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:migrate',
|
url = reverse('horizon:admin:volumes:migrate',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
|
mock_pool.assert_called_once()
|
||||||
self.assertRedirectsNoFollow(res, INDEX_URL)
|
self.assertRedirectsNoFollow(res, INDEX_URL)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('pool_list',
|
@mock.patch.object(cinder, 'volume_migrate')
|
||||||
'volume_get',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_migrate',)})
|
@mock.patch.object(cinder, 'pool_list')
|
||||||
def test_volume_migrate_post(self):
|
def test_volume_migrate_post(self, mock_pool, mock_get, mock_migtate):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
host = self.cinder_pools.first().name
|
host = self.cinder_pools.first().name
|
||||||
|
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
mock_get.return_value = volume
|
||||||
.AndReturn(volume)
|
mock_pool.return_value = self.cinder_pools.list()
|
||||||
cinder.pool_list(IsA(http.HttpRequest)) \
|
mock_migtate.return_value = None
|
||||||
.AndReturn(self.cinder_pools.list())
|
|
||||||
cinder.volume_migrate(IsA(http.HttpRequest),
|
|
||||||
volume.id,
|
|
||||||
host,
|
|
||||||
False) \
|
|
||||||
.AndReturn(None)
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:migrate',
|
url = reverse('horizon:admin:volumes:migrate',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.post(url, {'host': host, 'volume_id': volume.id})
|
res = self.client.post(url, {'host': host, 'volume_id': volume.id})
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
|
mock_pool.assert_called_once()
|
||||||
|
mock_migtate.assert_called_once_with(test.IsHttpRequest(),
|
||||||
|
volume.id, host, False)
|
||||||
self.assertNoFormErrors(res)
|
self.assertNoFormErrors(res)
|
||||||
self.assertRedirectsNoFollow(res, INDEX_URL)
|
self.assertRedirectsNoFollow(res, INDEX_URL)
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('pool_list',
|
@mock.patch.object(cinder, 'volume_migrate')
|
||||||
'volume_get',
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
'volume_migrate',)})
|
@mock.patch.object(cinder, 'pool_list')
|
||||||
def test_volume_migrate_post_api_exception(self):
|
def test_volume_migrate_post_api_exception(self, mock_pool, mock_get,
|
||||||
|
mock_migtate):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
host = self.cinder_pools.first().name
|
host = self.cinder_pools.first().name
|
||||||
|
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
mock_get.return_value = volume
|
||||||
.AndReturn(volume)
|
mock_pool.return_value = self.cinder_pools.list()
|
||||||
cinder.pool_list(IsA(http.HttpRequest)) \
|
mock_migtate.side_effect = self.exceptions.cinder
|
||||||
.AndReturn(self.cinder_pools.list())
|
|
||||||
cinder.volume_migrate(IsA(http.HttpRequest),
|
|
||||||
volume.id,
|
|
||||||
host,
|
|
||||||
False) \
|
|
||||||
.AndRaise(self.exceptions.cinder)
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:migrate',
|
url = reverse('horizon:admin:volumes:migrate',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.post(url, {'host': host, 'volume_id': volume.id})
|
res = self.client.post(url, {'host': host, 'volume_id': volume.id})
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
|
mock_pool.assert_called_once()
|
||||||
|
mock_migtate.assert_called_once_with(test.IsHttpRequest(), volume.id,
|
||||||
|
host, False)
|
||||||
self.assertRedirectsNoFollow(res, INDEX_URL)
|
self.assertRedirectsNoFollow(res, INDEX_URL)
|
||||||
|
|
||||||
def test_get_volume_status_choices_without_current(self):
|
def test_get_volume_status_choices_without_current(self):
|
||||||
@ -381,16 +373,15 @@ class VolumeTests(test.BaseAdminViewTests):
|
|||||||
self.assertNotIn(current_status,
|
self.assertNotIn(current_status,
|
||||||
[status[0] for status in status_choices])
|
[status[0] for status in status_choices])
|
||||||
|
|
||||||
@test.create_stubs({cinder: ('volume_get',)})
|
@mock.patch.object(cinder, 'volume_get')
|
||||||
def test_update_volume_status_get(self):
|
def test_update_volume_status_get(self, mock_get):
|
||||||
volume = self.cinder_volumes.get(name='v2_volume')
|
volume = self.cinder_volumes.get(name='v2_volume')
|
||||||
cinder.volume_get(IsA(http.HttpRequest), volume.id) \
|
mock_get.return_value = volume
|
||||||
.AndReturn(volume)
|
|
||||||
|
|
||||||
self.mox.ReplayAll()
|
|
||||||
|
|
||||||
url = reverse('horizon:admin:volumes:update_status',
|
url = reverse('horizon:admin:volumes:update_status',
|
||||||
args=[volume.id])
|
args=[volume.id])
|
||||||
res = self.client.get(url)
|
res = self.client.get(url)
|
||||||
status_option = "<option value=\"%s\"></option>" % volume.status
|
status_option = "<option value=\"%s\"></option>" % volume.status
|
||||||
|
|
||||||
|
mock_get.assert_called_once_with(test.IsHttpRequest(), volume.id)
|
||||||
self.assertNotContains(res, status_option)
|
self.assertNotContains(res, status_option)
|
||||||
|
@ -30,6 +30,7 @@ from django.conf import settings
|
|||||||
from django.contrib.messages.storage import default_storage
|
from django.contrib.messages.storage import default_storage
|
||||||
from django.core.handlers import wsgi
|
from django.core.handlers import wsgi
|
||||||
from django.core import urlresolvers
|
from django.core import urlresolvers
|
||||||
|
from django import http as http_request
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
from django.test import utils as django_test_utils
|
from django.test import utils as django_test_utils
|
||||||
from django.utils import http
|
from django.utils import http
|
||||||
@ -693,3 +694,9 @@ def mock_factory(r):
|
|||||||
mocked = mock_obj_to_dict(r)
|
mocked = mock_obj_to_dict(r)
|
||||||
mocked.configure_mock(**r)
|
mocked.configure_mock(**r)
|
||||||
return mocked
|
return mocked
|
||||||
|
|
||||||
|
|
||||||
|
class IsHttpRequest(object):
|
||||||
|
"""Class to compare param is django.http.HttpRequest."""
|
||||||
|
def __eq__(self, other):
|
||||||
|
return isinstance(other, http_request.HttpRequest)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user