Revision 0ad7f5d8 lib/hypervisor/hv_kvm.py
b/lib/hypervisor/hv_kvm.py | ||
---|---|---|
555 | 555 |
|
556 | 556 |
_DEFAULT_MACHINE_VERSION_RE = re.compile(r"(\S+).*\(default\)") |
557 | 557 |
|
558 |
_QMP_RE = re.compile(r"^-qmp\s", re.M) |
|
559 |
_SPICE_RE = re.compile(r"^-spice\s", re.M) |
|
560 |
_VHOST_RE = re.compile(r"^-net\s.*,vhost=on|off", re.M) |
|
561 |
_ENABLE_KVM_RE = re.compile(r"^-enable-kvm\s", re.M) |
|
562 |
_DISABLE_KVM_RE = re.compile(r"^-disable-kvm\s", re.M) |
|
563 |
_NETDEV_RE = re.compile(r"^-netdev\s", re.M) |
|
564 |
# match -drive.*boot=on|off on different lines, but in between accept only |
|
565 |
# dashes not preceeded by a new line (which would mean another option |
|
566 |
# different than -drive is starting) |
|
567 |
_BOOT_RE = re.compile(r"^-drive\s([^-]|(?<!^)-)*,boot=on\|off", re.M | re.S) |
|
568 |
|
|
558 | 569 |
ANCILLARY_FILES = [ |
559 | 570 |
_KVM_NETWORK_SCRIPT, |
560 | 571 |
] |
... | ... | |
1004 | 1015 |
|
1005 | 1016 |
""" |
1006 | 1017 |
# pylint: disable=R0912,R0914,R0915 |
1007 |
_, v_major, v_min, _ = self._GetKVMVersion()
|
|
1018 |
kvmhelp = self._GetKVMHelpOutput()
|
|
1008 | 1019 |
hvp = instance.hvparams |
1009 | 1020 |
|
1010 | 1021 |
pidfile = self._InstancePidFile(instance.name) |
... | ... | |
1048 | 1059 |
if startup_paused: |
1049 | 1060 |
kvm_cmd.extend([_KVM_START_PAUSED_FLAG]) |
1050 | 1061 |
|
1051 |
if hvp[constants.HV_KVM_FLAG] == constants.HT_KVM_ENABLED: |
|
1062 |
if (hvp[constants.HV_KVM_FLAG] == constants.HT_KVM_ENABLED and |
|
1063 |
self._ENABLE_KVM_RE.search(kvmhelp)): |
|
1052 | 1064 |
kvm_cmd.extend(["-enable-kvm"]) |
1053 |
elif hvp[constants.HV_KVM_FLAG] == constants.HT_KVM_DISABLED: |
|
1065 |
elif (hvp[constants.HV_KVM_FLAG] == constants.HT_KVM_DISABLED and |
|
1066 |
self._DISABLE_KVM_RE.search(kvmhelp)): |
|
1054 | 1067 |
kvm_cmd.extend(["-disable-kvm"]) |
1055 | 1068 |
|
1056 | 1069 |
if boot_network: |
... | ... | |
1058 | 1071 |
|
1059 | 1072 |
# whether this is an older KVM version that uses the boot=on flag |
1060 | 1073 |
# on devices |
1061 |
needs_boot_flag = (v_major, v_min) < (0, 14)
|
|
1074 |
needs_boot_flag = self._BOOT_RE.search(kvmhelp)
|
|
1062 | 1075 |
|
1063 | 1076 |
disk_type = hvp[constants.HV_DISK_TYPE] |
1064 | 1077 |
if disk_type == constants.HT_DISK_PARAVIRTUAL: |
... | ... | |
1415 | 1428 |
kvm_cmd, kvm_nics, up_hvp = kvm_runtime |
1416 | 1429 |
up_hvp = objects.FillDict(conf_hvp, up_hvp) |
1417 | 1430 |
|
1418 |
_, v_major, v_min, _ = self._GetKVMVersion() |
|
1431 |
kvmhelp = self._GetKVMHelpOutput() |
|
1432 |
_, v_major, v_min, _ = self._ParseKVMVersion(kvmhelp) |
|
1419 | 1433 |
|
1420 | 1434 |
# We know it's safe to run as a different user upon migration, so we'll use |
1421 | 1435 |
# the latest conf, from conf_hvp. |
... | ... | |
1454 | 1468 |
|
1455 | 1469 |
if up_hvp[constants.HV_VHOST_NET]: |
1456 | 1470 |
# vhost_net is only available from version 0.13.0 or newer |
1457 |
if (v_major, v_min) >= (0, 13):
|
|
1471 |
if self._VHOST_RE.search(kvmhelp):
|
|
1458 | 1472 |
tap_extra = ",vhost=on" |
1459 | 1473 |
else: |
1460 | 1474 |
raise errors.HypervisorError("vhost_net is configured" |
... | ... | |
1466 | 1480 |
tapname, tapfd = _OpenTap(vnet_hdr) |
1467 | 1481 |
tapfds.append(tapfd) |
1468 | 1482 |
taps.append(tapname) |
1469 |
if (v_major, v_min) >= (0, 12):
|
|
1483 |
if self._NETDEV_RE.search(kvmhelp):
|
|
1470 | 1484 |
nic_val = "%s,mac=%s,netdev=netdev%s" % (nic_model, nic.mac, nic_seq) |
1471 | 1485 |
tap_val = "type=tap,id=netdev%s,fd=%d%s" % (nic_seq, tapfd, tap_extra) |
1472 | 1486 |
kvm_cmd.extend(["-netdev", tap_val, "-device", nic_val]) |
... | ... | |
1497 | 1511 |
constants.SECURE_DIR_MODE)]) |
1498 | 1512 |
|
1499 | 1513 |
# Automatically enable QMP if version is >= 0.14 |
1500 |
if (v_major, v_min) >= (0, 14):
|
|
1514 |
if self._QMP_RE.search(kvmhelp):
|
|
1501 | 1515 |
logging.debug("Enabling QMP") |
1502 | 1516 |
kvm_cmd.extend(["-qmp", "unix:%s,server,nowait" % |
1503 | 1517 |
self._InstanceQmpMonitor(instance.name)]) |
... | ... | |
2054 | 2068 |
" given time.") |
2055 | 2069 |
|
2056 | 2070 |
# KVM version should be >= 0.14.0 |
2057 |
_, v_major, v_min, _ = cls._GetKVMVersion()
|
|
2058 |
if (v_major, v_min) < (0, 14):
|
|
2071 |
kvmhelp = cls._GetKVMHelpOutput()
|
|
2072 |
if not cls._SPICE_RE.search(kvmhelp):
|
|
2059 | 2073 |
raise errors.HypervisorError("spice is configured, but it is not" |
2060 |
" available in versions of KVM < 0.14")
|
|
2074 |
" supported according to kvm --help")
|
|
2061 | 2075 |
|
2062 | 2076 |
# if spice_bind is not an IP address, it must be a valid interface |
2063 | 2077 |
bound_to_addr = (netutils.IP4Address.IsValid(spice_bind) |
Also available in: Unified diff