Adds "file" disk driver support to Xen libvirt driver.
There are Xen servers which do not support http://wiki.xen.org/wiki/Blktap (e.g. Oracle VM Server for x86) but are still operational with simple file driver. So, if Xen node do not support Blktap then method pick_disk_driver_name return "file" instead of "tap" or "tap2" in case of "qemu" is not available. Change-Id: If8fbb058ed7e78e4a80d54f0561e2d8b9055ecb9 Partial-Bug: #1323722
This commit is contained in:
parent
9595d09e05
commit
09f8089a9a
@ -336,31 +336,70 @@ ID TAG VM SIZE DATE VM CLOCK
|
||||
def test_pick_disk_driver_name(self):
|
||||
type_map = {'kvm': ([True, 'qemu'], [False, 'qemu'], [None, 'qemu']),
|
||||
'qemu': ([True, 'qemu'], [False, 'qemu'], [None, 'qemu']),
|
||||
'xen': ([True, 'phy'], [False, 'qemu'], [None, 'qemu']),
|
||||
'uml': ([True, None], [False, None], [None, None]),
|
||||
'lxc': ([True, None], [False, None], [None, None])}
|
||||
# NOTE(aloga): Xen is tested in test_pick_disk_driver_name_xen
|
||||
|
||||
version = 1005001
|
||||
for (virt_type, checks) in type_map.iteritems():
|
||||
if virt_type == "xen":
|
||||
# NOTE(aloga): Xen is tested in test_pick_disk_driver_name_xen
|
||||
version = 4004000
|
||||
else:
|
||||
version = 1005001
|
||||
|
||||
self.flags(virt_type=virt_type, group='libvirt')
|
||||
for (is_block_dev, expected_result) in checks:
|
||||
result = libvirt_utils.pick_disk_driver_name(version,
|
||||
is_block_dev)
|
||||
self.assertEqual(result, expected_result)
|
||||
|
||||
def test_pick_disk_driver_name_xen(self):
|
||||
version_map = ((4000000, "tap"),
|
||||
(4001000, "tap2"),
|
||||
(4002000, "qemu"))
|
||||
@mock.patch('nova.utils.execute')
|
||||
def test_pick_disk_driver_name_xen(self, mock_execute):
|
||||
|
||||
def side_effect(*args, **kwargs):
|
||||
if args == ('tap-ctl', 'check'):
|
||||
if mock_execute.blktap is True:
|
||||
return ('ok\n', '')
|
||||
elif mock_execute.blktap is False:
|
||||
return ('some error\n', '')
|
||||
else:
|
||||
raise OSError(2, "No such file or directory")
|
||||
elif args == ('xend', 'status'):
|
||||
if mock_execute.xend is True:
|
||||
return ('', '')
|
||||
elif mock_execute.xend is False:
|
||||
raise processutils.ProcessExecutionError("error")
|
||||
else:
|
||||
raise OSError(2, "No such file or directory")
|
||||
raise Exception('Unexpected call')
|
||||
mock_execute.side_effect = side_effect
|
||||
|
||||
self.flags(virt_type="xen", group='libvirt')
|
||||
for ver, drv in version_map:
|
||||
result = libvirt_utils.pick_disk_driver_name(ver, False)
|
||||
self.assertEqual(drv, result)
|
||||
versions = [4000000, 4001000, 4002000, 4003000, 4005000]
|
||||
for version in versions:
|
||||
# block dev
|
||||
result = libvirt_utils.pick_disk_driver_name(version, True)
|
||||
self.assertEqual(result, "phy")
|
||||
self.assertFalse(mock_execute.called)
|
||||
mock_execute.reset_mock()
|
||||
# file dev
|
||||
for blktap in True, False, None:
|
||||
mock_execute.blktap = blktap
|
||||
for xend in True, False, None:
|
||||
mock_execute.xend = xend
|
||||
result = libvirt_utils.pick_disk_driver_name(version,
|
||||
False)
|
||||
# qemu backend supported only by libxl which is
|
||||
# production since xen 4.2. libvirt use libxl if
|
||||
# xend service not started.
|
||||
if version >= 4002000 and xend is not True:
|
||||
self.assertEqual(result, 'qemu')
|
||||
elif blktap:
|
||||
if version == 4000000:
|
||||
self.assertEqual(result, 'tap')
|
||||
else:
|
||||
self.assertEqual(result, 'tap2')
|
||||
else:
|
||||
self.assertEqual(result, 'file')
|
||||
# default is_block_dev False
|
||||
self.assertEqual(result,
|
||||
libvirt_utils.pick_disk_driver_name(version))
|
||||
mock_execute.reset_mock()
|
||||
|
||||
@mock.patch('os.path.exists', return_value=True)
|
||||
@mock.patch('nova.utils.execute')
|
||||
|
@ -223,13 +223,37 @@ def pick_disk_driver_name(hypervisor_version, is_block_dev=False):
|
||||
else:
|
||||
# 4002000 == 4.2.0
|
||||
if hypervisor_version >= 4002000:
|
||||
return 'qemu'
|
||||
# 4000000 == 4.0.0
|
||||
elif hypervisor_version > 4000000:
|
||||
return "tap2"
|
||||
else:
|
||||
return "tap"
|
||||
|
||||
try:
|
||||
execute('xend', 'status',
|
||||
run_as_root=True, check_exit_code=True)
|
||||
except OSError as exc:
|
||||
if exc.errno == errno.ENOENT:
|
||||
LOG.debug("xend is not found")
|
||||
# libvirt will try to use libxl toolstack
|
||||
return 'qemu'
|
||||
else:
|
||||
raise
|
||||
except processutils.ProcessExecutionError as exc:
|
||||
LOG.debug("xend is not started")
|
||||
# libvirt will try to use libxl toolstack
|
||||
return 'qemu'
|
||||
# libvirt will use xend/xm toolstack
|
||||
try:
|
||||
out, err = execute('tap-ctl', 'check', check_exit_code=False)
|
||||
if out == 'ok\n':
|
||||
# 4000000 == 4.0.0
|
||||
if hypervisor_version > 4000000:
|
||||
return "tap2"
|
||||
else:
|
||||
return "tap"
|
||||
else:
|
||||
LOG.info(_LI("tap-ctl check: %s"), out)
|
||||
except OSError as exc:
|
||||
if exc.errno == errno.ENOENT:
|
||||
LOG.debug("tap-ctl tool is not installed")
|
||||
else:
|
||||
raise
|
||||
return "file"
|
||||
elif CONF.libvirt.virt_type in ('kvm', 'qemu'):
|
||||
return "qemu"
|
||||
else:
|
||||
|
Loading…
Reference in New Issue
Block a user