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@xxxxxxxxxx> > --- > > 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@xxxxxxxxxx> 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/