static char * esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags) { char *xml = NULL; esxPrivate *priv = pool->conn->storagePrivateData; esxVI_HostInternetScsiHba *hostInternetScsiHba = NULL; esxVI_HostInternetScsiHbaStaticTarget *target; virStoragePoolDef def; virCheckFlags(0, NULL); memset(&def, 0, sizeof(def)); if (esxVI_LookupHostInternetScsiHba(priv->primary, &hostInternetScsiHba)) { goto cleanup; } for (target = hostInternetScsiHba->configuredStaticTarget; target; target = target->_next) { if (STREQ(target->iScsiName, pool->name)) { break; } } if (!target) { /* pool not found */ virReportError(VIR_ERR_INTERNAL_ERROR, _("Could not find storage pool with name '%s'"), pool->name); goto cleanup; } def.name = pool->name; memcpy(def.uuid, pool->uuid, VIR_UUID_BUFLEN); def.type = VIR_STORAGE_POOL_ISCSI; def.source.initiator.iqn = target->iScsiName; def.source.nhost = 1; if (VIR_ALLOC_N(def.source.hosts, def.source.nhost) < 0) goto cleanup; def.source.hosts[0].name = target->address; if (target->port) { def.source.hosts[0].port = target->port->value; } /* TODO: add CHAP authentication params */ xml = virStoragePoolDefFormat(&def); cleanup: VIR_FREE(def.source.hosts); esxVI_HostInternetScsiHba_Free(&hostInternetScsiHba); return xml; }
static char * parallelsStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags) { parallelsConnPtr privconn = pool->conn->privateData; virStoragePoolObjPtr privpool; char *ret = NULL; virCheckFlags(0, NULL); parallelsDriverLock(privconn); privpool = virStoragePoolObjFindByName(&privconn->pools, pool->name); parallelsDriverUnlock(privconn); if (privpool == NULL) { parallelsPoolNotFoundError(pool->name); goto cleanup; } ret = virStoragePoolDefFormat(privpool->def); cleanup: if (privpool) virStoragePoolObjUnlock(privpool); return ret; }
static int testCompareXMLToXMLFiles(const char *inxml, const char *outxml) { char *inXmlData = NULL; char *outXmlData = NULL; char *actual = NULL; int ret = -1; virStoragePoolDefPtr dev = NULL; if (virtTestLoadFile(inxml, &inXmlData) < 0) goto fail; if (virtTestLoadFile(outxml, &outXmlData) < 0) goto fail; if (!(dev = virStoragePoolDefParseString(inXmlData))) goto fail; if (!(actual = virStoragePoolDefFormat(dev))) goto fail; if (STRNEQ(outXmlData, actual)) { virtTestDifference(stderr, outXmlData, actual); goto fail; } ret = 0; fail: VIR_FREE(inXmlData); VIR_FREE(outXmlData); VIR_FREE(actual); virStoragePoolDefFree(dev); return ret; }
static int testCompareXMLToXMLFiles(const char *inxml, const char *outxml) { char *actual = NULL; int ret = -1; virStoragePoolDefPtr dev = NULL; if (!(dev = virStoragePoolDefParseFile(inxml))) goto fail; if (!(actual = virStoragePoolDefFormat(dev))) goto fail; if (virtTestCompareToFile(actual, outxml) < 0) goto fail; ret = 0; fail: VIR_FREE(actual); virStoragePoolDefFree(dev); return ret; }
static char * esxStoragePoolGetXMLDesc(virStoragePoolPtr pool, unsigned int flags) { esxPrivate *priv = pool->conn->privateData; 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_NasDatastoreInfo *nasInfo = NULL; char *xml = NULL; virCheckFlags(0, NULL); memset(&def, 0, sizeof(def)); if (esxVI_String_AppendValueListToList(&propertyNameList, "summary.accessible\0" "summary.capacity\0" "summary.freeSpace\0" "info\0") < 0 || esxVI_LookupDatastoreByName(priv->primary, pool->name, propertyNameList, &datastore, esxVI_Occurrence_RequiredItem) < 0 || esxVI_GetBoolean(datastore, "summary.accessible", &accessible, esxVI_Occurrence_RequiredItem) < 0 || esxVI_LookupDatastoreHostMount(priv->primary, datastore->obj, &hostMount, esxVI_Occurrence_RequiredItem) < 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; dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "summary.capacity")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { goto cleanup; } def.capacity = dynamicProperty->val->int64; } else if (STREQ(dynamicProperty->name, "summary.freeSpace")) { if (esxVI_AnyType_ExpectType(dynamicProperty->val, esxVI_Type_Long) < 0) { goto cleanup; } def.available = dynamicProperty->val->int64; } } def.allocation = def.capacity - def.available; } for (dynamicProperty = datastore->propSet; dynamicProperty; dynamicProperty = dynamicProperty->_next) { if (STREQ(dynamicProperty->name, "info")) { if (esxVI_DatastoreInfo_CastFromAnyType(dynamicProperty->val, &info) < 0) { goto cleanup; } break; } } /* See vSphere API documentation about HostDatastoreSystem for details */ if (esxVI_LocalDatastoreInfo_DynamicCast(info)) { def.type = VIR_STORAGE_POOL_DIR; } else if ((nasInfo = esxVI_NasDatastoreInfo_DynamicCast(info))) { if (VIR_ALLOC_N(def.source.hosts, 1) < 0) goto cleanup; def.type = VIR_STORAGE_POOL_NETFS; def.source.nhost = 1; def.source.hosts[0].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 { virReportError(VIR_ERR_INTERNAL_ERROR, _("Datastore has unexpected type '%s'"), nasInfo->nas->type); goto cleanup; } } else if (esxVI_VmfsDatastoreInfo_DynamicCast(info)) { 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 { virReportError(VIR_ERR_INTERNAL_ERROR, "%s", _("DatastoreInfo has unexpected type")); goto cleanup; } xml = virStoragePoolDefFormat(&def); cleanup: esxVI_String_Free(&propertyNameList); esxVI_ObjectContent_Free(&datastore); esxVI_DatastoreHostMount_Free(&hostMount); esxVI_DatastoreInfo_Free(&info); return xml; }