xenapi: remove pv detection
It was assumed that pygrub is there in domU, so that the RAW and unknown disks were attached to domU and investigated with pygrub to find out if PV could be used. This patch removes this functionality. Also some cleanup is made around the ImageType mess. From now RAW and unknown disks will not be investigated for PV-ness and will boot as HVM. Fixes bug 1196570 Change-Id: If84b93cee36938257b7ad0fa44b3b22878520506
This commit is contained in:
parent
6a3f5fd6cc
commit
e3ef5214c6
@ -83,12 +83,6 @@ def stubout_stream_disk(stubs):
|
||||
stubs.Set(vm_utils, '_stream_disk', fake_stream_disk)
|
||||
|
||||
|
||||
def stubout_is_vdi_pv(stubs):
|
||||
def f(_1):
|
||||
return False
|
||||
stubs.Set(vm_utils, '_is_vdi_pv', f)
|
||||
|
||||
|
||||
def stubout_determine_is_pv_objectstore(stubs):
|
||||
"""Assumes VMs stu have PV kernels."""
|
||||
|
||||
|
@ -147,7 +147,7 @@ def get_fake_device_info():
|
||||
return fake
|
||||
|
||||
|
||||
def stub_vm_utils_with_vdi_attached_here(function, should_return=True):
|
||||
def stub_vm_utils_with_vdi_attached_here(function):
|
||||
"""
|
||||
vm_utils.with_vdi_attached_here needs to be stubbed out because it
|
||||
calls down to the filesystem to attach a vdi. This provides a
|
||||
@ -163,19 +163,13 @@ def stub_vm_utils_with_vdi_attached_here(function, should_return=True):
|
||||
def fake_image_download(*args, **kwargs):
|
||||
pass
|
||||
|
||||
def fake_is_vdi_pv(*args, **kwargs):
|
||||
return should_return
|
||||
|
||||
orig_vdi_attached_here = vm_utils.vdi_attached_here
|
||||
orig_image_download = fake_image._FakeImageService.download
|
||||
orig_is_vdi_pv = vm_utils._is_vdi_pv
|
||||
try:
|
||||
vm_utils.vdi_attached_here = fake_vdi_attached_here
|
||||
fake_image._FakeImageService.download = fake_image_download
|
||||
vm_utils._is_vdi_pv = fake_is_vdi_pv
|
||||
return function(self, *args, **kwargs)
|
||||
finally:
|
||||
vm_utils._is_vdi_pv = orig_is_vdi_pv
|
||||
fake_image._FakeImageService.download = orig_image_download
|
||||
vm_utils.vdi_attached_here = orig_vdi_attached_here
|
||||
|
||||
@ -328,7 +322,6 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
|
||||
xenapi_fake.create_network('fake', CONF.flat_network_bridge)
|
||||
stubs.stubout_session(self.stubs, stubs.FakeSessionForVMTests)
|
||||
stubs.stubout_get_this_vm_uuid(self.stubs)
|
||||
stubs.stubout_is_vdi_pv(self.stubs)
|
||||
stubs.stub_out_vm_methods(self.stubs)
|
||||
fake_processutils.stub_out_processutils_execute(self.stubs)
|
||||
self.user_id = 'fake'
|
||||
@ -810,10 +803,9 @@ class XenAPIVMTestCase(stubs.XenAPITestBase):
|
||||
# No additional VMs should be found.
|
||||
self.assertEqual(start_vms, end_vms)
|
||||
|
||||
@stub_vm_utils_with_vdi_attached_here
|
||||
def test_spawn_raw_glance(self):
|
||||
self._test_spawn(IMAGE_RAW, None, None)
|
||||
self.check_vm_params_for_linux()
|
||||
self.check_vm_params_for_windows()
|
||||
|
||||
def test_spawn_vhd_glance_linux(self):
|
||||
self._test_spawn(IMAGE_VHD, None, None,
|
||||
@ -1886,9 +1878,8 @@ class XenAPIDetermineIsPVTestCase(test.TestCase):
|
||||
def test_linux_vhd(self):
|
||||
self.assert_pv_status(vm_utils.ImageType.DISK_VHD, 'linux', True)
|
||||
|
||||
@stub_vm_utils_with_vdi_attached_here
|
||||
def test_raw(self):
|
||||
self.assert_pv_status(vm_utils.ImageType.DISK_RAW, 'linux', True)
|
||||
self.assert_pv_status(vm_utils.ImageType.DISK_RAW, 'linux', False)
|
||||
|
||||
def test_disk(self):
|
||||
self.assert_pv_status(vm_utils.ImageType.DISK, None, True)
|
||||
@ -1896,9 +1887,8 @@ class XenAPIDetermineIsPVTestCase(test.TestCase):
|
||||
def test_iso(self):
|
||||
self.assert_pv_status(vm_utils.ImageType.DISK_ISO, None, False)
|
||||
|
||||
@stub_vm_utils_with_vdi_attached_here
|
||||
def test_none(self):
|
||||
self.assert_pv_status(None, None, True)
|
||||
self.assert_pv_status(None, None, False)
|
||||
|
||||
|
||||
class CompareVersionTestCase(test.TestCase):
|
||||
|
@ -1436,24 +1436,27 @@ def determine_disk_image_type(image_meta):
|
||||
disk_format = image_meta['disk_format']
|
||||
|
||||
disk_format_map = {
|
||||
'ami': 'DISK',
|
||||
'aki': 'KERNEL',
|
||||
'ari': 'RAMDISK',
|
||||
'raw': 'DISK_RAW',
|
||||
'vhd': 'DISK_VHD',
|
||||
'iso': 'DISK_ISO',
|
||||
'ami': ImageType.DISK,
|
||||
'aki': ImageType.KERNEL,
|
||||
'ari': ImageType.RAMDISK,
|
||||
'raw': ImageType.DISK_RAW,
|
||||
'vhd': ImageType.DISK_VHD,
|
||||
'iso': ImageType.DISK_ISO,
|
||||
}
|
||||
|
||||
try:
|
||||
image_type_str = disk_format_map[disk_format]
|
||||
image_type = disk_format_map[disk_format]
|
||||
except KeyError:
|
||||
raise exception.InvalidDiskFormat(disk_format=disk_format)
|
||||
|
||||
image_type = getattr(ImageType, image_type_str)
|
||||
|
||||
image_ref = image_meta['id']
|
||||
|
||||
params = {
|
||||
'image_type_str': ImageType.to_string(image_type),
|
||||
'image_ref': image_ref
|
||||
}
|
||||
LOG.debug(_("Detected %(image_type_str)s format for image %(image_ref)s"),
|
||||
{'image_type_str': image_type_str, 'image_ref': image_ref})
|
||||
params)
|
||||
|
||||
return image_type
|
||||
|
||||
@ -1463,21 +1466,15 @@ def determine_is_pv(session, vdi_ref, disk_image_type, os_type):
|
||||
Determine whether the VM will use a paravirtualized kernel or if it
|
||||
will use hardware virtualization.
|
||||
|
||||
1. Glance (VHD): then we use `os_type`, raise if not set
|
||||
1. Glance (VHD): if `os_type` is windows, HVM, otherwise PV
|
||||
|
||||
2. Glance (DISK_RAW): use Pygrub to figure out if pv kernel is
|
||||
available
|
||||
2. Glance (DISK_RAW): HVM
|
||||
|
||||
3. Glance (DISK): pv is assumed
|
||||
3. Glance (DISK): PV
|
||||
|
||||
4. Glance (DISK_ISO): no pv is assumed
|
||||
4. Glance (DISK_ISO): HVM
|
||||
|
||||
5. Boot From Volume - without image metadata (None): attempt to
|
||||
use Pygrub to figure out if the volume stores a PV VM or a
|
||||
HVM one. Log a warning, because there may be cases where the
|
||||
volume is RAW (in which case using pygrub is fine) and cases
|
||||
where the content of the volume is VHD, and pygrub might not
|
||||
work as expected.
|
||||
5. Boot From Volume - without image metadata (None): use HVM
|
||||
NOTE: if disk_image_type is not specified, instances launched
|
||||
from remote volumes will have to include kernel and ramdisk
|
||||
because external kernel and ramdisk will not be fetched.
|
||||
@ -1492,8 +1489,7 @@ def determine_is_pv(session, vdi_ref, disk_image_type, os_type):
|
||||
is_pv = True
|
||||
elif disk_image_type == ImageType.DISK_RAW:
|
||||
# 2. RAW
|
||||
with vdi_attached_here(session, vdi_ref, read_only=True) as dev:
|
||||
is_pv = _is_vdi_pv(dev)
|
||||
is_pv = False
|
||||
elif disk_image_type == ImageType.DISK:
|
||||
# 3. Disk
|
||||
is_pv = True
|
||||
@ -1501,11 +1497,7 @@ def determine_is_pv(session, vdi_ref, disk_image_type, os_type):
|
||||
# 4. ISO
|
||||
is_pv = False
|
||||
elif not disk_image_type:
|
||||
LOG.warning(_("Image format is None: trying to determine PV status "
|
||||
"using pygrub; if instance with vdi %s does not boot "
|
||||
"correctly, try with image metadata.") % vdi_ref)
|
||||
with vdi_attached_here(session, vdi_ref, read_only=True) as dev:
|
||||
is_pv = _is_vdi_pv(dev)
|
||||
is_pv = False
|
||||
else:
|
||||
raise exception.NovaException(_("Unknown image format %s") %
|
||||
disk_image_type)
|
||||
@ -2018,27 +2010,6 @@ def _get_this_vm_ref(session):
|
||||
return session.call_xenapi("VM.get_by_uuid", get_this_vm_uuid())
|
||||
|
||||
|
||||
def _is_vdi_pv(dev):
|
||||
LOG.debug(_("Running pygrub against %s"), dev)
|
||||
dev_path = utils.make_dev_path(dev)
|
||||
try:
|
||||
out, err = utils.execute('pygrub', '-qn', dev_path, run_as_root=True)
|
||||
for line in out:
|
||||
# try to find kernel string
|
||||
m = re.search('(?<=kernel:)/.*(?:>)', line)
|
||||
if m and m.group(0).find('xen') != -1:
|
||||
LOG.debug(_("Found Xen kernel %s") % m.group(0))
|
||||
return True
|
||||
LOG.debug(_("No Xen kernel found. Booting HVM."))
|
||||
except processutils.ProcessExecutionError:
|
||||
LOG.exception(_("Error while executing pygrub! Please, ensure the "
|
||||
"binary is installed correctly, and available in your "
|
||||
"PATH; on some Linux distros, pygrub may be installed "
|
||||
"in /usr/lib/xen-X.Y/bin/pygrub. Attempting to boot "
|
||||
"in HVM mode."))
|
||||
return False
|
||||
|
||||
|
||||
def _get_partitions(dev):
|
||||
"""Return partition information (num, size, type) for a device."""
|
||||
dev_path = utils.make_dev_path(dev)
|
||||
|
Loading…
Reference in New Issue
Block a user