diff --git a/lib/hypervisor/hv_kvm.py b/lib/hypervisor/hv_kvm.py index 20fddca5371dc7fe4c102f625b014d5ade761bfc..7a0a209f4c1a0932d55295c62faeb62e0d9c8d8d 100644 --- a/lib/hypervisor/hv_kvm.py +++ b/lib/hypervisor/hv_kvm.py @@ -589,10 +589,13 @@ class KVMHypervisor(hv_base.BaseHypervisor): _KVMOPT_HELP = "help" _KVMOPT_MLIST = "mlist" _KVMOPT_DEVICELIST = "devicelist" + + # Command to execute to get the output from kvm, and whether to + # accept the output even on failure. _KVMOPTS_CMDS = { - _KVMOPT_HELP: ["--help"], - _KVMOPT_MLIST: ["-M", "?"], - _KVMOPT_DEVICELIST: ["-device", "?"], + _KVMOPT_HELP: (["--help"], False), + _KVMOPT_MLIST: (["-M", "?"], False), + _KVMOPT_DEVICELIST: (["-device", "?"], True), } def __init__(self): @@ -1713,14 +1716,20 @@ class KVMHypervisor(hv_base.BaseHypervisor): def _GetKVMOutput(cls, kvm_path, option): """Return the output of a kvm invocation + @type kvm_path: string + @param kvm_path: path to the kvm executable + @type option: a key of _KVMOPTS_CMDS + @param option: kvm option to fetch the output from @return: output a supported kvm invocation @raise errors.HypervisorError: when the KVM help output cannot be retrieved """ assert option in cls._KVMOPTS_CMDS, "Invalid output option" - result = utils.RunCmd([kvm_path] + cls._KVMOPTS_CMDS[option]) - if result.failed: + optlist, can_fail = cls._KVMOPTS_CMDS[option] + + result = utils.RunCmd([kvm_path] + optlist) + if result.failed and not can_fail: raise errors.HypervisorError("Unable to get KVM %s output" % " ".join(cls._KVMOPTS_CMDS[option])) return result.output