ch: Fix cloud-hypervisor version processing

Refactor the version processing logic in ch driver to support versions
from non-release cloud-hypervisor binaries. This version also supports
versions with branch prefixes in them.

Signed-off-by: Praveen K Paladugu <prapal@linux.microsoft.com>
Reviewed-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
Praveen K Paladugu 2023-09-08 17:29:08 -05:00 committed by Martin Kletzander
parent 16ad37c119
commit efeaf5589c
1 changed files with 32 additions and 2 deletions

View File

@ -172,6 +172,29 @@ virCHDriverConfigDispose(void *obj)
#define MIN_VERSION ((15 * 1000000) + (0 * 1000) + (0))
/**
* chPreProcessVersionString:
*
* Returns: a pointer to numerical version without branch/commit info
*/
static char *
chPreProcessVersionString(char *version)
{
char *tmp = strrchr(version, '/');
if (tmp)
version = tmp + 1;
if (version[0] == 'v')
version++;
tmp = strchr(version, '-');
if (tmp)
*tmp = '\0';
return version;
}
int
chExtractVersion(virCHDriver *driver)
{
@ -193,13 +216,20 @@ chExtractVersion(virCHDriver *driver)
tmp = help;
/* expected format: cloud-hypervisor v<major>.<minor>.<micro> */
if ((tmp = STRSKIP(tmp, "cloud-hypervisor v")) == NULL) {
/* Below are example version formats and expected outputs:
* cloud-hypervisor v32.0.0 (expected: 32.0.0)
* cloud-hypervisor v33.0-104-ge0e3779e-dirty (expected: 33.0)
* cloud-hypervisor testing/v32.0.131-1-ga5d6db5c-dirty (expected: 32.0.131)
*/
if ((tmp = STRSKIP(tmp, "cloud-hypervisor ")) == NULL) {
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
_("Unexpected output of cloud-hypervisor binary"));
return -1;
}
tmp = chPreProcessVersionString(tmp);
VIR_DEBUG("Cloud-Hypervisor version detected: %s", tmp);
if (virStringParseVersion(&version, tmp, true) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
_("Unable to parse cloud-hypervisor version: %1$s"), tmp);