Fix tests broken by novaclient 4.0.0 release

The release of python-novaclient 4.0.0 removed both volume_types
and volume_snapshots from the v2 namespace. Both of these data types
are supplied by cinder, but the Horizon test data was still populating
them in nova test data and the tests were using the nova values.

This patch removes the missing namespace references and replaces
the mocked test data with those mocked for cinder.

Additionally, the change exposed a rather broken test in the QoS
for volume_types test suite. This test has been fixed and improved
to exercise more branches.

This fix will unblock the gate for Horizon.

Closes-Bug: #1572246
Change-Id: I9604cd4046a5ab1486373d0572ddf504d4691196
This commit is contained in:
David Lyle 2016-04-19 14:20:17 -06:00
parent 0d6703d017
commit 5d6003971f
7 changed files with 77 additions and 102 deletions

View File

@ -181,7 +181,7 @@ class VolumeTests(test.BaseAdminViewTests):
self.cinder_volume_encryption_types.list()[1])
cinder.volume_type_list_with_qos_associations(
IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.qos_spec_list(IsA(http.HttpRequest)).\
AndReturn(self.cinder_qos_specs.list())
cinder.volume_encryption_type_list(IsA(http.HttpRequest))\
@ -198,7 +198,7 @@ class VolumeTests(test.BaseAdminViewTests):
self.assertTemplateUsed(
res, 'admin/volumes/volume_types/volume_types_tables.html')
volume_types = res.context['volume_types_table'].data
self.assertItemsEqual(volume_types, self.volume_types.list())
self.assertItemsEqual(volume_types, self.cinder_volume_types.list())
qos_specs = res.context['qos_specs_table'].data
self.assertItemsEqual(qos_specs, self.cinder_qos_specs.list())

View File

@ -74,7 +74,7 @@ class QosSpecsTests(test.BaseAdminViewTests):
api.cinder.volume_type_list_with_qos_associations(
IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
api.cinder.volume_encryption_type_list(IsA(http.HttpRequest))\
.AndReturn(self.cinder_volume_encryption_types.list()[0:1])
api.cinder.qos_spec_list(IsA(http.HttpRequest)).\
@ -152,37 +152,43 @@ class QosSpecsTests(test.BaseAdminViewTests):
'qos_spec_get',
'qos_spec_get_associations',
'volume_type_get',
'qos_spec_associate',), })
'qos_spec_associate',
'qos_spec_disassociate'), })
def test_associate_qos_spec(self):
volume_type = self.volume_types.first()
volume_types = self.volume_types.list()
qos_spec = self.cinder_qos_specs.first()
volume_type = self.cinder_volume_types.first()
volume_types = self.cinder_volume_types.list()
qos_specs = self.cinder_qos_specs.list()
# associate qos spec with volume type
formData = {'qos_spec_choice': qos_spec.id}
formData = {'qos_spec_choice': qos_specs[0].id}
edit_url = reverse(
'horizon:admin:volumes:volume_types:manage_qos_spec_association',
args=[volume_type.id])
api.cinder.qos_spec_get(IsA(http.HttpRequest),
qos_spec.id).AndReturn(qos_spec)
# for maximum code coverage, this test swaps the QoS association
# on one volume type moving the QoS assigned from 1 to 0
api.cinder.volume_type_get(IsA(http.HttpRequest),
volume_type.id) \
.AndReturn(volume_type)
api.cinder.qos_spec_list(IsA(http.HttpRequest)) \
.AndReturn(qos_specs)
.MultipleTimes().AndReturn(qos_specs)
api.cinder.qos_spec_get_associations(IsA(http.HttpRequest),
qos_spec.id) \
.AndReturn(volume_types)
qos_specs[0].id) \
.AndReturn([])
api.cinder.qos_spec_get_associations(IsA(http.HttpRequest),
qos_specs[1].id) \
.AndReturn(volume_types)
api.cinder.volume_type_get(IsA(http.HttpRequest),
str(volume_type.id)) \
.AndReturn(volume_type)
api.cinder.qos_spec_get(IsA(http.HttpRequest),
qos_specs[1].id).AndReturn(qos_specs[1])
api.cinder.qos_spec_disassociate(IsA(http.HttpRequest),
qos_specs[1],
volume_type.id)
api.cinder.qos_spec_get(IsA(http.HttpRequest),
qos_specs[0].id).AndReturn(qos_specs[0])
api.cinder.qos_spec_associate(IsA(http.HttpRequest),
qos_spec,
str(volume_type.id))
qos_specs[0],
volume_type.id)
self.mox.ReplayAll()
resp = self.client.post(edit_url, formData)

View File

@ -31,7 +31,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
IsA(http.HttpRequest),
formData['name'],
formData['vol_type_description']).AndReturn(
self.volume_types.first())
self.cinder_volume_types.first())
self.mox.ReplayAll()
res = self.client.post(
@ -78,7 +78,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
cinder.volume_type_list_with_qos_associations(
IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.qos_spec_list(IsA(http.HttpRequest)).\
AndReturn(self.cinder_qos_specs.list())
cinder.volume_encryption_type_list(IsA(http.HttpRequest))\
@ -103,14 +103,14 @@ class VolumeTypeTests(test.BaseAdminViewTests):
'volume_encryption_type_list'),
keystone: ('tenant_list',)})
def test_delete_volume_type_exception(self):
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
formData = {'action': 'volume_types__delete__%s' % volume_type.id}
encryption_list = (self.cinder_volume_encryption_types.list()[0],
self.cinder_volume_encryption_types.list()[1])
cinder.volume_type_list_with_qos_associations(
IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.qos_spec_list(IsA(http.HttpRequest)).\
AndReturn(self.cinder_qos_specs.list())
cinder.volume_encryption_type_list(IsA(http.HttpRequest))\
@ -131,8 +131,8 @@ class VolumeTypeTests(test.BaseAdminViewTests):
@test.create_stubs({cinder: ('volume_encryption_type_create',
'volume_type_list',)})
def test_create_volume_type_encryption(self):
volume_type1 = self.volume_types.list()[0]
volume_type2 = self.volume_types.list()[1]
volume_type1 = self.cinder_volume_types.list()[0]
volume_type2 = self.cinder_volume_types.list()[1]
volume_type1.id = u'1'
volume_type2.id = u'2'
volume_type_list = [volume_type1, volume_type2]
@ -164,7 +164,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
@test.create_stubs({cinder: ('volume_encryption_type_get',
'volume_type_list',)})
def test_type_encryption_detail_view_unencrypted(self):
volume_type1 = self.volume_types.list()[0]
volume_type1 = self.cinder_volume_types.list()[0]
volume_type1.id = u'1'
volume_type_list = [volume_type1]
vol_unenc_type = self.cinder_volume_encryption_types.list()[2]
@ -193,7 +193,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
@test.create_stubs({cinder: ('volume_encryption_type_get',
'volume_type_list',)})
def test_type_encryption_detail_view_encrypted(self):
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
volume_type.id = u'1'
volume_type.name = "An Encrypted Volume Name"
volume_type_list = [volume_type]
@ -233,7 +233,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
'volume_encryption_type_list',
'volume_encryption_type_delete',)})
def test_delete_volume_type_encryption(self):
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
volume_type.id = u'1'
formData = {'action': 'volume_types__delete_encryption__%s' %
volume_type.id}
@ -245,7 +245,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
.AndReturn(True)
cinder.volume_type_list_with_qos_associations(
IsA(http.HttpRequest))\
.AndReturn(self.volume_types.list())
.AndReturn(self.cinder_volume_types.list())
cinder.qos_spec_list(IsA(http.HttpRequest))\
.AndReturn(self.cinder_qos_specs.list())
cinder.volume_encryption_type_list(IsA(http.HttpRequest))\
@ -266,7 +266,7 @@ class VolumeTypeTests(test.BaseAdminViewTests):
'volume_encryption_type_get',
'volume_type_list')})
def test_update_volume_type_encryption(self):
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
volume_type.id = u'1'
volume_type_list = [volume_type]
formData = {'name': u'An Encrypted Volume Type',

View File

@ -60,7 +60,7 @@ class VolumeViewTests(test.BaseAdminViewTests):
'bootable': False}
cinder.volume_type_list(
IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.availability_zone_list(
IsA(http.HttpRequest)).\
AndReturn(self.availability_zones.list())

View File

@ -34,7 +34,7 @@ class ConsistencyGroupTests(test.TestCase):
'extension_supported')})
def test_create_cgroup(self):
cgroup = self.cinder_consistencygroups.first()
volume_types = self.volume_types.list()
volume_types = self.cinder_volume_types.list()
az = self.cinder_availability_zones.first().zoneName
formData = {'volume_types': '1',
'name': 'test CG',
@ -72,7 +72,7 @@ class ConsistencyGroupTests(test.TestCase):
'availability_zone_list',
'extension_supported')})
def test_create_cgroup_exception(self):
volume_types = self.volume_types.list()
volume_types = self.cinder_volume_types.list()
az = self.cinder_availability_zones.first().zoneName
formData = {'volume_types': '1',
'name': 'test CG',

View File

@ -52,7 +52,7 @@ class VolumeViewTests(test.TestCase):
quotas: ('tenant_limit_usages',)})
def test_create_volume(self):
volume = self.cinder_volumes.first()
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
az = self.cinder_availability_zones.first().zoneName
usage_limit = {'maxTotalVolumeGigabytes': 250,
'gigabytesUsed': 20,
@ -67,9 +67,9 @@ class VolumeViewTests(test.TestCase):
'availability_zone': az}
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_list(IsA(http.HttpRequest),
@ -125,7 +125,7 @@ class VolumeViewTests(test.TestCase):
quotas: ('tenant_limit_usages',)})
def test_create_volume_without_name(self):
volume = self.cinder_volumes.first()
volume_type = self.volume_types.first()
volume_type = self.cinder_volume_types.first()
az = self.cinder_availability_zones.first().zoneName
usage_limit = {'maxTotalVolumeGigabytes': 250,
'gigabytesUsed': 20,
@ -140,7 +140,7 @@ class VolumeViewTests(test.TestCase):
'availability_zone': az}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_list(IsA(http.HttpRequest),
@ -161,7 +161,7 @@ class VolumeViewTests(test.TestCase):
cinder.extension_supported(IsA(http.HttpRequest), 'AvailabilityZones')\
.AndReturn(True)
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_list(IsA(
http.HttpRequest),
search_opts=SEARCH_OPTS).AndReturn(self.cinder_volumes.list())
@ -211,9 +211,9 @@ class VolumeViewTests(test.TestCase):
'image_source': self.images.first().id}
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS).\
AndReturn(self.cinder_volume_snapshots.list())
@ -277,9 +277,9 @@ class VolumeViewTests(test.TestCase):
'snapshot_source': snapshot.id}
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_get(IsA(http.HttpRequest),
@ -335,11 +335,11 @@ class VolumeViewTests(test.TestCase):
'volume_source': volume.id}
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_list(IsA(http.HttpRequest), search_opts=SEARCH_OPTS).\
AndReturn(self.cinder_volumes.list())
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS).\
AndReturn(self.cinder_volume_snapshots.list())
@ -408,7 +408,7 @@ class VolumeViewTests(test.TestCase):
'snapshot_source': snapshot.id}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS).\
AndReturn(self.cinder_volume_snapshots.list())
@ -422,7 +422,7 @@ class VolumeViewTests(test.TestCase):
'status': 'active'}) \
.AndReturn([[], False, False])
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_list(IsA(
http.HttpRequest),
search_opts=SEARCH_OPTS).AndReturn(self.cinder_volumes.list())
@ -474,12 +474,12 @@ class VolumeViewTests(test.TestCase):
'size': 20, 'snapshot_source': snapshot.id}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
if django.VERSION >= (1, 9):
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_get(IsA(http.HttpRequest),
@ -488,7 +488,7 @@ class VolumeViewTests(test.TestCase):
AndReturn(self.cinder_volumes.first())
if django.VERSION >= (1, 9):
cinder.volume_type_default(IsA(http.HttpRequest)). \
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_snapshot_get(IsA(http.HttpRequest),
str(snapshot.id)).AndReturn(snapshot)
cinder.volume_get(IsA(http.HttpRequest), snapshot.volume_id). \
@ -527,9 +527,9 @@ class VolumeViewTests(test.TestCase):
'image_source': image.id}
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
api.glance.image_get(IsA(http.HttpRequest),
@ -589,7 +589,7 @@ class VolumeViewTests(test.TestCase):
'image_source': image.id}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS).\
AndReturn(self.cinder_volume_snapshots.list())
@ -603,7 +603,7 @@ class VolumeViewTests(test.TestCase):
'status': 'active'}) \
.AndReturn([[], False, False])
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_list(IsA(
http.HttpRequest),
search_opts=SEARCH_OPTS).AndReturn(self.cinder_volumes.list())
@ -656,12 +656,12 @@ class VolumeViewTests(test.TestCase):
'size': 1, 'image_source': image.id}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
if django.VERSION >= (1, 9):
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
api.glance.image_get(IsA(http.HttpRequest),
@ -672,7 +672,7 @@ class VolumeViewTests(test.TestCase):
self.cinder_availability_zones.list())
if django.VERSION >= (1, 9):
cinder.volume_type_default(IsA(http.HttpRequest)). \
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
api.glance.image_get(IsA(http.HttpRequest),
str(image.id)).AndReturn(image)
cinder.extension_supported(IsA(http.HttpRequest),
@ -711,12 +711,12 @@ class VolumeViewTests(test.TestCase):
'size': 5, 'image_source': image.id}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
if django.VERSION >= (1, 9):
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
api.glance.image_get(IsA(http.HttpRequest),
@ -727,7 +727,7 @@ class VolumeViewTests(test.TestCase):
self.cinder_availability_zones.list())
if django.VERSION >= (1, 9):
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
api.glance.image_get(IsA(http.HttpRequest),
str(image.id)).AndReturn(image)
cinder.extension_supported(IsA(http.HttpRequest),
@ -776,12 +776,12 @@ class VolumeViewTests(test.TestCase):
'size': 5000}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
if django.VERSION >= (1, 9):
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_list(IsA(http.HttpRequest),
@ -805,7 +805,7 @@ class VolumeViewTests(test.TestCase):
self.cinder_availability_zones.list())
if django.VERSION >= (1, 9):
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS). \
AndReturn(self.cinder_volume_snapshots.list())
@ -855,12 +855,12 @@ class VolumeViewTests(test.TestCase):
'size': 10}
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
if django.VERSION >= (1, 9):
cinder.volume_type_list(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.list())
AndReturn(self.cinder_volume_types.list())
cinder.volume_type_default(IsA(http.HttpRequest)).\
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
quotas.tenant_limit_usages(IsA(http.HttpRequest)).\
AndReturn(usage_limit)
cinder.volume_snapshot_list(IsA(http.HttpRequest),
@ -884,7 +884,7 @@ class VolumeViewTests(test.TestCase):
self.cinder_availability_zones.list())
if django.VERSION >= (1, 9):
cinder.volume_type_default(IsA(http.HttpRequest)). \
AndReturn(self.volume_types.first())
AndReturn(self.cinder_volume_types.first())
cinder.volume_snapshot_list(IsA(http.HttpRequest),
search_opts=SEARCH_OPTS). \
AndReturn(self.cinder_volume_snapshots.list())

View File

@ -30,8 +30,6 @@ from novaclient.v2 import security_groups as sec_groups
from novaclient.v2 import servers
from novaclient.v2 import services
from novaclient.v2 import usage
from novaclient.v2 import volume_snapshots as vol_snaps
from novaclient.v2 import volume_types
from novaclient.v2 import volumes
from openstack_dashboard.api import base
@ -176,8 +174,6 @@ def data(TEST):
TEST.floating_ips_uuid = utils.TestDataContainer()
TEST.usages = utils.TestDataContainer()
TEST.certs = utils.TestDataContainer()
TEST.volume_snapshots = utils.TestDataContainer()
TEST.volume_types = utils.TestDataContainer()
TEST.availability_zones = utils.TestDataContainer()
TEST.hypervisors = utils.TestDataContainer()
TEST.services = utils.TestDataContainer()
@ -247,14 +243,6 @@ def data(TEST):
TEST.volumes.add(attached_volume)
TEST.volumes.add(non_bootable_volume)
vol_type1 = volume_types.VolumeType(volume_types.VolumeTypeManager(None),
{'id': 1,
'name': 'vol_type_1'})
vol_type2 = volume_types.VolumeType(volume_types.VolumeTypeManager(None),
{'id': 2,
'name': 'vol_type_2'})
TEST.volume_types.add(vol_type1, vol_type2)
# Flavors
flavor_1 = flavors.Flavor(flavors.FlavorManager(None),
{'id': "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
@ -569,25 +557,6 @@ def data(TEST):
json.loads(USAGE_DATA % usage_2_vals))
TEST.usages.add(usage_obj_2)
volume_snapshot = vol_snaps.Snapshot(
vol_snaps.SnapshotManager(None),
{'id': '40f3fabf-3613-4f5e-90e5-6c9a08333fc3',
'display_name': 'test snapshot',
'display_description': 'vol snap!',
'size': 40,
'status': 'available',
'volume_id': '41023e92-8008-4c8b-8059-7f2293ff3775'})
volume_snapshot2 = vol_snaps.Snapshot(
vol_snaps.SnapshotManager(None),
{'id': 'a374cbb8-3f99-4c3f-a2ef-3edbec842e31',
'display_name': '',
'display_description': 'vol snap 2!',
'size': 80,
'status': 'available',
'volume_id': '3b189ac8-9166-ac7f-90c9-16c8bf9e01ac'})
TEST.volume_snapshots.add(volume_snapshot)
TEST.volume_snapshots.add(volume_snapshot2)
cert_data = {'private_key': 'private',
'data': 'certificate_data'}
certificate = certs.Certificate(certs.CertificateManager(None), cert_data)