MATSUDA Daiki <matsudadik@intellilink.co.jp>
Jan Kiszka <jan.kiszka@siemens.com>
Ryan Woodsmall <rwoodsmall@gmail.com>
+ Wido den Hollander <wido@widodh.nl>
[....send patches to get your name here....]
if (!source)
return;
- VIR_FREE(source->host.name);
+ for (i = 0 ; i < source->nhost ; i++) {
+ VIR_FREE(source->hosts[i].name);
+ }
+ VIR_FREE(source->hosts);
+
for (i = 0 ; i < source->ndevice ; i++) {
VIR_FREE(source->devices[i].freeExtents);
VIR_FREE(source->devices[i].path);
char *authType = NULL;
int nsource, i;
virStoragePoolOptionsPtr options;
+ char *name = NULL;
char *port = NULL;
relnode = ctxt->node;
VIR_FREE(format);
}
- source->host.name = virXPathString("string(./host/@name)", ctxt);
- port = virXPathString("string(./host/@port)", ctxt);
- if (port) {
- if (virStrToLong_i(port, NULL, 10, &source->host.port) < 0) {
- virStorageReportError(VIR_ERR_XML_ERROR,
- _("Invalid port number: %s"),
- port);
+ source->nhost = virXPathNodeSet("./host", ctxt, &nodeset);
+
+ if (source->nhost) {
+ if (VIR_ALLOC_N(source->hosts, source->nhost) < 0) {
+ virReportOOMError();
goto cleanup;
}
- }
+ for (i = 0 ; i < source->nhost ; i++) {
+ name = virXMLPropString(nodeset[i], "name");
+ if (name == NULL) {
+ virStorageReportError(VIR_ERR_XML_ERROR,
+ "%s", _("missing storage pool host name"));
+ goto cleanup;
+ }
+ source->hosts[i].name = name;
+
+ port = virXMLPropString(nodeset[i], "port");
+ if (port) {
+ if (virStrToLong_i(port, NULL, 10, &source->hosts[i].port) < 0) {
+ virStorageReportError(VIR_ERR_XML_ERROR,
+ _("Invalid port number: %s"),
+ port);
+ goto cleanup;
+ }
+ }
+ }
+ }
source->initiator.iqn = virXPathString("string(./initiator/iqn/@name)", ctxt);
}
if (options->flags & VIR_STORAGE_POOL_SOURCE_HOST) {
- if (!ret->source.host.name) {
+ if (!ret->source.nhost) {
virStorageReportError(VIR_ERR_XML_ERROR,
"%s",
_("missing storage pool source host name"));
int i, j;
virBufferAddLit(buf," <source>\n");
- if ((options->flags & VIR_STORAGE_POOL_SOURCE_HOST) &&
- src->host.name) {
- virBufferAsprintf(buf, " <host name='%s'", src->host.name);
- if (src->host.port)
- virBufferAsprintf(buf, " port='%d'", src->host.port);
- virBufferAddLit(buf, "/>\n");
+ if ((options->flags & VIR_STORAGE_POOL_SOURCE_HOST) && src->nhost) {
+ for (i = 0; i < src->nhost; i++) {
+ virBufferAsprintf(buf, " <host name='%s'", src->hosts[i].name);
+ if (src->hosts[i].port)
+ virBufferAsprintf(buf, " port='%d'", src->hosts[i].port);
+ virBufferAddLit(buf, "/>\n");
+ }
}
if ((options->flags & VIR_STORAGE_POOL_SOURCE_DEVICE) &&
break;
case VIR_STORAGE_POOL_NETFS:
if ((STREQ(pool->def->source.dir, def->source.dir)) \
- && (STREQ(pool->def->source.host.name, def->source.host.name)))
+ && (pool->def->source.nhost == 1 && def->source.nhost == 1) \
+ && (STREQ(pool->def->source.hosts[0].name, def->source.hosts[0].name)))
matchpool = pool;
break;
case VIR_STORAGE_POOL_SCSI:
{
matchpool = virStoragePoolSourceFindDuplicateDevices(pool, def);
if (matchpool) {
- if (STREQ(matchpool->def->source.host.name, def->source.host.name)) {
- if ((matchpool->def->source.initiator.iqn) && (def->source.initiator.iqn)) {
- if (STREQ(matchpool->def->source.initiator.iqn, def->source.initiator.iqn))
- break;
- matchpool = NULL;
+ if (matchpool->def->source.nhost == 1 && def->source.nhost == 1) {
+ if (STREQ(matchpool->def->source.hosts[0].name, def->source.hosts[0].name)) {
+ if ((matchpool->def->source.initiator.iqn) && (def->source.initiator.iqn)) {
+ if (STREQ(matchpool->def->source.initiator.iqn, def->source.initiator.iqn))
+ break;
+ matchpool = NULL;
+ }
+ break;
}
- break;
}
matchpool = NULL;
}
typedef struct _virStoragePoolSource virStoragePoolSource;
typedef virStoragePoolSource *virStoragePoolSourcePtr;
struct _virStoragePoolSource {
- /* An optional host */
- virStoragePoolSourceHost host;
+ /* An optional (maybe multiple) host(s) */
+ size_t nhost;
+ virStoragePoolSourceHostPtr hosts;
/* And either one or more devices ... */
int ndevice;
if (esxVI_LocalDatastoreInfo_DynamicCast(info) != NULL) {
def.type = VIR_STORAGE_POOL_DIR;
} else if ((nasInfo = esxVI_NasDatastoreInfo_DynamicCast(info)) != NULL) {
+ if (VIR_ALLOC_N(def.source.hosts, 1) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
def.type = VIR_STORAGE_POOL_NETFS;
- def.source.host.name = nasInfo->nas->remoteHost;
+ def.source.hosts[0].name = nasInfo->nas->remoteHost;
def.source.dir = nasInfo->nas->remotePath;
if (STRCASEEQ(nasInfo->nas->type, "NFS")) {
if (!(src = virStoragePoolSourceListNewSource(&state->list)))
goto cleanup;
- if (!(src->host.name = strdup(state->host)) ||
+ if (src->nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ goto cleanup;
+ }
+
+ if (!(src->hosts[0].name = strdup(state->host)) ||
!(src->dir = strdup(path))) {
virReportOOMError();
goto cleanup;
if (!source)
goto cleanup;
- state.host = source->host.name;
- prog[3] = source->host.name;
+ if (source->nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ goto cleanup;
+ }
+
+ state.host = source->hosts[0].name;
+ prog[3] = source->hosts[0].name;
if (virStorageBackendRunProgRegex(NULL, prog, 1, regexes, vars,
virStorageBackendFileSystemNetFindPoolSourcesFunc,
int ret;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
- if (pool->def->source.host.name == NULL) {
+ if (pool->def->source.nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ return -1;
+ }
+ if (pool->def->source.hosts[0].name == NULL) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("missing source host"));
return -1;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
if (virAsprintf(&src, "%s:%s",
- pool->def->source.host.name,
+ pool->def->source.hosts[0].name,
pool->def->source.dir) == -1) {
virReportOOMError();
return -1;
int ret;
if (pool->def->type == VIR_STORAGE_POOL_NETFS) {
- if (pool->def->source.host.name == NULL) {
+ if (pool->def->source.nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ return -1;
+ }
+ if (pool->def->source.hosts[0].name == NULL) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("missing source host"));
return -1;
char ipaddr[NI_MAXHOST];
char *portal;
- if (virStorageBackendISCSITargetIP(source->host.name,
+ if (source->nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ return NULL;
+ }
+
+ if (virStorageBackendISCSITargetIP(source->hosts[0].name,
ipaddr, sizeof(ipaddr)) < 0)
return NULL;
if (virAsprintf(&portal, "%s:%d,1", ipaddr,
- source->host.port ?
- source->host.port : 3260) < 0) {
+ source->hosts[0].port ?
+ source->hosts[0].port : 3260) < 0) {
virReportOOMError();
return NULL;
}
list.type)))
return NULL;
+ if (source->nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ goto cleanup;
+ }
+
if (!(portal = virStorageBackendISCSIPortal(source)))
goto cleanup;
virReportOOMError();
goto cleanup;
}
- list.sources[i].host = source->host;
+ list.sources[i].host = source->hosts[0];
list.sources[i].initiator = source->initiator;
list.sources[i].ndevice = 1;
list.sources[i].devices[0].path = targets[i];
*isActive = false;
- if (pool->def->source.host.name == NULL) {
+ if (pool->def->source.nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ return -1;
+ }
+
+ if (pool->def->source.hosts[0].name == NULL) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("missing source host"));
return -1;
int ret = -1;
const char *loginargv[] = { "--login", NULL };
- if (pool->def->source.host.name == NULL) {
+ if (pool->def->source.nhost != 1) {
+ virStorageReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Expected exactly 1 host for the storage pool"));
+ return -1;
+ }
+
+ if (pool->def->source.hosts[0].name == NULL) {
virStorageReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("missing source host"));
return -1;
break;
case VIR_STORAGE_POOL_NETFS:
- if (!source || !source->host.name) {
+ if (!source || !source->hosts[0].name) {
testError(VIR_ERR_INVALID_ARG,
"%s", "hostname must be specified for netfs sources");
goto cleanup;
}
if (virAsprintf(&ret, defaultPoolSourcesNetFSXML,
- source->host.name) < 0)
+ source->hosts[0].name) < 0)
virReportOOMError();
break;