[PATCH] vmx: Parse vm.genid

Richard W.M. Jones rjones at redhat.com
Fri Jul 30 12:02:30 UTC 2021


On Thu, Jul 29, 2021 at 10:30:30AM +0200, Michal Privoznik wrote:
> The VMware metadata file contains genid but we are not parsing
> and thus reporting it in domain XML. However, it's not as
> straightforward as one might think. The UUID reported by VMware
> is not in its usual string form, but split into two signed long
> longs. That means, we have to do a bit of trickery when parsing.
> But looking around it's the same magic that libguestfs does:
> 
> https://github.com/libguestfs/virt-v2v/blob/master/v2v/input_vmx.ml#L421
> 
> It's also explained by Rich on qemu-devel:
> 
> https://lists.nongnu.org/archive/html/qemu-devel/2018-07/msg02019.html
> 
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1598348
> Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> ---
> 
> I've successfully ran vmx2xmltest on an s390x machine which means that
> there shouldn't be any endiandness problem.
> 
>  src/vmx/vmx.c                                 | 30 +++++++++++++++++++
>  .../vmx2xml-esx-in-the-wild-10.xml            |  1 +
>  2 files changed, 31 insertions(+)
> 
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 1cd5a82227..04eabff18a 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -1337,6 +1337,32 @@ virVMXConfigScanResultsCollector(const char* name,
>  }
>  
>  
> +static int
> +virVMXParseGenID(virConf *conf,
> +                 virDomainDef *def)
> +{
> +    long long vmid[2] = { 0 };
> +    g_autofree char *uuidstr = NULL;
> +
> +    if (virVMXGetConfigLong(conf, "vm.genid", &vmid[0], 0, true) < 0 ||
> +        virVMXGetConfigLong(conf, "vm.genidX", &vmid[1], 0, true) < 0)
> +        return -1;
> +
> +    if (vmid[0] == 0 && vmid[1] == 0)
> +        return 0;
> +
> +    uuidstr = g_strdup_printf("%.16llx%.16llx", vmid[0], vmid[1]);
> +    if (virUUIDParse(uuidstr, def->genid) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       _("Could not parse UUID from string '%s'"), uuidstr);
> +        return -1;
> +    }
> +    def->genidRequested = true;
> +
> +    return 0;
> +}
> +
> +
>  
>  /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
>   * VMX -> Domain XML
> @@ -1466,6 +1492,10 @@ virVMXParseConfig(virVMXContext *ctx,
>          }
>      }
>  
> +    /* vmx:vm.genid + vm.genidX -> def:genid */
> +    if (virVMXParseGenID(conf, def) < 0)
> +        goto cleanup;
> +
>      /* vmx:annotation -> def:description */
>      if (virVMXGetConfigString(conf, "annotation", &def->description,
>                                true) < 0) {
> diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml
> index b8c522af1f..47ed637920 100644
> --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml
> +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml
> @@ -1,6 +1,7 @@
>  <domain type='vmware'>
>    <name>w2019biosvmware</name>
>    <uuid>421a6177-5aa9-abb7-5924-fc376c18a1b4</uuid>
> +  <genid>13c67c91-9f47-526f-b0d6-e4dd2e4bb4f9</genid>
>    <memory unit='KiB'>4194304</memory>
>    <currentMemory unit='KiB'>4194304</currentMemory>
>    <vcpu placement='static'>2</vcpu>

Looked reasonable and seems to match the description here:

https://lists.nongnu.org/archive/html/qemu-devel/2018-07/msg02019.html

Reviewed-by: Richard W.M. Jones <rjones at redhat.com>

Out of interest, what is this being consumed by?  I will add this to
virt-v2v when it goes upstream.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the libvir-list mailing list