]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
vmx: Parse vm.genid
authorMichal Privoznik <mprivozn@redhat.com>
Wed, 28 Jul 2021 11:32:10 +0000 (13:32 +0200)
committerMichal Privoznik <mprivozn@redhat.com>
Mon, 2 Aug 2021 10:54:17 +0000 (12:54 +0200)
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@redhat.com>
Reviewed-by: Richard W.M. Jones <rjones@redhat.com>
src/vmx/vmx.c
tests/vmx2xmldata/vmx2xml-esx-in-the-wild-10.xml

index 1cd5a8222739ae2b16852325e84e079ffe91a336..04eabff18afbbd1906f081420a47326c083ccd65 100644 (file)
@@ -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) {
index b8c522af1f0f13a27595b658647626ed2058ce86..47ed637920a66cf235751755022d61d7a28b2b4c 100644 (file)
@@ -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>