[Libvirt-cim] [PATCH 1 of 2] Image Creation: add functions for generating a storage volume XML
Richard Maciel
rmaciel at linux.vnet.ibm.com
Wed Aug 12 17:30:08 UTC 2009
On 08/11/2009 05:19 PM, Kaitlin Rupert wrote:
> # HG changeset patch
> # User Kaitlin Rupert<karupert at 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 at 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";
Since you're using the same message, why not assign the value and use it?
> + 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
>
> _______________________________________________
> Libvirt-cim mailing list
> Libvirt-cim at redhat.com
> https://www.redhat.com/mailman/listinfo/libvirt-cim
Only a small comment on the style above. Overall, the code is fine.
--
Richard Maciel, MSc
IBM Linux Technology Center
rmaciel at linux.vnet.ibm.com
More information about the Libvirt-cim
mailing list