[libvirt] [PATCH] esx: Expose host UUID in the capabilities XML
Stefan Berger
stefanb at linux.vnet.ibm.com
Wed May 26 12:16:21 UTC 2010
On Wed, 2010-05-26 at 13:15 +0200, Matthias Bolte wrote:
> Parse the BIOS UUID. This information may not be available, in that
> case no host UUID is exposed in the capabilities XML.
> ---
> src/esx/esx_driver.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 files changed, 67 insertions(+), 0 deletions(-)
>
> diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
> index 7c9c50e..b89de72 100644
> --- a/src/esx/esx_driver.c
> +++ b/src/esx/esx_driver.c
> @@ -141,6 +141,69 @@ esxSupportsLongMode(esxPrivate *priv)
>
>
>
> +static int
> +esxLookupHostSystemBiosUuid(esxPrivate *priv, unsigned char *uuid)
> +{
> + int result = -1;
> + esxVI_String *propertyNameList = NULL;
> + esxVI_ObjectContent *hostSystem = NULL;
> + esxVI_DynamicProperty *dynamicProperty = NULL;
> +
> + if (esxVI_EnsureSession(priv->host) < 0) {
> + return -1;
> + }
> +
> + if (esxVI_String_AppendValueToList(&propertyNameList,
> + "hardware.systemInfo.uuid") < 0 ||
> + esxVI_LookupObjectContentByType(priv->host, priv->host->hostFolder,
> + "HostSystem", propertyNameList,
> + esxVI_Boolean_True, &hostSystem) < 0) {
> + goto cleanup;
> + }
> +
> + if (hostSystem == NULL) {
> + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
> + _("Could not retrieve the HostSystem object"));
> + goto cleanup;
> + }
> +
> + for (dynamicProperty = hostSystem->propSet; dynamicProperty != NULL;
> + dynamicProperty = dynamicProperty->_next) {
> + if (STREQ(dynamicProperty->name, "hardware.systemInfo.uuid")) {
> + if (esxVI_AnyType_ExpectType(dynamicProperty->val,
> + esxVI_Type_String) < 0) {
> + goto cleanup;
> + }
> +
> + if (strlen(dynamicProperty->val->string) > 0) {
> + if (virUUIDParse(dynamicProperty->val->string, uuid) < 0) {
If the UUID is malformatted it may end up writing a couple of bytes into
uuid and then terminate. Maybe do the memset below also here?
> + ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
> + _("Could not parse UUID from string '%s'"),
> + dynamicProperty->val->string);
> + goto cleanup;
> + }
> + } else {
> + /* HostSystem has an empty UUID */
> + memset(uuid, 0, VIR_UUID_BUFLEN);
> + }
> +
> + break;
> + } else {
> + VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
> + }
> + }
> +
> + result = 0;
> +
> + cleanup:
> + esxVI_String_Free(&propertyNameList);
> + esxVI_ObjectContent_Free(&hostSystem);
> +
> + return result;
> +}
> +
> +
> +
> static virCapsPtr
> esxCapsInit(esxPrivate *priv)
> {
> @@ -166,6 +229,10 @@ esxCapsInit(esxPrivate *priv)
> virCapabilitiesSetMacPrefix(caps, (unsigned char[]){ 0x00, 0x0c, 0x29 });
> virCapabilitiesAddHostMigrateTransport(caps, "esx");
>
> + if (esxLookupHostSystemBiosUuid(priv, caps->host.host_uuid) < 0) {
> + goto failure;
> + }
> +
> /* i686 */
> guest = virCapabilitiesAddGuest(caps, "hvm", "i686", 32, NULL, NULL, 0,
> NULL);
Otherwise it looks good to me. ACK.
Stefan
More information about the libvir-list
mailing list