From 78fd35ac5520f5228d4fd5319ac47c72fa20a350 Mon Sep 17 00:00:00 2001 From: Sean Dague Date: Tue, 22 May 2012 15:13:20 -0400 Subject: [PATCH] convert virt drivers to fully dynamic loading Progress on bp:virt-driver-cleanup This series of patches converts the virt drivers to loading via importutils making it possible to add a virt driver without changing core code. It deprecates the use of connection_type in favor of a full driver name in compute_driver. Based on email thread with Vish and Jay Pipes on approaches to do this. Change-Id: I48366ec7efc7b095859988e5e6ac5a853b98b8a7 --- nova/test.py | 4 - nova/tests/api/ec2/test_cloud.py | 2 +- nova/tests/api/ec2/test_ec2_validate.py | 2 +- nova/tests/baremetal/test_proxy_bare_metal.py | 2 +- nova/tests/compute/test_compute.py | 18 +- nova/tests/fake_flags.py | 1 + nova/tests/integrated/test_servers.py | 2 +- nova/tests/test_auth.py | 2 +- nova/tests/test_compute_utils.py | 2 +- nova/tests/test_libvirt.py | 167 +++++++++--------- nova/tests/test_notifications.py | 2 +- nova/tests/test_quota.py | 2 +- nova/tests/test_virt_drivers.py | 21 ++- nova/tests/test_vmwareapi.py | 2 +- nova/tests/test_volume.py | 2 +- nova/tests/test_volume_utils.py | 2 +- nova/tests/test_xenapi.py | 40 ++--- nova/virt/baremetal/proxy.py | 10 +- nova/virt/connection.py | 43 ++--- nova/virt/fake.py | 15 +- nova/virt/libvirt/connection.py | 26 +-- nova/virt/vmwareapi_conn.py | 33 ++-- nova/virt/xenapi/connection.py | 32 ++-- 23 files changed, 196 insertions(+), 236 deletions(-) diff --git a/nova/test.py b/nova/test.py index 478eddded464..dcde09b86d35 100644 --- a/nova/test.py +++ b/nova/test.py @@ -152,10 +152,6 @@ class TestCase(unittest.TestCase): self.mox.VerifyAll() super(TestCase, self).tearDown() finally: - if FLAGS.connection_type == 'fake': - if hasattr(fake.FakeConnection, '_instance'): - del fake.FakeConnection._instance - if FLAGS.image_service == 'nova.image.fake.FakeImageService': nova.image.fake.FakeImageService_reset() diff --git a/nova/tests/api/ec2/test_cloud.py b/nova/tests/api/ec2/test_cloud.py index c9080c0e3d35..58cba6d15859 100644 --- a/nova/tests/api/ec2/test_cloud.py +++ b/nova/tests/api/ec2/test_cloud.py @@ -90,7 +90,7 @@ def get_instances_with_cached_ips(orig_func, *args, **kwargs): class CloudTestCase(test.TestCase): def setUp(self): super(CloudTestCase, self).setUp() - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True) def dumb(*args, **kwargs): diff --git a/nova/tests/api/ec2/test_ec2_validate.py b/nova/tests/api/ec2/test_ec2_validate.py index 5def89175496..cb72b8bb49d2 100644 --- a/nova/tests/api/ec2/test_ec2_validate.py +++ b/nova/tests/api/ec2/test_ec2_validate.py @@ -41,7 +41,7 @@ FLAGS = flags.FLAGS class EC2ValidateTestCase(test.TestCase): def setUp(self): super(EC2ValidateTestCase, self).setUp() - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True) def dumb(*args, **kwargs): diff --git a/nova/tests/baremetal/test_proxy_bare_metal.py b/nova/tests/baremetal/test_proxy_bare_metal.py index 5b99002659e1..497debef9a5b 100644 --- a/nova/tests/baremetal/test_proxy_bare_metal.py +++ b/nova/tests/baremetal/test_proxy_bare_metal.py @@ -260,7 +260,7 @@ class ProxyBareMetalTestCase(test.TestCase): self.mox.ReplayAll() # Code under test - conn = proxy.get_connection(True) + conn = proxy.ProxyConnection(True) # TODO(mikalstill): this is not a very good fake instance info = conn.get_info({'name': 'instance-00000001'}) diff --git a/nova/tests/compute/test_compute.py b/nova/tests/compute/test_compute.py index f1903bd4cdc3..3bd70de66b96 100644 --- a/nova/tests/compute/test_compute.py +++ b/nova/tests/compute/test_compute.py @@ -106,7 +106,7 @@ class BaseTestCase(test.TestCase): def setUp(self): super(BaseTestCase, self).setUp() - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True, notification_driver='nova.notifier.test_notifier', network_manager='nova.network.manager.FlatManager') @@ -420,12 +420,12 @@ class ComputeTestCase(BaseTestCase): def fake_rescue(self, context, instance_ref, network_info, image_meta): called['rescued'] = True - self.stubs.Set(nova.virt.fake.FakeConnection, 'rescue', fake_rescue) + self.stubs.Set(nova.virt.fake.FakeDriver, 'rescue', fake_rescue) def fake_unrescue(self, instance_ref, network_info): called['unrescued'] = True - self.stubs.Set(nova.virt.fake.FakeConnection, 'unrescue', + self.stubs.Set(nova.virt.fake.FakeDriver, 'unrescue', fake_unrescue) instance = self._create_fake_instance() @@ -593,7 +593,7 @@ class ComputeTestCase(BaseTestCase): 'num_cpu': 2, 'cpu_time': 0} - self.stubs.Set(nova.virt.fake.FakeConnection, 'get_info', + self.stubs.Set(nova.virt.fake.FakeDriver, 'get_info', fake_driver_get_info) self.assertRaises(exception.Invalid, @@ -613,7 +613,7 @@ class ComputeTestCase(BaseTestCase): def fake_driver_set_pass(self2, _instance, _pwd): raise exception.NotAuthorized(_('Internal error')) - self.stubs.Set(nova.virt.fake.FakeConnection, 'set_admin_password', + self.stubs.Set(nova.virt.fake.FakeDriver, 'set_admin_password', fake_driver_set_pass) instance = self._create_fake_instance() @@ -647,7 +647,7 @@ class ComputeTestCase(BaseTestCase): self.assertEqual(contents, "File Contents") called['inject'] = True - self.stubs.Set(nova.virt.fake.FakeConnection, 'inject_file', + self.stubs.Set(nova.virt.fake.FakeDriver, 'inject_file', fake_driver_inject_file) instance = self._create_fake_instance() @@ -664,7 +664,7 @@ class ComputeTestCase(BaseTestCase): def fake_driver_inject_network(self, instance, network_info): called['inject'] = True - self.stubs.Set(nova.virt.fake.FakeConnection, 'inject_network_info', + self.stubs.Set(nova.virt.fake.FakeDriver, 'inject_network_info', fake_driver_inject_network) instance = self._create_fake_instance() @@ -681,7 +681,7 @@ class ComputeTestCase(BaseTestCase): def fake_driver_reset_network(self, instance): called['reset'] = True - self.stubs.Set(nova.virt.fake.FakeConnection, 'reset_network', + self.stubs.Set(nova.virt.fake.FakeDriver, 'reset_network', fake_driver_reset_network) instance = self._create_fake_instance() @@ -700,7 +700,7 @@ class ComputeTestCase(BaseTestCase): self.assertEqual(url, 'http://fake/url/') self.assertEqual(md5hash, 'fakehash') - self.stubs.Set(nova.virt.fake.FakeConnection, 'agent_update', + self.stubs.Set(nova.virt.fake.FakeDriver, 'agent_update', fake_driver_agent_update) instance = self._create_fake_instance() diff --git a/nova/tests/fake_flags.py b/nova/tests/fake_flags.py index f25a9be450ee..283a0fe1e7d7 100644 --- a/nova/tests/fake_flags.py +++ b/nova/tests/fake_flags.py @@ -33,6 +33,7 @@ flags.DECLARE('volume_driver', 'nova.volume.manager') def set_defaults(conf): conf.set_default('api_paste_config', '$state_path/etc/nova/api-paste.ini') conf.set_default('auth_driver', 'nova.auth.dbdriver.DbDriver') + conf.set_default('compute_driver', 'nova.virt.fake.FakeDriver') conf.set_default('connection_type', 'fake') conf.set_default('fake_network', True) conf.set_default('fake_rabbit', True) diff --git a/nova/tests/integrated/test_servers.py b/nova/tests/integrated/test_servers.py index 2d59c49e38a9..dccc879a7b95 100644 --- a/nova/tests/integrated/test_servers.py +++ b/nova/tests/integrated/test_servers.py @@ -56,7 +56,7 @@ class ServersTest(integrated_helpers._IntegratedTestBase): def throw_error(*_): raise Exception() - self.stubs.Set(nova.virt.fake.FakeConnection, 'spawn', throw_error) + self.stubs.Set(nova.virt.fake.FakeDriver, 'spawn', throw_error) server = self._build_minimal_create_server_request() created_server = self.api.post_server({"server": server}) diff --git a/nova/tests/test_auth.py b/nova/tests/test_auth.py index eaf0d4815235..afee021cd27b 100644 --- a/nova/tests/test_auth.py +++ b/nova/tests/test_auth.py @@ -91,7 +91,7 @@ class _AuthManagerBaseTestCase(test.TestCase): def setUp(self): super(_AuthManagerBaseTestCase, self).setUp() self.flags(auth_driver=self.auth_driver, - connection_type='fake') + compute_driver='nova.virt.fake.FakeDriver') self.manager = manager.AuthManager(new=True) self.manager.mc.cache = {} diff --git a/nova/tests/test_compute_utils.py b/nova/tests/test_compute_utils.py index cc069c9d529c..5fbf2e80c2e1 100644 --- a/nova/tests/test_compute_utils.py +++ b/nova/tests/test_compute_utils.py @@ -48,7 +48,7 @@ class UsageInfoTestCase(test.TestCase): self.stubs.Set(nova.network.API, 'get_instance_nw_info', fake_get_nw_info) - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True, notification_driver='nova.notifier.test_notifier', network_manager='nova.network.manager.FlatManager') diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index 329f81ab4b91..62ab9efc427f 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -57,6 +57,9 @@ try: import libvirt connection.libvirt = libvirt except ImportError: + # TODO(sdague): there should be a cleaner way to handle this + # in the case where libvirt python isn't installed + connection.libvirt = "" libvirt = None @@ -129,7 +132,7 @@ class LibvirtVolumeTestCase(test.TestCase): self.stubs.Set(utils, 'execute', fake_execute) - class FakeLibvirtConnection(object): + class FakeLibvirtDriver(object): def __init__(self, hyperv="QEMU"): self.hyperv = hyperv @@ -139,7 +142,7 @@ class LibvirtVolumeTestCase(test.TestCase): def get_all_block_devices(self): return [] - self.fake_conn = FakeLibvirtConnection() + self.fake_conn = FakeLibvirtDriver() self.connr = { 'ip': '127.0.0.1', 'initiator': 'fake_initiator', @@ -349,7 +352,7 @@ class CacheConcurrencyTestCase(test.TestCase): def test_same_fname_concurrency(self): """Ensures that the same fname cache runs at a sequentially""" - conn = connection.LibvirtConnection + conn = connection.LibvirtDriver wait1 = eventlet.event.Event() done1 = eventlet.event.Event() eventlet.spawn(conn._cache_image, _concurrency, @@ -370,7 +373,7 @@ class CacheConcurrencyTestCase(test.TestCase): def test_different_fname_concurrency(self): """Ensures that two different fname caches are concurrent""" - conn = connection.LibvirtConnection + conn = connection.LibvirtDriver wait1 = eventlet.event.Event() done1 = eventlet.event.Event() eventlet.spawn(conn._cache_image, _concurrency, @@ -440,17 +443,17 @@ class LibvirtConnTestCase(test.TestCase): 'instance_type_id': '5'} # m1.small def create_fake_libvirt_mock(self, **kwargs): - """Defining mocks for LibvirtConnection(libvirt is not used).""" + """Defining mocks for LibvirtDriver(libvirt is not used).""" # A fake libvirt.virConnect - class FakeLibvirtConnection(object): + class FakeLibvirtDriver(object): def defineXML(self, xml): return FakeVirtDomain() # Creating mocks volume_driver = 'iscsi=nova.tests.test_libvirt.FakeVolumeDriver' self.flags(libvirt_volume_drivers=[volume_driver]) - fake = FakeLibvirtConnection() + fake = FakeLibvirtDriver() # Customizing above fake if necessary for key, val in kwargs.items(): fake.__setattr__(key, val) @@ -458,8 +461,8 @@ class LibvirtConnTestCase(test.TestCase): self.flags(image_service='nova.image.fake.FakeImageService') self.flags(libvirt_vif_driver="nova.tests.fake_network.FakeVIFDriver") - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn = fake + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn = fake def fake_lookup(self, instance_name): return FakeVirtDomain() @@ -483,7 +486,7 @@ class LibvirtConnTestCase(test.TestCase): self.flags(my_ip=ip) self.flags(host=host) - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) expected = { 'ip': ip, 'initiator': initiator, @@ -496,7 +499,7 @@ class LibvirtConnTestCase(test.TestCase): self.assertDictMatch(expected, result) def test_get_guest_config(self): - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) instance_ref = db.instance_create(self.context, self.test_instance) cfg = conn.get_guest_config(instance_ref, @@ -525,7 +528,7 @@ class LibvirtConnTestCase(test.TestCase): config.LibvirtConfigGuestGraphics) def test_get_guest_config_with_two_nics(self): - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) instance_ref = db.instance_create(self.context, self.test_instance) cfg = conn.get_guest_config(instance_ref, @@ -557,7 +560,7 @@ class LibvirtConnTestCase(test.TestCase): def test_get_guest_config_with_root_device_name(self): self.flags(libvirt_type='uml') - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) instance_ref = db.instance_create(self.context, self.test_instance) cfg = conn.get_guest_config(instance_ref, [], None, False, @@ -632,12 +635,12 @@ class LibvirtConnTestCase(test.TestCase): "cdrom", "ide") def test_list_instances(self): - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByID = self.fake_lookup - connection.LibvirtConnection._conn.listDomainsID = lambda: [0, 1] + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByID = self.fake_lookup + connection.LibvirtDriver._conn.listDomainsID = lambda: [0, 1] self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) instances = conn.list_instances() # Only one should be listed, since domain with ID 0 must be skiped self.assertEquals(len(instances), 1) @@ -684,12 +687,12 @@ class LibvirtConnTestCase(test.TestCase): def fake_lookup(id): return FakeVirtDomain(xml[id]) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.listDomainsID = lambda: range(4) - connection.LibvirtConnection._conn.lookupByID = fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.listDomainsID = lambda: range(4) + connection.LibvirtDriver._conn.lookupByID = fake_lookup self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) devices = conn.get_all_block_devices() self.assertEqual(devices, ['/path/to/dev/1', '/path/to/dev/3']) @@ -743,13 +746,13 @@ class LibvirtConnTestCase(test.TestCase): def fake_lookup_name(name): return FakeVirtDomain(xml[1]) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.listDomainsID = lambda: range(4) - connection.LibvirtConnection._conn.lookupByID = fake_lookup - connection.LibvirtConnection._conn.lookupByName = fake_lookup_name + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.listDomainsID = lambda: range(4) + connection.LibvirtDriver._conn.lookupByID = fake_lookup + connection.LibvirtDriver._conn.lookupByName = fake_lookup_name self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) devices = conn.get_disks(conn.list_instances()[0]) self.assertEqual(devices, ['vda', 'vdb']) @@ -775,14 +778,14 @@ class LibvirtConnTestCase(test.TestCase): # To work with it from snapshot, the single image_service is needed recv_meta = image_service.create(context, sent_meta) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.StubOutWithMock(connection.utils, 'execute') connection.utils.execute = self.fake_execute self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.snapshot(self.context, instance_ref, recv_meta['id']) snapshot = image_service.show(context, recv_meta['id']) @@ -809,14 +812,14 @@ class LibvirtConnTestCase(test.TestCase): # To work with it from snapshot, the single image_service is needed recv_meta = image_service.create(context, sent_meta) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.StubOutWithMock(connection.utils, 'execute') connection.utils.execute = self.fake_execute self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.snapshot(self.context, instance_ref, recv_meta['id']) snapshot = image_service.show(context, recv_meta['id']) @@ -844,14 +847,14 @@ class LibvirtConnTestCase(test.TestCase): # To work with it from snapshot, the single image_service is needed recv_meta = image_service.create(context, sent_meta) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.StubOutWithMock(connection.utils, 'execute') connection.utils.execute = self.fake_execute self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.snapshot(self.context, instance_ref, recv_meta['id']) snapshot = image_service.show(context, recv_meta['id']) @@ -883,14 +886,14 @@ class LibvirtConnTestCase(test.TestCase): # To work with it from snapshot, the single image_service is needed recv_meta = image_service.create(context, sent_meta) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.StubOutWithMock(connection.utils, 'execute') connection.utils.execute = self.fake_execute self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.snapshot(self.context, instance_ref, recv_meta['id']) snapshot = image_service.show(context, recv_meta['id']) @@ -917,14 +920,14 @@ class LibvirtConnTestCase(test.TestCase): 'status': 'creating', 'properties': properties} recv_meta = image_service.create(context, sent_meta) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.StubOutWithMock(connection.utils, 'execute') connection.utils.execute = self.fake_execute self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.snapshot(self.context, instance_ref, recv_meta['id']) snapshot = image_service.show(context, recv_meta['id']) @@ -934,9 +937,9 @@ class LibvirtConnTestCase(test.TestCase): def test_attach_invalid_volume_type(self): self.create_fake_libvirt_mock() - connection.LibvirtConnection._conn.lookupByName = self.fake_lookup + connection.LibvirtDriver._conn.lookupByName = self.fake_lookup self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.assertRaises(exception.VolumeDriverNotFound, conn.attach_volume, {"driver_volume_type": "badtype"}, @@ -946,7 +949,7 @@ class LibvirtConnTestCase(test.TestCase): def test_multi_nic(self): instance_data = dict(self.test_instance) network_info = _fake_network_info(self.stubs, 2) - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) instance_ref = db.instance_create(self.context, instance_data) xml = conn.to_xml(instance_ref, network_info, None, False) tree = etree.fromstring(xml) @@ -963,7 +966,7 @@ class LibvirtConnTestCase(test.TestCase): instance_ref = db.instance_create(user_context, instance) self.flags(libvirt_type='lxc') - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) self.assertEquals(conn.uri, 'lxc:///') @@ -1006,7 +1009,7 @@ class LibvirtConnTestCase(test.TestCase): for (libvirt_type, checks) in type_disk_map.iteritems(): self.flags(libvirt_type=libvirt_type) - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) network_info = _fake_network_info(self.stubs, 1) xml = conn.to_xml(instance_ref, network_info) @@ -1035,14 +1038,14 @@ class LibvirtConnTestCase(test.TestCase): def connection_supports_direct_io_stub(*args, **kwargs): return directio_supported - self.stubs.Set(connection.LibvirtConnection, + self.stubs.Set(connection.LibvirtDriver, '_supports_direct_io', connection_supports_direct_io_stub) user_context = context.RequestContext(self.user_id, self.project_id) instance_ref = db.instance_create(user_context, self.test_instance) network_info = _fake_network_info(self.stubs, 1) - xml = connection.LibvirtConnection(True).to_xml(instance_ref, + xml = connection.LibvirtDriver(True).to_xml(instance_ref, network_info, image_meta) tree = etree.fromstring(xml) @@ -1053,8 +1056,8 @@ class LibvirtConnTestCase(test.TestCase): directio_supported = False # The O_DIRECT availability is cached on first use in - # LibvirtConnection, hence we re-create it here - xml = connection.LibvirtConnection(True).to_xml(instance_ref, + # LibvirtDriver, hence we re-create it here + xml = connection.LibvirtDriver(True).to_xml(instance_ref, network_info, image_meta) tree = etree.fromstring(xml) @@ -1067,7 +1070,7 @@ class LibvirtConnTestCase(test.TestCase): instance_ref = db.instance_create(user_context, self.test_instance) network_info = _fake_network_info(self.stubs, 1) - xml = connection.LibvirtConnection(True).to_xml(instance_ref, + xml = connection.LibvirtDriver(True).to_xml(instance_ref, network_info, image_meta) tree = etree.fromstring(xml) @@ -1080,7 +1083,7 @@ class LibvirtConnTestCase(test.TestCase): instance_ref = db.instance_create(user_context, self.test_instance) network_info = _fake_network_info(self.stubs, 1) - xml = connection.LibvirtConnection(True).to_xml(instance_ref, + xml = connection.LibvirtDriver(True).to_xml(instance_ref, network_info, image_meta) tree = etree.fromstring(xml) @@ -1173,7 +1176,7 @@ class LibvirtConnTestCase(test.TestCase): for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems(): self.flags(libvirt_type=libvirt_type) - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) self.assertEquals(conn.uri, expected_uri) @@ -1202,7 +1205,7 @@ class LibvirtConnTestCase(test.TestCase): self.flags(libvirt_uri=testuri) for (libvirt_type, (expected_uri, checks)) in type_uri_map.iteritems(): self.flags(libvirt_type=libvirt_type) - conn = connection.LibvirtConnection(True) + conn = connection.LibvirtDriver(True) self.assertEquals(conn.uri, testuri) db.instance_destroy(user_context, instance_ref['id']) @@ -1235,7 +1238,7 @@ class LibvirtConnTestCase(test.TestCase): # Start test self.mox.ReplayAll() try: - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.stubs.Set(conn.firewall_driver, 'setup_basic_filtering', fake_none) @@ -1295,7 +1298,7 @@ class LibvirtConnTestCase(test.TestCase): #start test self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.assertRaises(libvirt.libvirtError, conn._live_migration, self.context, instance_ref, 'dest', False, @@ -1316,7 +1319,7 @@ class LibvirtConnTestCase(test.TestCase): vol = {'block_device_mapping': [ {'connection_info': 'dummy', 'mount_device': '/dev/sda'}, {'connection_info': 'dummy', 'mount_device': '/dev/sdb'}]} - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) # Creating mocks self.mox.StubOutWithMock(driver, "block_device_info_get_mapping") @@ -1347,7 +1350,7 @@ class LibvirtConnTestCase(test.TestCase): # qemu-img should be mockd since test environment might not have # large disk space. self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) conn.pre_block_migration(self.context, instance_ref, dummyjson % tmpdir) @@ -1403,7 +1406,7 @@ class LibvirtConnTestCase(test.TestCase): os.path.getsize('/test/disk.local').AndReturn((21474836480)) self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) info = conn.get_instance_disk_info(instance_ref.name) info = jsonutils.loads(info) self.assertEquals(info[0]['type'], 'raw') @@ -1435,7 +1438,7 @@ class LibvirtConnTestCase(test.TestCase): # Start test self.mox.ReplayAll() - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.stubs.Set(conn.firewall_driver, 'setup_basic_filtering', fake_none) @@ -1493,10 +1496,10 @@ class LibvirtConnTestCase(test.TestCase): return FakeVirtDomain(fake_dom_xml) self.create_fake_libvirt_mock() - connection.LibvirtConnection._conn.lookupByName = fake_lookup + connection.LibvirtDriver._conn.lookupByName = fake_lookup connection.libvirt_utils = fake_libvirt_utils - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) output = conn.get_console_output(instance) self.assertEquals("foo", output) @@ -1537,16 +1540,16 @@ class LibvirtConnTestCase(test.TestCase): return fp.read() self.create_fake_libvirt_mock() - connection.LibvirtConnection._conn.lookupByName = fake_lookup - connection.LibvirtConnection._flush_libvirt_console = _fake_flush + connection.LibvirtDriver._conn.lookupByName = fake_lookup + connection.LibvirtDriver._flush_libvirt_console = _fake_flush connection.libvirt_utils = fake_libvirt_utils - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) output = conn.get_console_output(instance) self.assertEquals("foo", output) def test_get_host_ip_addr(self): - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) ip = conn.get_host_ip_addr() self.assertEquals(ip, FLAGS.my_ip) @@ -1556,7 +1559,7 @@ class LibvirtConnTestCase(test.TestCase): (libvirt.VIR_ERR_SYSTEM_ERROR, libvirt.VIR_FROM_REMOTE), (libvirt.VIR_ERR_SYSTEM_ERROR, libvirt.VIR_FROM_RPC)): - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.mox.StubOutWithMock(conn, "_wrapped_conn") self.mox.StubOutWithMock(conn._wrapped_conn, "getCapabilities") @@ -1576,7 +1579,7 @@ class LibvirtConnTestCase(test.TestCase): self.mox.UnsetStubs() def test_volume_in_mapping(self): - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) swap = {'device_name': '/dev/sdb', 'swap_size': 1} ephemerals = [{'num': 0, @@ -1613,9 +1616,9 @@ class LibvirtConnTestCase(test.TestCase): @test.skip_if(missing_libvirt(), "Test requires libvirt") def test_immediate_delete(self): - conn = connection.LibvirtConnection(False) - self.mox.StubOutWithMock(connection.LibvirtConnection, '_conn') - connection.LibvirtConnection._conn.lookupByName = lambda x: None + conn = connection.LibvirtDriver(False) + self.mox.StubOutWithMock(connection.LibvirtDriver, '_conn') + connection.LibvirtDriver._conn.lookupByName = lambda x: None instance = db.instance_create(self.context, self.test_instance) conn.destroy(instance, {}) @@ -1634,7 +1637,7 @@ class LibvirtConnTestCase(test.TestCase): def fake_lookup_by_name(instance_name): return mock - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) self.stubs.Set(conn, '_lookup_by_name', fake_lookup_by_name) instance = {"name": "instancename", "id": "instanceid", "uuid": "875a8070-d0b9-4949-8b31-104d125c9a64"} @@ -1642,7 +1645,7 @@ class LibvirtConnTestCase(test.TestCase): def test_available_least_handles_missing(self): """Ensure destroy calls managedSaveRemove for saved instance""" - conn = connection.LibvirtConnection(False) + conn = connection.LibvirtDriver(False) def list_instances(): return ['fake'] @@ -1702,8 +1705,8 @@ class HostStateTestCase(test.TestCase): return 13091 def test_update_status(self): - self.mox.StubOutWithMock(connection, 'get_connection') - connection.get_connection(True).AndReturn(self.FakeConnection()) + self.mox.StubOutWithMock(connection, 'LibvirtDriver') + connection.LibvirtDriver(True).AndReturn(self.FakeConnection()) self.mox.ReplayAll() hs = connection.HostState(True) @@ -1760,11 +1763,11 @@ class IptablesFirewallTestCase(test.TestCase): self.project_id = 'fake' self.context = context.RequestContext(self.user_id, self.project_id) - class FakeLibvirtConnection(object): + class FakeLibvirtDriver(object): def nwfilterDefineXML(*args, **kwargs): """setup_basic_rules in nwfilter calls this.""" pass - self.fake_libvirt_connection = FakeLibvirtConnection() + self.fake_libvirt_connection = FakeLibvirtDriver() self.fw = firewall.IptablesFirewallDriver( get_connection=lambda: self.fake_libvirt_connection) @@ -2453,11 +2456,11 @@ disk size: 4.4M''', '')) self.assertEqual(out, 'c') -class LibvirtConnectionTestCase(test.TestCase): - """Test for nova.virt.libvirt.connection.LibvirtConnection.""" +class LibvirtDriverTestCase(test.TestCase): + """Test for nova.virt.libvirt.connection.LibvirtDriver.""" def setUp(self): - super(LibvirtConnectionTestCase, self).setUp() - self.libvirtconnection = connection.LibvirtConnection(read_only=True) + super(LibvirtDriverTestCase, self).setUp() + self.libvirtconnection = connection.LibvirtDriver(read_only=True) def _create_instance(self, params=None): """Create a test instance""" @@ -2694,5 +2697,5 @@ class LibvirtNonblockingTestCase(test.TestCase): def test_connection_to_primitive(self): """Test bug 962840""" import nova.virt.libvirt.connection - connection = nova.virt.libvirt.connection.get_connection('') + connection = nova.virt.libvirt.connection.LibvirtDriver('') jsonutils.to_primitive(connection._conn, convert_instances=True) diff --git a/nova/tests/test_notifications.py b/nova/tests/test_notifications.py index a9d4f3f3bf74..a30908dbc0b7 100644 --- a/nova/tests/test_notifications.py +++ b/nova/tests/test_notifications.py @@ -50,7 +50,7 @@ class NotificationsTestCase(test.TestCase): self.stubs.Set(nova.network.API, 'get_instance_nw_info', fake_get_nw_info) - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True, notification_driver='nova.notifier.test_notifier', network_manager='nova.network.manager.FlatManager', diff --git a/nova/tests/test_quota.py b/nova/tests/test_quota.py index f17243cdcc6c..3aee30911dfc 100644 --- a/nova/tests/test_quota.py +++ b/nova/tests/test_quota.py @@ -46,7 +46,7 @@ class QuotaIntegrationTestCase(test.TestCase): def setUp(self): super(QuotaIntegrationTestCase, self).setUp() - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', quota_instances=2, quota_cores=4, quota_volumes=2, diff --git a/nova/tests/test_virt_drivers.py b/nova/tests/test_virt_drivers.py index 249ed012deae..b2c22bcc12e3 100644 --- a/nova/tests/test_virt_drivers.py +++ b/nova/tests/test_virt_drivers.py @@ -23,6 +23,7 @@ from nova import exception from nova import flags from nova import image from nova import log as logging +from nova.openstack.common import importutils from nova import test from nova.tests import utils as test_utils @@ -55,7 +56,7 @@ def catch_notimplementederror(f): class _VirtDriverTestCase(test.TestCase): def setUp(self): super(_VirtDriverTestCase, self).setUp() - self.connection = self.driver_module.get_connection('') + self.connection = importutils.import_object(self.driver_module, '') self.ctxt = test_utils.get_test_admin_context() self.image_service = image.get_default_image_service() @@ -400,21 +401,23 @@ class _VirtDriverTestCase(test.TestCase): class AbstractDriverTestCase(_VirtDriverTestCase): def setUp(self): - import nova.virt.driver + from nova.virt.driver import ComputeDriver - self.driver_module = nova.virt.driver + self.driver_module = "nova.virt.driver.ComputeDriver" - def get_driver_connection(_): - return nova.virt.driver.ComputeDriver() + # TODO(sdague): the abstract driver doesn't have a constructor, + # add one now that the loader loads classes directly + def __new_init__(self, read_only=False): + super(ComputeDriver, self).__init__() + + ComputeDriver.__init__ = __new_init__ - self.driver_module.get_connection = get_driver_connection super(AbstractDriverTestCase, self).setUp() class FakeConnectionTestCase(_VirtDriverTestCase): def setUp(self): - import nova.virt.fake - self.driver_module = nova.virt.fake + self.driver_module = 'nova.virt.fake.FakeDriver' super(FakeConnectionTestCase, self).setUp() @@ -444,7 +447,7 @@ class LibvirtConnTestCase(_VirtDriverTestCase): FLAGS.instances_path = '' # Point _VirtDriverTestCase at the right module - self.driver_module = nova.virt.libvirt.connection + self.driver_module = 'nova.virt.libvirt.connection.LibvirtDriver' super(LibvirtConnTestCase, self).setUp() self.flags(firewall_driver=nova.virt.libvirt.firewall.drivers[0], rescue_image_id="2", diff --git a/nova/tests/test_vmwareapi.py b/nova/tests/test_vmwareapi.py index ca852c86a506..b47b34335e73 100644 --- a/nova/tests/test_vmwareapi.py +++ b/nova/tests/test_vmwareapi.py @@ -51,7 +51,7 @@ class VMWareAPIVMTestCase(test.TestCase): db_fakes.stub_out_db_instance_api(self.stubs) stubs.set_stubs(self.stubs) glance_stubs.stubout_glance_client(self.stubs) - self.conn = vmwareapi_conn.get_connection(False) + self.conn = vmwareapi_conn.VMWareESXDriver(False) # NOTE(vish): none of the network plugging code is actually # being tested self.network_info = [({'bridge': 'fa0', diff --git a/nova/tests/test_volume.py b/nova/tests/test_volume.py index 2909b51f7021..b8cc6b63817c 100644 --- a/nova/tests/test_volume.py +++ b/nova/tests/test_volume.py @@ -48,7 +48,7 @@ class VolumeTestCase(test.TestCase): def setUp(self): super(VolumeTestCase, self).setUp() self.compute = importutils.import_object(FLAGS.compute_manager) - self.flags(connection_type='fake') + self.flags(compute_driver='nova.virt.fake.FakeDriver') self.stubs.Set(nova.flags.FLAGS, 'notification_driver', 'nova.notifier.test_notifier') self.volume = importutils.import_object(FLAGS.volume_manager) diff --git a/nova/tests/test_volume_utils.py b/nova/tests/test_volume_utils.py index da84dd5d2433..222f12266d6b 100644 --- a/nova/tests/test_volume_utils.py +++ b/nova/tests/test_volume_utils.py @@ -36,7 +36,7 @@ class UsageInfoTestCase(test.TestCase): def setUp(self): super(UsageInfoTestCase, self).setUp() - self.flags(connection_type='fake', + self.flags(compute_driver='nova.virt.fake.FakeDriver', stub_network=True, host='fake') self.stubs.Set(nova.flags.FLAGS, 'notification_driver', diff --git a/nova/tests/test_xenapi.py b/nova/tests/test_xenapi.py index 6572f6304568..d8b41d7630b1 100644 --- a/nova/tests/test_xenapi.py +++ b/nova/tests/test_xenapi.py @@ -178,7 +178,7 @@ class XenAPIVolumeTestCase(test.TestCase): def test_attach_volume(self): """This shows how to test Ops classes' methods.""" stubs.stubout_session(self.stubs, stubs.FakeSessionForVolumeTests) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) volume = self._create_volume() instance = db.instance_create(self.context, self.instance_values) vm = xenapi_fake.create_vm(instance.name, 'Running') @@ -196,7 +196,7 @@ class XenAPIVolumeTestCase(test.TestCase): """This shows how to test when exceptions are raised.""" stubs.stubout_session(self.stubs, stubs.FakeSessionForVolumeFailedTests) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) volume = self._create_volume() instance = db.instance_create(self.context, self.instance_values) xenapi_fake.create_vm(instance.name, 'Running') @@ -232,7 +232,7 @@ class XenAPIVMTestCase(test.TestCase): self.user_id = 'fake' self.project_id = 'fake' self.context = context.RequestContext(self.user_id, self.project_id) - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) def test_init_host(self): session = xenapi_conn.XenAPISession('test_url', 'root', 'test_pass') @@ -708,7 +708,7 @@ class XenAPIVMTestCase(test.TestCase): xenapi_fake.create_vbd(vm_ref, "swap", userdevice=1) xenapi_fake.create_vbd(vm_ref, "rootfs", userdevice=0) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) image_meta = {'id': glance_stubs.FakeGlance.IMAGE_VHD, 'disk_format': 'vhd'} conn.rescue(self.context, instance, [], image_meta) @@ -725,7 +725,7 @@ class XenAPIVMTestCase(test.TestCase): def test_unrescue(self): instance = self._create_instance() - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) # Unrescue expects the original instance to be powered off conn.power_off(instance) rescue_vm = xenapi_fake.create_vm(instance.name + '-rescue', 'Running') @@ -733,7 +733,7 @@ class XenAPIVMTestCase(test.TestCase): def test_unrescue_not_in_rescue(self): instance = self._create_instance() - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) # Ensure that it will not unrescue a non-rescued instance. self.assertRaises(exception.InstanceNotInRescueMode, conn.unrescue, instance, None) @@ -749,7 +749,7 @@ class XenAPIVMTestCase(test.TestCase): def finish_revert_migration(self, instance): self.finish_revert_migration_called = True - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) conn._vmops = VMOpsMock() conn.finish_revert_migration(instance, None) self.assertTrue(conn._vmops.finish_revert_migration_called) @@ -873,7 +873,7 @@ class XenAPIMigrateInstance(test.TestCase): "VDI_resize", fake_vdi_resize) stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests, product_version=(6, 0, 0)) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) vdi_ref = xenapi_fake.create_vdi('hurr', 'fake') vdi_uuid = xenapi_fake.get_record('VDI', vdi_ref)['uuid'] conn._vmops._resize_instance(instance, vdi_uuid) @@ -883,7 +883,7 @@ class XenAPIMigrateInstance(test.TestCase): instance = db.instance_create(self.context, self.instance_values) xenapi_fake.create_vm(instance.name, 'Running') instance_type = db.instance_type_get_by_name(self.context, 'm1.large') - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) conn.migrate_disk_and_power_off(self.context, instance, '127.0.0.1', instance_type, None) @@ -896,7 +896,7 @@ class XenAPIMigrateInstance(test.TestCase): raise exception.MigrationError(reason='test failure') self.stubs.Set(vmops.VMOps, "_migrate_vhd", fake_raise) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) self.assertRaises(exception.MigrationError, conn.migrate_disk_and_power_off, self.context, instance, @@ -923,7 +923,7 @@ class XenAPIMigrateInstance(test.TestCase): self.stubs.Set(vmops.VMOps, 'finish_revert_migration', fake_finish_revert_migration) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) network_info = fake_network.fake_get_instance_nw_info(self.stubs, spectacular=True) image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'} @@ -955,7 +955,7 @@ class XenAPIMigrateInstance(test.TestCase): self.stubs.Set(stubs.FakeSessionForVMTests, "VDI_resize_online", fake_vdi_resize) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) network_info = fake_network.fake_get_instance_nw_info(self.stubs, spectacular=True) image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'} @@ -977,7 +977,7 @@ class XenAPIMigrateInstance(test.TestCase): self.stubs.Set(stubs.FakeSessionForVMTests, "VDI_resize_online", fake_vdi_resize) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) network_info = fake_network.fake_get_instance_nw_info(self.stubs, spectacular=True) image_meta = {'id': instance.image_ref, 'disk_format': 'vhd'} @@ -993,7 +993,7 @@ class XenAPIMigrateInstance(test.TestCase): self.stubs.Set(stubs.FakeSessionForVMTests, "VDI_resize_online", fake_vdi_resize) - conn = xenapi_conn.get_connection(False) + conn = xenapi_conn.XenAPIDriver(False) network_info = fake_network.fake_get_instance_nw_info(self.stubs, spectacular=True) # Resize instance would be determined by the compute call @@ -1083,7 +1083,7 @@ class XenAPIHostTestCase(test.TestCase): stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) xenapi_fake.reset() xenapi_fake.create_local_srs() - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) def test_host_state(self): stats = self.conn.get_host_stats() @@ -1135,7 +1135,7 @@ class XenAPIAutoDiskConfigTestCase(test.TestCase): 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) xenapi_fake.reset() - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) self.user_id = 'fake' self.project_id = 'fake' @@ -1228,7 +1228,7 @@ class XenAPIGenerateLocal(test.TestCase): stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) db_fakes.stub_out_db_instance_api(self.stubs) xenapi_fake.reset() - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) self.user_id = 'fake' self.project_id = 'fake' @@ -1307,7 +1307,7 @@ class XenAPIBWUsageTestCase(test.TestCase): 'Dom0IptablesFirewallDriver') stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) xenapi_fake.reset() - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) @classmethod def _fake_compile_metrics(cls, start_time, stop_time=None): @@ -1384,7 +1384,7 @@ class XenAPIDom0IptablesFirewallTestCase(test.TestCase): test_case=self) self.context = context.RequestContext(self.user_id, self.project_id) self.network = importutils.import_object(FLAGS.network_manager) - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) self.fw = self.conn._vmops.firewall_driver def _create_instance_ref(self): @@ -1699,7 +1699,7 @@ class XenAPIAggregateTestCase(test.TestCase): host_ref = xenapi_fake.get_all('host')[0] stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests) self.context = context.get_admin_context() - self.conn = xenapi_conn.get_connection(False) + self.conn = xenapi_conn.XenAPIDriver(False) self.fake_metadata = {'master_compute': 'host', 'host': xenapi_fake.get_record('host', host_ref)['uuid']} diff --git a/nova/virt/baremetal/proxy.py b/nova/virt/baremetal/proxy.py index 1ee927c039ae..1c57294229e0 100644 --- a/nova/virt/baremetal/proxy.py +++ b/nova/virt/baremetal/proxy.py @@ -66,15 +66,6 @@ baremetal_opts = [ FLAGS.register_opts(baremetal_opts) -def get_connection(read_only): - # These are loaded late so that there's no need to install these - # libraries when not using baremetal. - # Cheetah is separate because the unit tests want to load Cheetah, - # but not baremetal. - _late_load_cheetah() - return ProxyConnection(read_only) - - def _late_load_cheetah(): global Template if Template is None: @@ -86,6 +77,7 @@ def _late_load_cheetah(): class ProxyConnection(driver.ComputeDriver): def __init__(self, read_only): + _late_load_cheetah() # Note that baremetal doesn't have a read-only connection # mode, so the read_only parameter is ignored super(ProxyConnection, self).__init__() diff --git a/nova/virt/connection.py b/nova/virt/connection.py index 84f84744ba54..8bf1ed5f5767 100644 --- a/nova/virt/connection.py +++ b/nova/virt/connection.py @@ -23,23 +23,20 @@ import sys from nova import flags from nova import log as logging +from nova.openstack.common import importutils from nova import utils from nova.virt import driver -from nova.virt import fake -from nova.virt.libvirt import connection as libvirt_conn -from nova.virt import vmwareapi_conn -from nova.virt.xenapi import connection as xenapi_conn - LOG = logging.getLogger(__name__) FLAGS = flags.FLAGS -""" -In case of baremetal (FLAGS.connection_type), -specific driver is set by FLAGS.baremetal_driver -""" -if FLAGS.connection_type == 'baremetal': - from nova.virt.baremetal import proxy +known_drivers = { + 'baremetal': 'nova.virt.baremetal.proxy.ProxyConnection', + 'fake': 'nova.virt.fake.FakeDriver', + 'libvirt': 'nova.virt.libvirt.connection.LibvirtDriver', + 'vmwareapi': 'nova.virt.vmwareapi_conn.VMWareESXDriver', + 'xenapi': 'nova.virt.xenapi.connection.XenAPIDriver' + } def get_connection(read_only=False): @@ -68,21 +65,17 @@ def get_connection(read_only=False): * baremetal """ - # TODO(termie): maybe lazy load after initial check for permissions # TODO(termie): check whether we can be disconnected - t = FLAGS.connection_type - if t == 'fake': - conn = fake.get_connection(read_only) - elif t == 'libvirt': - conn = libvirt_conn.get_connection(read_only) - elif t == 'xenapi': - conn = xenapi_conn.get_connection(read_only) - elif t == 'vmwareapi': - conn = vmwareapi_conn.get_connection(read_only) - elif t == 'baremetal': - conn = proxy.get_connection(read_only) - else: - raise Exception('Unknown connection type "%s"' % t) + # TODO(sdague): is there a better way to mark things deprecated + LOG.error(_('Specifying virt driver via connection_type is deprecated')) + + driver_name = known_drivers.get(FLAGS.connection_type) + + if driver_name is None: + raise Exception('Unknown virt connection type "%s"' % + FLAGS.connection_type) + + conn = importutils.import_object(driver_name, read_only=read_only) if conn is None: LOG.error(_('Failed to open connection to underlying virt platform')) diff --git a/nova/virt/fake.py b/nova/virt/fake.py index cb29cf567455..8a84c85b03cc 100644 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -36,11 +36,6 @@ from nova.virt import driver LOG = logging.getLogger(__name__) -def get_connection(_read_only): - # The read_only parameter is ignored. - return FakeConnection.instance() - - class FakeInstance(object): def __init__(self, name, state): @@ -48,10 +43,10 @@ class FakeInstance(object): self.state = state -class FakeConnection(driver.ComputeDriver): +class FakeDriver(driver.ComputeDriver): """Fake hypervisor driver""" - def __init__(self): + def __init__(self, readonly=False): self.instances = {} self.host_status = { 'host_name-description': 'Fake Host', @@ -70,12 +65,6 @@ class FakeConnection(driver.ComputeDriver): 'host_name_label': 'fake-mini'} self._mounts = {} - @classmethod - def instance(cls): - if not hasattr(cls, '_instance'): - cls._instance = cls() - return cls._instance - def init_host(self, host): return diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py index 8a24c4e55a48..ee08ecb79665 100644 --- a/nova/virt/libvirt/connection.py +++ b/nova/virt/libvirt/connection.py @@ -75,11 +75,9 @@ from nova.virt.libvirt import firewall from nova.virt.libvirt import imagecache from nova.virt.libvirt import utils as libvirt_utils - libvirt = None Template = None - LOG = logging.getLogger(__name__) libvirt_opts = [ @@ -192,18 +190,6 @@ def patch_tpool_proxy(): patch_tpool_proxy() -def get_connection(read_only): - # These are loaded late so that there's no need to install these - # libraries when not using libvirt. - # Cheetah is separate because the unit tests want to load Cheetah, - # but not libvirt. - global libvirt - if libvirt is None: - libvirt = __import__('libvirt') - _late_load_cheetah() - return LibvirtConnection(read_only) - - def _late_load_cheetah(): global Template if Template is None: @@ -216,10 +202,16 @@ def _get_eph_disk(ephemeral): return 'disk.eph' + str(ephemeral['num']) -class LibvirtConnection(driver.ComputeDriver): +class LibvirtDriver(driver.ComputeDriver): def __init__(self, read_only): - super(LibvirtConnection, self).__init__() + super(LibvirtDriver, self).__init__() + + global libvirt + if libvirt is None: + libvirt = __import__('libvirt') + + _late_load_cheetah() self._host_state = None self._initiator = None @@ -2629,7 +2621,7 @@ class HostState(object): """Retrieve status info from libvirt.""" LOG.debug(_("Updating host stats")) if self.connection is None: - self.connection = get_connection(self.read_only) + self.connection = LibvirtDriver(self.read_only) data = {} data["vcpus"] = self.connection.get_vcpu_total() data["vcpus_used"] = self.connection.get_vcpu_used() diff --git a/nova/virt/vmwareapi_conn.py b/nova/virt/vmwareapi_conn.py index 388126c68841..c9e6409391c8 100644 --- a/nova/virt/vmwareapi_conn.py +++ b/nova/virt/vmwareapi_conn.py @@ -95,27 +95,22 @@ class Failure(Exception): return str(self.details) -def get_connection(_read_only): - """Sets up the ESX host connection.""" - host_ip = FLAGS.vmwareapi_host_ip - host_username = FLAGS.vmwareapi_host_username - host_password = FLAGS.vmwareapi_host_password - api_retry_count = FLAGS.vmwareapi_api_retry_count - if not host_ip or host_username is None or host_password is None: - raise Exception(_("Must specify vmwareapi_host_ip," - "vmwareapi_host_username " - "and vmwareapi_host_password to use" - "connection_type=vmwareapi")) - return VMWareESXConnection(host_ip, host_username, host_password, - api_retry_count) - - -class VMWareESXConnection(driver.ComputeDriver): +class VMWareESXDriver(driver.ComputeDriver): """The ESX host connection object.""" - def __init__(self, host_ip, host_username, host_password, - api_retry_count, scheme="https"): - super(VMWareESXConnection, self).__init__() + def __init__(self, read_only=False, scheme="https"): + super(VMWareESXDriver, self).__init__() + + host_ip = FLAGS.vmwareapi_host_ip + host_username = FLAGS.vmwareapi_host_username + host_password = FLAGS.vmwareapi_host_password + api_retry_count = FLAGS.vmwareapi_api_retry_count + if not host_ip or host_username is None or host_password is None: + raise Exception(_("Must specify vmwareapi_host_ip," + "vmwareapi_host_username " + "and vmwareapi_host_password to use" + "connection_type=vmwareapi")) + session = VMWareAPISession(host_ip, host_username, host_password, api_retry_count, scheme=scheme) self._vmops = vmops.VMWareVMOps(session) diff --git a/nova/virt/xenapi/connection.py b/nova/virt/xenapi/connection.py index bd26e86a69f0..275e1f5d7b99 100644 --- a/nova/virt/xenapi/connection.py +++ b/nova/virt/xenapi/connection.py @@ -127,26 +127,22 @@ FLAGS = flags.FLAGS FLAGS.register_opts(xenapi_opts) -def get_connection(_read_only): - """Note that XenAPI doesn't have a read-only connection mode, so - the read_only parameter is ignored.""" - url = FLAGS.xenapi_connection_url - username = FLAGS.xenapi_connection_username - password = FLAGS.xenapi_connection_password - if not url or password is None: - raise Exception(_('Must specify xenapi_connection_url, ' - 'xenapi_connection_username (optionally), and ' - 'xenapi_connection_password to use ' - 'connection_type=xenapi')) - return XenAPIConnection(url, username, password) - - -class XenAPIConnection(driver.ComputeDriver): +class XenAPIDriver(driver.ComputeDriver): """A connection to XenServer or Xen Cloud Platform""" - def __init__(self, url, user, pw): - super(XenAPIConnection, self).__init__() - self._session = XenAPISession(url, user, pw) + def __init__(self, read_only=False): + super(XenAPIDriver, self).__init__() + + url = FLAGS.xenapi_connection_url + username = FLAGS.xenapi_connection_username + password = FLAGS.xenapi_connection_password + if not url or password is None: + raise Exception(_('Must specify xenapi_connection_url, ' + 'xenapi_connection_username (optionally), and ' + 'xenapi_connection_password to use ' + 'connection_type=xenapi')) + + self._session = XenAPISession(url, username, password) self._volumeops = volumeops.VolumeOps(self._session) self._host_state = None self._host = host.Host(self._session)