libvirt: saving the lxc rootfs device in instance metadata

Currently, nbd/loop device, to which lxc image has been
connected, is being saved as instance root device, which causing
the attached bug.
Saving the device name in instance system metadata instead.

Closes-Bug: #1330981
Change-Id: I3a0533a89ea8af61349118a39b822f4af146cc04
This commit is contained in:
Vladik Romanovsky 2014-06-27 08:19:39 -04:00
parent 33119f8b61
commit 9283379849
2 changed files with 32 additions and 10 deletions

View File

@ -7847,6 +7847,29 @@ Active: 8381604 kB
self.assertEqual(0, create.call_args_list[0][1]['launch_flags'])
self.assertEqual(0, domain.resume.call_count)
def test_lxc_create_and_rootfs_saved(self):
self.flags(virt_type='lxc', group='libvirt')
conn = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)
instance = db.instance_create(self.context, self.test_instance)
inst_obj = objects.Instance.get_by_uuid(self.context, instance['uuid'])
with contextlib.nested(
mock.patch('nova.virt.disk.api.setup_container',
return_value='/dev/nbd1'),
mock.patch('nova.virt.disk.api.clean_lxc_namespace'),
mock.patch('nova.openstack.common.fileutils.ensure_tree'),
mock.patch.object(conn.image_backend, 'image'),
mock.patch.object(conn, '_enable_hairpin'),
mock.patch.object(conn, 'get_info',
return_value={'state': power_state.RUNNING})
):
conn._conn.defineXML = mock.Mock()
conn._create_domain('xml', instance=inst_obj)
self.assertEqual('/dev/nbd1',
inst_obj.system_metadata.get(
'rootfs_device_name'))
def _test_create_with_network_events(self, neutron_failure=None,
power_on=True):
self.flags(vif_driver="nova.tests.fake_network.FakeVIFDriver",

View File

@ -890,8 +890,8 @@ class LibvirtDriver(driver.ComputeDriver):
def _teardown_container(self, instance):
inst_path = libvirt_utils.get_instance_path(instance)
container_dir = os.path.join(inst_path, 'rootfs')
container_root_device = instance.get('root_device_name')
disk.teardown_container(container_dir, container_root_device)
rootfs_dev = instance.system_metadata.get('rootfs_device_name')
disk.teardown_container(container_dir, rootfs_dev)
def _destroy(self, instance):
try:
@ -3598,15 +3598,14 @@ class LibvirtDriver(driver.ComputeDriver):
fileutils.ensure_tree(container_dir)
image = self.image_backend.image(instance, 'disk')
container_root_device = disk.setup_container(image.path,
container_dir=container_dir,
use_cow=CONF.use_cow_images)
rootfs_dev = disk.setup_container(image.path,
container_dir=container_dir,
use_cow=CONF.use_cow_images)
try:
# Note(GuanQiang): save container root device name here, used for
# detaching the linked image device when deleting
# the lxc instance.
if container_root_device:
instance.root_device_name = container_root_device
# Save rootfs device to disconnect it when deleting the instance
if rootfs_dev:
instance.system_metadata['rootfs_device_name'] = rootfs_dev
instance.save()
except Exception:
with excutils.save_and_reraise_exception():