[libvirt] [PATCH REPOST] esx: Add read-only storage volume access

Matthias Bolte matthias.bolte at googlemail.com
Thu Aug 26 21:50:53 UTC 2010


2010/8/23 Daniel P. Berrange <berrange at redhat.com>:
> On Mon, Aug 23, 2010 at 12:25:19AM +0200, Matthias Bolte wrote:
>> This allows to list existing volumes and to retrieve information
>> about them.
>> ---
>>  src/esx/esx_driver.c           |  112 +----------
>>  src/esx/esx_storage_driver.c   |  433 +++++++++++++++++++++++++++++++++++++++-
>>  src/esx/esx_vi.c               |  279 ++++++++++++++++++++++++++
>>  src/esx/esx_vi.h               |    9 +
>>  src/esx/esx_vi_generator.input |    7 +
>>  5 files changed, 724 insertions(+), 116 deletions(-)
>> +static char *
>> +esxStorageVolumeDumpXML(virStorageVolPtr volume, unsigned int flags)
>> +{
>> +    esxPrivate *priv = volume->conn->storagePrivateData;
>> +    esxVI_String *propertyNameList = NULL;
>> +    esxVI_ObjectContent *datastore = NULL;
>> +    esxVI_DynamicProperty *dynamicProperty = NULL;
>> +    esxVI_DatastoreInfo *datastoreInfo = NULL;
>> +    virStoragePoolDef pool;
>> +    char *datastorePath = NULL;
>> +    esxVI_FileInfo *fileInfo = NULL;
>> +    esxVI_VmDiskFileInfo *vmDiskFileInfo = NULL;
>> +    esxVI_IsoImageFileInfo *isoImageFileInfo = NULL;
>> +    esxVI_FloppyImageFileInfo *floppyImageFileInfo = NULL;
>> +    virStorageVolDef def;
>> +    char *xml = NULL;
>> +
>> +    virCheckFlags(0, NULL);
>> +
>> +    memset(&pool, 0, sizeof (pool));
>> +    memset(&def, 0, sizeof (def));
>> +
>> +    if (esxVI_EnsureSession(priv->primary) < 0) {
>> +        return NULL;
>> +    }
>> +
>> +    /* Lookup storage pool type */
>> +    if (esxVI_String_AppendValueToList(&propertyNameList, "info") < 0 ||
>> +        esxVI_LookupDatastoreByName(priv->primary, volume->pool,
>> +                                    propertyNameList, &datastore,
>> +                                    esxVI_Occurrence_RequiredItem) < 0) {
>> +        goto cleanup;
>> +    }
>> +
>> +    for (dynamicProperty = datastore->propSet; dynamicProperty != NULL;
>> +         dynamicProperty = dynamicProperty->_next) {
>> +        if (STREQ(dynamicProperty->name, "info")) {
>> +            if (esxVI_DatastoreInfo_CastFromAnyType(dynamicProperty->val,
>> +                                                    &datastoreInfo) < 0) {
>> +                goto cleanup;
>> +            }
>> +
>> +            break;
>> +        }
>> +    }
>> +
>> +    if (esxVI_LocalDatastoreInfo_DynamicCast(datastoreInfo) != NULL) {
>> +        pool.type = VIR_STORAGE_POOL_DIR;
>> +    } else if (esxVI_NasDatastoreInfo_DynamicCast(datastoreInfo) != NULL) {
>> +        pool.type = VIR_STORAGE_POOL_NETFS;
>> +    } else if (esxVI_VmfsDatastoreInfo_DynamicCast(datastoreInfo) != NULL) {
>> +        pool.type = VIR_STORAGE_POOL_FS;
>> +    } else {
>> +        ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
>> +                  _("DatastoreInfo has unexpected type"));
>> +        goto cleanup;
>> +    }
>> +
>> +    /* Lookup file info */
>> +    if (virAsprintf(&datastorePath, "[%s] %s", volume->pool, volume->name) < 0) {
>> +        virReportOOMError();
>> +        goto cleanup;
>> +    }
>> +
>> +    if (esxVI_LookupFileInfoByDatastorePath(priv->primary, datastorePath,
>> +                                            &fileInfo,
>> +                                            esxVI_Occurrence_RequiredItem) < 0) {
>> +        goto cleanup;
>> +    }
>> +
>> +    vmDiskFileInfo = esxVI_VmDiskFileInfo_DynamicCast(fileInfo);
>> +    isoImageFileInfo = esxVI_IsoImageFileInfo_DynamicCast(fileInfo);
>> +    floppyImageFileInfo = esxVI_FloppyImageFileInfo_DynamicCast(fileInfo);
>> +
>> +    def.name = volume->name;
>> +    def.key = datastorePath;
>
> I know that the main libvirt storage driver uses a path for 'key'
> currently, but if you have a choice with ESX, it would be desirable
> to use a 'better' unique identifier for key. The idea is that 'key'
> is trying to provide a unique identifier that is stable even if the
> volume is moved or renamed, but still points at the same underlying
> data. A path is fine as the catchall fallback case, but if there's a
> a UUID, or SCSI/iSCSI LUN WWID then that's better.

The vSphere API provides a QueryVirtualDiskUuid function that allows
to get the UUID of .vmdk images. But for .iso of floppy images there
is no better unique identifier than the path itself, at least I didn't
find one yet.

> ACK, to the patch anyway since we can change this later if desired.
>

So, I pushed this patch now and will do another patch to use the UUID
obtained by QueryVirtualDiskUuid as key for .vmdk images.

Matthias




More information about the libvir-list mailing list