# HG changeset patch
# User Kaitlin Rupert <karupert(a)us.ibm.com>
# Date 1245187550 25200
# Node ID ffc93d36908aa5fca483fc650393802383409890
# Parent 615da7491c145fa283e658df520fd9e31615f4d4
Image Creation: add functions for generating a storage volume XML
Signed-off-by: Kaitlin Rupert <karupert(a)us.ibm.com>
diff -r 615da7491c14 -r ffc93d36908a libxkutil/xmlgen.c
--- a/libxkutil/xmlgen.c Mon Aug 10 13:52:58 2009 -0700
+++ b/libxkutil/xmlgen.c Tue Jun 16 14:25:50 2009 -0700
@@ -39,6 +39,7 @@
typedef const char *(*devfn_t)(xmlNodePtr node, struct domain *dominfo);
typedef const char *(*poolfn_t)(xmlNodePtr node, struct virt_pool *pool);
+typedef const char *(*resfn_t)(xmlNodePtr node, struct virt_pool_res *res);
static char *disk_block_xml(xmlNodePtr root, struct disk_device *dev)
{
@@ -1056,6 +1057,133 @@
return xml;
}
+static const char *vol_format_type_to_str(uint16_t type)
+{
+ switch (type) {
+ case VOL_FORMAT_RAW:
+ return "raw";
+ default:
+ CU_DEBUG("Unsupported storage volume type");
+ }
+
+ return NULL;
+}
+
+static const char *storage_vol_xml(xmlNodePtr root,
+ struct virt_pool_res *res)
+{
+ xmlNodePtr v = NULL;
+ xmlNodePtr name = NULL;
+ xmlNodePtr alloc = NULL;
+ xmlNodePtr cap = NULL;
+ xmlNodePtr target = NULL;
+ xmlNodePtr path = NULL;
+ xmlNodePtr format = NULL;
+ const char *type = NULL;
+ struct storage_vol *vol = &res->res.storage_vol;
+ char *string = NULL;
+ int ret;
+
+ type = vol_format_type_to_str(vol->format_type);
+ if (type == NULL)
+ goto out;
+
+ v = xmlNewChild(root, NULL, BAD_CAST "volume", NULL);
+ if (v == NULL)
+ goto out;
+
+ name = xmlNewChild(v, NULL, BAD_CAST "name", BAD_CAST
vol->vol_name);
+ if (name == NULL)
+ goto out;
+
+ ret = asprintf(&string, "%" PRIu16, vol->alloc);
+ if (ret == -1)
+ return XML_ERROR;
+
+ alloc = xmlNewChild(v, NULL, BAD_CAST "allocation", BAD_CAST string);
+ if (alloc == NULL)
+ goto out;
+
+ free(string);
+ ret = asprintf(&string, "%" PRIu16, vol->cap);
+ if (ret == -1)
+ return XML_ERROR;
+
+ cap = xmlNewChild(v, NULL, BAD_CAST "capacity", BAD_CAST string);
+ if (cap == NULL)
+ goto out;
+
+ free(string);
+
+ if (xmlNewProp(cap, BAD_CAST "unit", BAD_CAST vol->cap_units) ==
NULL)
+ goto out;
+
+ target = xmlNewChild(v, NULL, BAD_CAST "target", NULL);
+ if (target == NULL)
+ goto out;
+
+ path = xmlNewChild(target, NULL, BAD_CAST "path", BAD_CAST
vol->path);
+ if (path == NULL)
+ goto out;
+
+ format = xmlNewChild(target, NULL, BAD_CAST "format", NULL);
+ if (format == NULL)
+ goto out;
+
+ if (xmlNewProp(format, BAD_CAST "type", BAD_CAST type) == NULL)
+ goto out;
+
+ /* FIXME: Need to add permissions and label tags here */
+
+ return NULL;
+
+ out:
+ free(string);
+ return XML_ERROR;
+ }
+
+char *res_to_xml(struct virt_pool_res *res) {
+ char *xml = NULL;
+ xmlNodePtr root = NULL;
+ int type = res->type;
+ const char *msg = NULL;
+ resfn_t func;
+
+ root = xmlNewNode(NULL, BAD_CAST "tmp");
+ if (root == NULL) {
+ msg = XML_ERROR;
+ goto out;
+ }
+
+ switch (type) {
+ case CIM_RES_TYPE_IMAGE:
+ func = storage_vol_xml;
+ break;
+ default:
+ CU_DEBUG("res_to_xml: invalid type specified: %d", type);
+ msg = "res_to_xml: invalid type specified";
+ goto out;
+ }
+
+ msg = func(root, res);
+ if (msg != NULL)
+ goto out;
+
+ xml = tree_to_xml(root->children);
+ if (xml == NULL)
+ msg = "XML generation failed";
+ out:
+ if (msg != NULL) {
+ CU_DEBUG("Failed to create res XML: %s", msg);
+ } else {
+ CU_DEBUG("Created res XML:\n%s\n", xml);
+ }
+
+ xmlFreeNode(root);
+
+ return xml;
+}
+
/*
* Local Variables:
* mode: C
diff -r 615da7491c14 -r ffc93d36908a libxkutil/xmlgen.h
--- a/libxkutil/xmlgen.h Mon Aug 10 13:52:58 2009 -0700
+++ b/libxkutil/xmlgen.h Tue Jun 16 14:25:50 2009 -0700
@@ -36,4 +36,6 @@
char *pool_to_xml(struct virt_pool *pool);
+char *res_to_xml(struct virt_pool_res *res);
+
#endif