[libvirt] [libvirt-glib 1/4] config: Allow NULL node name to gvir_config_object_set_content

This is useful when you want to set the content of the current node. --- libvirt-gconfig/libvirt-gconfig-object.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index a7352a5..ac0545c 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -534,7 +534,6 @@ gvir_config_object_set_node_content(GVirConfigObject *object, GVirConfigObject *node; g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL); if (value == NULL) { gvir_config_object_delete_child(object, node_name, NULL); @@ -542,8 +541,12 @@ gvir_config_object_set_node_content(GVirConfigObject *object, return; } - node = gvir_config_object_replace_child(object, node_name); - g_return_if_fail(node != NULL); + if (node_name != NULL) { + node = gvir_config_object_replace_child(object, node_name); + g_return_if_fail(node != NULL); + } else { + node = g_object_ref(G_OBJECT(object)); + } encoded_data = xmlEncodeEntitiesReentrant(node->priv->node->doc, (xmlChar *)value); xmlNodeSetContent(node->priv->node, encoded_data); @@ -559,7 +562,6 @@ gvir_config_object_set_node_content_uint64(GVirConfigObject *object, char *str; g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL); str = g_strdup_printf("%"G_GUINT64_FORMAT, value); gvir_config_object_set_node_content(object, node_name, str); -- 1.7.11.4

Explicit the fact that it sets the maximum domain memory. --- libvirt-gconfig/libvirt-gconfig-domain.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 2ca478f..e6f22bd 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -286,7 +286,7 @@ void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *de * gvir_config_domain_get_memory: * @domain: a #GVirConfigDomain * - * Returns: amount of RAM in kilobytes (i.e. blocks of 1024 bytes). + * Returns: maximum amount of RAM in kilobytes (i.e. blocks of 1024 bytes). */ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) { @@ -297,9 +297,10 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) /** * gvir_config_domain_set_memory: * @domain: a #GVirConfigDomain - * @memory: The amount of RAM in kilobytes. + * @memory: The maximum amount of RAM in kilobytes. * - * Sets the amount of RAM allocated to @domain in kilobytes (i.e. blocks of 1024 bytes). + * Sets the maximum amount of RAM allocated to @domain in kilobytes (i.e. + * blocks of 1024 bytes). */ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) { -- 1.7.11.4

On Tue, Sep 04, 2012 at 02:44:46PM +0200, Christophe Fergeau wrote:
Explicit the fact that it sets the maximum domain memory. --- libvirt-gconfig/libvirt-gconfig-domain.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index 2ca478f..e6f22bd 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -286,7 +286,7 @@ void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *de * gvir_config_domain_get_memory: * @domain: a #GVirConfigDomain * - * Returns: amount of RAM in kilobytes (i.e. blocks of 1024 bytes). + * Returns: maximum amount of RAM in kilobytes (i.e. blocks of 1024 bytes). */ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) { @@ -297,9 +297,10 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) /** * gvir_config_domain_set_memory: * @domain: a #GVirConfigDomain - * @memory: The amount of RAM in kilobytes. + * @memory: The maximum amount of RAM in kilobytes. * - * Sets the amount of RAM allocated to @domain in kilobytes (i.e. blocks of 1024 bytes). + * Sets the maximum amount of RAM allocated to @domain in kilobytes (i.e. + * blocks of 1024 bytes). */ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) {
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

gvir_config_[gs]et_memory have an optional 'unit' attribute which indicates the unit used to express the memory size. This commit adds support for parsing this unit, and adjusting the returned value accordingly. --- libvirt-gconfig/libvirt-gconfig-domain.c | 81 ++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 5 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index e6f22bd..dd4e232 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -275,13 +275,70 @@ const char *gvir_config_domain_get_description(GVirConfigDomain *domain) * @domain: a #GVirConfigDomain * @description: (allow-none): */ -void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *description) +void gvir_config_domain_set_description(GVirConfigDomain *domain, + const char *description) { gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(domain), "description", description); g_object_notify(G_OBJECT(domain), "description"); } +static void insert_base(GHashTable *unit_bases, + const char *unit, + guint64 unit_base) +{ + guint64 *base; + base = g_slice_alloc(sizeof(*base)); + *base = unit_base; + g_hash_table_insert(unit_bases, (gpointer)unit, base); +} + +static gpointer set_unit_bases(G_GNUC_UNUSED gpointer user_data) +{ + GHashTable *unit_bases; + + unit_bases = g_hash_table_new(g_str_hash, g_str_equal); + + insert_base(unit_bases, "b", 1); + insert_base(unit_bases, "bytes", 1); + insert_base(unit_bases, "KB", 1000); + insert_base(unit_bases, "k", 1024); + insert_base(unit_bases, "KiB", 1024); + insert_base(unit_bases, "MB", 1000*1000); + insert_base(unit_bases, "M", 1024*1024); + insert_base(unit_bases, "MiB", 1024*1024); + insert_base(unit_bases, "GB", 1000*1000*1000); + insert_base(unit_bases, "G", 1024*1024*1024); + insert_base(unit_bases, "GiB", 1024*1024*1024); + insert_base(unit_bases, "TB", (guint64)1000*1000*1000*1000); + insert_base(unit_bases, "T", (guint64)1024*1024*1024*1024); + insert_base(unit_bases, "TiB", (guint64)1024*1024*1024*1024); + + return unit_bases; +} + +static guint64 get_unit_base(const char *unit, guint64 default_base) +{ + static GOnce set_unit_bases_once = G_ONCE_INIT; + GHashTable *unit_bases; + guint64 *unit_base; + + if (unit == NULL) { + return default_base; + } + + unit_bases = g_once (&set_unit_bases_once, set_unit_bases, &unit_bases); + g_return_val_if_fail (unit_bases != NULL, default_base); + + unit_base = g_hash_table_lookup(unit_bases, unit); + if (unit_base == NULL) { + /* unknown unit, fall back to the default unit */ + g_return_val_if_reached(default_base); + } + + return *unit_base; +} + /** * gvir_config_domain_get_memory: * @domain: a #GVirConfigDomain @@ -290,8 +347,17 @@ void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *de */ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) { - return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), - "memory"); + const char *unit; + guint64 unit_base; + guint64 memory; + + unit = gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(domain), "memory", "unit"); + unit_base = get_unit_base(unit, 1024); + + memory = gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory"); + + return memory * unit_base / 1024; } /** @@ -304,8 +370,13 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) */ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) { - gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(domain), - "memory", memory); + GVirConfigObject *node; + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), "memory"); + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(node), NULL, memory); + gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(node), + "unit", "KiB", + NULL); g_object_notify(G_OBJECT(domain), "memory"); } -- 1.7.11.4

On Tue, Sep 04, 2012 at 02:44:47PM +0200, Christophe Fergeau wrote:
gvir_config_[gs]et_memory have an optional 'unit' attribute which indicates the unit used to express the memory size. This commit adds support for parsing this unit, and adjusting the returned value accordingly. --- libvirt-gconfig/libvirt-gconfig-domain.c | 81 ++++++++++++++++++++++++++++++-- 1 file changed, 76 insertions(+), 5 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index e6f22bd..dd4e232 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -275,13 +275,70 @@ const char *gvir_config_domain_get_description(GVirConfigDomain *domain) * @domain: a #GVirConfigDomain * @description: (allow-none): */ -void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *description) +void gvir_config_domain_set_description(GVirConfigDomain *domain, + const char *description) { gvir_config_object_set_node_content(GVIR_CONFIG_OBJECT(domain), "description", description); g_object_notify(G_OBJECT(domain), "description"); }
+static void insert_base(GHashTable *unit_bases, + const char *unit, + guint64 unit_base) +{ + guint64 *base; + base = g_slice_alloc(sizeof(*base)); + *base = unit_base; + g_hash_table_insert(unit_bases, (gpointer)unit, base); +} + +static gpointer set_unit_bases(G_GNUC_UNUSED gpointer user_data) +{ + GHashTable *unit_bases; + + unit_bases = g_hash_table_new(g_str_hash, g_str_equal); + + insert_base(unit_bases, "b", 1); + insert_base(unit_bases, "bytes", 1); + insert_base(unit_bases, "KB", 1000); + insert_base(unit_bases, "k", 1024); + insert_base(unit_bases, "KiB", 1024); + insert_base(unit_bases, "MB", 1000*1000); + insert_base(unit_bases, "M", 1024*1024); + insert_base(unit_bases, "MiB", 1024*1024); + insert_base(unit_bases, "GB", 1000*1000*1000); + insert_base(unit_bases, "G", 1024*1024*1024); + insert_base(unit_bases, "GiB", 1024*1024*1024); + insert_base(unit_bases, "TB", (guint64)1000*1000*1000*1000); + insert_base(unit_bases, "T", (guint64)1024*1024*1024*1024); + insert_base(unit_bases, "TiB", (guint64)1024*1024*1024*1024); + + return unit_bases; +} + +static guint64 get_unit_base(const char *unit, guint64 default_base) +{ + static GOnce set_unit_bases_once = G_ONCE_INIT; + GHashTable *unit_bases; + guint64 *unit_base; + + if (unit == NULL) { + return default_base; + } + + unit_bases = g_once (&set_unit_bases_once, set_unit_bases, &unit_bases); + g_return_val_if_fail (unit_bases != NULL, default_base); + + unit_base = g_hash_table_lookup(unit_bases, unit); + if (unit_base == NULL) { + /* unknown unit, fall back to the default unit */ + g_return_val_if_reached(default_base); + } + + return *unit_base; +} + /** * gvir_config_domain_get_memory: * @domain: a #GVirConfigDomain @@ -290,8 +347,17 @@ void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *de */ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) { - return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), - "memory"); + const char *unit; + guint64 unit_base; + guint64 memory; + + unit = gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(domain), "memory", "unit"); + unit_base = get_unit_base(unit, 1024); + + memory = gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "memory"); + + return memory * unit_base / 1024; }
/** @@ -304,8 +370,13 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) */ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) { - gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(domain), - "memory", memory); + GVirConfigObject *node; + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), "memory"); + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(node), NULL, memory); + gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(node), + "unit", "KiB", + NULL); g_object_notify(G_OBJECT(domain), "memory");
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

libvirt will insert a <currentMemory> node when setting the domain maximum memory. If we want to be able to later increase the domain maximum memory, libvirt-gconfig needs to be able to set this currentMemory node as well, otherwise this will cap the available memory in the domain. --- libvirt-gconfig/libvirt-gconfig-domain.c | 64 +++++++++++++++++++++++++++++++- libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 6 +++ 3 files changed, 71 insertions(+), 1 deletion(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index dd4e232..e679e3a 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -43,7 +43,8 @@ enum { PROP_DESCRIPTION, PROP_MEMORY, PROP_VCPU, - PROP_FEATURES + PROP_FEATURES, + PROP_CURRENT_MEMORY }; static void gvir_config_domain_get_property(GObject *object, @@ -66,6 +67,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_MEMORY: g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); break; + case PROP_CURRENT_MEMORY: + g_value_set_uint64(value, gvir_config_domain_get_current_memory(domain)); + break; case PROP_VCPU: g_value_set_uint64(value, gvir_config_domain_get_vcpus(domain)); break; @@ -98,6 +102,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_MEMORY: gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); break; + case PROP_CURRENT_MEMORY: + gvir_config_domain_set_current_memory(domain, g_value_get_uint64(value)); + break; case PROP_VCPU: gvir_config_domain_set_vcpus(domain, g_value_get_uint64(value)); break; @@ -153,6 +160,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, + PROP_CURRENT_MEMORY, + g_param_spec_uint64("current-memory", + "Current memory", + "Current Guest Memory (in kilobytes)", + 0, G_MAXUINT64, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, PROP_VCPU, g_param_spec_uint64("vcpu", "Virtual CPUs", @@ -361,6 +377,27 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) } /** + * gvir_config_domain_get_current_memory: + * @domain: a #GVirConfigDomain + * + * Returns: current amount of RAM in kilobytes (i.e. blocks of 1024 bytes). + */ +guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain) +{ + const char *unit; + guint64 unit_base; + guint64 memory; + + unit = gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(domain), "currentMemory", "unit"); + unit_base = get_unit_base(unit, 1024); + + memory = gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "currentMemory"); + + return memory * unit_base / 1024; +} + +/** * gvir_config_domain_set_memory: * @domain: a #GVirConfigDomain * @memory: The maximum amount of RAM in kilobytes. @@ -380,6 +417,31 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) g_object_notify(G_OBJECT(domain), "memory"); } +/** + * gvir_config_domain_set_current_memory: + * @domain: a #GVirConfigDomain + * @memory: The current amount of RAM in kilobytes. + * + * Sets the current amount of RAM allocated to @domain in kilobytes (i.e. + * blocks of 1024 bytes). This can be set to less than the maximum domain + * memory to allow to balloon the guest memory on the fly. Be aware that + * libvirt will set it automatically if it's not explictly set, which means + * you may need to set this value in addition to 'memory' if you want to + * change the available domain memory after creation. + */ +void gvir_config_domain_set_current_memory(GVirConfigDomain *domain, + guint64 memory) +{ + GVirConfigObject *node; + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), "currentMemory"); + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(node), NULL, memory); + gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(node), + "unit", "KiB", + NULL); + g_object_notify(G_OBJECT(domain), "current-memory"); +} + guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain) { return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index b9a0dce..a7bd73b 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -108,6 +108,8 @@ const char *gvir_config_domain_get_description(GVirConfigDomain *domain); void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *description); guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory); +guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain); +void gvir_config_domain_set_current_memory(GVirConfigDomain *domain, guint64 memory); guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain); void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, guint64 vcpu_count); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7507d45..f83eabb 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -460,4 +460,10 @@ LIBVIRT_GCONFIG_0.1.0 { gvir_config_domain_cpu_feature_set_policy; } LIBVIRT_GCONFIG_0.0.9; +LIBVIRT_GCONFIG_0.1.3 { + global: + gvir_config_domain_get_current_memory; + gvir_config_domain_set_current_memory; +} LIBVIRT_GCONFIG_0.1.0; + # .... define new API here using predicted next version number .... -- 1.7.11.4

On Tue, Sep 04, 2012 at 02:44:48PM +0200, Christophe Fergeau wrote:
libvirt will insert a <currentMemory> node when setting the domain maximum memory. If we want to be able to later increase the domain maximum memory, libvirt-gconfig needs to be able to set this currentMemory node as well, otherwise this will cap the available memory in the domain. --- libvirt-gconfig/libvirt-gconfig-domain.c | 64 +++++++++++++++++++++++++++++++- libvirt-gconfig/libvirt-gconfig-domain.h | 2 + libvirt-gconfig/libvirt-gconfig.sym | 6 +++ 3 files changed, 71 insertions(+), 1 deletion(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-domain.c b/libvirt-gconfig/libvirt-gconfig-domain.c index dd4e232..e679e3a 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.c +++ b/libvirt-gconfig/libvirt-gconfig-domain.c @@ -43,7 +43,8 @@ enum { PROP_DESCRIPTION, PROP_MEMORY, PROP_VCPU, - PROP_FEATURES + PROP_FEATURES, + PROP_CURRENT_MEMORY };
static void gvir_config_domain_get_property(GObject *object, @@ -66,6 +67,9 @@ static void gvir_config_domain_get_property(GObject *object, case PROP_MEMORY: g_value_set_uint64(value, gvir_config_domain_get_memory(domain)); break; + case PROP_CURRENT_MEMORY: + g_value_set_uint64(value, gvir_config_domain_get_current_memory(domain)); + break; case PROP_VCPU: g_value_set_uint64(value, gvir_config_domain_get_vcpus(domain)); break; @@ -98,6 +102,9 @@ static void gvir_config_domain_set_property(GObject *object, case PROP_MEMORY: gvir_config_domain_set_memory(domain, g_value_get_uint64(value)); break; + case PROP_CURRENT_MEMORY: + gvir_config_domain_set_current_memory(domain, g_value_get_uint64(value)); + break; case PROP_VCPU: gvir_config_domain_set_vcpus(domain, g_value_get_uint64(value)); break; @@ -153,6 +160,15 @@ static void gvir_config_domain_class_init(GVirConfigDomainClass *klass) G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); g_object_class_install_property(object_class, + PROP_CURRENT_MEMORY, + g_param_spec_uint64("current-memory", + "Current memory", + "Current Guest Memory (in kilobytes)", + 0, G_MAXUINT64, + 0, + G_PARAM_READWRITE | + G_PARAM_STATIC_STRINGS)); + g_object_class_install_property(object_class, PROP_VCPU, g_param_spec_uint64("vcpu", "Virtual CPUs", @@ -361,6 +377,27 @@ guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain) }
/** + * gvir_config_domain_get_current_memory: + * @domain: a #GVirConfigDomain + * + * Returns: current amount of RAM in kilobytes (i.e. blocks of 1024 bytes). + */ +guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain) +{ + const char *unit; + guint64 unit_base; + guint64 memory; + + unit = gvir_config_object_get_attribute(GVIR_CONFIG_OBJECT(domain), "currentMemory", "unit"); + unit_base = get_unit_base(unit, 1024); + + memory = gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), + "currentMemory"); + + return memory * unit_base / 1024; +} + +/** * gvir_config_domain_set_memory: * @domain: a #GVirConfigDomain * @memory: The maximum amount of RAM in kilobytes. @@ -380,6 +417,31 @@ void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory) g_object_notify(G_OBJECT(domain), "memory"); }
+/** + * gvir_config_domain_set_current_memory: + * @domain: a #GVirConfigDomain + * @memory: The current amount of RAM in kilobytes. + * + * Sets the current amount of RAM allocated to @domain in kilobytes (i.e. + * blocks of 1024 bytes). This can be set to less than the maximum domain + * memory to allow to balloon the guest memory on the fly. Be aware that + * libvirt will set it automatically if it's not explictly set, which means + * you may need to set this value in addition to 'memory' if you want to + * change the available domain memory after creation. + */ +void gvir_config_domain_set_current_memory(GVirConfigDomain *domain, + guint64 memory) +{ + GVirConfigObject *node; + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(domain), "currentMemory"); + gvir_config_object_set_node_content_uint64(GVIR_CONFIG_OBJECT(node), NULL, memory); + gvir_config_object_set_attribute(GVIR_CONFIG_OBJECT(node), + "unit", "KiB", + NULL); + g_object_notify(G_OBJECT(domain), "current-memory"); +} + guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain) { return gvir_config_object_get_node_content_uint64(GVIR_CONFIG_OBJECT(domain), diff --git a/libvirt-gconfig/libvirt-gconfig-domain.h b/libvirt-gconfig/libvirt-gconfig-domain.h index b9a0dce..a7bd73b 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain.h +++ b/libvirt-gconfig/libvirt-gconfig-domain.h @@ -108,6 +108,8 @@ const char *gvir_config_domain_get_description(GVirConfigDomain *domain); void gvir_config_domain_set_description(GVirConfigDomain *domain, const char *description); guint64 gvir_config_domain_get_memory(GVirConfigDomain *domain); void gvir_config_domain_set_memory(GVirConfigDomain *domain, guint64 memory); +guint64 gvir_config_domain_get_current_memory(GVirConfigDomain *domain); +void gvir_config_domain_set_current_memory(GVirConfigDomain *domain, guint64 memory); guint64 gvir_config_domain_get_vcpus(GVirConfigDomain *domain); void gvir_config_domain_set_vcpus(GVirConfigDomain *domain, guint64 vcpu_count); diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 7507d45..f83eabb 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -460,4 +460,10 @@ LIBVIRT_GCONFIG_0.1.0 { gvir_config_domain_cpu_feature_set_policy; } LIBVIRT_GCONFIG_0.0.9;
+LIBVIRT_GCONFIG_0.1.3 { + global: + gvir_config_domain_get_current_memory; + gvir_config_domain_set_current_memory; +} LIBVIRT_GCONFIG_0.1.0; + # .... define new API here using predicted next version number ....
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

Hey, I think this patch was missed during the review, I can't push the 3 patches that were ACK'ed without this one. Christophe On Tue, Sep 04, 2012 at 02:44:45PM +0200, Christophe Fergeau wrote:
This is useful when you want to set the content of the current node. --- libvirt-gconfig/libvirt-gconfig-object.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index a7352a5..ac0545c 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -534,7 +534,6 @@ gvir_config_object_set_node_content(GVirConfigObject *object, GVirConfigObject *node;
g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL);
if (value == NULL) { gvir_config_object_delete_child(object, node_name, NULL); @@ -542,8 +541,12 @@ gvir_config_object_set_node_content(GVirConfigObject *object, return; }
- node = gvir_config_object_replace_child(object, node_name); - g_return_if_fail(node != NULL); + if (node_name != NULL) { + node = gvir_config_object_replace_child(object, node_name); + g_return_if_fail(node != NULL); + } else { + node = g_object_ref(G_OBJECT(object)); + } encoded_data = xmlEncodeEntitiesReentrant(node->priv->node->doc, (xmlChar *)value); xmlNodeSetContent(node->priv->node, encoded_data); @@ -559,7 +562,6 @@ gvir_config_object_set_node_content_uint64(GVirConfigObject *object, char *str;
g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL);
str = g_strdup_printf("%"G_GUINT64_FORMAT, value); gvir_config_object_set_node_content(object, node_name, str); -- 1.7.11.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list

On Mon, Sep 10, 2012 at 10:58:55AM +0200, Christophe Fergeau wrote:
Hey,
I think this patch was missed during the review, I can't push the 3 patches that were ACK'ed without this one.
Christophe
On Tue, Sep 04, 2012 at 02:44:45PM +0200, Christophe Fergeau wrote:
This is useful when you want to set the content of the current node. --- libvirt-gconfig/libvirt-gconfig-object.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
diff --git a/libvirt-gconfig/libvirt-gconfig-object.c b/libvirt-gconfig/libvirt-gconfig-object.c index a7352a5..ac0545c 100644 --- a/libvirt-gconfig/libvirt-gconfig-object.c +++ b/libvirt-gconfig/libvirt-gconfig-object.c @@ -534,7 +534,6 @@ gvir_config_object_set_node_content(GVirConfigObject *object, GVirConfigObject *node;
g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL);
if (value == NULL) { gvir_config_object_delete_child(object, node_name, NULL); @@ -542,8 +541,12 @@ gvir_config_object_set_node_content(GVirConfigObject *object, return; }
- node = gvir_config_object_replace_child(object, node_name); - g_return_if_fail(node != NULL); + if (node_name != NULL) { + node = gvir_config_object_replace_child(object, node_name); + g_return_if_fail(node != NULL); + } else { + node = g_object_ref(G_OBJECT(object)); + } encoded_data = xmlEncodeEntitiesReentrant(node->priv->node->doc, (xmlChar *)value); xmlNodeSetContent(node->priv->node, encoded_data); @@ -559,7 +562,6 @@ gvir_config_object_set_node_content_uint64(GVirConfigObject *object, char *str;
g_return_if_fail(GVIR_CONFIG_IS_OBJECT(object)); - g_return_if_fail(node_name != NULL);
str = g_strdup_printf("%"G_GUINT64_FORMAT, value); gvir_config_object_set_node_content(object, node_name, str); -- 1.7.11.4
-- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
participants (2)
-
Christophe Fergeau
-
Daniel P. Berrange