Convert project tests into mock: cgroups/cg_snapshots

test_update_cgroup_add_vol/remove_vol tests were completely broken
as add/remove_vol operation is not a part of cgroup_update.
These tests are fixed to pass tests after mock migration.
I don't know why they passes before.

test_create_cgroup_from_snapshot* in CG snapshot tests was also
broken (redirect destination and method signature were wrong).
They are fixed as well though I am not sure why they passed.

Partially-Implements: blueprint mock-framework-in-unit-tests
Change-Id: I8fe53390da2f7c35a31e339306e7d1394bb36218
This commit is contained in:
Akihiro Motoki
2018-01-08 05:23:10 +09:00
parent d4c1c29cbb
commit f8150ab4cc
3 changed files with 246 additions and 198 deletions

View File

@@ -10,9 +10,8 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from django import http
from django.urls import reverse from django.urls import reverse
from mox3.mox import IsA import mock
from openstack_dashboard.api import cinder from openstack_dashboard.api import cinder
from openstack_dashboard.test import helpers as test from openstack_dashboard.test import helpers as test
@@ -22,7 +21,7 @@ INDEX_URL = reverse('horizon:project:cg_snapshots:index')
class CGroupSnapshotTests(test.TestCase): class CGroupSnapshotTests(test.TestCase):
@test.create_stubs({cinder: ('volume_cg_snapshot_get', @test.create_mocks({cinder: ('volume_cg_snapshot_get',
'volume_cgroup_create_from_source',)}) 'volume_cgroup_create_from_source',)})
def test_create_cgroup_from_snapshot(self): def test_create_cgroup_from_snapshot(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
@@ -31,23 +30,25 @@ class CGroupSnapshotTests(test.TestCase):
'name': 'test CG SS Create', 'name': 'test CG SS Create',
'description': 'test desc'} 'description': 'test desc'}
cinder.volume_cg_snapshot_get(IsA(http.HttpRequest), cg_snapshot.id).\ self.mock_volume_cg_snapshot_get.return_value = cg_snapshot
AndReturn(cg_snapshot) self.mock_volume_cgroup_create_from_source.return_value = cgroup
cinder.volume_cgroup_create_from_source(
IsA(http.HttpRequest),
formData['name'],
source_cgroup_id=formData['cg_snapshot_id'],
description=formData['description'])\
.AndReturn(cgroup)
self.mox.ReplayAll()
url = reverse('horizon:project:cg_snapshots:create_cgroup', url = reverse('horizon:project:cg_snapshots:create_cgroup',
args=[cg_snapshot.id]) args=[cg_snapshot.id])
res = self.client.post(url, formData) res = self.client.post(url, formData)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(
res, reverse('horizon:project:cgroups:index'))
@test.create_stubs({cinder: ('volume_cg_snapshot_get', self.mock_volume_cg_snapshot_get.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)
self.mock_volume_cgroup_create_from_source.assert_called_once_with(
test.IsHttpRequest(),
formData['name'],
cg_snapshot_id=formData['cg_snapshot_id'],
description=formData['description'])
@test.create_mocks({cinder: ('volume_cg_snapshot_get',
'volume_cgroup_create_from_source',)}) 'volume_cgroup_create_from_source',)})
def test_create_cgroup_from_snapshot_exception(self): def test_create_cgroup_from_snapshot_exception(self):
cg_snapshot = self.cinder_cg_snapshots.first() cg_snapshot = self.cinder_cg_snapshots.first()
@@ -56,15 +57,9 @@ class CGroupSnapshotTests(test.TestCase):
'name': new_cg_name, 'name': new_cg_name,
'description': 'test desc'} 'description': 'test desc'}
cinder.volume_cg_snapshot_get(IsA(http.HttpRequest), cg_snapshot.id).\ self.mock_volume_cg_snapshot_get.return_value = cg_snapshot
AndReturn(cg_snapshot) self.mock_volume_cgroup_create_from_source.side_effect = \
cinder.volume_cgroup_create_from_source( self.exceptions.cinder
IsA(http.HttpRequest),
formData['name'],
source_cgroup_id=formData['cg_snapshot_id'],
description=formData['description'])\
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:project:cg_snapshots:create_cgroup', url = reverse('horizon:project:cg_snapshots:create_cgroup',
args=[cg_snapshot.id]) args=[cg_snapshot.id])
@@ -77,16 +72,22 @@ class CGroupSnapshotTests(test.TestCase):
res.cookies.output().replace('\\', '')) res.cookies.output().replace('\\', ''))
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cg_snapshot_list', self.mock_volume_cg_snapshot_get.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)
self.mock_volume_cgroup_create_from_source.assert_called_once_with(
test.IsHttpRequest(),
formData['name'],
cg_snapshot_id=formData['cg_snapshot_id'],
description=formData['description'])
@test.create_mocks({cinder: ('volume_cg_snapshot_list',
'volume_cg_snapshot_delete',)}) 'volume_cg_snapshot_delete',)})
def test_delete_cgroup_snapshot(self): def test_delete_cgroup_snapshot(self):
cg_snapshots = self.cinder_cg_snapshots.list() cg_snapshots = self.cinder_cg_snapshots.list()
cg_snapshot = self.cinder_cg_snapshots.first() cg_snapshot = self.cinder_cg_snapshots.first()
cinder.volume_cg_snapshot_list(IsA(http.HttpRequest)).\ self.mock_volume_cg_snapshot_list.return_value = cg_snapshots
AndReturn(cg_snapshots) self.mock_volume_cg_snapshot_delete.return_value = None
cinder.volume_cg_snapshot_delete(IsA(http.HttpRequest), cg_snapshot.id)
self.mox.ReplayAll()
form_data = {'action': 'volume_cg_snapshots__delete_cg_snapshot__%s' form_data = {'action': 'volume_cg_snapshots__delete_cg_snapshot__%s'
% cg_snapshot.id} % cg_snapshot.id}
@@ -95,18 +96,21 @@ class CGroupSnapshotTests(test.TestCase):
self.assertIn("Scheduled deletion of Snapshot: %s" % cg_snapshot.name, self.assertIn("Scheduled deletion of Snapshot: %s" % cg_snapshot.name,
[m.message for m in res.context['messages']]) [m.message for m in res.context['messages']])
@test.create_stubs({cinder: ('volume_cg_snapshot_list', self.assert_mock_multiple_calls_with_same_arguments(
self.mock_volume_cg_snapshot_list, 2,
mock.call(test.IsHttpRequest()))
self.mock_volume_cg_snapshot_delete.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)
@test.create_mocks({cinder: ('volume_cg_snapshot_list',
'volume_cg_snapshot_delete',)}) 'volume_cg_snapshot_delete',)})
def test_delete_cgroup_snapshot_exception(self): def test_delete_cgroup_snapshot_exception(self):
cg_snapshots = self.cinder_cg_snapshots.list() cg_snapshots = self.cinder_cg_snapshots.list()
cg_snapshot = self.cinder_cg_snapshots.first() cg_snapshot = self.cinder_cg_snapshots.first()
cinder.volume_cg_snapshot_list(IsA(http.HttpRequest)).\ self.mock_volume_cg_snapshot_list.return_value = cg_snapshots
AndReturn(cg_snapshots) self.mock_volume_cg_snapshot_delete.side_effect = \
cinder.volume_cg_snapshot_delete(IsA(http.HttpRequest), self.exceptions.cinder
cg_snapshot.id).\
AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
form_data = {'action': 'volume_cg_snapshots__delete_cg_snapshot__%s' form_data = {'action': 'volume_cg_snapshots__delete_cg_snapshot__%s'
% cg_snapshot.id} % cg_snapshot.id}
@@ -115,7 +119,13 @@ class CGroupSnapshotTests(test.TestCase):
self.assertIn("Unable to delete snapshot: %s" % cg_snapshot.name, self.assertIn("Unable to delete snapshot: %s" % cg_snapshot.name,
[m.message for m in res.context['messages']]) [m.message for m in res.context['messages']])
@test.create_stubs({cinder: ('volume_cg_snapshot_get', self.assert_mock_multiple_calls_with_same_arguments(
self.mock_volume_cg_snapshot_list, 2,
mock.call(test.IsHttpRequest()))
self.mock_volume_cg_snapshot_delete.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)
@test.create_mocks({cinder: ('volume_cg_snapshot_get',
'volume_cgroup_get', 'volume_cgroup_get',
'volume_type_get', 'volume_type_get',
'volume_list',)}) 'volume_list',)})
@@ -125,17 +135,10 @@ class CGroupSnapshotTests(test.TestCase):
volume_type = self.cinder_volume_types.first() volume_type = self.cinder_volume_types.first()
volumes = self.cinder_volumes.list() volumes = self.cinder_volumes.list()
cinder.volume_cg_snapshot_get(IsA(http.HttpRequest), cg_snapshot.id).\ self.mock_volume_cg_snapshot_get.return_value = cg_snapshot
AndReturn(cg_snapshot) self.mock_volume_cgroup_get.return_value = cgroup
cinder.volume_cgroup_get(IsA(http.HttpRequest), cgroup.id).\ self.mock_volume_type_get.return_value = volume_type
AndReturn(cgroup) self.mock_volume_list.return_value = volumes
cinder.volume_type_get(IsA(http.HttpRequest), volume_type.id).\
MultipleTimes().AndReturn(volume_type)
search_opts = {'consistencygroup_id': cgroup.id}
cinder.volume_list(IsA(http.HttpRequest), search_opts=search_opts).\
AndReturn(volumes)
self.mox.ReplayAll()
url = reverse( url = reverse(
'horizon:project:cg_snapshots:cg_snapshot_detail', 'horizon:project:cg_snapshots:cg_snapshot_detail',
@@ -144,14 +147,21 @@ class CGroupSnapshotTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertEqual(res.status_code, 200) self.assertEqual(res.status_code, 200)
@test.create_stubs({cinder: ('volume_cg_snapshot_get',)}) self.mock_volume_cg_snapshot_get.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)
self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
self.mock_volume_type_get.assert_called_once_with(
test.IsHttpRequest(), volume_type.id)
search_opts = {'consistencygroup_id': cgroup.id}
self.mock_volume_list.assert_called_once_with(
test.IsHttpRequest(), search_opts=search_opts)
@test.create_mocks({cinder: ('volume_cg_snapshot_get',)})
def test_detail_view_with_exception(self): def test_detail_view_with_exception(self):
cg_snapshot = self.cinder_cg_snapshots.first() cg_snapshot = self.cinder_cg_snapshots.first()
cinder.volume_cg_snapshot_get(IsA(http.HttpRequest), cg_snapshot.id).\ self.mock_volume_cg_snapshot_get.side_effect = self.exceptions.cinder
AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse( url = reverse(
'horizon:project:cg_snapshots:cg_snapshot_detail', 'horizon:project:cg_snapshots:cg_snapshot_detail',
@@ -159,3 +169,6 @@ class CGroupSnapshotTests(test.TestCase):
res = self.client.get(url) res = self.client.get(url)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
self.mock_volume_cg_snapshot_get.assert_called_once_with(
test.IsHttpRequest(), cg_snapshot.id)

View File

@@ -10,10 +10,9 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
from django import http
from django.urls import reverse from django.urls import reverse
from django.utils.http import urlunquote from django.utils.http import urlunquote
from mox3.mox import IsA import mock
from openstack_dashboard.api import cinder from openstack_dashboard.api import cinder
from openstack_dashboard.test import helpers as test from openstack_dashboard.test import helpers as test
@@ -25,7 +24,7 @@ VOLUME_CGROUPS_SNAP_INDEX_URL = urlunquote(reverse(
class ConsistencyGroupTests(test.TestCase): class ConsistencyGroupTests(test.TestCase):
@test.create_stubs({cinder: ('extension_supported', @test.create_mocks({cinder: ('extension_supported',
'availability_zone_list', 'availability_zone_list',
'volume_type_list', 'volume_type_list',
'volume_type_list_with_qos_associations', 'volume_type_list_with_qos_associations',
@@ -42,30 +41,39 @@ class ConsistencyGroupTests(test.TestCase):
'availability_zone': az, 'availability_zone': az,
'add_vtypes_to_cgroup_role_member': [volume_type_id]} 'add_vtypes_to_cgroup_role_member': [volume_type_id]}
cinder.extension_supported(IsA(http.HttpRequest), 'AvailabilityZones')\ self.mock_extension_supported.return_value = True
.AndReturn(True) self.mock_availability_zone_list.return_value = \
cinder.availability_zone_list(IsA(http.HttpRequest)).AndReturn( self.cinder_availability_zones.list()
self.cinder_availability_zones.list()) self.mock_volume_type_list.return_value = volume_types
cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn(volume_types) self.mock_volume_type_list_with_qos_associations.return_value = \
cinder.volume_type_list_with_qos_associations(IsA(http.HttpRequest)).\ volume_types
AndReturn(volume_types) self.mock_volume_cgroup_list.return_value = \
cinder.volume_cgroup_list(IsA(http.HttpRequest)).\ self.cinder_consistencygroups.list()
AndReturn(self.cinder_consistencygroups.list()) self.mock_volume_cgroup_create.return_value = cgroup
cinder.volume_cgroup_create(
IsA(http.HttpRequest),
formData['volume_types'],
formData['name'],
formData['description'],
availability_zone=formData['availability_zone'])\
.AndReturn(cgroup)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:create') url = reverse('horizon:project:cgroups:create')
res = self.client.post(url, formData) res = self.client.post(url, formData)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('extension_supported', self.mock_extension_supported.assert_called_once_with(
test.IsHttpRequest(), 'AvailabilityZones')
self.mock_availability_zone_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_type_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_type_list_with_qos_associations \
.assert_called_once_with(test.IsHttpRequest())
self.mock_volume_cgroup_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_cgroup_create.assert_called_once_with(
test.IsHttpRequest(),
formData['volume_types'],
formData['name'],
description=formData['description'],
availability_zone=formData['availability_zone'])
@test.create_mocks({cinder: ('extension_supported',
'availability_zone_list', 'availability_zone_list',
'volume_type_list', 'volume_type_list',
'volume_type_list_with_qos_associations', 'volume_type_list_with_qos_associations',
@@ -81,23 +89,15 @@ class ConsistencyGroupTests(test.TestCase):
'availability_zone': az, 'availability_zone': az,
'add_vtypes_to_cgroup_role_member': [volume_type_id]} 'add_vtypes_to_cgroup_role_member': [volume_type_id]}
cinder.extension_supported(IsA(http.HttpRequest), 'AvailabilityZones')\ self.mock_extension_supported.return_value = True
.AndReturn(True) self.mock_availability_zone_list.return_value = \
cinder.availability_zone_list(IsA(http.HttpRequest)).AndReturn( self.cinder_availability_zones.list()
self.cinder_availability_zones.list()) self.mock_volume_type_list.return_value = volume_types
cinder.volume_type_list(IsA(http.HttpRequest)).AndReturn(volume_types) self.mock_volume_type_list_with_qos_associations.return_value = \
cinder.volume_type_list_with_qos_associations(IsA(http.HttpRequest)).\ volume_types
AndReturn(volume_types) self.mock_volume_cgroup_list.return_value = \
cinder.volume_cgroup_list(IsA(http.HttpRequest)).\ self.cinder_consistencygroups.list()
AndReturn(self.cinder_consistencygroups.list()) self.mock_volume_cgroup_create.side_effect = self.exceptions.cinder
cinder.volume_cgroup_create(
IsA(http.HttpRequest),
formData['volume_types'],
formData['name'],
formData['description'],
availability_zone=formData['availability_zone'])\
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:create') url = reverse('horizon:project:cgroups:create')
res = self.client.post(url, formData) res = self.client.post(url, formData)
@@ -106,16 +106,30 @@ class ConsistencyGroupTests(test.TestCase):
self.assertIn("Unable to create consistency group.", self.assertIn("Unable to create consistency group.",
res.cookies.output()) res.cookies.output())
@test.create_stubs({cinder: ('volume_cgroup_get', self.mock_extension_supported.assert_called_once_with(
test.IsHttpRequest(), 'AvailabilityZones')
self.mock_availability_zone_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_type_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_type_list_with_qos_associations \
.assert_called_once_with(test.IsHttpRequest())
self.mock_volume_cgroup_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_cgroup_create.assert_called_once_with(
test.IsHttpRequest(),
formData['volume_types'],
formData['name'],
description=formData['description'],
availability_zone=formData['availability_zone'])
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_delete')}) 'volume_cgroup_delete')})
def test_delete_cgroup(self): def test_delete_cgroup(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
cinder.volume_cgroup_get(IsA(http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_get.return_value = cgroup
AndReturn(cgroup) self.mock_volume_cgroup_delete.return_value = None
cinder.volume_cgroup_delete(IsA(http.HttpRequest), cgroup.id,
force=False)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:delete', url = reverse('horizon:project:cgroups:delete',
args=[cgroup.id]) args=[cgroup.id])
@@ -123,17 +137,19 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_get', self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_delete.assert_called_once_with(
test.IsHttpRequest(), cgroup.id, force=False)
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_delete')}) 'volume_cgroup_delete')})
def test_delete_cgroup_force_flag(self): def test_delete_cgroup_force_flag(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
formData = {'delete_volumes': True} formData = {'delete_volumes': True}
cinder.volume_cgroup_get(IsA(http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_get.return_value = cgroup
AndReturn(cgroup) self.mock_volume_cgroup_delete.return_value = None
cinder.volume_cgroup_delete(IsA(http.HttpRequest), cgroup.id,
force=True)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:delete', url = reverse('horizon:project:cgroups:delete',
args=[cgroup.id]) args=[cgroup.id])
@@ -141,19 +157,19 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_get', self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_delete.assert_called_once_with(
test.IsHttpRequest(), cgroup.id, force=True)
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_delete')}) 'volume_cgroup_delete')})
def test_delete_cgroup_exception(self): def test_delete_cgroup_exception(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
formData = {'delete_volumes': False} formData = {'delete_volumes': False}
cinder.volume_cgroup_get(IsA(http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_get.return_value = cgroup
AndReturn(cgroup) self.mock_volume_cgroup_delete.side_effect = self.exceptions.cinder
cinder.volume_cgroup_delete(IsA(http.HttpRequest),
cgroup.id,
force=False).\
AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:delete', url = reverse('horizon:project:cgroups:delete',
args=[cgroup.id]) args=[cgroup.id])
@@ -161,75 +177,84 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_update', self.mock_volume_cgroup_get.assert_called_once_with(
'volume_cgroup_get')}) test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_delete.assert_called_once_with(
test.IsHttpRequest(), cgroup.id, force=False)
def test_update_cgroup_add_vol(self): def test_update_cgroup_add_vol(self):
cgroup = self.cinder_consistencygroups.first() self._test_update_cgroup_add_remove_vol(add=True)
volume = self.cinder_volumes.first()
formData = {'volume_types': '1',
'name': 'test CG',
'description': 'test desc'}
cinder.volume_cgroup_get(IsA(
http.HttpRequest), cgroup.id).\
AndReturn(cgroup)
cinder.volume_cgroup_update(
IsA(http.HttpRequest),
formData['name'],
formData['description'],
add_vols=volume)\
.AndReturn(cgroup)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:update',
args=[cgroup.id])
res = self.client.post(url, formData)
self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_update',
'volume_cgroup_get')})
def test_update_cgroup_remove_vol(self): def test_update_cgroup_remove_vol(self):
self._test_update_cgroup_add_remove_vol(add=False)
@test.create_mocks({cinder: ('volume_list',
'volume_type_list',
'volume_cgroup_get',
'volume_cgroup_update')})
def _test_update_cgroup_add_remove_vol(self, add=True):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
volume = self.cinder_volumes.first() volume_types = self.cinder_volume_types.list()
formData = {'volume_types': '1', volumes = (self.cinder_volumes.list() +
'name': 'test CG', self.cinder_cgroup_volumes.list())
'description': 'test desc'}
cinder.volume_cgroup_get(IsA( cgroup_voltype_names = [t.name for t in volume_types
http.HttpRequest), cgroup.id).\ if t.id in cgroup.volume_types]
AndReturn(cgroup) compat_volumes = [v for v in volumes
cinder.volume_cgroup_update( if v.volume_type in cgroup_voltype_names]
IsA(http.HttpRequest), compat_volume_ids = [v.id for v in compat_volumes]
formData['name'], assigned_volume_ids = [v.id for v in compat_volumes
formData['description'], if getattr(v, 'consistencygroup_id', None)]
remove_vols=volume)\ add_volume_ids = [v.id for v in compat_volumes
.AndReturn(cgroup) if v.id not in assigned_volume_ids]
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:update', new_volums = compat_volume_ids if add else []
formData = {
'default_add_volumes_to_cgroup_role': 'member',
'add_volumes_to_cgroup_role_member': new_volums,
}
self.mock_volume_list.return_value = volumes
self.mock_volume_type_list.return_value = volume_types
self.mock_volume_cgroup_get.return_value = cgroup
self.mock_volume_cgroup_update.return_value = cgroup
url = reverse('horizon:project:cgroups:manage',
args=[cgroup.id]) args=[cgroup.id])
res = self.client.post(url, formData) res = self.client.post(url, formData)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_update', self.assert_mock_multiple_calls_with_same_arguments(
'volume_cgroup_get')}) self.mock_volume_list, 2,
mock.call(test.IsHttpRequest()))
self.mock_volume_type_list.assert_called_once_with(
test.IsHttpRequest())
self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
if add:
self.mock_volume_cgroup_update.assert_called_once_with(
test.IsHttpRequest(), cgroup.id,
name=cgroup.name,
add_vols=','.join(add_volume_ids),
remove_vols='')
else:
self.mock_volume_cgroup_update.assert_called_once_with(
test.IsHttpRequest(), cgroup.id,
name=cgroup.name,
add_vols='',
remove_vols=','.join(assigned_volume_ids))
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_update')})
def test_update_cgroup_name_and_description(self): def test_update_cgroup_name_and_description(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
formData = {'volume_types': '1', formData = {'volume_types': '1',
'name': 'test CG-new', 'name': 'test CG-new',
'description': 'test desc-new'} 'description': 'test desc-new'}
cinder.volume_cgroup_get(IsA( self.mock_volume_cgroup_get.return_value = cgroup
http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_update.return_value = cgroup
AndReturn(cgroup)
cinder.volume_cgroup_update(
IsA(http.HttpRequest),
formData['name'],
formData['description'])\
.AndReturn(cgroup)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:update', url = reverse('horizon:project:cgroups:update',
args=[cgroup.id]) args=[cgroup.id])
@@ -237,23 +262,23 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_update', self.mock_volume_cgroup_get.assert_called_once_with(
'volume_cgroup_get')}) test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_update.assert_called_once_with(
test.IsHttpRequest(), cgroup.id,
formData['name'],
formData['description'])
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_update')})
def test_update_cgroup_with_exception(self): def test_update_cgroup_with_exception(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
formData = {'volume_types': '1', formData = {'volume_types': '1',
'name': 'test CG-new', 'name': 'test CG-new',
'description': 'test desc-new'} 'description': 'test desc-new'}
cinder.volume_cgroup_get(IsA( self.mock_volume_cgroup_get.return_value = cgroup
http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_update.side_effect = self.exceptions.cinder
AndReturn(cgroup)
cinder.volume_cgroup_update(
IsA(http.HttpRequest),
formData['name'],
formData['description'])\
.AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:update', url = reverse('horizon:project:cgroups:update',
args=[cgroup.id]) args=[cgroup.id])
@@ -261,14 +286,18 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_get',)}) self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_update.assert_called_once_with(
test.IsHttpRequest(), cgroup.id,
formData['name'],
formData['description'])
@test.create_mocks({cinder: ('volume_cgroup_get',)})
def test_detail_view_with_exception(self): def test_detail_view_with_exception(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
cinder.volume_cgroup_get(IsA(http.HttpRequest), cgroup.id).\ self.mock_volume_cgroup_get.side_effect = self.exceptions.cinder
AndRaise(self.exceptions.cinder)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:detail', url = reverse('horizon:project:cgroups:detail',
args=[cgroup.id]) args=[cgroup.id])
@@ -276,7 +305,10 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
@test.create_stubs({cinder: ('volume_cg_snapshot_create',)}) self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
@test.create_mocks({cinder: ('volume_cg_snapshot_create',)})
def test_create_snapshot(self): def test_create_snapshot(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
cg_snapshot = self.cinder_cg_snapshots.first() cg_snapshot = self.cinder_cg_snapshots.first()
@@ -284,13 +316,7 @@ class ConsistencyGroupTests(test.TestCase):
'name': 'test CG Snapshot', 'name': 'test CG Snapshot',
'description': 'test desc'} 'description': 'test desc'}
cinder.volume_cg_snapshot_create( self.mock_volume_cg_snapshot_create.return_value = cg_snapshot
IsA(http.HttpRequest),
formData['cgroup_id'],
formData['name'],
formData['description'])\
.AndReturn(cg_snapshot)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:create_snapshot', url = reverse('horizon:project:cgroups:create_snapshot',
args=[cgroup.id]) args=[cgroup.id])
@@ -298,23 +324,32 @@ class ConsistencyGroupTests(test.TestCase):
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, VOLUME_CGROUPS_SNAP_INDEX_URL) self.assertRedirectsNoFollow(res, VOLUME_CGROUPS_SNAP_INDEX_URL)
@test.create_stubs({cinder: ('volume_cgroup_get', self.mock_volume_cg_snapshot_create.assert_called_once_with(
'volume_cgroup_create_from_source',)}) test.IsHttpRequest(),
formData['cgroup_id'],
formData['name'],
formData['description'])
@test.create_mocks({cinder: ('volume_cgroup_get',
'volume_cgroup_create_from_source')})
def test_create_clone(self): def test_create_clone(self):
cgroup = self.cinder_consistencygroups.first() cgroup = self.cinder_consistencygroups.first()
formData = {'cgroup_id': cgroup.id, formData = {'cgroup_id': cgroup.id,
'name': 'test CG Clone', 'name': 'test CG Clone',
'description': 'test desc'} 'description': 'test desc'}
cinder.volume_cgroup_create_from_source( self.mock_volume_cgroup_get.return_value = cgroup
IsA(http.HttpRequest), self.mock_volume_cgroup_create_from_source.return_value = cgroup
formData['name'],
source_cgroup_id=formData['cgroup_id'],
description=formData['description'])\
.AndReturn(cgroup)
self.mox.ReplayAll()
url = reverse('horizon:project:cgroups:clone_cgroup', url = reverse('horizon:project:cgroups:clone_cgroup',
args=[cgroup.id]) args=[cgroup.id])
res = self.client.post(url, formData) res = self.client.post(url, formData)
self.assertNoFormErrors(res) self.assertNoFormErrors(res)
self.assertRedirectsNoFollow(res, INDEX_URL) self.assertRedirectsNoFollow(res, INDEX_URL)
self.mock_volume_cgroup_get.assert_called_once_with(
test.IsHttpRequest(), cgroup.id)
self.mock_volume_cgroup_create_from_source.assert_called_once_with(
test.IsHttpRequest(),
formData['name'],
source_cgroup_id=formData['cgroup_id'],
description=formData['description'])

View File

@@ -424,7 +424,7 @@ def data(TEST):
{'id': u'1', {'id': u'1',
'name': u'cg_1', 'name': u'cg_1',
'description': 'cg 1 description', 'description': 'cg 1 description',
'volume_types': u'1', 'volume_types': ['1'],
'volume_type_names': []}) 'volume_type_names': []})
cgroup_2 = consistencygroups.Consistencygroup( cgroup_2 = consistencygroups.Consistencygroup(
@@ -432,7 +432,7 @@ def data(TEST):
{'id': u'2', {'id': u'2',
'name': u'cg_2', 'name': u'cg_2',
'description': 'cg 2 description', 'description': 'cg 2 description',
'volume_types': u'1', 'volume_types': ['1'],
'volume_type_names': []}) 'volume_type_names': []})
TEST.cinder_consistencygroups.add(cgroup_1) TEST.cinder_consistencygroups.add(cgroup_1)
@@ -446,7 +446,7 @@ def data(TEST):
'display_name': 'Volume name', 'display_name': 'Volume name',
'display_description': 'Volume description', 'display_description': 'Volume description',
'created_at': '2014-01-27 10:30:00', 'created_at': '2014-01-27 10:30:00',
'volume_type': None, 'volume_type': 'vol_type_1',
'attachments': [], 'attachments': [],
'consistencygroup_id': u'1'}) 'consistencygroup_id': u'1'})
TEST.cinder_cgroup_volumes.add(api.cinder.Volume( TEST.cinder_cgroup_volumes.add(api.cinder.Volume(