diff options
| author | Jenkins <jenkins@review.openstack.org> | 2013-05-23 16:46:06 +0000 |
|---|---|---|
| committer | Gerrit Code Review <review@openstack.org> | 2013-05-23 16:46:06 +0000 |
| commit | 6dd1709bcea69ab47a695d42cb1c3d0e7f221ab2 (patch) | |
| tree | 27a236b6758928fc47504c9a835d684dffc4e5c4 | |
| parent | fd50761d3ed6181689d55ff63ca295ac9fc1a7d0 (diff) | |
| parent | 942169b3b21439c83822d25d213e515c97c85135 (diff) | |
Merge "xenapi: Moving tests under tests/virt/xenapi/"
| -rw-r--r-- | nova/tests/virt/xenapi/stubs.py (renamed from nova/tests/xenapi/stubs.py) | 0 | ||||
| -rw-r--r-- | nova/tests/virt/xenapi/test_vm_utils.py | 375 | ||||
| -rw-r--r-- | nova/tests/virt/xenapi/test_volumeops.py | 2 | ||||
| -rw-r--r-- | nova/tests/virt/xenapi/test_xenapi.py (renamed from nova/tests/test_xenapi.py) | 4 | ||||
| -rw-r--r-- | nova/tests/virt/xenapi/vm_rrd.xml (renamed from nova/tests/xenapi/vm_rrd.xml) | 0 | ||||
| -rw-r--r-- | nova/tests/xenapi/__init__.py | 20 | ||||
| -rw-r--r-- | nova/tests/xenapi/test_vm_utils.py | 377 |
7 files changed, 377 insertions, 401 deletions
diff --git a/nova/tests/xenapi/stubs.py b/nova/tests/virt/xenapi/stubs.py index fa214b23e..fa214b23e 100644 --- a/nova/tests/xenapi/stubs.py +++ b/nova/tests/virt/xenapi/stubs.py diff --git a/nova/tests/virt/xenapi/test_vm_utils.py b/nova/tests/virt/xenapi/test_vm_utils.py index 4a7370dd9..3f7de1521 100644 --- a/nova/tests/virt/xenapi/test_vm_utils.py +++ b/nova/tests/virt/xenapi/test_vm_utils.py @@ -15,16 +15,45 @@ # License for the specific language governing permissions and limitations # under the License. - import contextlib + import fixtures import mox from nova.compute import flavors +from nova import context +from nova import db from nova import exception from nova import test +from nova.tests.virt.xenapi import stubs from nova import utils +from nova.virt.xenapi import driver as xenapi_conn +from nova.virt.xenapi import fake from nova.virt.xenapi import vm_utils +from nova.virt.xenapi import volume_utils + + +XENSM_TYPE = 'xensm' +ISCSI_TYPE = 'iscsi' + + +def get_fake_connection_data(sr_type): + fakes = {XENSM_TYPE: {'sr_uuid': 'falseSR', + 'name_label': 'fake_storage', + 'name_description': 'test purposes', + 'server': 'myserver', + 'serverpath': '/local/scratch/myname', + 'sr_type': 'nfs', + 'introduce_sr_keys': ['server', + 'serverpath', + 'sr_type'], + 'vdi_uuid': 'falseVDI'}, + ISCSI_TYPE: {'volume_id': 'fake_volume_id', + 'target_lun': 1, + 'target_iqn': 'fake_iqn:volume-fake_volume_id', + 'target_portal': u'localhost:3260', + 'target_discovered': False}, } + return fakes[sr_type] @contextlib.contextmanager @@ -414,3 +443,347 @@ class CheckVDISizeTestCase(test.TestCase): vm_utils._check_vdi_size(self.context, self.session, self.instance, self.vdi_uuid) + + +class GetInstanceForVdisForSrTestCase(stubs.XenAPITestBase): + def setUp(self): + super(GetInstanceForVdisForSrTestCase, self).setUp() + self.flags(disable_process_locking=True, + instance_name_template='%d', + firewall_driver='nova.virt.xenapi.firewall.' + 'Dom0IptablesFirewallDriver', + xenapi_connection_url='test_url', + xenapi_connection_password='test_pass',) + + def test_get_instance_vdis_for_sr(self): + vm_ref = fake.create_vm("foo", "Running") + sr_ref = fake.create_sr() + + vdi_1 = fake.create_vdi('vdiname1', sr_ref) + vdi_2 = fake.create_vdi('vdiname2', sr_ref) + + for vdi_ref in [vdi_1, vdi_2]: + fake.create_vbd(vm_ref, vdi_ref) + + stubs.stubout_session(self.stubs, fake.SessionBase) + driver = xenapi_conn.XenAPIDriver(False) + + result = list(vm_utils.get_instance_vdis_for_sr( + driver._session, vm_ref, sr_ref)) + + self.assertEquals([vdi_1, vdi_2], result) + + def test_get_instance_vdis_for_sr_no_vbd(self): + vm_ref = fake.create_vm("foo", "Running") + sr_ref = fake.create_sr() + + stubs.stubout_session(self.stubs, fake.SessionBase) + driver = xenapi_conn.XenAPIDriver(False) + + result = list(vm_utils.get_instance_vdis_for_sr( + driver._session, vm_ref, sr_ref)) + + self.assertEquals([], result) + + def test_get_vdi_uuid_for_volume_with_sr_uuid(self): + connection_data = get_fake_connection_data(XENSM_TYPE) + stubs.stubout_session(self.stubs, fake.SessionBase) + driver = xenapi_conn.XenAPIDriver(False) + + vdi_uuid = vm_utils.get_vdi_uuid_for_volume( + driver._session, connection_data) + self.assertEquals(vdi_uuid, 'falseVDI') + + def test_get_vdi_uuid_for_volume_failure(self): + stubs.stubout_session(self.stubs, fake.SessionBase) + driver = xenapi_conn.XenAPIDriver(False) + + def bad_introduce_sr(session, sr_uuid, label, sr_params): + return None + + self.stubs.Set(volume_utils, 'introduce_sr', bad_introduce_sr) + connection_data = get_fake_connection_data(XENSM_TYPE) + self.assertRaises(exception.NovaException, + vm_utils.get_vdi_uuid_for_volume, + driver._session, connection_data) + + def test_get_vdi_uuid_for_volume_from_iscsi_vol_missing_sr_uuid(self): + connection_data = get_fake_connection_data(ISCSI_TYPE) + stubs.stubout_session(self.stubs, fake.SessionBase) + driver = xenapi_conn.XenAPIDriver(False) + + vdi_uuid = vm_utils.get_vdi_uuid_for_volume( + driver._session, connection_data) + self.assertNotEquals(vdi_uuid, None) + + +class VMRefOrRaiseVMFoundTestCase(test.TestCase): + + def test_lookup_call(self): + mock = mox.Mox() + mock.StubOutWithMock(vm_utils, 'lookup') + + vm_utils.lookup('session', 'somename').AndReturn('ignored') + + mock.ReplayAll() + vm_utils.vm_ref_or_raise('session', 'somename') + mock.VerifyAll() + + def test_return_value(self): + mock = mox.Mox() + mock.StubOutWithMock(vm_utils, 'lookup') + + vm_utils.lookup(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('vmref') + + mock.ReplayAll() + self.assertEquals( + 'vmref', vm_utils.vm_ref_or_raise('session', 'somename')) + mock.VerifyAll() + + +class VMRefOrRaiseVMNotFoundTestCase(test.TestCase): + + def test_exception_raised(self): + mock = mox.Mox() + mock.StubOutWithMock(vm_utils, 'lookup') + + vm_utils.lookup('session', 'somename').AndReturn(None) + + mock.ReplayAll() + self.assertRaises( + exception.InstanceNotFound, + lambda: vm_utils.vm_ref_or_raise('session', 'somename') + ) + mock.VerifyAll() + + def test_exception_msg_contains_vm_name(self): + mock = mox.Mox() + mock.StubOutWithMock(vm_utils, 'lookup') + + vm_utils.lookup('session', 'somename').AndReturn(None) + + mock.ReplayAll() + try: + vm_utils.vm_ref_or_raise('session', 'somename') + except exception.InstanceNotFound as e: + self.assertTrue( + 'somename' in str(e)) + mock.VerifyAll() + + +class BittorrentTestCase(stubs.XenAPITestBase): + def setUp(self): + super(BittorrentTestCase, self).setUp() + self.context = context.get_admin_context() + + def test_image_uses_bittorrent(self): + sys_meta = {'image_bittorrent': True} + instance = db.instance_create(self.context, + {'system_metadata': sys_meta}) + instance = db.instance_get_by_uuid(self.context, instance['uuid']) + self.flags(xenapi_torrent_images='some') + self.assertTrue(vm_utils._image_uses_bittorrent(self.context, + instance)) + + def _test_create_image(self, cache_type): + sys_meta = {'image_cache_in_nova': True} + instance = db.instance_create(self.context, + {'system_metadata': sys_meta}) + instance = db.instance_get_by_uuid(self.context, instance['uuid']) + self.flags(cache_images=cache_type) + + was = {'called': None} + + def fake_create_cached_image(*args): + was['called'] = 'some' + return {} + self.stubs.Set(vm_utils, '_create_cached_image', + fake_create_cached_image) + + def fake_fetch_image(*args): + was['called'] = 'none' + return {} + self.stubs.Set(vm_utils, '_fetch_image', + fake_fetch_image) + + vm_utils._create_image(self.context, None, instance, + 'foo', 'bar', 'baz') + + self.assertEqual(was['called'], cache_type) + + def test_create_image_cached(self): + self._test_create_image('some') + + def test_create_image_uncached(self): + self._test_create_image('none') + + +class CreateVBDTestCase(test.TestCase): + def setUp(self): + super(CreateVBDTestCase, self).setUp() + self.session = FakeSession() + self.mock = mox.Mox() + self.mock.StubOutWithMock(self.session, 'call_xenapi') + self.vbd_rec = self._generate_vbd_rec() + + def _generate_vbd_rec(self): + vbd_rec = {} + vbd_rec['VM'] = 'vm_ref' + vbd_rec['VDI'] = 'vdi_ref' + vbd_rec['userdevice'] = '0' + vbd_rec['bootable'] = False + vbd_rec['mode'] = 'RW' + vbd_rec['type'] = 'disk' + vbd_rec['unpluggable'] = True + vbd_rec['empty'] = False + vbd_rec['other_config'] = {} + vbd_rec['qos_algorithm_type'] = '' + vbd_rec['qos_algorithm_params'] = {} + vbd_rec['qos_supported_algorithms'] = [] + return vbd_rec + + def test_create_vbd_default_args(self): + self.session.call_xenapi('VBD.create', + self.vbd_rec).AndReturn("vbd_ref") + self.mock.ReplayAll() + + result = vm_utils.create_vbd(self.session, "vm_ref", "vdi_ref", 0) + self.assertEquals(result, "vbd_ref") + self.mock.VerifyAll() + + def test_create_vbd_osvol(self): + self.session.call_xenapi('VBD.create', + self.vbd_rec).AndReturn("vbd_ref") + self.session.call_xenapi('VBD.add_to_other_config', "vbd_ref", + "osvol", "True") + self.mock.ReplayAll() + result = vm_utils.create_vbd(self.session, "vm_ref", "vdi_ref", 0, + osvol=True) + self.assertEquals(result, "vbd_ref") + self.mock.VerifyAll() + + def test_create_vbd_extra_args(self): + self.vbd_rec['VDI'] = 'OpaqueRef:NULL' + self.vbd_rec['type'] = 'a' + self.vbd_rec['mode'] = 'RO' + self.vbd_rec['bootable'] = True + self.vbd_rec['empty'] = True + self.vbd_rec['unpluggable'] = False + self.session.call_xenapi('VBD.create', + self.vbd_rec).AndReturn("vbd_ref") + self.mock.ReplayAll() + + result = vm_utils.create_vbd(self.session, "vm_ref", None, 0, + vbd_type="a", read_only=True, bootable=True, + empty=True, unpluggable=False) + self.assertEquals(result, "vbd_ref") + self.mock.VerifyAll() + + def test_attach_cd(self): + self.mock.StubOutWithMock(vm_utils, 'create_vbd') + + vm_utils.create_vbd(self.session, "vm_ref", None, 1, + vbd_type='cd', read_only=True, bootable=True, + empty=True, unpluggable=False).AndReturn("vbd_ref") + self.session.call_xenapi('VBD.insert', "vbd_ref", "vdi_ref") + self.mock.ReplayAll() + + result = vm_utils.attach_cd(self.session, "vm_ref", "vdi_ref", 1) + self.assertEquals(result, "vbd_ref") + self.mock.VerifyAll() + + +class VDIOtherConfigTestCase(stubs.XenAPITestBase): + """Tests to ensure that the code is populating VDI's `other_config` + attribute with the correct metadta. + """ + + def setUp(self): + super(VDIOtherConfigTestCase, self).setUp() + + class _FakeSession(): + def call_xenapi(self, operation, *args, **kwargs): + # VDI.add_to_other_config -> VDI_add_to_other_config + method = getattr(self, operation.replace('.', '_'), None) + if method: + return method(*args, **kwargs) + + self.operation = operation + self.args = args + self.kwargs = kwargs + + self.session = _FakeSession() + self.context = context.get_admin_context() + self.fake_instance = {'uuid': 'aaaa-bbbb-cccc-dddd', + 'name': 'myinstance'} + + def test_create_vdi(self): + # Some images are registered with XenServer explicitly by calling + # `create_vdi` + vm_utils.create_vdi(self.session, 'sr_ref', self.fake_instance, + 'myvdi', 'root', 1024, read_only=True) + + expected = {'nova_disk_type': 'root', + 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} + + self.assertEqual(expected, self.session.args[0]['other_config']) + + def test_create_image(self): + # Other images are registered implicitly when they are dropped into + # the SR by a dom0 plugin or some other process + self.flags(cache_images='none') + + def fake_fetch_image(*args): + return {'root': {'uuid': 'fake-uuid'}} + + self.stubs.Set(vm_utils, '_fetch_image', fake_fetch_image) + + other_config = {} + + def VDI_add_to_other_config(ref, key, value): + other_config[key] = value + + def VDI_get_record(ref): + return {'other_config': {}} + + # Stubbing on the session object and not class so we don't pollute + # other tests + self.session.VDI_add_to_other_config = VDI_add_to_other_config + self.session.VDI_get_record = VDI_get_record + + vm_utils._create_image(self.context, self.session, self.fake_instance, + 'myvdi', 'image1', vm_utils.ImageType.DISK_VHD) + + expected = {'nova_disk_type': 'root', + 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} + + self.assertEqual(expected, other_config) + + def test_move_disks(self): + # Migrated images should preserve the `other_config` + other_config = {} + + def VDI_add_to_other_config(ref, key, value): + other_config[key] = value + + def VDI_get_record(ref): + return {'other_config': {}} + + def call_plugin_serialized(*args, **kwargs): + return {'root': {'uuid': 'aaaa-bbbb-cccc-dddd'}} + + # Stubbing on the session object and not class so we don't pollute + # other tests + self.session.VDI_add_to_other_config = VDI_add_to_other_config + self.session.VDI_get_record = VDI_get_record + self.session.call_plugin_serialized = call_plugin_serialized + + self.stubs.Set(vm_utils, 'get_sr_path', lambda *a, **k: None) + self.stubs.Set(vm_utils, 'scan_default_sr', lambda *a, **k: None) + + vm_utils.move_disks(self.session, self.fake_instance, {}) + + expected = {'nova_disk_type': 'root', + 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} + + self.assertEqual(expected, other_config) diff --git a/nova/tests/virt/xenapi/test_volumeops.py b/nova/tests/virt/xenapi/test_volumeops.py index 5d4344bb0..1f94d21e3 100644 --- a/nova/tests/virt/xenapi/test_volumeops.py +++ b/nova/tests/virt/xenapi/test_volumeops.py @@ -17,7 +17,7 @@ import collections from nova import test -from nova.tests.xenapi import stubs +from nova.tests.virt.xenapi import stubs from nova.virt.xenapi import volumeops diff --git a/nova/tests/test_xenapi.py b/nova/tests/virt/xenapi/test_xenapi.py index 2628f2582..af2d97f67 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/virt/xenapi/test_xenapi.py @@ -42,7 +42,7 @@ from nova.tests import fake_network from nova.tests import fake_processutils import nova.tests.image.fake as fake_image from nova.tests import matchers -from nova.tests.xenapi import stubs +from nova.tests.virt.xenapi import stubs from nova.virt import fake from nova.virt.xenapi import agent from nova.virt.xenapi import driver as xenapi_conn @@ -396,7 +396,7 @@ class XenAPIVMTestCase(stubs.XenAPITestBase): def test_get_diagnostics(self): def fake_get_rrd(host, vm_uuid): path = os.path.dirname(os.path.realpath(__file__)) - with open(os.path.join(path, 'xenapi/vm_rrd.xml')) as f: + with open(os.path.join(path, 'vm_rrd.xml')) as f: return re.sub(r'\s', '', f.read()) self.stubs.Set(vm_utils, '_get_rrd', fake_get_rrd) diff --git a/nova/tests/xenapi/vm_rrd.xml b/nova/tests/virt/xenapi/vm_rrd.xml index f9a7c8083..f9a7c8083 100644 --- a/nova/tests/xenapi/vm_rrd.xml +++ b/nova/tests/virt/xenapi/vm_rrd.xml diff --git a/nova/tests/xenapi/__init__.py b/nova/tests/xenapi/__init__.py deleted file mode 100644 index 1dd02bdc1..000000000 --- a/nova/tests/xenapi/__init__.py +++ /dev/null @@ -1,20 +0,0 @@ -# vim: tabstop=4 shiftwidth=4 softtabstop=4 - -# Copyright (c) 2010 Citrix Systems, Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); you may -# not use this file except in compliance with the License. You may obtain -# a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT -# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the -# License for the specific language governing permissions and limitations -# under the License. - -""" -:mod:`xenapi` -- Stubs for XenAPI -================================= -""" diff --git a/nova/tests/xenapi/test_vm_utils.py b/nova/tests/xenapi/test_vm_utils.py deleted file mode 100644 index 694be1713..000000000 --- a/nova/tests/xenapi/test_vm_utils.py +++ /dev/null @@ -1,377 +0,0 @@ -import mox -from nova import context -from nova import db -from nova import exception -from nova import test -from nova.tests.xenapi import stubs -from nova.virt.xenapi import driver as xenapi_conn -from nova.virt.xenapi import fake -from nova.virt.xenapi import vm_utils -from nova.virt.xenapi import volume_utils - - -XENSM_TYPE = 'xensm' -ISCSI_TYPE = 'iscsi' - - -class FakeSession(): - def call_xenapi(self, operation, *args, **kwargs): - # VDI.add_to_other_config -> VDI_add_to_other_config - method = getattr(self, operation.replace('.', '_'), None) - if method: - return method(*args, **kwargs) - - self.operation = operation - self.args = args - self.kwargs = kwargs - - -def get_fake_connection_data(sr_type): - fakes = {XENSM_TYPE: {'sr_uuid': 'falseSR', - 'name_label': 'fake_storage', - 'name_description': 'test purposes', - 'server': 'myserver', - 'serverpath': '/local/scratch/myname', - 'sr_type': 'nfs', - 'introduce_sr_keys': ['server', - 'serverpath', - 'sr_type'], - 'vdi_uuid': 'falseVDI'}, - ISCSI_TYPE: {'volume_id': 'fake_volume_id', - 'target_lun': 1, - 'target_iqn': 'fake_iqn:volume-fake_volume_id', - 'target_portal': u'localhost:3260', - 'target_discovered': False}, } - return fakes[sr_type] - - -class GetInstanceForVdisForSrTestCase(stubs.XenAPITestBase): - def setUp(self): - super(GetInstanceForVdisForSrTestCase, self).setUp() - self.flags(disable_process_locking=True, - instance_name_template='%d', - firewall_driver='nova.virt.xenapi.firewall.' - 'Dom0IptablesFirewallDriver', - xenapi_connection_url='test_url', - xenapi_connection_password='test_pass',) - - def test_get_instance_vdis_for_sr(self): - vm_ref = fake.create_vm("foo", "Running") - sr_ref = fake.create_sr() - - vdi_1 = fake.create_vdi('vdiname1', sr_ref) - vdi_2 = fake.create_vdi('vdiname2', sr_ref) - - for vdi_ref in [vdi_1, vdi_2]: - fake.create_vbd(vm_ref, vdi_ref) - - stubs.stubout_session(self.stubs, fake.SessionBase) - driver = xenapi_conn.XenAPIDriver(False) - - result = list(vm_utils.get_instance_vdis_for_sr( - driver._session, vm_ref, sr_ref)) - - self.assertEquals([vdi_1, vdi_2], result) - - def test_get_instance_vdis_for_sr_no_vbd(self): - vm_ref = fake.create_vm("foo", "Running") - sr_ref = fake.create_sr() - - stubs.stubout_session(self.stubs, fake.SessionBase) - driver = xenapi_conn.XenAPIDriver(False) - - result = list(vm_utils.get_instance_vdis_for_sr( - driver._session, vm_ref, sr_ref)) - - self.assertEquals([], result) - - def test_get_vdi_uuid_for_volume_with_sr_uuid(self): - connection_data = get_fake_connection_data(XENSM_TYPE) - stubs.stubout_session(self.stubs, fake.SessionBase) - driver = xenapi_conn.XenAPIDriver(False) - - vdi_uuid = vm_utils.get_vdi_uuid_for_volume( - driver._session, connection_data) - self.assertEquals(vdi_uuid, 'falseVDI') - - def test_get_vdi_uuid_for_volume_failure(self): - stubs.stubout_session(self.stubs, fake.SessionBase) - driver = xenapi_conn.XenAPIDriver(False) - - def bad_introduce_sr(session, sr_uuid, label, sr_params): - return None - - self.stubs.Set(volume_utils, 'introduce_sr', bad_introduce_sr) - connection_data = get_fake_connection_data(XENSM_TYPE) - self.assertRaises(exception.NovaException, - vm_utils.get_vdi_uuid_for_volume, - driver._session, connection_data) - - def test_get_vdi_uuid_for_volume_from_iscsi_vol_missing_sr_uuid(self): - connection_data = get_fake_connection_data(ISCSI_TYPE) - stubs.stubout_session(self.stubs, fake.SessionBase) - driver = xenapi_conn.XenAPIDriver(False) - - vdi_uuid = vm_utils.get_vdi_uuid_for_volume( - driver._session, connection_data) - self.assertNotEquals(vdi_uuid, None) - - -class VMRefOrRaiseVMFoundTestCase(test.TestCase): - - def test_lookup_call(self): - mock = mox.Mox() - mock.StubOutWithMock(vm_utils, 'lookup') - - vm_utils.lookup('session', 'somename').AndReturn('ignored') - - mock.ReplayAll() - vm_utils.vm_ref_or_raise('session', 'somename') - mock.VerifyAll() - - def test_return_value(self): - mock = mox.Mox() - mock.StubOutWithMock(vm_utils, 'lookup') - - vm_utils.lookup(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn('vmref') - - mock.ReplayAll() - self.assertEquals( - 'vmref', vm_utils.vm_ref_or_raise('session', 'somename')) - mock.VerifyAll() - - -class VMRefOrRaiseVMNotFoundTestCase(test.TestCase): - - def test_exception_raised(self): - mock = mox.Mox() - mock.StubOutWithMock(vm_utils, 'lookup') - - vm_utils.lookup('session', 'somename').AndReturn(None) - - mock.ReplayAll() - self.assertRaises( - exception.InstanceNotFound, - lambda: vm_utils.vm_ref_or_raise('session', 'somename') - ) - mock.VerifyAll() - - def test_exception_msg_contains_vm_name(self): - mock = mox.Mox() - mock.StubOutWithMock(vm_utils, 'lookup') - - vm_utils.lookup('session', 'somename').AndReturn(None) - - mock.ReplayAll() - try: - vm_utils.vm_ref_or_raise('session', 'somename') - except exception.InstanceNotFound as e: - self.assertTrue( - 'somename' in str(e)) - mock.VerifyAll() - - -class BittorrentTestCase(stubs.XenAPITestBase): - def setUp(self): - super(BittorrentTestCase, self).setUp() - self.context = context.get_admin_context() - - def test_image_uses_bittorrent(self): - sys_meta = {'image_bittorrent': True} - instance = db.instance_create(self.context, - {'system_metadata': sys_meta}) - instance = db.instance_get_by_uuid(self.context, instance['uuid']) - self.flags(xenapi_torrent_images='some') - self.assertTrue(vm_utils._image_uses_bittorrent(self.context, - instance)) - - def _test_create_image(self, cache_type): - sys_meta = {'image_cache_in_nova': True} - instance = db.instance_create(self.context, - {'system_metadata': sys_meta}) - instance = db.instance_get_by_uuid(self.context, instance['uuid']) - self.flags(cache_images=cache_type) - - was = {'called': None} - - def fake_create_cached_image(*args): - was['called'] = 'some' - return {} - self.stubs.Set(vm_utils, '_create_cached_image', - fake_create_cached_image) - - def fake_fetch_image(*args): - was['called'] = 'none' - return {} - self.stubs.Set(vm_utils, '_fetch_image', - fake_fetch_image) - - vm_utils._create_image(self.context, None, instance, - 'foo', 'bar', 'baz') - - self.assertEqual(was['called'], cache_type) - - def test_create_image_cached(self): - self._test_create_image('some') - - def test_create_image_uncached(self): - self._test_create_image('none') - - -class CreateVBDTestCase(test.TestCase): - def setUp(self): - super(CreateVBDTestCase, self).setUp() - self.session = FakeSession() - self.mock = mox.Mox() - self.mock.StubOutWithMock(self.session, 'call_xenapi') - self.vbd_rec = self._generate_vbd_rec() - - def _generate_vbd_rec(self): - vbd_rec = {} - vbd_rec['VM'] = 'vm_ref' - vbd_rec['VDI'] = 'vdi_ref' - vbd_rec['userdevice'] = '0' - vbd_rec['bootable'] = False - vbd_rec['mode'] = 'RW' - vbd_rec['type'] = 'disk' - vbd_rec['unpluggable'] = True - vbd_rec['empty'] = False - vbd_rec['other_config'] = {} - vbd_rec['qos_algorithm_type'] = '' - vbd_rec['qos_algorithm_params'] = {} - vbd_rec['qos_supported_algorithms'] = [] - return vbd_rec - - def test_create_vbd_default_args(self): - self.session.call_xenapi('VBD.create', - self.vbd_rec).AndReturn("vbd_ref") - self.mock.ReplayAll() - - result = vm_utils.create_vbd(self.session, "vm_ref", "vdi_ref", 0) - self.assertEquals(result, "vbd_ref") - self.mock.VerifyAll() - - def test_create_vbd_osvol(self): - self.session.call_xenapi('VBD.create', - self.vbd_rec).AndReturn("vbd_ref") - self.session.call_xenapi('VBD.add_to_other_config', "vbd_ref", - "osvol", "True") - self.mock.ReplayAll() - result = vm_utils.create_vbd(self.session, "vm_ref", "vdi_ref", 0, - osvol=True) - self.assertEquals(result, "vbd_ref") - self.mock.VerifyAll() - - def test_create_vbd_extra_args(self): - self.vbd_rec['VDI'] = 'OpaqueRef:NULL' - self.vbd_rec['type'] = 'a' - self.vbd_rec['mode'] = 'RO' - self.vbd_rec['bootable'] = True - self.vbd_rec['empty'] = True - self.vbd_rec['unpluggable'] = False - self.session.call_xenapi('VBD.create', - self.vbd_rec).AndReturn("vbd_ref") - self.mock.ReplayAll() - - result = vm_utils.create_vbd(self.session, "vm_ref", None, 0, - vbd_type="a", read_only=True, bootable=True, - empty=True, unpluggable=False) - self.assertEquals(result, "vbd_ref") - self.mock.VerifyAll() - - def test_attach_cd(self): - self.mock.StubOutWithMock(vm_utils, 'create_vbd') - - vm_utils.create_vbd(self.session, "vm_ref", None, 1, - vbd_type='cd', read_only=True, bootable=True, - empty=True, unpluggable=False).AndReturn("vbd_ref") - self.session.call_xenapi('VBD.insert', "vbd_ref", "vdi_ref") - self.mock.ReplayAll() - - result = vm_utils.attach_cd(self.session, "vm_ref", "vdi_ref", 1) - self.assertEquals(result, "vbd_ref") - self.mock.VerifyAll() - - -class VDIOtherConfigTestCase(stubs.XenAPITestBase): - """Tests to ensure that the code is populating VDI's `other_config` - attribute with the correct metadta. - """ - - def setUp(self): - super(VDIOtherConfigTestCase, self).setUp() - self.session = FakeSession() - self.context = context.get_admin_context() - self.fake_instance = {'uuid': 'aaaa-bbbb-cccc-dddd', - 'name': 'myinstance'} - - def test_create_vdi(self): - # Some images are registered with XenServer explicitly by calling - # `create_vdi` - vm_utils.create_vdi(self.session, 'sr_ref', self.fake_instance, - 'myvdi', 'root', 1024, read_only=True) - - expected = {'nova_disk_type': 'root', - 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} - - self.assertEqual(expected, self.session.args[0]['other_config']) - - def test_create_image(self): - # Other images are registered implicitly when they are dropped into - # the SR by a dom0 plugin or some other process - self.flags(cache_images='none') - - def fake_fetch_image(*args): - return {'root': {'uuid': 'fake-uuid'}} - - self.stubs.Set(vm_utils, '_fetch_image', fake_fetch_image) - - other_config = {} - - def VDI_add_to_other_config(ref, key, value): - other_config[key] = value - - def VDI_get_record(ref): - return {'other_config': {}} - - # Stubbing on the session object and not class so we don't pollute - # other tests - self.session.VDI_add_to_other_config = VDI_add_to_other_config - self.session.VDI_get_record = VDI_get_record - - vm_utils._create_image(self.context, self.session, self.fake_instance, - 'myvdi', 'image1', vm_utils.ImageType.DISK_VHD) - - expected = {'nova_disk_type': 'root', - 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} - - self.assertEqual(expected, other_config) - - def test_move_disks(self): - # Migrated images should preserve the `other_config` - other_config = {} - - def VDI_add_to_other_config(ref, key, value): - other_config[key] = value - - def VDI_get_record(ref): - return {'other_config': {}} - - def call_plugin_serialized(*args, **kwargs): - return {'root': {'uuid': 'aaaa-bbbb-cccc-dddd'}} - - # Stubbing on the session object and not class so we don't pollute - # other tests - self.session.VDI_add_to_other_config = VDI_add_to_other_config - self.session.VDI_get_record = VDI_get_record - self.session.call_plugin_serialized = call_plugin_serialized - - self.stubs.Set(vm_utils, 'get_sr_path', lambda *a, **k: None) - self.stubs.Set(vm_utils, 'scan_default_sr', lambda *a, **k: None) - - vm_utils.move_disks(self.session, self.fake_instance, {}) - - expected = {'nova_disk_type': 'root', - 'nova_instance_uuid': 'aaaa-bbbb-cccc-dddd'} - - self.assertEqual(expected, other_config) |
