summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/tests/test_libvirt.py59
-rw-r--r--nova/virt/libvirt/connection.py29
2 files changed, 55 insertions, 33 deletions
diff --git a/nova/tests/test_libvirt.py b/nova/tests/test_libvirt.py
index 329f81ab4..731a6e90a 100644
--- a/nova/tests/test_libvirt.py
+++ b/nova/tests/test_libvirt.py
@@ -501,7 +501,7 @@ class LibvirtConnTestCase(test.TestCase):
cfg = conn.get_guest_config(instance_ref,
_fake_network_info(self.stubs, 1),
- None, False)
+ None, None)
self.assertEquals(cfg.acpi, True)
self.assertEquals(cfg.memory, 1024 * 1024 * 2)
self.assertEquals(cfg.vcpus, 1)
@@ -530,7 +530,7 @@ class LibvirtConnTestCase(test.TestCase):
cfg = conn.get_guest_config(instance_ref,
_fake_network_info(self.stubs, 2),
- None, False)
+ None, None)
self.assertEquals(cfg.acpi, True)
self.assertEquals(cfg.memory, 1024 * 1024 * 2)
self.assertEquals(cfg.vcpus, 1)
@@ -560,7 +560,7 @@ class LibvirtConnTestCase(test.TestCase):
conn = connection.LibvirtConnection(True)
instance_ref = db.instance_create(self.context, self.test_instance)
- cfg = conn.get_guest_config(instance_ref, [], None, False,
+ cfg = conn.get_guest_config(instance_ref, [], None, None,
{'root_device_name': 'dev/vdb'})
self.assertEquals(cfg.acpi, False)
self.assertEquals(cfg.memory, 1024 * 1024 * 2)
@@ -605,7 +605,24 @@ class LibvirtConnTestCase(test.TestCase):
instance_data['ramdisk_id'] = 'ari-deadbeef'
instance_data['kernel_id'] = 'aki-deadbeef'
self._check_xml_and_uri(instance_data, expect_kernel=True,
- expect_ramdisk=True, rescue=True)
+ expect_ramdisk=True, rescue=instance_data)
+
+ def test_xml_and_uri_rescue_no_kernel_no_ramdisk(self):
+ instance_data = dict(self.test_instance)
+ self._check_xml_and_uri(instance_data, expect_kernel=False,
+ expect_ramdisk=False, rescue=instance_data)
+
+ def test_xml_and_uri_rescue_no_kernel(self):
+ instance_data = dict(self.test_instance)
+ instance_data['ramdisk_id'] = 'aki-deadbeef'
+ self._check_xml_and_uri(instance_data, expect_kernel=False,
+ expect_ramdisk=True, rescue=instance_data)
+
+ def test_xml_and_uri_rescue_no_ramdisk(self):
+ instance_data = dict(self.test_instance)
+ instance_data['kernel_id'] = 'aki-deadbeef'
+ self._check_xml_and_uri(instance_data, expect_kernel=True,
+ expect_ramdisk=False, rescue=instance_data)
def test_xml_uuid(self):
instance_data = dict(self.test_instance)
@@ -1088,7 +1105,7 @@ class LibvirtConnTestCase(test.TestCase):
instance_ref['uuid'])
def _check_xml_and_uri(self, instance, expect_ramdisk, expect_kernel,
- rescue=False):
+ rescue=None):
user_context = context.RequestContext(self.user_id, self.project_id)
instance_ref = db.instance_create(user_context, instance)
network_ref = db.project_get_networks(context.get_admin_context(),
@@ -1114,26 +1131,22 @@ class LibvirtConnTestCase(test.TestCase):
check_list = type_uri_map[hypervisor_type][1]
if rescue:
- check = (lambda t: t.find('./os/kernel').text.split('/')[1],
- 'kernel.rescue')
- check_list.append(check)
- check = (lambda t: t.find('./os/initrd').text.split('/')[1],
- 'ramdisk.rescue')
- check_list.append(check)
+ suffix = '.rescue'
else:
- if expect_kernel:
- check = (lambda t: t.find('./os/kernel').text.split(
- '/')[1], 'kernel')
- else:
- check = (lambda t: t.find('./os/kernel'), None)
- check_list.append(check)
+ suffix = ''
+ if expect_kernel:
+ check = (lambda t: t.find('./os/kernel').text.split(
+ '/')[1], 'kernel' + suffix)
+ else:
+ check = (lambda t: t.find('./os/kernel'), None)
+ check_list.append(check)
- if expect_ramdisk:
- check = (lambda t: t.find('./os/initrd').text.split(
- '/')[1], 'ramdisk')
- else:
- check = (lambda t: t.find('./os/initrd'), None)
- check_list.append(check)
+ if expect_ramdisk:
+ check = (lambda t: t.find('./os/initrd').text.split(
+ '/')[1], 'ramdisk' + suffix)
+ else:
+ check = (lambda t: t.find('./os/initrd'), None)
+ check_list.append(check)
if hypervisor_type in ['qemu', 'kvm']:
check = (lambda t: t.findall('./devices/serial')[0].get(
diff --git a/nova/virt/libvirt/connection.py b/nova/virt/libvirt/connection.py
index ab32ff927..3f1db75a3 100644
--- a/nova/virt/libvirt/connection.py
+++ b/nova/virt/libvirt/connection.py
@@ -829,12 +829,13 @@ class LibvirtConnection(driver.ComputeDriver):
'unrescue.xml')
libvirt_utils.write_to_file(unrescue_xml_path, unrescue_xml)
- xml = self.to_xml(instance, network_info, image_meta, rescue=True)
rescue_images = {
'image_id': FLAGS.rescue_image_id or instance['image_ref'],
'kernel_id': FLAGS.rescue_kernel_id or instance['kernel_id'],
'ramdisk_id': FLAGS.rescue_ramdisk_id or instance['ramdisk_id'],
}
+ xml = self.to_xml(instance, network_info, image_meta,
+ rescue=rescue_images)
self._create_image(context, instance, xml, '.rescue', rescue_images,
network_info=network_info)
self._hard_reboot(instance, network_info, xml=xml)
@@ -880,7 +881,7 @@ class LibvirtConnection(driver.ComputeDriver):
@exception.wrap_exception()
def spawn(self, context, instance, image_meta, network_info,
block_device_info=None):
- xml = self.to_xml(instance, network_info, image_meta, False,
+ xml = self.to_xml(instance, network_info, image_meta,
block_device_info=block_device_info)
self.firewall_driver.setup_basic_filtering(instance, network_info)
self.firewall_driver.prepare_instance_filter(instance, network_info)
@@ -1392,8 +1393,14 @@ class LibvirtConnection(driver.ComputeDriver):
config_drive, config_drive_id = self._get_config_drive_info(instance)
return any((config_drive, config_drive_id))
- def get_guest_config(self, instance, network_info, image_meta, rescue,
+ def get_guest_config(self, instance, network_info, image_meta, rescue=None,
block_device_info=None):
+ """Get config data for parameters.
+
+ :param rescue: optional dictionary that should contain the key
+ 'ramdisk_id' if a ramdisk is needed for the rescue image and
+ 'kernel_id' if a kernel is needed for the rescue image.
+ """
block_device_mapping = driver.block_device_info_get_mapping(
block_device_info)
@@ -1437,12 +1444,14 @@ class LibvirtConnection(driver.ComputeDriver):
guest.os_type = "hvm"
if rescue:
- guest.os_kernel = os.path.join(FLAGS.instances_path,
- instance['name'],
- "kernel.rescue")
- guest.os_initrd = os.path.join(FLAGS.instances_path,
- instance['name'],
- "ramdisk.rescue")
+ if rescue.get('kernel_id'):
+ guest.os_kernel = os.path.join(FLAGS.instances_path,
+ instance['name'],
+ "kernel.rescue")
+ if rescue.get('ramdisk_id'):
+ guest.os_initrd = os.path.join(FLAGS.instances_path,
+ instance['name'],
+ "ramdisk.rescue")
elif instance['kernel_id']:
guest.os_kernel = os.path.join(FLAGS.instances_path,
instance['name'],
@@ -1664,7 +1673,7 @@ class LibvirtConnection(driver.ComputeDriver):
return guest
- def to_xml(self, instance, network_info, image_meta=None, rescue=False,
+ def to_xml(self, instance, network_info, image_meta=None, rescue=None,
block_device_info=None):
LOG.debug(_('Starting toXML method'), instance=instance)
conf = self.get_guest_config(instance, network_info, image_meta,