libvirt: Remove QEMU_VERSION_REQ_SHARED
The updated minimum required libvirt (4.0.0) and QEMU (2.11)
for "Ussuri" satisfy the version requirements; this was done
in Change-Id: Ia18e9be4d (22c1916b49 — libvirt: Bump
MIN_{LIBVIRT,QEMU}_VERSION for "Ussuri", 2019-11-19).
Drop the version constant QEMU_VERSION_REQ_SHARED and now-needless
compatibility code; adjust/remove tests.
Change-Id: If878a023c69f25a9ea45b7de2ff9eb1976aaeb8c
Signed-off-by: Stephen Finucane <sfinucan@redhat.com>
This commit is contained in:
committed by
Stephen Finucane
parent
dce9bc03c4
commit
bd9bea5690
@@ -16,7 +16,6 @@
|
||||
Helpers for qemu tasks.
|
||||
"""
|
||||
|
||||
import operator
|
||||
import os
|
||||
|
||||
from oslo_concurrency import processutils
|
||||
@@ -33,8 +32,6 @@ QEMU_IMG_LIMITS = processutils.ProcessLimits(
|
||||
cpu_time=30,
|
||||
address_space=1 * units.Gi)
|
||||
|
||||
QEMU_VERSION_REQ_SHARED = 2010000
|
||||
|
||||
|
||||
@nova.privsep.sys_admin_pctxt.entrypoint
|
||||
def convert_image(source, dest, in_format, out_format, instances_path,
|
||||
@@ -85,20 +82,17 @@ def unprivileged_convert_image(source, dest, in_format, out_format,
|
||||
|
||||
|
||||
@nova.privsep.sys_admin_pctxt.entrypoint
|
||||
def privileged_qemu_img_info(path, format=None, qemu_version=None,
|
||||
output_format=None):
|
||||
def privileged_qemu_img_info(path, format=None, output_format=None):
|
||||
"""Return an oject containing the parsed output from qemu-img info
|
||||
|
||||
This is a privileged call to qemu-img info using the sys_admin_pctxt
|
||||
entrypoint allowing host block devices etc to be accessed.
|
||||
"""
|
||||
return unprivileged_qemu_img_info(
|
||||
path, format=format, qemu_version=qemu_version,
|
||||
output_format=output_format)
|
||||
path, format=format, output_format=output_format)
|
||||
|
||||
|
||||
def unprivileged_qemu_img_info(path, format=None, qemu_version=None,
|
||||
output_format=None):
|
||||
def unprivileged_qemu_img_info(path, format=None, output_format=None):
|
||||
"""Return an object containing the parsed output from qemu-img info."""
|
||||
try:
|
||||
# The following check is about ploop images that reside within
|
||||
@@ -107,15 +101,14 @@ def unprivileged_qemu_img_info(path, format=None, qemu_version=None,
|
||||
os.path.exists(os.path.join(path, "DiskDescriptor.xml"))):
|
||||
path = os.path.join(path, "root.hds")
|
||||
|
||||
cmd = ('env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path)
|
||||
cmd = (
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
'--force-share',
|
||||
)
|
||||
if format is not None:
|
||||
cmd = cmd + ('-f', format)
|
||||
if output_format is not None:
|
||||
cmd = cmd + ("--output=%s" % (output_format),)
|
||||
# Check to see if the qemu version is >= 2.10 because if so, we need
|
||||
# to add the --force-share flag.
|
||||
if qemu_version and operator.ge(qemu_version, QEMU_VERSION_REQ_SHARED):
|
||||
cmd = cmd + ('--force-share',)
|
||||
out, err = processutils.execute(*cmd, prlimit=QEMU_IMG_LIMITS)
|
||||
except processutils.ProcessExecutionError as exp:
|
||||
if exp.exit_code == -9:
|
||||
|
||||
@@ -105,7 +105,6 @@ from nova.virt import driver
|
||||
from nova.virt import fake
|
||||
from nova.virt import hardware
|
||||
from nova.virt.image import model as imgmodel
|
||||
from nova.virt import images
|
||||
from nova.virt.libvirt import blockinfo
|
||||
from nova.virt.libvirt import config as vconfig
|
||||
from nova.virt.libvirt import designer
|
||||
@@ -1310,23 +1309,6 @@ class LibvirtConnTestCase(test.NoDBTestCase,
|
||||
break
|
||||
self.assertFalse(version_arg_found)
|
||||
|
||||
# NOTE(sdague): python2.7 and python3.5 have different behaviors
|
||||
# when it comes to comparing against the sentinel, so
|
||||
# has_min_version is needed to pass python3.5.
|
||||
@mock.patch.object(nova.virt.libvirt.host.Host, "has_min_version",
|
||||
return_value=True)
|
||||
@mock.patch.object(fakelibvirt.Connection, 'getVersion',
|
||||
return_value=mock.sentinel.qemu_version)
|
||||
def test_qemu_image_version(self, mock_get_libversion, min_ver):
|
||||
"""Test that init_host sets qemu image version
|
||||
|
||||
A sentinel is used here so that we aren't chasing this value
|
||||
against minimums that get raised over time.
|
||||
"""
|
||||
drvr = libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), True)
|
||||
drvr.init_host("dummyhost")
|
||||
self.assertEqual(images.QEMU_VERSION, mock.sentinel.qemu_version)
|
||||
|
||||
@mock.patch.object(fields.Architecture, "from_host",
|
||||
return_value=fields.Architecture.PPC64)
|
||||
def test_min_version_ppc_ok(self, mock_arch):
|
||||
|
||||
@@ -110,7 +110,7 @@ disk size: 96K
|
||||
d_backing = libvirt_utils.get_disk_backing_file(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertIsNone(d_backing)
|
||||
|
||||
@@ -119,7 +119,7 @@ disk size: 96K
|
||||
self.assertEqual(expected_size, d_size)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
|
||||
@mock.patch('os.path.exists', return_value=True)
|
||||
def test_disk_size(self, mock_exists):
|
||||
@@ -167,29 +167,7 @@ disk size: 96K
|
||||
image_info = images.qemu_img_info(path, output_format='json')
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
'--output=json', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
self.assertEqual('raw', image_info.file_format)
|
||||
self.assertEqual(67108864, image_info.virtual_size)
|
||||
self.assertEqual(98304, image_info.disk_size)
|
||||
self.assertEqual(65536, image_info.cluster_size)
|
||||
|
||||
@mock.patch('os.path.exists', return_value=True)
|
||||
@mock.patch('oslo_concurrency.processutils.execute')
|
||||
def test_qemu_info_canon(self, mock_execute, mock_exists):
|
||||
path = "disk.config"
|
||||
example_output = """image: disk.config
|
||||
file format: raw
|
||||
virtual size: 64M (67108864 bytes)
|
||||
cluster_size: 65536
|
||||
disk size: 96K
|
||||
blah BLAH: bb
|
||||
"""
|
||||
mock_execute.return_value = (example_output, '')
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
'--force-share', '--output=json',
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
@@ -200,8 +178,7 @@ blah BLAH: bb
|
||||
|
||||
@mock.patch('os.path.exists', return_value=True)
|
||||
@mock.patch('oslo_concurrency.processutils.execute')
|
||||
def test_qemu_info_canon_qemu_2_10(self, mock_execute, mock_exists):
|
||||
images.QEMU_VERSION = nova.privsep.qemu.QEMU_VERSION_REQ_SHARED
|
||||
def test_qemu_info_canon(self, mock_execute, mock_exists):
|
||||
path = "disk.config"
|
||||
example_output = """image: disk.config
|
||||
file format: raw
|
||||
@@ -237,7 +214,7 @@ backing file: /var/lib/nova/a328c7998805951a_2
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
self.assertEqual('qcow2', image_info.file_format)
|
||||
@@ -261,7 +238,7 @@ disk size: 706M
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info',
|
||||
os.path.join(path, 'root.hds'),
|
||||
os.path.join(path, 'root.hds'), '--force-share',
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_isdir.assert_called_once_with(path)
|
||||
self.assertEqual(2, mock_exists.call_count)
|
||||
@@ -292,7 +269,7 @@ backing file: /var/lib/nova/a328c7998805951a_2 (actual path: /b/3a988059e51a_2)
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
self.assertEqual('raw', image_info.file_format)
|
||||
@@ -321,7 +298,7 @@ junk stuff: bbb
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
self.assertEqual('raw', image_info.file_format)
|
||||
@@ -346,7 +323,7 @@ ID TAG VM SIZE DATE VM CLOCK
|
||||
image_info = images.qemu_img_info(path)
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
self.assertEqual('disk.config', image_info.image)
|
||||
self.assertEqual('raw', image_info.file_format)
|
||||
@@ -503,7 +480,7 @@ disk size: 4.4M
|
||||
self.assertEqual(4592640, disk.get_disk_size('/some/path'))
|
||||
mock_execute.assert_called_once_with(
|
||||
'env', 'LC_ALL=C', 'LANG=C', 'qemu-img', 'info', path,
|
||||
prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
'--force-share', prlimit=nova.privsep.qemu.QEMU_IMG_LIMITS)
|
||||
mock_exists.assert_called_once_with(path)
|
||||
|
||||
def test_copy_image(self):
|
||||
|
||||
@@ -33,10 +33,6 @@ from nova.i18n import _
|
||||
from nova.image import glance
|
||||
import nova.privsep.qemu
|
||||
|
||||
# This is set by the libvirt driver on startup. The version is used to
|
||||
# determine what flags need to be set on the command line.
|
||||
QEMU_VERSION = None
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
CONF = nova.conf.CONF
|
||||
@@ -49,8 +45,7 @@ def qemu_img_info(path, format=None, output_format=None):
|
||||
raise exception.DiskNotFound(location=path)
|
||||
|
||||
info = nova.privsep.qemu.unprivileged_qemu_img_info(
|
||||
path, format=format, qemu_version=QEMU_VERSION,
|
||||
output_format=output_format)
|
||||
path, format=format, output_format=output_format)
|
||||
if output_format:
|
||||
return imageutils.QemuImgInfo(info, format=output_format)
|
||||
else:
|
||||
@@ -63,8 +58,7 @@ def privileged_qemu_img_info(path, format=None, output_format=None):
|
||||
raise exception.DiskNotFound(location=path)
|
||||
|
||||
info = nova.privsep.qemu.privileged_qemu_img_info(
|
||||
path, format=format, qemu_version=QEMU_VERSION,
|
||||
output_format=output_format)
|
||||
path, format=format, output_format=output_format)
|
||||
if output_format:
|
||||
return imageutils.QemuImgInfo(info, format=output_format)
|
||||
else:
|
||||
|
||||
@@ -658,11 +658,7 @@ class LibvirtDriver(driver.ComputeDriver):
|
||||
libvirt_utils.version_to_string(MIN_LIBVIRT_VERSION))
|
||||
|
||||
if CONF.libvirt.virt_type in ("qemu", "kvm"):
|
||||
if self._host.has_min_version(hv_ver=MIN_QEMU_VERSION):
|
||||
# "qemu-img info" calls are version dependent, so we need to
|
||||
# store the version in the images module.
|
||||
images.QEMU_VERSION = self._host.get_connection().getVersion()
|
||||
else:
|
||||
if not self._host.has_min_version(hv_ver=MIN_QEMU_VERSION):
|
||||
raise exception.InternalError(
|
||||
_('Nova requires QEMU version %s or greater.') %
|
||||
libvirt_utils.version_to_string(MIN_QEMU_VERSION))
|
||||
|
||||
Reference in New Issue
Block a user