QueryVirtualDiskUuid is only available on an ESX(i) server. vCenter returns an NotImplemented fault and a GSX server is missing the VirtualDiskManager completely. Therefore only use QueryVirtualDiskUuid with an ESX(i) server and fall back to path as storage volume key for vCenter and GSX server. --- src/esx/esx_storage_driver.c | 36 +++++++++++++++++++++++------ src/esx/esx_vi.c | 50 +++++++++++++++++++++++++++-------------- src/esx/esx_vi.h | 1 + 3 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/esx/esx_storage_driver.c b/src/esx/esx_storage_driver.c index 76f8769..329020b 100644 --- a/src/esx/esx_storage_driver.c +++ b/src/esx/esx_storage_driver.c @@ -783,6 +783,13 @@ esxStorageVolumeLookupByKey(virConnectPtr conn, const char *key) return esxStorageVolumeLookupByPath(conn, key); } + if (!priv->primary->hasQueryVirtualDiskUuid) { + ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", + _("QueryVirtualDiskUuid not avialable, cannot lookup storage " + "volume by UUID")); + return NULL; + } + if (esxVI_EnsureSession(priv->primary) < 0) { return NULL; } @@ -916,7 +923,7 @@ esxStorageVolumeCreateXML(virStoragePoolPtr pool, const char *xmldesc, esxVI_ManagedObjectReference *task = NULL; esxVI_TaskInfoState taskInfoState; char *uuid_string = NULL; - char key[VIR_UUID_STRING_BUFLEN] = ""; + char *key = NULL; virCheckFlags(0, NULL); @@ -1068,14 +1075,26 @@ esxStorageVolumeCreateXML(virStoragePoolPtr pool, const char *xmldesc, goto cleanup; } - if (esxVI_QueryVirtualDiskUuid(priv->primary, datastorePath, - priv->primary->datacenter->_reference, - &uuid_string) < 0) { - goto cleanup; - } + if (priv->primary->hasQueryVirtualDiskUuid) { + if (VIR_ALLOC_N(key, VIR_UUID_STRING_BUFLEN) < 0) { + virReportOOMError(); + goto cleanup; + } - if (esxUtil_ReformatUuid(uuid_string, key) < 0) { - goto cleanup; + if (esxVI_QueryVirtualDiskUuid(priv->primary, datastorePath, + priv->primary->datacenter->_reference, + &uuid_string) < 0) { + goto cleanup; + } + + if (esxUtil_ReformatUuid(uuid_string, key) < 0) { + goto cleanup; + } + } else { + /* Fall back to the path as key */ + if (esxVI_String_DeepCopyValue(&key, datastorePath) < 0) { + goto cleanup; + } } } else { ESX_ERROR(VIR_ERR_INTERNAL_ERROR, @@ -1103,6 +1122,7 @@ esxStorageVolumeCreateXML(virStoragePoolPtr pool, const char *xmldesc, esxVI_FileBackedVirtualDiskSpec_Free(&virtualDiskSpec); esxVI_ManagedObjectReference_Free(&task); VIR_FREE(uuid_string); + VIR_FREE(key); return volume; } diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c index 00e15f0..78cfdfd 100644 --- a/src/esx/esx_vi.c +++ b/src/esx/esx_vi.c @@ -453,6 +453,17 @@ esxVI_Context_Connect(esxVI_Context *ctx, const char *url, return -1; } + if (ctx->productVersion & esxVI_ProductVersion_ESX) { + /* + * FIXME: Actually this should be detected by really calling + * QueryVirtualDiskUuid and checking if a NotImplemented fault is + * returned. But currently we don't deserialized the details of a + * possbile fault and therefore we don't know if the fault was a + * NotImplemented fault or not. + */ + ctx->hasQueryVirtualDiskUuid = true; + } + if (esxVI_Login(ctx, username, password, NULL, &ctx->session) < 0 || esxVI_BuildSelectSetCollection(ctx) < 0) { return -1; @@ -3267,28 +3278,33 @@ esxVI_LookupStorageVolumeKeyByDatastorePath(esxVI_Context *ctx, return -1; } - if (esxVI_LookupFileInfoByDatastorePath(ctx, datastorePath, false, &fileInfo, - esxVI_Occurrence_RequiredItem) < 0) { - goto cleanup; - } - - if (esxVI_VmDiskFileInfo_DynamicCast(fileInfo) != NULL) { - /* VirtualDisks have a UUID, use it as key */ - if (esxVI_QueryVirtualDiskUuid(ctx, datastorePath, - ctx->datacenter->_reference, - &uuid_string) < 0) { + if (ctx->hasQueryVirtualDiskUuid) { + if (esxVI_LookupFileInfoByDatastorePath + (ctx, datastorePath, false, &fileInfo, + esxVI_Occurrence_RequiredItem) < 0) { goto cleanup; } - if (VIR_ALLOC_N(*key, VIR_UUID_STRING_BUFLEN) < 0) { - virReportOOMError(); - goto cleanup; - } + if (esxVI_VmDiskFileInfo_DynamicCast(fileInfo) != NULL) { + /* VirtualDisks have a UUID, use it as key */ + if (esxVI_QueryVirtualDiskUuid(ctx, datastorePath, + ctx->datacenter->_reference, + &uuid_string) < 0) { + goto cleanup; + } - if (esxUtil_ReformatUuid(uuid_string, *key) < 0) { - goto cleanup; + if (VIR_ALLOC_N(*key, VIR_UUID_STRING_BUFLEN) < 0) { + virReportOOMError(); + goto cleanup; + } + + if (esxUtil_ReformatUuid(uuid_string, *key) < 0) { + goto cleanup; + } } - } else { + } + + if (*key == NULL) { /* Other files don't have a UUID, fall back to the path as key */ if (esxVI_String_DeepCopyValue(key, datastorePath) < 0) { goto cleanup; diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h index bd37b05..b205b8c 100644 --- a/src/esx/esx_vi.h +++ b/src/esx/esx_vi.h @@ -167,6 +167,7 @@ struct _esxVI_Context { esxVI_SelectionSpec *selectSet_hostSystemToDatastore; esxVI_SelectionSpec *selectSet_computeResourceToHost; esxVI_SelectionSpec *selectSet_computeResourceToParentToParent; + bool hasQueryVirtualDiskUuid; }; int esxVI_Context_Alloc(esxVI_Context **ctx); -- 1.7.0.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list