From de62c0d8361bf9dae16a8ff1672229fee1c15e5e Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 3 Dec 2014 17:25:41 -0600 Subject: [PATCH] libvirt: Fix domain creation for LXC A condition was introduced during domain creation that needs disk_info to determine whether or not an instance was booted from volume. Many calls to _create_domain_and_network were not providing disk_info and thus the condition was always evaluating to True. This change adds disk_info to each call that was missing it. Closes-bug: #1370590 Co-Authored-By: Andrew Melton Change-Id: I23e7e013d3a51b8040dd37e5facfe75b480e1721 --- nova/tests/unit/virt/libvirt/test_driver.py | 41 +++++++++++++-------- nova/virt/libvirt/driver.py | 31 ++++++++++++---- 2 files changed, 48 insertions(+), 24 deletions(-) diff --git a/nova/tests/unit/virt/libvirt/test_driver.py b/nova/tests/unit/virt/libvirt/test_driver.py index ff57f26b6030..9539f969b585 100644 --- a/nova/tests/unit/virt/libvirt/test_driver.py +++ b/nova/tests/unit/virt/libvirt/test_driver.py @@ -2566,7 +2566,7 @@ class LibvirtConnTestCase(test.NoDBTestCase): conn._create_domain_and_network, self.context, 'xml', - mock_instance, None) + mock_instance, None, None) mock_teardown.assert_called_with(container_dir='/tmp/rootfs') @@ -7592,7 +7592,8 @@ class LibvirtConnTestCase(test.NoDBTestCase): libvirt_utils.get_instance_path(instance), disk_info_json) conn._create_domain_and_network(self.context, dummyxml, instance, - network_info, block_device_info, + network_info, disk_info, + block_device_info=block_device_info, reboot=True, vifs_already_plugged=True) self.mox.ReplayAll() @@ -7891,15 +7892,23 @@ class LibvirtConnTestCase(test.NoDBTestCase): mock.patch.object(conn, '_attach_pci_devices'), mock.patch.object(pci_manager, 'get_instance_pci_devs', return_value='fake_pci_devs'), + mock.patch.object(compute_utils, 'get_image_metadata'), + mock.patch.object(blockinfo, 'get_disk_info'), ) as (_get_existing_domain_xml, _create_domain_and_network, - _attach_pci_devices, get_instance_pci_devs): + _attach_pci_devices, get_instance_pci_devs, get_image_metadata, + get_disk_info): + get_image_metadata.return_value = {'bar': 234} + + disk_info = {'foo': 123} + get_disk_info.return_value = disk_info + conn.resume(self.context, instance, network_info, block_device_info) _get_existing_domain_xml.assert_has_calls([mock.call(instance, network_info, block_device_info)]) _create_domain_and_network.assert_has_calls([mock.call( self.context, dummyxml, - instance, network_info, + instance, network_info, disk_info, block_device_info=block_device_info, vifs_already_plugged=True)]) _attach_pci_devices.assert_has_calls([mock.call('fake_dom', @@ -9305,7 +9314,7 @@ Active: 8381604 kB mock.patch.object(conn.firewall_driver, 'prepare_instance_filter'), mock.patch.object(conn.firewall_driver, 'apply_instance_filter')): conn._create_domain_and_network(self.context, 'xml', - mock_instance, []) + mock_instance, [], None) self.assertEqual('/dev/nbd0', inst_sys_meta['rootfs_device_name']) mock_instance.save.assert_not_called() @@ -9368,7 +9377,7 @@ Active: 8381604 kB mock.patch.object(conn.firewall_driver, 'prepare_instance_filter'), mock.patch.object(conn.firewall_driver, 'apply_instance_filter')): conn._create_domain_and_network(self.context, 'xml', - mock_instance, []) + mock_instance, [], None) self.assertEqual('/dev/nbd0', inst_sys_meta['rootfs_device_name']) mock_instance.save.assert_not_called() @@ -9417,7 +9426,7 @@ Active: 8381604 kB mock.patch.object(conn.firewall_driver, 'prepare_instance_filter'), mock.patch.object(conn.firewall_driver, 'apply_instance_filter')): conn._create_domain_and_network(self.context, 'xml', - mock_instance, []) + mock_instance, [], None) self.assertEqual('/dev/nbd0', inst_sys_meta['rootfs_device_name']) mock_instance.save.assert_not_called() @@ -9873,7 +9882,7 @@ Active: 8381604 kB conn._create_domain_and_network, self.context, 'xml', - instance, None) + instance, None, None) def test_create_without_pause(self): self.flags(virt_type='lxc', group='libvirt') @@ -9894,7 +9903,7 @@ Active: 8381604 kB mock.patch.object(conn, 'cleanup')) as ( _handler, cleanup, firewall_driver, create, plug_vifs): domain = conn._create_domain_and_network(self.context, 'xml', - instance, None) + instance, None, None) self.assertEqual(0, create.call_args_list[0][1]['launch_flags']) self.assertEqual(0, domain.resume.call_count) @@ -9935,7 +9944,7 @@ Active: 8381604 kB @mock.patch.object(conn, 'cleanup') def test_create(cleanup, create, fw_driver, plug_vifs): domain = conn._create_domain_and_network(self.context, 'xml', - instance, vifs, + instance, vifs, None, power_on=power_on) plug_vifs.assert_called_with(instance, vifs) @@ -10044,7 +10053,7 @@ Active: 8381604 kB mock_volume = mock.MagicMock() mock_volume.__getitem__.side_effect = fake_getitem - bdi = {'block_device_mapping': [mock_volume]} + block_device_info = {'block_device_mapping': [mock_volume]} network_info = [network_model.VIF(id='1'), network_model.VIF(id='2', active=True)] @@ -10060,9 +10069,9 @@ Active: 8381604 kB prepare_instance_filter, create_domain, apply_instance_filter): create_domain.return_value = mock_dom - domain = conn._create_domain_and_network(self.context, fake_xml, - instance, network_info, - block_device_info=bdi) + domain = conn._create_domain_and_network( + self.context, fake_xml, instance, network_info, None, + block_device_info=block_device_info) get_encryption_metadata.assert_called_once_with(self.context, conn._volume_api, fake_volume_id, connection_info) @@ -10889,7 +10898,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase): self.assertFalse(inject_files) def fake_create_domain_and_network( - context, xml, instance, network_info, + context, xml, instance, network_info, disk_info, block_device_info=None, power_on=True, reboot=False, vifs_already_plugged=False): self.fake_create_domain_called = True @@ -11032,7 +11041,7 @@ class LibvirtDriverTestCase(test.NoDBTestCase): self.stubs.Set(self.libvirtconnection, '_get_guest_xml', lambda *a, **k: None) self.stubs.Set(self.libvirtconnection, '_create_domain_and_network', - lambda *a: None) + lambda *a, **kw: None) self.stubs.Set(loopingcall, 'FixedIntervalLoopingCall', lambda *a, **k: FakeLoopingCall()) diff --git a/nova/virt/libvirt/driver.py b/nova/virt/libvirt/driver.py index d633e17c37e1..f3c7dcd7e7a9 100644 --- a/nova/virt/libvirt/driver.py +++ b/nova/virt/libvirt/driver.py @@ -2063,7 +2063,9 @@ class LibvirtDriver(driver.ComputeDriver): # Initialize all the necessary networking, block devices and # start the instance. self._create_domain_and_network(context, xml, instance, network_info, - block_device_info, reboot=True, + disk_info, + block_device_info=block_device_info, + reboot=True, vifs_already_plugged=True) self._prepare_pci_devices_for_use( pci_manager.get_instance_pci_devs(instance, 'all')) @@ -2189,10 +2191,18 @@ class LibvirtDriver(driver.ComputeDriver): def resume(self, context, instance, network_info, block_device_info=None): """resume the specified instance.""" + image_meta = compute_utils.get_image_metadata(context, + self._image_api, instance.image_ref, instance) + + disk_info = blockinfo.get_disk_info( + CONF.libvirt.virt_type, instance, + block_device_info=block_device_info, image_meta=image_meta) + xml = self._get_existing_domain_xml(instance, network_info, block_device_info) dom = self._create_domain_and_network(context, xml, instance, - network_info, block_device_info=block_device_info, + network_info, disk_info, + block_device_info=block_device_info, vifs_already_plugged=True) self._attach_pci_devices(dom, pci_manager.get_instance_pci_devs(instance)) @@ -2311,7 +2321,8 @@ class LibvirtDriver(driver.ComputeDriver): block_device_info=block_device_info, write_to_disk=True) self._create_domain_and_network(context, xml, instance, network_info, - block_device_info, disk_info=disk_info) + disk_info, + block_device_info=block_device_info) LOG.debug("Instance is running", instance=instance) def _wait_for_boot(): @@ -4112,9 +4123,9 @@ class LibvirtDriver(driver.ComputeDriver): for vif in network_info if vif.get('active', True) is False] def _create_domain_and_network(self, context, xml, instance, network_info, - block_device_info=None, power_on=True, - reboot=False, vifs_already_plugged=False, - disk_info=None): + disk_info, block_device_info=None, + power_on=True, reboot=False, + vifs_already_plugged=False): """Do required network setup and create domain.""" block_device_mapping = driver.block_device_info_get_mapping( @@ -5820,7 +5831,9 @@ class LibvirtDriver(driver.ComputeDriver): block_device_info=block_device_info, write_to_disk=True) self._create_domain_and_network(context, xml, instance, network_info, - block_device_info, power_on, + disk_info, + block_device_info=block_device_info, + power_on=power_on, vifs_already_plugged=True) if power_on: timer = loopingcall.FixedIntervalLoopingCall( @@ -5860,7 +5873,9 @@ class LibvirtDriver(driver.ComputeDriver): xml = self._get_guest_xml(context, instance, network_info, disk_info, block_device_info=block_device_info) self._create_domain_and_network(context, xml, instance, network_info, - block_device_info, power_on) + disk_info, + block_device_info=block_device_info, + power_on=power_on) if power_on: timer = loopingcall.FixedIntervalLoopingCall(