[libvirt] [PATCH] esx: Set storage pool target path to host.mountInfo.path

Matthias Bolte matthias.bolte at googlemail.com
Sun Aug 1 23:25:56 UTC 2010


Now all storage pool types expose the target path.
---
 src/esx/esx_storage_driver.c |  114 ++++++++++++++++++-----------------------
 src/esx/esx_vi.c             |   68 +++++++++++++++++++++++++
 src/esx/esx_vi.h             |    4 ++
 src/esx/esx_vi_generator.py  |    2 +-
 4 files changed, 123 insertions(+), 65 deletions(-)

diff --git a/src/esx/esx_storage_driver.c b/src/esx/esx_storage_driver.c
index e0680a1..4fcc4af 100644
--- a/src/esx/esx_storage_driver.c
+++ b/src/esx/esx_storage_driver.c
@@ -194,11 +194,8 @@ static virStoragePoolPtr
 esxStoragePoolLookupByName(virConnectPtr conn, const char *name)
 {
     esxPrivate *priv = conn->storagePrivateData;
-    esxVI_String *propertyNameList = NULL;
     esxVI_ObjectContent *datastore = NULL;
-    esxVI_DynamicProperty *dynamicProperty = NULL;
-    esxVI_DatastoreHostMount *datastoreHostMountList = NULL;
-    esxVI_DatastoreHostMount *datastoreHostMount = NULL;
+    esxVI_DatastoreHostMount *hostMount = NULL;
     char *suffix = NULL;
     int suffixLength;
     char uuid_string[VIR_UUID_STRING_BUFLEN] = "00000000-00000000-0000-000000000000";
@@ -209,9 +206,7 @@ esxStoragePoolLookupByName(virConnectPtr conn, const char *name)
         return NULL;
     }
 
-    if (esxVI_String_AppendValueToList(&propertyNameList, "host") < 0 ||
-        esxVI_LookupDatastoreByName(priv->primary, name,
-                                    propertyNameList, &datastore,
+    if (esxVI_LookupDatastoreByName(priv->primary, name, NULL, &datastore,
                                     esxVI_Occurrence_RequiredItem) < 0) {
         goto cleanup;
     }
@@ -232,30 +227,12 @@ esxStoragePoolLookupByName(virConnectPtr conn, const char *name)
      * The object name of virtual machine contains an integer, we use that as
      * domain ID.
      */
-    for (dynamicProperty = datastore->propSet; dynamicProperty != NULL;
-         dynamicProperty = dynamicProperty->_next) {
-        if (STREQ(dynamicProperty->name, "host")) {
-            if (esxVI_DatastoreHostMount_CastListFromAnyType
-                  (dynamicProperty->val, &datastoreHostMountList) < 0) {
-                goto cleanup;
-            }
-
-            break;
-        }
+    if (esxVI_LookupDatastoreHostMount(priv->primary, datastore->obj,
+                                       &hostMount) < 0) {
+        goto cleanup;
     }
 
-    for (datastoreHostMount = datastoreHostMountList; datastoreHostMount != NULL;
-         datastoreHostMount = datastoreHostMount->_next) {
-        if (STRNEQ(priv->primary->hostSystem->_reference->value,
-                   datastoreHostMount->key->value)) {
-            continue;
-        }
-
-        if ((suffix = STRSKIP(datastoreHostMount->mountInfo->path,
-                              "/vmfs/volumes/")) == NULL) {
-            break;
-        }
-
+    if ((suffix = STRSKIP(hostMount->mountInfo->path, "/vmfs/volumes/")) != NULL) {
         suffixLength = strlen(suffix);
 
         if ((suffixLength == 35 && /* = strlen("4b0beca7-7fd401f3-1d7f-000ae484a6a3") */
@@ -284,9 +261,8 @@ esxStoragePoolLookupByName(virConnectPtr conn, const char *name)
     pool = virGetStoragePool(conn, name, uuid);
 
   cleanup:
-    esxVI_String_Free(&propertyNameList);
     esxVI_ObjectContent_Free(&datastore);
-    esxVI_DatastoreHostMount_Free(&datastoreHostMountList);
+    esxVI_DatastoreHostMount_Free(&hostMount);
 
     return pool;
 }
@@ -481,13 +457,12 @@ esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags)
     esxPrivate *priv = pool->conn->storagePrivateData;
     esxVI_String *propertyNameList = NULL;
     esxVI_ObjectContent *datastore = NULL;
+    esxVI_DatastoreHostMount *hostMount = NULL;
     esxVI_DynamicProperty *dynamicProperty = NULL;
     esxVI_Boolean accessible = esxVI_Boolean_Undefined;
     virStoragePoolDef def;
     esxVI_DatastoreInfo *info = NULL;
-    esxVI_LocalDatastoreInfo *localInfo = NULL;
     esxVI_NasDatastoreInfo *nasInfo = NULL;
-    esxVI_VmfsDatastoreInfo *vmfsInfo = NULL;
     char *xml = NULL;
 
     virCheckFlags(0, NULL);
@@ -507,13 +482,17 @@ esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags)
                                     propertyNameList, &datastore,
                                     esxVI_Occurrence_RequiredItem) < 0 ||
         esxVI_GetBoolean(datastore, "summary.accessible",
-                         &accessible, esxVI_Occurrence_RequiredItem) < 0) {
+                         &accessible, esxVI_Occurrence_RequiredItem) < 0 ||
+        esxVI_LookupDatastoreHostMount(priv->primary, datastore->obj,
+                                       &hostMount) < 0) {
         goto cleanup;
     }
 
     def.name = pool->name;
     memcpy(def.uuid, pool->uuid, VIR_UUID_BUFLEN);
 
+    def.target.path = hostMount->mountInfo->path;
+
     if (accessible == esxVI_Boolean_True) {
         for (dynamicProperty = datastore->propSet; dynamicProperty != NULL;
              dynamicProperty = dynamicProperty->_next) {
@@ -531,46 +510,52 @@ esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags)
                 }
 
                 def.available = dynamicProperty->val->int64;
-            } else if (STREQ(dynamicProperty->name, "info")) {
-                if (esxVI_DatastoreInfo_CastFromAnyType(dynamicProperty->val,
-                                                        &info) < 0) {
-                    goto cleanup;
-                }
             }
         }
 
         def.allocation = def.capacity - def.available;
+    }
 
-        /* See vSphere API documentation about HostDatastoreSystem for details */
-        if ((localInfo = esxVI_LocalDatastoreInfo_DynamicCast(info)) != NULL) {
-            def.type = VIR_STORAGE_POOL_DIR;
-            def.target.path = localInfo->path;
-        } else if ((nasInfo = esxVI_NasDatastoreInfo_DynamicCast(info)) != NULL) {
-            def.type = VIR_STORAGE_POOL_NETFS;
-            def.source.host.name = nasInfo->nas->remoteHost;
-            def.source.dir = nasInfo->nas->remotePath;
-
-            if (STRCASEEQ(nasInfo->nas->type, "NFS")) {
-                def.source.format = VIR_STORAGE_POOL_NETFS_NFS;
-            } else  if (STRCASEEQ(nasInfo->nas->type, "CIFS")) {
-                def.source.format = VIR_STORAGE_POOL_NETFS_CIFS;
-            } else {
-                ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
-                          _("Datastore has unexpected type '%s'"),
-                          nasInfo->nas->type);
+    for (dynamicProperty = datastore->propSet; dynamicProperty != NULL;
+         dynamicProperty = dynamicProperty->_next) {
+        if (STREQ(dynamicProperty->name, "info")) {
+            if (esxVI_DatastoreInfo_CastFromAnyType(dynamicProperty->val,
+                                                    &info) < 0) {
                 goto cleanup;
             }
-        } else if ((vmfsInfo = esxVI_VmfsDatastoreInfo_DynamicCast(info)) != NULL) {
-            def.type = VIR_STORAGE_POOL_FS;
-            /*
-             * FIXME: I'm not sure how to represent the source and target of a
-             * VMFS based datastore in libvirt terms
-             */
+
+            break;
+        }
+    }
+
+    /* See vSphere API documentation about HostDatastoreSystem for details */
+    if (esxVI_LocalDatastoreInfo_DynamicCast(info) != NULL) {
+        def.type = VIR_STORAGE_POOL_DIR;
+    } else if ((nasInfo = esxVI_NasDatastoreInfo_DynamicCast(info)) != NULL) {
+        def.type = VIR_STORAGE_POOL_NETFS;
+        def.source.host.name = nasInfo->nas->remoteHost;
+        def.source.dir = nasInfo->nas->remotePath;
+
+        if (STRCASEEQ(nasInfo->nas->type, "NFS")) {
+            def.source.format = VIR_STORAGE_POOL_NETFS_NFS;
+        } else  if (STRCASEEQ(nasInfo->nas->type, "CIFS")) {
+            def.source.format = VIR_STORAGE_POOL_NETFS_CIFS;
         } else {
-            ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
-                      _("DatastoreInfo has unexpected type"));
+            ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
+                      _("Datastore has unexpected type '%s'"),
+                      nasInfo->nas->type);
             goto cleanup;
         }
+    } else if (esxVI_VmfsDatastoreInfo_DynamicCast(info) != NULL) {
+        def.type = VIR_STORAGE_POOL_FS;
+        /*
+         * FIXME: I'm not sure how to represent the source and target of a
+         * VMFS based datastore in libvirt terms
+         */
+    } else {
+        ESX_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
+                  _("DatastoreInfo has unexpected type"));
+        goto cleanup;
     }
 
     xml = virStoragePoolDefFormat(&def);
@@ -578,6 +563,7 @@ esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags)
   cleanup:
     esxVI_String_Free(&propertyNameList);
     esxVI_ObjectContent_Free(&datastore);
+    esxVI_DatastoreHostMount_Free(&hostMount);
     esxVI_DatastoreInfo_Free(&info);
 
     return xml;
diff --git a/src/esx/esx_vi.c b/src/esx/esx_vi.c
index f421502..55c5246 100644
--- a/src/esx/esx_vi.c
+++ b/src/esx/esx_vi.c
@@ -2566,6 +2566,74 @@ esxVI_LookupDatastoreByAbsolutePath(esxVI_Context *ctx,
 
 
 int
+esxVI_LookupDatastoreHostMount(esxVI_Context *ctx,
+                               esxVI_ManagedObjectReference *datastore,
+                               esxVI_DatastoreHostMount **hostMount)
+{
+    int result = -1;
+    esxVI_String *propertyNameList = NULL;
+    esxVI_ObjectContent *objectContent = NULL;
+    esxVI_DynamicProperty *dynamicProperty = NULL;
+    esxVI_DatastoreHostMount *hostMountList = NULL;
+    esxVI_DatastoreHostMount *candidate = NULL;
+
+    if (hostMount == NULL || *hostMount != NULL) {
+        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s", _("Invalid argument"));
+        return -1;
+    }
+
+    if (esxVI_String_AppendValueToList(&propertyNameList, "host") < 0 ||
+        esxVI_LookupObjectContentByType(ctx, datastore, "Datastore",
+                                        propertyNameList, esxVI_Boolean_False,
+                                        &objectContent) < 0) {
+        goto cleanup;
+    }
+
+    for (dynamicProperty = objectContent->propSet; dynamicProperty != NULL;
+         dynamicProperty = dynamicProperty->_next) {
+        if (STREQ(dynamicProperty->name, "host")) {
+            if (esxVI_DatastoreHostMount_CastListFromAnyType
+                  (dynamicProperty->val, &hostMountList) < 0) {
+                goto cleanup;
+            }
+
+            break;
+        } else {
+            VIR_WARN("Unexpected '%s' property", dynamicProperty->name);
+        }
+    }
+
+    for (candidate = hostMountList; candidate != NULL;
+         candidate = candidate->_next) {
+        if (STRNEQ(ctx->hostSystem->_reference->value, candidate->key->value)) {
+            continue;
+        }
+
+        if (esxVI_DatastoreHostMount_DeepCopy(hostMount, candidate) < 0) {
+            goto cleanup;
+        }
+
+        break;
+    }
+
+    if (*hostMount == NULL) {
+        ESX_VI_ERROR(VIR_ERR_INTERNAL_ERROR, "%s",
+                     _("Could not lookup datastore host mount"));
+        goto cleanup;
+    }
+
+    result = 0;
+
+  cleanup:
+    esxVI_String_Free(&propertyNameList);
+    esxVI_ObjectContent_Free(&objectContent);
+    esxVI_DatastoreHostMount_Free(&hostMountList);
+
+    return result;
+}
+
+
+int
 esxVI_LookupTaskInfoByTask(esxVI_Context *ctx,
                            esxVI_ManagedObjectReference *task,
                            esxVI_TaskInfo **taskInfo)
diff --git a/src/esx/esx_vi.h b/src/esx/esx_vi.h
index fdd15f1..d5dc9d5 100644
--- a/src/esx/esx_vi.h
+++ b/src/esx/esx_vi.h
@@ -370,6 +370,10 @@ int esxVI_LookupDatastoreByAbsolutePath(esxVI_Context *ctx,
                                         esxVI_ObjectContent **datastore,
                                         esxVI_Occurrence occurrence);
 
+int esxVI_LookupDatastoreHostMount(esxVI_Context *ctx,
+                                   esxVI_ManagedObjectReference *datastore,
+                                   esxVI_DatastoreHostMount **hostMount);
+
 int esxVI_LookupTaskInfoByTask(esxVI_Context *ctx,
                                esxVI_ManagedObjectReference *task,
                                esxVI_TaskInfo **taskInfo);
diff --git a/src/esx/esx_vi_generator.py b/src/esx/esx_vi_generator.py
index e3c3d14..411fd80 100755
--- a/src/esx/esx_vi_generator.py
+++ b/src/esx/esx_vi_generator.py
@@ -1127,7 +1127,7 @@ additional_enum_features = { "ManagedEntityStatus"      : Enum.FEATURE__ANY_TYPE
                              "VirtualMachinePowerState" : Enum.FEATURE__ANY_TYPE }
 
 
-additional_object_features = { "DatastoreHostMount"         : Object.FEATURE__LIST | Object.FEATURE__ANY_TYPE,
+additional_object_features = { "DatastoreHostMount"         : Object.FEATURE__DEEP_COPY | Object.FEATURE__LIST | Object.FEATURE__ANY_TYPE,
                                "DatastoreInfo"              : Object.FEATURE__ANY_TYPE | Object.FEATURE__DYNAMIC_CAST,
                                "Event"                      : Object.FEATURE__LIST,
                                "FileInfo"                   : Object.FEATURE__DYNAMIC_CAST,
-- 
1.7.0.4




More information about the libvir-list mailing list