You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
326 lines
10 KiB
326 lines
10 KiB
5 years ago
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: "Eduardo Lima (Etrunko)" <etrunko@redhat.com>
|
||
|
Date: Thu, 22 Jun 2017 13:06:53 -0300
|
||
|
Subject: [PATCH] storage-domain: Move out ovirt_resource_parse_xml() to
|
||
|
ovirt-utils
|
||
|
|
||
|
There were a couple of tweaks to the function:
|
||
|
|
||
|
1) Renamed to ovirt_rest_xml_node_parse()
|
||
|
More suited to the task performed.
|
||
|
|
||
|
2) Validates GObject instead of OvirtResource
|
||
|
This removes the restriction of usage by a OvirtResource, and in the
|
||
|
future it can also be used by OvirtVmDisplay to parse the elements.
|
||
|
It also makes it more coherent to its purpose, as the function only
|
||
|
sets properties of a GObject and does not really require a
|
||
|
OvirtResource.
|
||
|
|
||
|
Signed-off-by: Eduardo Lima (Etrunko) <etrunko@redhat.com>
|
||
|
---
|
||
|
govirt/ovirt-storage-domain.c | 152 +++++++---------------------------
|
||
|
govirt/ovirt-utils.c | 71 +++++++++++++++-
|
||
|
govirt/ovirt-utils.h | 13 ++-
|
||
|
3 files changed, 113 insertions(+), 123 deletions(-)
|
||
|
|
||
|
diff --git a/govirt/ovirt-storage-domain.c b/govirt/ovirt-storage-domain.c
|
||
|
index 07c0ef0..0582203 100644
|
||
|
--- a/govirt/ovirt-storage-domain.c
|
||
|
+++ b/govirt/ovirt-storage-domain.c
|
||
|
@@ -53,10 +53,6 @@ enum {
|
||
|
PROP_STATE
|
||
|
};
|
||
|
|
||
|
-static gboolean
|
||
|
-ovirt_storage_domain_refresh_from_xml(OvirtStorageDomain *domain,
|
||
|
- RestXmlNode *node);
|
||
|
-
|
||
|
static void ovirt_storage_domain_get_property(GObject *object,
|
||
|
guint prop_id,
|
||
|
GValue *value,
|
||
|
@@ -145,10 +141,39 @@ static gboolean ovirt_storage_domain_init_from_xml(OvirtResource *resource,
|
||
|
{
|
||
|
gboolean parsed_ok;
|
||
|
OvirtResourceClass *parent_class;
|
||
|
- OvirtStorageDomain *domain;
|
||
|
+ OvirtXmlElement storage_domain_elements[] = {
|
||
|
+ { .prop_name = "type",
|
||
|
+ .type = OVIRT_TYPE_STORAGE_DOMAIN_TYPE,
|
||
|
+ .xml_path = "type",
|
||
|
+ },
|
||
|
+ { .prop_name = "master",
|
||
|
+ .type = G_TYPE_BOOLEAN,
|
||
|
+ .xml_path = "master",
|
||
|
+ },
|
||
|
+ { .prop_name = "available",
|
||
|
+ .type = G_TYPE_UINT64,
|
||
|
+ .xml_path = "available",
|
||
|
+ },
|
||
|
+ { .prop_name = "used",
|
||
|
+ .type = G_TYPE_UINT64,
|
||
|
+ .xml_path = "used",
|
||
|
+ },
|
||
|
+ { .prop_name = "committed",
|
||
|
+ .type = G_TYPE_UINT64,
|
||
|
+ .xml_path = "committed",
|
||
|
+ },
|
||
|
+ { .prop_name = "version",
|
||
|
+ .type = OVIRT_TYPE_STORAGE_DOMAIN_FORMAT_VERSION,
|
||
|
+ .xml_path = "storage_format",
|
||
|
+ },
|
||
|
+ { .prop_name = "state",
|
||
|
+ .type = OVIRT_TYPE_STORAGE_DOMAIN_STATE,
|
||
|
+ .xml_path = "status/state",
|
||
|
+ },
|
||
|
+ { NULL , }
|
||
|
+ };
|
||
|
|
||
|
- domain = OVIRT_STORAGE_DOMAIN(resource);
|
||
|
- parsed_ok = ovirt_storage_domain_refresh_from_xml(domain, node);
|
||
|
+ parsed_ok = ovirt_rest_xml_node_parse(node, G_OBJECT(resource), storage_domain_elements);
|
||
|
if (!parsed_ok) {
|
||
|
return FALSE;
|
||
|
}
|
||
|
@@ -277,119 +302,6 @@ OvirtStorageDomain *ovirt_storage_domain_new(void)
|
||
|
return OVIRT_STORAGE_DOMAIN(domain);
|
||
|
}
|
||
|
|
||
|
-static gboolean
|
||
|
-_set_property_value_from_type(GValue *value,
|
||
|
- GType type,
|
||
|
- const char *value_str,
|
||
|
- RestXmlNode *node)
|
||
|
-{
|
||
|
- gboolean ret = TRUE;
|
||
|
-
|
||
|
- if (g_type_is_a(type, OVIRT_TYPE_RESOURCE)) {
|
||
|
- GObject *resource_value = g_initable_new(type, NULL, NULL, "xml-node", node, NULL);
|
||
|
- g_value_set_object(value, resource_value);
|
||
|
- goto end;
|
||
|
- }
|
||
|
-
|
||
|
- /* All other types require valid value_str */
|
||
|
- if (value_str == NULL)
|
||
|
- return FALSE;
|
||
|
-
|
||
|
- if (G_TYPE_IS_ENUM(type)) {
|
||
|
- int enum_value = ovirt_utils_genum_get_value(type, value_str, 0);
|
||
|
- g_value_set_enum(value, enum_value);
|
||
|
- goto end;
|
||
|
- }
|
||
|
-
|
||
|
- switch(type) {
|
||
|
- case G_TYPE_BOOLEAN: {
|
||
|
- gboolean bool_value = ovirt_utils_boolean_from_string(value_str);
|
||
|
- g_value_set_boolean(value, bool_value);
|
||
|
- break;
|
||
|
- }
|
||
|
- case G_TYPE_UINT64: {
|
||
|
- guint64 int64_value = g_ascii_strtoull(value_str, NULL, 0);
|
||
|
- g_value_set_uint64(value, int64_value);
|
||
|
- break;
|
||
|
- }
|
||
|
- default: {
|
||
|
- g_warning("Unexpected type '%s' with value '%s'", g_type_name(type), value_str);
|
||
|
- ret = FALSE;
|
||
|
- }
|
||
|
- }
|
||
|
-
|
||
|
-end:
|
||
|
- return ret;
|
||
|
-}
|
||
|
-
|
||
|
-typedef struct {
|
||
|
- const char *prop_name;
|
||
|
- GType type;
|
||
|
- const char *xml_path;
|
||
|
-} OvirtXmlElement;
|
||
|
-
|
||
|
-static gboolean
|
||
|
-ovirt_resource_parse_xml(OvirtResource *resource,
|
||
|
- RestXmlNode *node,
|
||
|
- OvirtXmlElement *elements)
|
||
|
-{
|
||
|
- g_return_val_if_fail(OVIRT_IS_RESOURCE(resource), FALSE);
|
||
|
- g_return_val_if_fail(elements != NULL, FALSE);
|
||
|
-
|
||
|
- for (;elements->xml_path != NULL; elements++) {
|
||
|
- const char *value_str;
|
||
|
- GValue value = { 0, };
|
||
|
-
|
||
|
- value_str = ovirt_rest_xml_node_get_content_from_path(node, elements->xml_path);
|
||
|
-
|
||
|
- g_value_init(&value, elements->type);
|
||
|
- if (_set_property_value_from_type(&value, elements->type, value_str, node))
|
||
|
- g_object_set_property(G_OBJECT(resource), elements->prop_name, &value);
|
||
|
- g_value_unset(&value);
|
||
|
- }
|
||
|
-
|
||
|
- return TRUE;
|
||
|
-}
|
||
|
-
|
||
|
-static gboolean
|
||
|
-ovirt_storage_domain_refresh_from_xml(OvirtStorageDomain *domain,
|
||
|
- RestXmlNode *node)
|
||
|
-{
|
||
|
- OvirtXmlElement storage_domain_elements[] = {
|
||
|
- { .prop_name = "type",
|
||
|
- .type = OVIRT_TYPE_STORAGE_DOMAIN_TYPE,
|
||
|
- .xml_path = "type",
|
||
|
- },
|
||
|
- { .prop_name = "master",
|
||
|
- .type = G_TYPE_BOOLEAN,
|
||
|
- .xml_path = "master",
|
||
|
- },
|
||
|
- { .prop_name = "available",
|
||
|
- .type = G_TYPE_UINT64,
|
||
|
- .xml_path = "available",
|
||
|
- },
|
||
|
- { .prop_name = "used",
|
||
|
- .type = G_TYPE_UINT64,
|
||
|
- .xml_path = "used",
|
||
|
- },
|
||
|
- { .prop_name = "committed",
|
||
|
- .type = G_TYPE_UINT64,
|
||
|
- .xml_path = "committed",
|
||
|
- },
|
||
|
- { .prop_name = "version",
|
||
|
- .type = OVIRT_TYPE_STORAGE_DOMAIN_FORMAT_VERSION,
|
||
|
- .xml_path = "storage_format",
|
||
|
- },
|
||
|
- { .prop_name = "state",
|
||
|
- .type = OVIRT_TYPE_STORAGE_DOMAIN_STATE,
|
||
|
- .xml_path = "status/state",
|
||
|
- },
|
||
|
- { NULL , }
|
||
|
- };
|
||
|
-
|
||
|
- return ovirt_resource_parse_xml(OVIRT_RESOURCE(domain), node, storage_domain_elements);
|
||
|
-}
|
||
|
-
|
||
|
|
||
|
/**
|
||
|
* ovirt_storage_domain_get_files:
|
||
|
diff --git a/govirt/ovirt-utils.c b/govirt/ovirt-utils.c
|
||
|
index 0e0134c..44ea7da 100644
|
||
|
--- a/govirt/ovirt-utils.c
|
||
|
+++ b/govirt/ovirt-utils.c
|
||
|
@@ -31,6 +31,7 @@
|
||
|
#include "ovirt-utils.h"
|
||
|
|
||
|
#include "ovirt-error.h"
|
||
|
+#include "ovirt-resource.h"
|
||
|
|
||
|
RestXmlNode *
|
||
|
ovirt_rest_xml_node_from_call(RestProxyCall *call)
|
||
|
@@ -77,7 +78,7 @@ ovirt_rest_xml_node_get_content_va(RestXmlNode *node,
|
||
|
return node->content;
|
||
|
}
|
||
|
|
||
|
-G_GNUC_INTERNAL const char *
|
||
|
+static const char *
|
||
|
ovirt_rest_xml_node_get_content_from_path(RestXmlNode *node, const char *path)
|
||
|
{
|
||
|
GStrv pathv;
|
||
|
@@ -109,6 +110,74 @@ ovirt_rest_xml_node_get_content(RestXmlNode *node, ...)
|
||
|
return content;
|
||
|
}
|
||
|
|
||
|
+static gboolean
|
||
|
+_set_property_value_from_type(GValue *value,
|
||
|
+ GType type,
|
||
|
+ const char *value_str,
|
||
|
+ RestXmlNode *node)
|
||
|
+{
|
||
|
+ gboolean ret = TRUE;
|
||
|
+
|
||
|
+ if (g_type_is_a(type, OVIRT_TYPE_RESOURCE)) {
|
||
|
+ GObject *resource_value = g_initable_new(type, NULL, NULL, "xml-node", node, NULL);
|
||
|
+ g_value_set_object(value, resource_value);
|
||
|
+ goto end;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* All other types require valid value_str */
|
||
|
+ if (value_str == NULL)
|
||
|
+ return FALSE;
|
||
|
+
|
||
|
+ if (G_TYPE_IS_ENUM(type)) {
|
||
|
+ int enum_value = ovirt_utils_genum_get_value(type, value_str, 0);
|
||
|
+ g_value_set_enum(value, enum_value);
|
||
|
+ goto end;
|
||
|
+ }
|
||
|
+
|
||
|
+ switch(type) {
|
||
|
+ case G_TYPE_BOOLEAN: {
|
||
|
+ gboolean bool_value = ovirt_utils_boolean_from_string(value_str);
|
||
|
+ g_value_set_boolean(value, bool_value);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ case G_TYPE_UINT64: {
|
||
|
+ guint64 int64_value = g_ascii_strtoull(value_str, NULL, 0);
|
||
|
+ g_value_set_uint64(value, int64_value);
|
||
|
+ break;
|
||
|
+ }
|
||
|
+ default: {
|
||
|
+ g_warning("Unexpected type '%s' with value '%s'", g_type_name(type), value_str);
|
||
|
+ ret = FALSE;
|
||
|
+ }
|
||
|
+ }
|
||
|
+
|
||
|
+end:
|
||
|
+ return ret;
|
||
|
+}
|
||
|
+
|
||
|
+gboolean
|
||
|
+ovirt_rest_xml_node_parse(RestXmlNode *node,
|
||
|
+ GObject *object,
|
||
|
+ OvirtXmlElement *elements)
|
||
|
+{
|
||
|
+ g_return_val_if_fail(G_IS_OBJECT(object), FALSE);
|
||
|
+ g_return_val_if_fail(elements != NULL, FALSE);
|
||
|
+
|
||
|
+ for (;elements->xml_path != NULL; elements++) {
|
||
|
+ const char *value_str;
|
||
|
+ GValue value = { 0, };
|
||
|
+
|
||
|
+ value_str = ovirt_rest_xml_node_get_content_from_path(node, elements->xml_path);
|
||
|
+
|
||
|
+ g_value_init(&value, elements->type);
|
||
|
+ if (_set_property_value_from_type(&value, elements->type, value_str, node))
|
||
|
+ g_object_set_property(object, elements->prop_name, &value);
|
||
|
+ g_value_unset(&value);
|
||
|
+ }
|
||
|
+
|
||
|
+ return TRUE;
|
||
|
+}
|
||
|
+
|
||
|
|
||
|
/* These 2 functions come from
|
||
|
* libvirt-glib/libvirt-gconfig/libvirt-gconfig-helpers.c
|
||
|
diff --git a/govirt/ovirt-utils.h b/govirt/ovirt-utils.h
|
||
|
index 3f43fc9..4fd4164 100644
|
||
|
--- a/govirt/ovirt-utils.h
|
||
|
+++ b/govirt/ovirt-utils.h
|
||
|
@@ -27,10 +27,19 @@
|
||
|
|
||
|
G_BEGIN_DECLS
|
||
|
|
||
|
+typedef struct _OvirtXmlElement OvirtXmlElement;
|
||
|
+struct _OvirtXmlElement
|
||
|
+{
|
||
|
+ const char *prop_name;
|
||
|
+ GType type;
|
||
|
+ const char *xml_path;
|
||
|
+};
|
||
|
+
|
||
|
RestXmlNode *ovirt_rest_xml_node_from_call(RestProxyCall *call);
|
||
|
const char *ovirt_rest_xml_node_get_content(RestXmlNode *node, ...);
|
||
|
-const char *ovirt_rest_xml_node_get_content_from_path(RestXmlNode *node,
|
||
|
- const char *path);
|
||
|
+gboolean ovirt_rest_xml_node_parse(RestXmlNode *node,
|
||
|
+ GObject *object,
|
||
|
+ OvirtXmlElement *elements);
|
||
|
gboolean ovirt_utils_gerror_from_xml_fault(RestXmlNode *root, GError **error);
|
||
|
gboolean g_object_set_guint_property_from_xml(GObject *g_object,
|
||
|
RestXmlNode *node,
|