diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index 98b271f26682d401bcedfb5d907b25d3a7f4c979..bcb2db08b16c18162fb2067b49f1e91f1c19ba03 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -581,6 +581,14 @@ class KVMHypervisor(hv_base.BaseHypervisor): _KVM_NETWORK_SCRIPT, ] + # Supported kvm options to get output from + _KVMOPT_HELP = "help" + _KVMOPT_MLIST = "mlist" + _KVMOPTS_CMDS = { + _KVMOPT_HELP: ["--help"], + _KVMOPT_MLIST: ["-M", "?"], + } + def __init__(self): hv_base.BaseHypervisor.__init__(self) # Let's make sure the directories we need exist, even if the RUN_DIR lives @@ -1642,7 +1650,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): """ self._CheckDown(instance.name) kvmpath = instance.hvparams[constants.HV_KVM_PATH] - kvmhelp = self._GetKVMHelpOutput(kvmpath) + kvmhelp = self._GetKVMOutput(kvmpath, self._KVMOPT_HELP) kvm_runtime = self._GenerateKVMRuntime(instance, block_devices, startup_paused, kvmhelp) self._SaveKVMRuntime(instance, kvm_runtime) @@ -1690,16 +1698,19 @@ class KVMHypervisor(hv_base.BaseHypervisor): return (v_all, v_maj, v_min, v_rev) @classmethod - def _GetKVMHelpOutput(cls, kvm_path): - """Return the KVM help output. + def _GetKVMOutput(cls, kvm_path, option): + """Return the output of a kvm invocation - @return: output of kvm --help + @return: output a supported kvm invocation @raise errors.HypervisorError: when the KVM help output cannot be retrieved """ - result = utils.RunCmd([kvm_path, "--help"]) + assert option in cls._KVMOPTS_CMDS, "Invalid output option" + + result = utils.RunCmd([kvm_path] + cls._KVMOPTS_CMDS[option]) if result.failed: - raise errors.HypervisorError("Unable to get KVM help output") + raise errors.HypervisorError("Unable to get KVM % output" % + ' '.join(cls._KVMOPTS_CMDS[option])) return result.output @classmethod @@ -1710,27 +1721,14 @@ class KVMHypervisor(hv_base.BaseHypervisor): @raise errors.HypervisorError: when the KVM version cannot be retrieved """ - return cls._ParseKVMVersion(cls._GetKVMHelpOutput(kvm_path)) - - @classmethod - def _GetKVMSupportedMachinesOutput(cls, kvm_path): - """Return the output regarding supported machine versions. - - @return: output of kvm -M ? - @raise errors.HypervisorError: when the KVM help output cannot be retrieved - - """ - result = utils.RunCmd([kvm_path, "-M", "?"]) - if result.failed: - raise errors.HypervisorError("Unable to get kvm -M ? output") - return result.output + return cls._ParseKVMVersion(cls._GetKVMOutput(kvm_path, cls._KVMOPT_HELP)) @classmethod def _GetDefaultMachineVersion(cls, kvm_path): """Return the default hardware revision (e.g. pc-1.1) """ - output = cls._GetKVMSupportedMachinesOutput(kvm_path) + output = cls._GetKVMOutput(kvm_path, cls._KVMOPT_MLIST) match = cls._DEFAULT_MACHINE_VERSION_RE.search(output) if match: return match.group(1) @@ -1784,7 +1782,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): # ...and finally we can save it again, and execute it... self._SaveKVMRuntime(instance, kvm_runtime) kvmpath = instance.hvparams[constants.HV_KVM_PATH] - kvmhelp = self._GetKVMHelpOutput(kvmpath) + kvmhelp = self._GetKVMOutput(kvmpath, self._KVMOPT_HELP) self._ExecuteKVMRuntime(instance, kvm_runtime, kvmhelp) def MigrationInfo(self, instance): @@ -1812,7 +1810,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): kvm_runtime = self._LoadKVMRuntime(instance, serialized_runtime=info) incoming_address = (target, instance.hvparams[constants.HV_MIGRATION_PORT]) kvmpath = instance.hvparams[constants.HV_KVM_PATH] - kvmhelp = self._GetKVMHelpOutput(kvmpath) + kvmhelp = self._GetKVMOutput(kvmpath, self._KVMOPT_HELP) self._ExecuteKVMRuntime(instance, kvm_runtime, kvmhelp, incoming=incoming_address) @@ -2124,7 +2122,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): " given time.") # check that KVM supports SPICE - kvmhelp = cls._GetKVMHelpOutput(kvm_path) + kvmhelp = cls._GetKVMOutput(kvm_path, cls._KVMOPT_HELP) if not cls._SPICE_RE.search(kvmhelp): raise errors.HypervisorError("spice is configured, but it is not" " supported according to kvm --help") @@ -2139,7 +2137,7 @@ class KVMHypervisor(hv_base.BaseHypervisor): machine_version = hvparams[constants.HV_KVM_MACHINE_VERSION] if machine_version: - output = cls._GetKVMSupportedMachinesOutput(kvm_path) + output = cls._GetKVMOutput(kvm_path, cls._KVMOPT_MLIST) if not cls._CHECK_MACHINE_VERSION_RE(machine_version).search(output): raise errors.HypervisorError("Unsupported machine version: %s" % machine_version)