From 5eb5f15c480cf2ec6cf89c067da3633f3f684ec2 Mon Sep 17 00:00:00 2001 From: Vishvananda Ishaya Date: Sat, 28 Jan 2012 01:17:00 -0800 Subject: [PATCH] Add initiator to initialize_connection Some volumes need to know the name of the initiator that will be connecting to the iscsi volume. This adds a call down to the hypervisor driver to get the ip and the initiator name for the vm before calling initialize connection. This connection is passed down to the volume driver so that it can be used to authenticate when the hypervisor tries to connect to the volume. * Adds initiator initialize_connection * Makes a call to driver to get initiator name and ip address * Gets initiator from openiscsi for libvirt * Gets initiator from config for xenapi * Add tests for the driver calls * Fixes bug 924461 Change-Id: I5b6a2dd84560c7f7b447571e0abf0993e5512ca0 --- nova/rootwrap/compute.py | 3 +++ nova/tests/fake_libvirt_utils.py | 4 +++ nova/tests/test_libvirt.py | 46 +++++++++++++++++++++++++------- nova/tests/test_virt_drivers.py | 6 +++++ 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/nova/rootwrap/compute.py b/nova/rootwrap/compute.py index 8b7736cbd..65e6dfebb 100755 --- a/nova/rootwrap/compute.py +++ b/nova/rootwrap/compute.py @@ -168,4 +168,7 @@ filterlist = [ # nova/virt/libvirt/utils.py: 'mkswap' # nova/virt/xenapi/vm_utils.py: 'mkswap' filters.CommandFilter("/sbin/mkswap", "root"), + + # nova/virt/libvirt/connection.py: + filters.ReadFileFilter("/etc/iscsi/initiatorname.iscsi"), ] diff --git a/nova/tests/fake_libvirt_utils.py b/nova/tests/fake_libvirt_utils.py index f1d4a8ec7..27b753a64 100644 --- a/nova/tests/fake_libvirt_utils.py +++ b/nova/tests/fake_libvirt_utils.py @@ -21,6 +21,10 @@ disk_sizes = {} disk_backing_files = {} +def get_iscsi_initiator(): + return "fake.initiator.iqn" + + def create_image(disk_format, path, size): pass diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py index cbe45ed2f..72c9f8802 100644 --- a/nova/tests/test_libvirt.py +++ b/nova/tests/test_libvirt.py @@ -123,6 +123,10 @@ class LibvirtVolumeTestCase(test.TestCase): def get_hypervisor_type(self): return self.hyperv self.fake_conn = FakeLibvirtConnection("Xen") + self.connr = { + 'ip': '127.0.0.1', + 'initiator': 'fake_initiator' + } def test_libvirt_iscsi_driver(self): # NOTE(vish) exists is to make driver assume connecting worked @@ -136,8 +140,7 @@ class LibvirtVolumeTestCase(test.TestCase): 'name': name, 'provider_auth': None, 'provider_location': '%s,fake %s' % (location, iqn)} - address = '127.0.0.1' - connection_info = vol_driver.initialize_connection(vol, '127.0.0.1') + connection_info = vol_driver.initialize_connection(vol, self.connr) mount_device = "vde" xml = libvirt_driver.connect_volume(connection_info, mount_device) tree = xml_to_tree(xml) @@ -145,7 +148,7 @@ class LibvirtVolumeTestCase(test.TestCase): self.assertEqual(tree.get('type'), 'block') self.assertEqual(tree.find('./source').get('dev'), dev_str) libvirt_driver.disconnect_volume(connection_info, mount_device) - connection_info = vol_driver.terminate_connection(vol, '127.0.0.1') + connection_info = vol_driver.terminate_connection(vol, self.connr) expected_commands = [('iscsiadm', '-m', 'node', '-T', iqn, '-p', location), ('iscsiadm', '-m', 'node', '-T', iqn, @@ -167,8 +170,7 @@ class LibvirtVolumeTestCase(test.TestCase): libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn) name = 'volume-00000001' vol = {'id': 1, 'name': name} - address = '127.0.0.1' - connection_info = vol_driver.initialize_connection(vol, address) + connection_info = vol_driver.initialize_connection(vol, self.connr) mount_device = "vde" xml = libvirt_driver.connect_volume(connection_info, mount_device) tree = xml_to_tree(xml) @@ -176,15 +178,14 @@ class LibvirtVolumeTestCase(test.TestCase): self.assertEqual(tree.find('./source').get('protocol'), 'sheepdog') self.assertEqual(tree.find('./source').get('name'), name) libvirt_driver.disconnect_volume(connection_info, mount_device) - connection_info = vol_driver.terminate_connection(vol, '127.0.0.1') + connection_info = vol_driver.terminate_connection(vol, self.connr) def test_libvirt_rbd_driver(self): vol_driver = volume_driver.RBDDriver() libvirt_driver = volume.LibvirtNetVolumeDriver(self.fake_conn) name = 'volume-00000001' vol = {'id': 1, 'name': name} - address = '127.0.0.1' - connection_info = vol_driver.initialize_connection(vol, address) + connection_info = vol_driver.initialize_connection(vol, self.connr) mount_device = "vde" xml = libvirt_driver.connect_volume(connection_info, mount_device) tree = xml_to_tree(xml) @@ -193,7 +194,7 @@ class LibvirtVolumeTestCase(test.TestCase): rbd_name = '%s/%s' % (FLAGS.rbd_pool, name) self.assertEqual(tree.find('./source').get('name'), rbd_name) libvirt_driver.disconnect_volume(connection_info, mount_device) - connection_info = vol_driver.terminate_connection(vol, '127.0.0.1') + connection_info = vol_driver.terminate_connection(vol, self.connr) class CacheConcurrencyTestCase(test.TestCase): @@ -355,6 +356,22 @@ class LibvirtConnTestCase(test.TestCase): return db.service_create(context.get_admin_context(), service_ref) + def test_get_connector(self): + initiator = 'fake.initiator.iqn' + ip = 'fakeip' + self.flags(my_ip=ip) + + conn = connection.LibvirtConnection(True) + expected = { + 'ip': ip, + 'initiator': initiator + } + volume = { + 'id': 'fake' + } + result = conn.get_volume_connector(volume) + self.assertDictMatch(expected, result) + def test_preparing_xml_info(self): conn = connection.LibvirtConnection(True) instance_ref = db.instance_create(self.context, self.test_instance) @@ -1764,6 +1781,17 @@ class NWFilterTestCase(test.TestCase): class LibvirtUtilsTestCase(test.TestCase): + def test_get_iscsi_initiator(self): + self.mox.StubOutWithMock(utils, 'execute') + initiator = 'fake.initiator.iqn' + rval = ("junk\nInitiatorName=%s\njunk\n" % initiator, None) + utils.execute('cat', '/etc/iscsi/initiatorname.iscsi', + run_as_root=True).AndReturn(rval) + # Start test + self.mox.ReplayAll() + result = libvirt_utils.get_iscsi_initiator() + self.assertEqual(initiator, result) + def test_create_image(self): self.mox.StubOutWithMock(utils, 'execute') utils.execute('qemu-img', 'create', '-f', 'raw', diff --git a/nova/tests/test_virt_drivers.py b/nova/tests/test_virt_drivers.py index adf8f8eb8..c2d8524ba 100644 --- a/nova/tests/test_virt_drivers.py +++ b/nova/tests/test_virt_drivers.py @@ -224,6 +224,12 @@ class _VirtDriverTestCase(test.TestCase): self.assertNotIn(instance_ref['name'], self.connection.list_instances()) + @catch_notimplementederror + def test_get_volume_connector(self): + result = self.connection.get_volume_connector({'id': 'fake'}) + self.assertTrue('ip' in result) + self.assertTrue('initiator' in result) + @catch_notimplementederror def test_attach_detach_volume(self): instance_ref, network_info = self._get_running_instance()