[Libvirt-cim] [PATCH 2 of 4] Add code to be able to parse an existing storage pool's XML
Richard Maciel
rmaciel at linux.vnet.ibm.com
Tue Jul 21 17:54:48 UTC 2009
Kaitlin Rupert wrote:
> # HG changeset patch
> # User Kaitlin Rupert <karupert at us.ibm.com>
> # Date 1248121657 25200
> # Node ID 67c4f2ab76c74753438aa94db0bc4867e869ff97
> # Parent 5eefe23b2be112a925b834931897e61b97d2cd06
> Add code to be able to parse an existing storage pool's XML
>
> This is needed in order to determine the storage pool type. For the upcoming
> image creation support, only directory type pools will be supported initially.
>
> Signed-off-by: Kaitlin Rupert <karupert at us.ibm.com>
>
> diff -r 5eefe23b2be1 -r 67c4f2ab76c7 libxkutil/pool_parsing.c
> --- a/libxkutil/pool_parsing.c Mon Jul 20 13:53:31 2009 -0700
> +++ b/libxkutil/pool_parsing.c Mon Jul 20 13:27:37 2009 -0700
> @@ -31,6 +31,7 @@
> #include <libcmpiutil/libcmpiutil.h>
>
> #include "pool_parsing.h"
> +#include "device_parsing.h"
> #include "../src/svpc_types.h"
>
> /*
> @@ -86,6 +87,160 @@
> *pool = NULL;
> }
>
> +static int parse_disk_target(xmlNode *node, struct disk_pool *pool)
> +{
> + xmlNode *child;
> +
> + for (child = node->children; child != NULL; child = child->next) {
> + if (XSTREQ(child->name, "path")) {
> + STRPROP(pool, path, child);
> + break;
> + }
> + }
> +
> + return 1;
> +}
> +
> +static int parse_disk_source(xmlNode *node, struct disk_pool *pool)
> +{
> + xmlNode *child;
> +
> + for (child = node->children; child != NULL; child = child->next) {
> + if (XSTREQ(child->name, "device")) {
> + const char *path;
> + path = get_attr_value(child, "path");
> + /* Build device path array here */
> + } else if (XSTREQ(child->name, "host")) {
> + pool->host = get_attr_value(child, "name");
> + if (pool->host == NULL)
> + goto err;
> + } else if (XSTREQ(child->name, "dir")) {
> + pool->src_dir = get_attr_value(child, "path");
> + if (pool->src_dir == NULL)
> + goto err;
> + } else if (XSTREQ(child->name, "dir")) {
> + pool->src_dir = get_attr_value(child, "path");
> + if (pool->src_dir == NULL)
> + goto err;
Duplicate code for node "dir". Also, I can't find the "dir" node in the
libvirt xml documentation, storage pool section.
> + } else if (XSTREQ(child->name, "adapter")) {
> + pool->adapter = get_attr_value(child, "name");
> + pool->port_name = get_attr_value(child, "wwpn");
> + pool->node_name = get_attr_value(child, "wwnn");
> + }
> + }
> +
> + err:
> +
> + return 1;
> +}
> +
> +static const char *parse_disk_pool(xmlNodeSet *nsv, struct disk_pool *pool)
> +{
> + xmlNode **nodes = nsv->nodeTab;
> + xmlNode *child;
> + const char *type_str;
> + const char *name;
> + int type = 0;
> +
> + type_str = get_attr_value(nodes[0], "type");
> +
> + if (STREQC(type_str, "dir"))
> + type = DISK_POOL_DIR;
> + else if (STREQC(type_str, "fs"))
> + type = DISK_POOL_FS;
> + else if (STREQC(type_str, "netfs"))
> + type = DISK_POOL_NETFS;
> + else if (STREQC(type_str, "disk"))
> + type = DISK_POOL_DISK;
> + else if (STREQC(type_str, "iscsi"))
> + type = DISK_POOL_ISCSI;
> + else if (STREQC(type_str, "logical"))
> + type = DISK_POOL_LOGICAL;
> + else if (STREQC(type_str, "scsi"))
> + type = DISK_POOL_SCSI;
> + else
> + type = DISK_POOL_UNKNOWN;
> +
> + pool->pool_type = type;
> +
> + for (child = nodes[0]->children; child != NULL; child = child->next) {
> + if (XSTREQ(child->name, "name")) {
> + name = get_node_content(child);
> + } else if (XSTREQ(child->name, "target"))
> + parse_disk_target(child, pool);
> + else if (XSTREQ(child->name, "source"))
> + parse_disk_source(child, pool);
> + }
> +
> + return name;
> +}
> +
> +int get_pool_from_xml(const char *xml, struct virt_pool *pool, int type)
> +{
> + int len;
> + int ret = 0;
> + xmlDoc *xmldoc;
> + xmlXPathContext *xpathctx;
> + xmlXPathObject *xpathobj;
> + const xmlChar *xpathstr = (xmlChar *)"/pool";
> + const char *name;
> +
> + len = strlen(xml) + 1;
> +
> + if ((xmldoc = xmlParseMemory(xml, len)) == NULL)
> + goto err1;
> +
> + if ((xpathctx = xmlXPathNewContext(xmldoc)) == NULL)
> + goto err2;
> +
> + if ((xpathobj = xmlXPathEvalExpression(xpathstr, xpathctx)) == NULL)
> + goto err3;
> +
> + /* FIXME: Add support for parsing network pools */
> + if (type == CIM_RES_TYPE_NET) {
> + ret = 0;
> + goto err1;
> + }
> +
> + memset(pool, 0, sizeof(*pool));
> +
> + pool->type = CIM_RES_TYPE_DISK;
> + name = parse_disk_pool(xpathobj->nodesetval,
> + &(pool)->pool_info.disk);
> + if (name == NULL)
> + ret = 0;
> +
> + pool->id = strdup(name);
> +
> + xmlXPathFreeObject(xpathobj);
> + err3:
> + xmlXPathFreeContext(xpathctx);
> + err2:
> + xmlFreeDoc(xmldoc);
> + err1:
> + return ret;
> +}
> +
> +int get_disk_pool(virStoragePoolPtr poolptr, struct virt_pool **pool)
> +{
> + char *xml;
> + int ret;
> +
> + xml = virStoragePoolGetXMLDesc(poolptr, 0);
> + if (xml == NULL)
> + return 0;
> +
> + *pool = malloc(sizeof(**pool));
> + if (*pool == NULL)
> + return 0;
> +
> + ret = get_pool_from_xml(xml, *pool, CIM_RES_TYPE_DISK);
> +
> + free(xml);
> +
> + return ret;
> +}
> +
> int define_pool(virConnectPtr conn, const char *xml, int res_type)
> {
> int ret = 1;
> diff -r 5eefe23b2be1 -r 67c4f2ab76c7 libxkutil/pool_parsing.h
> --- a/libxkutil/pool_parsing.h Mon Jul 20 13:53:31 2009 -0700
> +++ b/libxkutil/pool_parsing.h Mon Jul 20 13:27:37 2009 -0700
> @@ -66,6 +66,9 @@
>
> void cleanup_virt_pool(struct virt_pool **pool);
>
> +int get_pool_from_xml(const char *xml, struct virt_pool *pool, int type);
> +int get_disk_pool(virStoragePoolPtr poolptr, struct virt_pool **pool);
> +
> int define_pool(virConnectPtr conn, const char *xml, int res_type);
> int destroy_pool(virConnectPtr conn, const char *name, int res_type);
>
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
--
Richard Maciel, MSc
IBM Linux Technology Center
rmaciel at linux.vnet.ibm.com
More information about the Libvirt-cim
mailing list