On Tue, May 12, 2026 at 06:23:30PM +0200, Martin Kletzander via Devel wrote:
> From: Martin Kletzander <[email protected]>
> 
> The difference is that the usual UUID is supposed to be unique per host
> and instanceUuid should be unique across the whole cluster.  One could
> think of them as HUID and CUID (as the first "U" does apparently mean
> something else in the Broadcom world).  That _would_ be fine for our
> scenario.  However, that piece of information turns out to be false as
> well and the UUID we were using (`config.uuid`, or in VMX the
> `uuid.bios`) can be the same in two machines on the same host.
> 
> Fortunately the `FindByUuid()` function can also search for VMs based on
> their `instanceUuid`, dictated by the so far omitted third parameter.
> Unfortunately that parameter is not parsed (or at least properly) before
> vSphere API 4.0 (the documentation says 2.0, but we are not using that
> namespace and 4.0 is the lowest we can target), which we are not
> specifying in the server returns a 500 HTTP error if we use the
> `instanceUuid` parameter.
> 
> So this patch adds the `SOAPAction: urn:vim25/4.0` header to the cURL
> requests which makes that `FindByUuid()` function work even with the
> `instanceUuid` set, but without any extra labor.
> 
> After that this patch also changes all UUIDs to be parsed from the
> `config.instanceUuid` (or `vc.uuid` in the VMX, but there's a fallback
> to the old `uuid.bios`) and adjusts tests accordingly.
> 
> Last, but not least it changes the parameter to aforementioned function
> to be always true and henceforth all searching ought to be done with the
> more unique ID.
> 
> Resolves: https://redhat.atlassian.net/browse/RHEL-174300
> Signed-off-by: Martin Kletzander <[email protected]>
> ---
>  src/esx/esx_driver.c                     |  8 ++++----
>  src/esx/esx_vi.c                         | 16 ++++++++++++++--
>  src/vmx/vmx.c                            | 10 +++++++---
>  tests/vmx2xmldata/esx-in-the-wild-10.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-11.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-12.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-13.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-14.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-15.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-16.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-17.xml |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-5.xml  |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-6.xml  |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-7.xml  |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-8.xml  |  2 +-
>  tests/vmx2xmldata/esx-in-the-wild-9.xml  |  2 +-
>  16 files changed, 38 insertions(+), 22 deletions(-)
> 
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index 010c62b8e880..7cc54af69239 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -1419,7 +1419,7 @@ esxDomainLookupByID(virConnectPtr conn, int id)
>                                             "configStatus\0"
>                                             "name\0"
>                                             "runtime.powerState\0"
> -                                           "config.uuid\0") < 0 ||
> +                                           "config.instanceUuid\0") < 0 ||
>          esxVI_LookupVirtualMachineList(priv->primary, propertyNameList,
>                                         &virtualMachineList) < 0) {
>          goto cleanup;
> @@ -1522,7 +1522,7 @@ esxDomainLookupByName(virConnectPtr conn, const char 
> *name)
>      if (esxVI_String_AppendValueListToList(&propertyNameList,
>                                             "configStatus\0"
>                                             "runtime.powerState\0"
> -                                           "config.uuid\0") < 0 ||
> +                                           "config.instanceUuid\0") < 0 ||
>          esxVI_LookupVirtualMachineByName(priv->primary, name, 
> propertyNameList,
>                                           &virtualMachine,
>                                           esxVI_Occurrence_RequiredItem) < 0) 
> {
> @@ -4788,7 +4788,7 @@ esxConnectListAllDomains(virConnectPtr conn,
>          if (esxVI_String_AppendValueListToList(&propertyNameList,
>                                                 "configStatus\0"
>                                                 "name\0"
> -                                               "config.uuid\0") < 0) {
> +                                               "config.instanceUuid\0") < 0) 
> {
>              goto cleanup;
>          }
>      }
> @@ -4970,7 +4970,7 @@ esxDomainHasManagedSaveImage(virDomainPtr domain, 
> unsigned int flags)
>  
>      if (esxVI_FindByUuid(priv->primary, 
> priv->primary->datacenter->_reference,
>                           uuid_string, esxVI_Boolean_True,
> -                         esxVI_Boolean_Undefined,
> +                         esxVI_Boolean_True,
>                           &managedObjectReference) < 0) {
>          return -1;
>      }
> diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
> index db006ed16f40..55d5d1478586 100644
> --- a/src/esx/esx_vi.c
> +++ b/src/esx/esx_vi.c
> @@ -300,6 +300,17 @@ esxVI_CURL_Connect(esxVI_CURL *curl, esxUtil_ParsedUri 
> *parsedUri)
>      curl->headers = curl_slist_append(curl->headers,
>                                        "Content-Type: text/xml; 
> charset=UTF-8");
>  
> +    /*
> +     * Testing showed that the 4.0 version is most close to our current 
> types in
> +     * esx_vi_generator.input data.  We could update the version if new 
> method
> +     * parameters or object properties are needed.
> +     *
> +     * The other option is to drop the "/x.y" suffix completely once
> +     * https://gitlab.com/libvirt/libvirt/-/work_items/878 is implemented 
> since
> +     * that will not limit the version at all.
> +     */
> +    curl->headers = curl_slist_append(curl->headers, "SOAPAction: 
> urn:vim25/4.0");
> +
>      /*
>       * Add an empty expect header to stop CURL from waiting for a response 
> code
>       * 100 (Continue) from the server before continuing the POST operation.
> @@ -2452,7 +2463,8 @@ esxVI_GetVirtualMachineIdentity(esxVI_ObjectContent 
> *virtualMachine,
>              for (dynamicProperty = virtualMachine->propSet;
>                   dynamicProperty;
>                   dynamicProperty = dynamicProperty->_next) {
> -                if (STREQ(dynamicProperty->name, "config.uuid")) {
> +
> +                if (STREQ(dynamicProperty->name, "config.instanceUuid")) {
>                      if (esxVI_AnyType_ExpectType(dynamicProperty->val,
>                                                   esxVI_Type_String) < 0) {
>                          goto failure;
> @@ -2682,7 +2694,7 @@ esxVI_LookupVirtualMachineByUuid(esxVI_Context *ctx, 
> const unsigned char *uuid,
>      virUUIDFormat(uuid, uuid_string);
>  
>      if (esxVI_FindByUuid(ctx, ctx->datacenter->_reference, uuid_string,
> -                         esxVI_Boolean_True, esxVI_Boolean_Undefined,
> +                         esxVI_Boolean_True, esxVI_Boolean_True,
>                           &managedObjectReference) < 0) {
>          return -1;
>      }
> diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c
> index 084b4154427f..a2422c37355c 100644
> --- a/src/vmx/vmx.c
> +++ b/src/vmx/vmx.c
> @@ -1492,9 +1492,13 @@ virVMXParseConfig(virVMXContext *ctx,
>          def->scsiBusMaxUnit = SCSI_SUPER_WIDE_BUS_MAX_CONT_UNIT;
>      }
>  
> -    /* vmx:uuid.bios -> def:uuid */
> -    /* FIXME: Need to handle 'uuid.action = "create"' */
> -    if (virVMXGetConfigUUID(conf, "uuid.bios", def->uuid, true) < 0)
> +    /* vmx:vc.uuid (fallback to uuid.bios) -> def:uuid */
> +    if (virVMXGetConfigUUID(conf, "vc.uuid", def->uuid, true) < 0)
> +        goto cleanup;
> +
> +    /* FIXME: Need to handle 'uuid.action = "create"' ? */
> +    if (!virUUIDIsValid(def->uuid) &&
> +        virVMXGetConfigUUID(conf, "uuid.bios", def->uuid, true) < 0)
>          goto cleanup;
>  
>      /* vmx:displayName -> def:name */
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-10.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-10.xml
> index 1b1fdf06623f..3a8bb20140a1 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-10.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-10.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>w2019biosvmware</name>
> -  <uuid>421a6177-5aa9-abb7-5924-fc376c18a1b4</uuid>
> +  <uuid>501af9f2-6d29-1c76-19a9-b208ede5f374</uuid>
>    <genid>13c67c91-9f47-526f-b0d6-e4dd2e4bb4f9</genid>
>    <memory unit='KiB'>4194304</memory>
>    <currentMemory unit='KiB'>4194304</currentMemory>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-11.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-11.xml
> index 0dd297af43f0..6398e50c5c6c 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-11.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-11.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>esx6.7-rhel7.7-x86_64</name>
> -  <uuid>422c0152-63ab-cd03-9650-4301ae77aefd</uuid>
> +  <uuid>502ca229-12eb-24f6-0c37-c025ff5da005</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>1</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-12.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-12.xml
> index ac83982b9b88..d505ff58d12d 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-12.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-12.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>Auto-esx8.0-rhell9.3-efi-with-empty-cdrom</name>
> -  <uuid>4220fca7-11dd-d67e-19cc-fcad0a37c342</uuid>
> +  <uuid>5020ca5b-7ac1-5c44-cfa1-9e762e2f933b</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>1</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-13.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-13.xml
> index cef9fd4e48c9..2bea51a087eb 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-13.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-13.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>Test-Mig-VM-1 (01ce57d0-4e20-41a5-8b6c-bcbf49a032ec)</name>
> -  <uuid>421eb458-5448-fc12-2074-83d5e419e138</uuid>
> +  <uuid>01ce57d0-4e20-41a5-8b6c-bcbf49a032ec</uuid>
>    <description>name:Test-Mig-VM-1
>  userid:962314ba515c48388a0e95c0961709ff
>  username:admin
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-14.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-14.xml
> index f10707d1d412..574dd2097455 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-14.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-14.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>wild14</name>
> -  <uuid>421b223a-f2c1-c7c9-a399-34d2d9fde26d</uuid>
> +  <uuid>501b831e-75d8-15f8-36fa-b9e225f395aa</uuid>
>    <description>execution env sandbox automation platform</description>
>    <memory unit='KiB'>33554432</memory>
>    <currentMemory unit='KiB'>33554432</currentMemory>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-15.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-15.xml
> index 78d15e1538e6..4c753f87e2ea 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-15.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-15.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>dokuwiki</name>
> -  <uuid>420338bd-1c9e-ad50-99a2-59e92ddda8b6</uuid>
> +  <uuid>500341d5-fe23-ac46-8cb3-77a8e5a1143d</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>2</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-16.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-16.xml
> index 51746dd77ef0..8c5bc7f43513 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-16.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-16.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>Auto-esx8.0-rhel9.4-efi-nvme-disk</name>
> -  <uuid>4220df89-e3a8-8513-f611-ad252bfd7047</uuid>
> +  <uuid>5020196e-c5c8-7310-fcdb-d2933d0c4b2f</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>1</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-17.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-17.xml
> index 725f21bdf601..506e08fc54ec 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-17.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-17.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>esx8.0-win11-with-second-disk-in-subfolder</name>
> -  <uuid>42256ec1-e066-9364-3dd1-36a0b75263dd</uuid>
> +  <uuid>50250f27-538b-5091-a43b-a50ce95f2382</uuid>
>    <genid>3191ed70-eb21-9c71-2478-373fb27fed9b</genid>
>    <memory unit='KiB'>4194304</memory>
>    <currentMemory unit='KiB'>4194304</currentMemory>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-5.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-5.xml
> index c88e60bdc070..a86119508c70 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-5.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-5.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>vmtest.local</name>
> -  <uuid>423e94a9-a1c7-b31d-7161-76c7586c830e</uuid>
> +  <uuid>503e06db-f8d5-458e-a2fb-f9820253a7be</uuid>
>    <description>Centos 5.5 64bit Server</description>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-6.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-6.xml
> index 805f03356129..f252304f9796 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-6.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-6.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>el6-test</name>
> -  <uuid>564d15d4-d062-fe9a-80f5-eb8e1a2c3afc</uuid>
> +  <uuid>5200b69b-8d88-7bdf-a14a-02705d653772</uuid>
>    <memory unit='KiB'>1048576</memory>
>    <currentMemory unit='KiB'>1048576</currentMemory>
>    <vcpu placement='static'>1</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-7.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-7.xml
> index b641574776b6..076655f37ac2 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-7.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-7.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>esx-rhel6-mini-with-scsi-device</name>
> -  <uuid>564d9176-621f-0239-f5ad-3a002371953b</uuid>
> +  <uuid>52409533-33a2-56c5-36ce-80d605f8ecf4</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>1</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-8.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-8.xml
> index f13e6f744880..2ef609e87bdb 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-8.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-8.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>RHEL7_10_NICs</name>
> -  <uuid>42359420-99dc-4261-5264-ba58ddae20e4</uuid>
> +  <uuid>50351de6-7d56-29ab-9d72-c7f9ea3fcfd0</uuid>
>    <memory unit='KiB'>2097152</memory>
>    <currentMemory unit='KiB'>2097152</currentMemory>
>    <vcpu placement='static'>8</vcpu>
> diff --git a/tests/vmx2xmldata/esx-in-the-wild-9.xml 
> b/tests/vmx2xmldata/esx-in-the-wild-9.xml
> index 6b4d878ab18a..4fbe141f6c47 100644
> --- a/tests/vmx2xmldata/esx-in-the-wild-9.xml
> +++ b/tests/vmx2xmldata/esx-in-the-wild-9.xml
> @@ -1,6 +1,6 @@
>  <domain type='vmware'>
>    <name>v2v-windows-kkulkarn</name>
> -  <uuid>42009372-17da-be73-779d-007ccf1bd228</uuid>
> +  <uuid>5000d2b0-616e-6129-8c06-82b07440a871</uuid>
>    <description>MIQ GUID=b55c806d-99b9-4fa5-bbcc-a4de04f822e5</description>
>    <memory unit='KiB'>16777216</memory>
>    <currentMemory unit='KiB'>16777216</currentMemory>
> -- 
> 2.54.0

I tested this on vSphere 8 & 9 (ESXi and vCenter) and it seems to work
fine.

The <uuid/> field changed (as expected), and I saw new fields for
<nvram/> amd <tpm/> which have been added in the latest libvirt
compared to the one installed on Fedora 43.  All looks good, so:

Tested-by: Richard W.M. Jones <[email protected]>

One thing I did notice (unrelated to this patch) is that tab-
completion in virsh seems to hang.  I'm unable to recover even with ^C ...

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
nbdkit - Flexible, fast NBD server with plugins
https://gitlab.com/nbdkit/nbdkit

Reply via email to