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:
parent
33119f8b61
commit
9283379849
|
@ -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",
|
||||
|
|
|
@ -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():
|
||||
|
|
Loading…
Reference in New Issue