From f6e88f611359d617caef2cecbfb02a56cbc2bde4 Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Mon, 17 Jul 2023 15:05:19 +0200 Subject: [PATCH] virsh: Make cmdVersion() work with split daemon When virsh connects to a non-hypervisor daemon directly (e.g. "nodedev:///system") and user executes 'version' they are met with an error message. This is because cmdVersion() calls virConnectGetVersion() which fails, hence the error. The reason for virConnectGetVersion() fail is simple - it's documented as: Get the version level of the Hypervisor running. Well, there's no hypervisor in non-hypervisor daemons and thus it doesn't make sense to provide an implementation in each driver's virConnectDriver.hypervisorDriver table (just like we do for other APIs, e.g. nodeConnectIsSecure()). Given all of this, just make cmdVersion() deal with the error in a non-fatal fashion. Signed-off-by: Michal Privoznik Reviewed-by: Peter Krempa --- tools/virsh-host.c | 29 +++++++++++++++++------------ 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/tools/virsh-host.c b/tools/virsh-host.c index 0bda327cae..ad440d5123 100644 --- a/tools/virsh-host.c +++ b/tools/virsh-host.c @@ -1448,20 +1448,25 @@ cmdVersion(vshControl *ctl, const vshCmd *cmd G_GNUC_UNUSED) major, minor, rel); if (virConnectGetVersion(priv->conn, &hvVersion) < 0) { - vshError(ctl, "%s", _("failed to get the hypervisor version")); - return false; - } - if (hvVersion == 0) { - vshPrint(ctl, - _("Cannot extract running %1$s hypervisor version\n"), hvType); + if (last_error->code == VIR_ERR_NO_SUPPORT) { + vshResetLibvirtError(); + } else { + vshError(ctl, "%s", _("failed to get the hypervisor version")); + return false; + } } else { - major = hvVersion / 1000000; - hvVersion %= 1000000; - minor = hvVersion / 1000; - rel = hvVersion % 1000; + if (hvVersion == 0) { + vshPrint(ctl, + _("Cannot extract running %1$s hypervisor version\n"), hvType); + } else { + major = hvVersion / 1000000; + hvVersion %= 1000000; + minor = hvVersion / 1000; + rel = hvVersion % 1000; - vshPrint(ctl, _("Running hypervisor: %1$s %2$d.%3$d.%4$d\n"), - hvType, major, minor, rel); + vshPrint(ctl, _("Running hypervisor: %1$s %2$d.%3$d.%4$d\n"), + hvType, major, minor, rel); + } } if (vshCommandOptBool(cmd, "daemon")) {