mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-25 10:03:49 +03:00
storage: netfs: Support lookup of glusterfs pool sources
https://bugzilla.redhat.com/show_bug.cgi?id=1072714 Use the "gluster" command line tool to retrieve information about remote volumes on a gluster server to allow storage pool source lookup. Unfortunately gluster doesn't provide a management library so that we could use that directly, instead the RPC calls are hardcoded in the command line tool.
This commit is contained in:
parent
18642d100f
commit
05671b95db
@ -1936,6 +1936,12 @@ if test "$with_storage_gluster" = "yes"; then
|
|||||||
fi
|
fi
|
||||||
AM_CONDITIONAL([WITH_STORAGE_GLUSTER], [test "$with_storage_gluster" = "yes"])
|
AM_CONDITIONAL([WITH_STORAGE_GLUSTER], [test "$with_storage_gluster" = "yes"])
|
||||||
|
|
||||||
|
if test "$with_storage_fs" = "yes" ||
|
||||||
|
test "$with_storage_gluster" = "yes"; then
|
||||||
|
AC_PATH_PROG([GLUSTER_CLI], [gluster], [], [$PATH:/sbin:/usr/sbin])
|
||||||
|
AC_DEFINE_UNQUOTED([GLUSTER_CLI], ["$GLUSTER_CLI"],
|
||||||
|
[Location or name of the gluster command line tool])
|
||||||
|
fi
|
||||||
|
|
||||||
LIBPARTED_CFLAGS=
|
LIBPARTED_CFLAGS=
|
||||||
LIBPARTED_LIBS=
|
LIBPARTED_LIBS=
|
||||||
|
@ -1636,3 +1636,92 @@ virStorageBackendStablePath(virStoragePoolObjPtr pool,
|
|||||||
|
|
||||||
return stablepath;
|
return stablepath;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef GLUSTER_CLI
|
||||||
|
int
|
||||||
|
virStorageBackendFindGlusterPoolSources(const char *host,
|
||||||
|
int pooltype,
|
||||||
|
virStoragePoolSourceListPtr list)
|
||||||
|
{
|
||||||
|
char *outbuf = NULL;
|
||||||
|
virCommandPtr cmd = NULL;
|
||||||
|
xmlDocPtr doc = NULL;
|
||||||
|
xmlXPathContextPtr ctxt = NULL;
|
||||||
|
xmlNodePtr *nodes = NULL;
|
||||||
|
virStoragePoolSource *src = NULL;
|
||||||
|
size_t i;
|
||||||
|
int nnodes;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
cmd = virCommandNewArgList(GLUSTER_CLI,
|
||||||
|
"--xml",
|
||||||
|
"--log-file=/dev/null",
|
||||||
|
"volume", "info", "all", NULL);
|
||||||
|
|
||||||
|
virCommandAddArgFormat(cmd, "--remote-host=%s", host);
|
||||||
|
virCommandSetOutputBuffer(cmd, &outbuf);
|
||||||
|
|
||||||
|
if (virCommandRun(cmd, &rc) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (rc != 0) {
|
||||||
|
VIR_INFO("failed to query host '%s' for gluster volumes: %s",
|
||||||
|
host, outbuf);
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(doc = virXMLParseStringCtxt(outbuf, _("(gluster_cli_output)"),
|
||||||
|
&ctxt)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((nnodes = virXPathNodeSet("//volumes/volume", ctxt, &nodes)) <= 0) {
|
||||||
|
VIR_INFO("no gluster volumes available on '%s'", host);
|
||||||
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (i = 0; i < nnodes; i++) {
|
||||||
|
ctxt->node = nodes[i];
|
||||||
|
|
||||||
|
if (!(src = virStoragePoolSourceListNewSource(list)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if (!(src->dir = virXPathString("string(//name)", ctxt))) {
|
||||||
|
virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
|
||||||
|
_("failed to extract gluster volume name"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (VIR_ALLOC_N(src->hosts, 1) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
src->nhost = 1;
|
||||||
|
|
||||||
|
if (VIR_STRDUP(src->hosts[0].name, host) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
src->format = pooltype;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
VIR_FREE(nodes);
|
||||||
|
xmlXPathFreeContext(ctxt);
|
||||||
|
xmlFreeDoc(doc);
|
||||||
|
VIR_FREE(outbuf);
|
||||||
|
virCommandFree(cmd);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else /* #ifdef GLUSTER_CLI */
|
||||||
|
int
|
||||||
|
virStorageBackendFindGlusterPoolSources(const char *host ATTRIBUTE_UNUSED,
|
||||||
|
int pooltype ATTRIBUTE_UNUSED,
|
||||||
|
virStoragePoolSourceListPtr list ATTRIBUTE_UNUSED)
|
||||||
|
{
|
||||||
|
VIR_INFO("gluster cli tool not installed");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* #ifdef GLUSTER_CLI */
|
||||||
|
@ -87,6 +87,10 @@ int virStorageBackendFindFSImageTool(char **tool);
|
|||||||
virStorageBackendBuildVolFrom
|
virStorageBackendBuildVolFrom
|
||||||
virStorageBackendFSImageToolTypeToFunc(int tool_type);
|
virStorageBackendFSImageToolTypeToFunc(int tool_type);
|
||||||
|
|
||||||
|
int virStorageBackendFindGlusterPoolSources(const char *host,
|
||||||
|
int pooltype,
|
||||||
|
virStoragePoolSourceListPtr list);
|
||||||
|
|
||||||
|
|
||||||
typedef struct _virStorageBackend virStorageBackend;
|
typedef struct _virStorageBackend virStorageBackend;
|
||||||
typedef virStorageBackend *virStorageBackendPtr;
|
typedef virStorageBackend *virStorageBackendPtr;
|
||||||
|
@ -316,6 +316,11 @@ virStorageBackendFileSystemNetFindPoolSources(virConnectPtr conn ATTRIBUTE_UNUSE
|
|||||||
|
|
||||||
virStorageBackendFileSystemNetFindNFSPoolSources(&state);
|
virStorageBackendFileSystemNetFindNFSPoolSources(&state);
|
||||||
|
|
||||||
|
if (virStorageBackendFindGlusterPoolSources(state.host,
|
||||||
|
VIR_STORAGE_POOL_NETFS_GLUSTERFS,
|
||||||
|
&state.list) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (!(ret = virStoragePoolSourceListFormat(&state.list)))
|
if (!(ret = virStoragePoolSourceListFormat(&state.list)))
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user