46
47
super(VolumeTestCase, self).setUp()
47
self.compute = utils.import_object(FLAGS.compute_manager)
48
self.compute = importutils.import_object(FLAGS.compute_manager)
48
49
self.flags(connection_type='fake')
49
self.volume = utils.import_object(FLAGS.volume_manager)
50
self.stubs.Set(nova.flags.FLAGS, 'notification_driver',
51
'nova.notifier.test_notifier')
52
self.volume = importutils.import_object(FLAGS.volume_manager)
50
53
self.context = context.get_admin_context()
51
self.instance_id = db.instance_create(self.context, {})['id']
54
instance = db.instance_create(self.context, {})
55
self.instance_id = instance['id']
56
self.instance_uuid = instance['uuid']
57
test_notifier.NOTIFICATIONS = []
53
59
def tearDown(self):
54
60
db.instance_destroy(self.context, self.instance_id)
55
61
super(VolumeTestCase, self).tearDown()
58
def _create_volume(size='0', snapshot_id=None):
64
def _create_volume(size=0, snapshot_id=None):
59
65
"""Create a volume object."""
67
73
vol['attach_status'] = "detached"
68
74
return db.volume_create(context.get_admin_context(), vol)
76
def test_ec2_uuid_mapping(self):
77
ec2_vol = db.ec2_volume_create(context.get_admin_context(),
78
'aaaaaaaa-bbbb-bbbb-bbbb-aaaaaaaaaaaa', 5)
79
self.assertEqual(5, ec2_vol['id'])
80
self.assertEqual('aaaaaaaa-bbbb-bbbb-bbbb-aaaaaaaaaaaa',
81
db.get_volume_uuid_by_ec2_id(context.get_admin_context(), 5))
83
ec2_vol = db.ec2_volume_create(context.get_admin_context(),
84
'aaaaaaaa-bbbb-bbbb-bbbb-aaaaaaaaaaaa', 1)
85
self.assertEqual(1, ec2_vol['id'])
87
ec2_vol = db.ec2_volume_create(context.get_admin_context(),
88
'aaaaaaaa-bbbb-bbbb-bbbb-aaaaaaaaazzz')
89
self.assertEqual(6, ec2_vol['id'])
70
91
def test_create_delete_volume(self):
71
92
"""Test volume can be created and deleted."""
72
93
volume = self._create_volume()
73
94
volume_id = volume['id']
95
self.assertEquals(len(test_notifier.NOTIFICATIONS), 0)
74
96
self.volume.create_volume(self.context, volume_id)
97
self.assertEquals(len(test_notifier.NOTIFICATIONS), 2)
75
98
self.assertEqual(volume_id, db.volume_get(context.get_admin_context(),
78
101
self.volume.delete_volume(self.context, volume_id)
102
self.assertEquals(len(test_notifier.NOTIFICATIONS), 4)
79
103
self.assertRaises(exception.NotFound,
160
184
inst['project_id'] = 'fake'
161
185
inst['instance_type_id'] = '2' # m1.tiny
162
186
inst['ami_launch_index'] = 0
163
instance_id = db.instance_create(self.context, inst)['id']
187
instance = db.instance_create(self.context, {})
188
instance_id = instance['id']
189
instance_uuid = instance['uuid']
164
190
mountpoint = "/dev/sdf"
165
191
volume = self._create_volume()
166
192
volume_id = volume['id']
167
193
self.volume.create_volume(self.context, volume_id)
168
194
if FLAGS.fake_tests:
169
db.volume_attached(self.context, volume_id, instance_id,
195
db.volume_attached(self.context, volume_id, instance_uuid,
172
198
self.compute.attach_volume(self.context,
176
202
vol = db.volume_get(context.get_admin_context(), volume_id)
177
203
self.assertEqual(vol['status'], "in-use")
178
204
self.assertEqual(vol['attach_status'], "attached")
179
205
self.assertEqual(vol['mountpoint'], mountpoint)
180
instance_ref = db.volume_get_instance(self.context, volume_id)
181
self.assertEqual(instance_ref['id'], instance_id)
206
self.assertEqual(vol['instance_uuid'], instance_uuid)
183
self.assertRaises(exception.Error,
208
self.assertRaises(exception.NovaException,
184
209
self.volume.delete_volume,
188
213
db.volume_detached(self.context, volume_id)
190
215
self.compute.detach_volume(self.context,
193
218
vol = db.volume_get(self.context, volume_id)
194
219
self.assertEqual(vol['status'], "available")
309
334
volume = self._create_volume()
310
335
self.volume.create_volume(self.context, volume['id'])
311
db.volume_attached(self.context, volume['id'], self.instance_id,
336
db.volume_attached(self.context, volume['id'], self.instance_uuid,
314
339
volume_api = nova.volume.api.API()
345
370
self.volume.delete_snapshot(self.context, snapshot_id)
346
371
self.volume.delete_volume(self.context, volume_id)
373
def test_create_volume_usage_notification(self):
374
"""Ensure create volume generates appropriate usage notification"""
375
volume = self._create_volume()
376
volume_id = volume['id']
377
self.assertEquals(len(test_notifier.NOTIFICATIONS), 0)
378
self.volume.create_volume(self.context, volume_id)
379
self.assertEquals(len(test_notifier.NOTIFICATIONS), 2)
380
msg = test_notifier.NOTIFICATIONS[0]
381
self.assertEquals(msg['event_type'], 'volume.create.start')
382
msg = test_notifier.NOTIFICATIONS[1]
383
self.assertEquals(msg['priority'], 'INFO')
384
self.assertEquals(msg['event_type'], 'volume.create.end')
385
payload = msg['payload']
386
self.assertEquals(payload['tenant_id'], volume['project_id'])
387
self.assertEquals(payload['user_id'], volume['user_id'])
388
self.assertEquals(payload['volume_id'], volume['id'])
389
self.assertEquals(payload['status'], 'creating')
390
self.assertEquals(payload['size'], volume['size'])
391
self.assertTrue('display_name' in payload)
392
self.assertTrue('snapshot_id' in payload)
393
self.assertTrue('launched_at' in payload)
394
self.assertTrue('created_at' in payload)
395
self.volume.delete_volume(self.context, volume_id)
349
398
class DriverTestCase(test.TestCase):
350
399
"""Base Test class for Drivers."""
354
403
super(DriverTestCase, self).setUp()
355
404
self.flags(volume_driver=self.driver_name,
356
405
logging_default_format_string="%(message)s")
357
self.volume = utils.import_object(FLAGS.volume_manager)
406
self.volume = importutils.import_object(FLAGS.volume_manager)
358
407
self.context = context.get_admin_context()
368
417
log.logger.addHandler(logging.logging.StreamHandler(self.stream))
371
self.instance_id = db.instance_create(self.context, inst)['id']
420
instance = db.instance_create(self.context, {})
421
self.instance_id = instance['id']
422
self.instance_uuid = instance['uuid']
373
424
def _attach_volume(self):
374
425
"""Attach volumes to an instance. This function also sets
422
473
# each volume has a different mountpoint
423
474
mountpoint = "/dev/sd" + chr((ord('b') + index))
424
db.volume_attached(self.context, vol_ref['id'], self.instance_id,
475
db.volume_attached(self.context, vol_ref['id'], self.instance_uuid,
426
477
volume_id_list.append(vol_ref['id'])