28
27
from nova import context
29
28
from nova import db
30
29
from nova import exception
31
from nova import flags
30
from nova.openstack.common import cfg
32
31
from nova.openstack.common import log as logging
33
32
from nova.openstack.common import rpc
34
33
from nova import test
35
34
from nova.tests import fake_network
36
35
from nova.tests.image import fake
36
from nova.tests import matchers
37
37
from nova import volume
40
CONF.import_opt('default_instance_type', 'nova.config')
41
CONF.import_opt('use_ipv6', 'nova.config')
40
42
LOG = logging.getLogger(__name__)
44
45
def get_fake_cache():
85
86
super(CinderCloudTestCase, self).setUp()
86
87
vol_tmpdir = tempfile.mkdtemp()
87
88
self.flags(compute_driver='nova.virt.fake.FakeDriver',
88
volume_api_class='nova.tests.fake_volume.API',
89
volumes_dir=vol_tmpdir)
89
volume_api_class='nova.tests.fake_volume.API')
91
91
def fake_show(meh, context, id):
93
93
'name': 'fake_name',
94
94
'container_format': 'ami',
96
97
'kernel_id': 'cedef40a-ed67-4d10-800e-17455edce175',
97
98
'ramdisk_id': 'cedef40a-ed67-4d10-800e-17455edce175',
116
117
# set up our cloud
117
118
self.cloud = cloud.CloudController()
118
self.flags(compute_scheduler_driver='nova.scheduler.'
119
'chance.ChanceScheduler')
119
self.flags(scheduler_driver='nova.scheduler.chance.ChanceScheduler')
121
121
# set up services
122
122
self.compute = self.start_service('compute')
123
123
self.scheduler = self.start_service('scheduler')
124
124
self.network = self.start_service('network')
125
self.volume = self.start_service('volume')
127
126
self.user_id = 'fake'
128
127
self.project_id = 'fake'
142
141
'76fa36fc-c930-4bf3-8c8a-ea2a2420deb6')
144
143
def tearDown(self):
146
shutil.rmtree(FLAGS.volumes_dir)
149
144
self.volume_api.reset_fake_api(self.context)
150
145
super(CinderCloudTestCase, self).tearDown()
151
146
fake.FakeImageService_reset()
311
306
kwargs = {'name': 'bdmtest-volume',
312
307
'description': 'bdm test volume description',
313
308
'status': 'available',
314
'host': self.volume.host,
316
311
'attach_status': 'detached',
317
312
'volume_id': values['id']}
442
437
self.cloud._format_instance_bdm(self.context, inst1['uuid'],
443
438
'/dev/sdb1', result)
444
self.assertSubDictMatch(
445
440
{'rootDeviceType': self._expected_instance_bdm1['rootDeviceType']},
441
matchers.IsSubDictOf(result))
447
442
self._assertEqualBlockDeviceMapping(
448
443
self._expected_block_device_mapping0, result['blockDeviceMapping'])
451
446
self.cloud._format_instance_bdm(self.context, inst2['uuid'],
452
447
'/dev/sdc1', result)
453
self.assertSubDictMatch(
454
449
{'rootDeviceType': self._expected_instance_bdm2['rootDeviceType']},
450
matchers.IsSubDictOf(result))
457
452
self._tearDownBlockDeviceMapping(inst1, inst2, volumes)
484
479
(inst1, inst2, volumes) = self._setUpBlockDeviceMapping()
486
481
result = self._assertInstance(inst1['id'])
487
self.assertSubDictMatch(self._expected_instance_bdm1, result)
483
self._expected_instance_bdm1,
484
matchers.IsSubDictOf(result))
488
485
self._assertEqualBlockDeviceMapping(
489
486
self._expected_block_device_mapping0, result['blockDeviceMapping'])
491
488
result = self._assertInstance(inst2['id'])
492
self.assertSubDictMatch(self._expected_instance_bdm2, result)
490
self._expected_instance_bdm2,
491
matchers.IsSubDictOf(result))
494
493
self._tearDownBlockDeviceMapping(inst1, inst2, volumes)
496
def assertDictListUnorderedMatch(self, L1, L2, key):
497
self.assertEqual(len(L1), len(L2))
499
self.assertTrue(key in d1)
501
self.assertTrue(key in d2)
502
if d1[key] == d2[key]:
503
self.assertDictMatch(d1, d2)
505
495
def _setUpImageSet(self, create_volumes_and_snapshots=False):
507
497
{'device': '/dev/sda1', 'virtual': 'root'},
639
631
kwargs = {'name': 'test-volume',
640
632
'description': 'test volume description',
641
633
'status': 'available',
642
'host': self.volume.host,
644
636
'attach_status': 'detached'}
646
638
kwargs['volume_id'] = volume_id
647
639
return self.volume_api.create_with_kwargs(self.context, **kwargs)
648
#return db.volume_create(self.context, kwargs)
650
641
def _assert_volume_attached(self, vol, instance_uuid, mountpoint):
651
642
self.assertEqual(vol['instance_uuid'], instance_uuid)
674
665
self._restart_compute_service(periodic_interval=0.3)
676
667
kwargs = {'image_id': 'ami-1',
677
'instance_type': FLAGS.default_instance_type,
668
'instance_type': CONF.default_instance_type,
679
670
'block_device_mapping': [{'device_name': '/dev/sdb',
680
671
'volume_id': vol1_uuid,
684
675
'delete_on_termination': True},
686
677
ec2_instance_id = self._run_instance(**kwargs)
687
instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
678
instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
689
680
vols = self.volume_api.get_all(self.context)
690
681
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
756
747
# enforce periodic tasks run in short time to avoid wait for 60s.
757
748
self._restart_compute_service(periodic_interval=0.3)
758
749
kwargs = {'image_id': 'ami-1',
759
'instance_type': FLAGS.default_instance_type,
750
'instance_type': CONF.default_instance_type,
761
752
'block_device_mapping': [{'device_name': '/dev/sdb',
762
753
'volume_id': vol1_uuid,
763
754
'delete_on_termination': True}]}
764
755
ec2_instance_id = self._run_instance(**kwargs)
765
instance_id = ec2utils.ec2_id_to_id(ec2_instance_id)
766
instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
756
instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
769
759
vols = self.volume_api.get_all(self.context)
770
760
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
775
765
vol = self.volume_api.get(self.context, vol2_uuid)
776
766
self._assert_volume_detached(vol)
778
instance = db.instance_get(self.context, instance_id)
768
instance = db.instance_get_by_uuid(self.context, instance_uuid)
779
769
self.cloud.compute_api.attach_volume(self.context,
781
771
volume_id=vol2_uuid,
838
828
snap2_uuid = ec2utils.ec2_snap_id_to_uuid(snap2['snapshotId'])
840
830
kwargs = {'image_id': 'ami-1',
841
'instance_type': FLAGS.default_instance_type,
831
'instance_type': CONF.default_instance_type,
843
833
'block_device_mapping': [{'device_name': '/dev/vdb',
844
834
'snapshot_id': snap1_uuid,
847
837
'snapshot_id': snap2_uuid,
848
838
'delete_on_termination': True}]}
849
839
ec2_instance_id = self._run_instance(**kwargs)
850
instance_uuid = ec2utils.ec2_instance_id_to_uuid(self.context,
840
instance_uuid = ec2utils.ec2_inst_id_to_uuid(self.context,
853
843
vols = self.volume_api.get_all(self.context)
854
844
vols = [v for v in vols if v['instance_uuid'] == instance_uuid]
898
888
create_volumes_and_snapshots=True)
900
890
kwargs = {'image_id': 'ami-1',
901
'instance_type': FLAGS.default_instance_type,
891
'instance_type': CONF.default_instance_type,
903
893
ec2_instance_id = self._run_instance(**kwargs)