[libvirt] Expand GVirConfigDomainInterface a bit

Hi, This patch series add setters for the GVirConfigDomainInterface properties which are common to all classes deriving from GVirConfigDomainInterface. It also adds GVirConfigDomainInterfaceUser so that it's possible to create <interface type="user"> nodes. Christophe

--- libvirt-gconfig/Makefile.am | 2 + .../libvirt-gconfig-domain-interface-user.c | 77 ++++++++++++++++++++ .../libvirt-gconfig-domain-interface-user.h | 68 +++++++++++++++++ libvirt-gconfig/libvirt-gconfig.h | 1 + libvirt-gconfig/libvirt-gconfig.sym | 4 + 5 files changed, 152 insertions(+), 0 deletions(-) create mode 100644 libvirt-gconfig/libvirt-gconfig-domain-interface-user.c create mode 100644 libvirt-gconfig/libvirt-gconfig-domain-interface-user.h diff --git a/libvirt-gconfig/Makefile.am b/libvirt-gconfig/Makefile.am index 6363f88..e44ca85 100644 --- a/libvirt-gconfig/Makefile.am +++ b/libvirt-gconfig/Makefile.am @@ -28,6 +28,7 @@ GCONFIG_HEADER_FILES = \ libvirt-gconfig-domain-input.h \ libvirt-gconfig-domain-interface.h \ libvirt-gconfig-domain-interface-network.h \ + libvirt-gconfig-domain-interface-user.h \ libvirt-gconfig-domain-memballoon.h \ libvirt-gconfig-domain-os.h \ libvirt-gconfig-domain-seclabel.h \ @@ -71,6 +72,7 @@ GCONFIG_SOURCE_FILES = \ libvirt-gconfig-domain-input.c \ libvirt-gconfig-domain-interface.c \ libvirt-gconfig-domain-interface-network.c \ + libvirt-gconfig-domain-interface-user.c \ libvirt-gconfig-domain-memballoon.c \ libvirt-gconfig-domain-os.c \ libvirt-gconfig-domain-seclabel.c \ diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c new file mode 100644 index 0000000..2c03af2 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.c @@ -0,0 +1,77 @@ +/* + * libvirt-gconfig-domain-interface-user.c: libvirt domain interface configuration + * + * Copyright (C) 2008 Daniel P. Berrange + * Copyright (C) 2011 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Daniel P. Berrange <berrange@redhat.com> + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#include <config.h> + +#include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-helpers-private.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" + +#define GVIR_CONFIG_DOMAIN_INTERFACE_USER_GET_PRIVATE(obj) \ + (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER, GVirConfigDomainInterfaceUserPrivate)) + +struct _GVirConfigDomainInterfaceUserPrivate +{ + gboolean unused; +}; + +G_DEFINE_TYPE(GVirConfigDomainInterfaceUser, gvir_config_domain_interface_user, GVIR_TYPE_CONFIG_DOMAIN_INTERFACE); + + +static void gvir_config_domain_interface_user_class_init(GVirConfigDomainInterfaceUserClass *klass) +{ + g_type_class_add_private(klass, sizeof(GVirConfigDomainInterfaceUserPrivate)); +} + + +static void gvir_config_domain_interface_user_init(GVirConfigDomainInterfaceUser *conn) +{ + g_debug("Init GVirConfigDomainInterfaceUser=%p", conn); + + conn->priv = GVIR_CONFIG_DOMAIN_INTERFACE_USER_GET_PRIVATE(conn); +} + + +GVirConfigDomainInterfaceUser *gvir_config_domain_interface_user_new(void) +{ + GVirConfigObject *object; + + object = gvir_config_object_new(GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER, + "interface", NULL); + gvir_config_object_set_attribute(object, "type", "user", NULL); + return GVIR_CONFIG_DOMAIN_INTERFACE_USER(object); +} + +GVirConfigDomainInterfaceUser *gvir_config_domain_interface_user_new_from_xml(const gchar *xml, + GError **error) +{ + GVirConfigObject *object; + + object = gvir_config_object_new_from_xml(GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER, + "interface", NULL, xml, error); + if (object == NULL) + return NULL; + gvir_config_object_set_attribute(object, "type", "user", NULL); + return GVIR_CONFIG_DOMAIN_INTERFACE_USER(object); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface-user.h b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.h new file mode 100644 index 0000000..bf76412 --- /dev/null +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface-user.h @@ -0,0 +1,68 @@ +/* + * libvirt-gconfig-domain-interface-user.c: libvirt domain interface configuration + * + * Copyright (C) 2011 Red Hat, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * Author: Daniel P. Berrange <berrange@redhat.com> + * Author: Christophe Fergeau <cfergeau@redhat.com> + */ + +#if !defined(__LIBVIRT_GCONFIG_H__) && !defined(LIBVIRT_GCONFIG_BUILD) +#error "Only <libvirt-gconfig/libvirt-gconfig.h> can be included directly." +#endif + +#ifndef __LIBVIRT_GCONFIG_DOMAIN_INTERFACE_USER_H__ +#define __LIBVIRT_GCONFIG_DOMAIN_INTERFACE_USER_H__ + +G_BEGIN_DECLS + +#define GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_USER (gvir_config_domain_interface_user_get_type ()) +#define GVIR_CONFIG_DOMAIN_INTERFACE_USER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE, GVirConfigDomainInterfaceUser)) +#define GVIR_CONFIG_DOMAIN_INTERFACE_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE, GVirConfigDomainInterfaceUserClass)) +#define GVIR_IS_CONFIG_DOMAIN_INTERFACE_USER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE)) +#define GVIR_IS_CONFIG_DOMAIN_INTERFACE_USER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE)) +#define GVIR_CONFIG_DOMAIN_INTERFACE_USER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE, GVirConfigDomainInterfaceUserClass)) + +typedef struct _GVirConfigDomainInterfaceUser GVirConfigDomainInterfaceUser; +typedef struct _GVirConfigDomainInterfaceUserPrivate GVirConfigDomainInterfaceUserPrivate; +typedef struct _GVirConfigDomainInterfaceUserClass GVirConfigDomainInterfaceUserClass; + +struct _GVirConfigDomainInterfaceUser +{ + GVirConfigDomainInterface parent; + + GVirConfigDomainInterfaceUserPrivate *priv; + + /* Do not add fields to this struct */ +}; + +struct _GVirConfigDomainInterfaceUserClass +{ + GVirConfigDomainInterfaceClass parent_class; + + gpointer padding[20]; +}; + +GType gvir_config_domain_interface_user_get_type(void); + +GVirConfigDomainInterfaceUser *gvir_config_domain_interface_user_new(void); +GVirConfigDomainInterfaceUser *gvir_config_domain_interface_user_new_from_xml(const gchar *xml, + GError **error); + +G_END_DECLS + +#endif /* __LIBVIRT_GCONFIG_DOMAIN_INTERFACE_USER_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.h b/libvirt-gconfig/libvirt-gconfig.h index 252f51c..5ea8c2f 100644 --- a/libvirt-gconfig/libvirt-gconfig.h +++ b/libvirt-gconfig/libvirt-gconfig.h @@ -45,6 +45,7 @@ #include <libvirt-gconfig/libvirt-gconfig-domain-input.h> #include <libvirt-gconfig/libvirt-gconfig-domain-interface.h> #include <libvirt-gconfig/libvirt-gconfig-domain-interface-network.h> +#include <libvirt-gconfig/libvirt-gconfig-domain-interface-user.h> #include <libvirt-gconfig/libvirt-gconfig-domain-memballoon.h> #include <libvirt-gconfig/libvirt-gconfig-domain-os.h> #include <libvirt-gconfig/libvirt-gconfig-domain-seclabel.h> diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index 48e2fd7..b06231c 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -117,6 +117,10 @@ LIBVIRT_GCONFIG_0.0.1 { gvir_config_domain_interface_network_new_from_xml; gvir_config_domain_interface_network_set_source; + gvir_config_domain_interface_user_get_type; + gvir_config_domain_interface_user_new; + gvir_config_domain_interface_user_new_from_xml; + gvir_config_domain_memballoon_get_type; gvir_config_domain_memballoon_model_get_type; gvir_config_domain_memballoon_new; -- 1.7.7.3

These attributes are valid for all types deriving from GVirConfigDomainInterface so we add it to the base class. --- libvirt-gconfig/libvirt-gconfig-domain-interface.c | 62 ++++++++++++++++++++ libvirt-gconfig/libvirt-gconfig-domain-interface.h | 14 +++++ libvirt-gconfig/libvirt-gconfig.sym | 5 ++ libvirt-gconfig/tests/test-domain-create.c | 18 +++++- 4 files changed, 95 insertions(+), 4 deletions(-) diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface.c b/libvirt-gconfig/libvirt-gconfig-domain-interface.c index 5732ff1..6f64234 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface.c +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface.c @@ -19,11 +19,13 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Author: Daniel P. Berrange <berrange@redhat.com> + * Christophe Fergeau <cfergeau@redhat.com> */ #include <config.h> #include "libvirt-gconfig/libvirt-gconfig.h" +#include "libvirt-gconfig/libvirt-gconfig-object-private.h" #define GVIR_CONFIG_DOMAIN_INTERFACE_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE((obj), GVIR_TYPE_CONFIG_DOMAIN_INTERFACE, GVirConfigDomainInterfacePrivate)) @@ -48,3 +50,63 @@ static void gvir_config_domain_interface_init(GVirConfigDomainInterface *interfa interface->priv = GVIR_CONFIG_DOMAIN_INTERFACE_GET_PRIVATE(interface); } + +void gvir_config_domain_interface_set_ifname(GVirConfigDomainInterface *interface, + const char *ifname) +{ + GVirConfigObject *node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_INTERFACE(interface)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(interface), + "target"); + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(node)); + gvir_config_object_set_attribute(node, "device", ifname, NULL); + g_object_unref(G_OBJECT(node)); +} + +void gvir_config_domain_interface_set_link_state(GVirConfigDomainInterface *interface, + GVirConfigDomainInterfaceLinkState state) +{ + GVirConfigObject *node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_INTERFACE(interface)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(interface), + "link"); + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(node)); + gvir_config_object_set_attribute_with_type(node, + "state", + GVIR_TYPE_CONFIG_DOMAIN_INTERFACE_LINK_STATE, + state, + NULL); + g_object_unref(G_OBJECT(node)); +} + +void gvir_config_domain_interface_set_mac(GVirConfigDomainInterface *interface, + const char *mac_address) +{ + GVirConfigObject *node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_INTERFACE(interface)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(interface), + "mac"); + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(node)); + gvir_config_object_set_attribute(node, "address", mac_address, NULL); + g_object_unref(G_OBJECT(node)); +} + +void gvir_config_domain_interface_set_model(GVirConfigDomainInterface *interface, + const char *model) +{ + GVirConfigObject *node; + + g_return_if_fail(GVIR_IS_CONFIG_DOMAIN_INTERFACE(interface)); + + node = gvir_config_object_replace_child(GVIR_CONFIG_OBJECT(interface), + "model"); + g_return_if_fail(GVIR_IS_CONFIG_OBJECT(node)); + gvir_config_object_set_attribute(node, "type", model, NULL); + g_object_unref(G_OBJECT(node)); +} diff --git a/libvirt-gconfig/libvirt-gconfig-domain-interface.h b/libvirt-gconfig/libvirt-gconfig-domain-interface.h index 7021ae4..28bbd41 100644 --- a/libvirt-gconfig/libvirt-gconfig-domain-interface.h +++ b/libvirt-gconfig/libvirt-gconfig-domain-interface.h @@ -56,9 +56,23 @@ struct _GVirConfigDomainInterfaceClass gpointer padding[20]; }; +typedef enum { + GVIR_CONFIG_DOMAIN_INTERFACE_LINK_STATE_DEFAULT, + GVIR_CONFIG_DOMAIN_INTERFACE_LINK_STATE_UP, + GVIR_CONFIG_DOMAIN_INTERFACE_LINK_STATE_DOWN +} GVirConfigDomainInterfaceLinkState; GType gvir_config_domain_interface_get_type(void); +void gvir_config_domain_interface_set_ifname(GVirConfigDomainInterface *interface, + const char *ifname); +void gvir_config_domain_interface_set_link_state(GVirConfigDomainInterface *interface, + GVirConfigDomainInterfaceLinkState state); +void gvir_config_domain_interface_set_mac(GVirConfigDomainInterface *interface, + const char *mac_address); +void gvir_config_domain_interface_set_model(GVirConfigDomainInterface *interface, + const char *model); + G_END_DECLS #endif /* __LIBVIRT_GCONFIG_DOMAIN_INTERFACE_H__ */ diff --git a/libvirt-gconfig/libvirt-gconfig.sym b/libvirt-gconfig/libvirt-gconfig.sym index b06231c..6adc2c2 100644 --- a/libvirt-gconfig/libvirt-gconfig.sym +++ b/libvirt-gconfig/libvirt-gconfig.sym @@ -111,6 +111,11 @@ LIBVIRT_GCONFIG_0.0.1 { gvir_config_domain_input_set_bus; gvir_config_domain_interface_get_type; + gvir_config_domain_interface_link_state_get_type; + gvir_config_domain_interface_set_ifname; + gvir_config_domain_interface_set_link_state; + gvir_config_domain_interface_set_mac; + gvir_config_domain_interface_set_model; gvir_config_domain_interface_network_get_type; gvir_config_domain_interface_network_new; diff --git a/libvirt-gconfig/tests/test-domain-create.c b/libvirt-gconfig/tests/test-domain-create.c index bcaa29a..42aa09b 100644 --- a/libvirt-gconfig/tests/test-domain-create.c +++ b/libvirt-gconfig/tests/test-domain-create.c @@ -105,13 +105,23 @@ int main(void) devices = g_list_append(devices, GVIR_CONFIG_DOMAIN_DEVICE(disk)); - /* network interface node */ - GVirConfigDomainInterfaceNetwork *interface; + /* network interfaces node */ + GVirConfigDomainInterface *interface; - interface = gvir_config_domain_interface_network_new(); - gvir_config_domain_interface_network_set_source(interface, "default"); + interface = GVIR_CONFIG_DOMAIN_INTERFACE(gvir_config_domain_interface_network_new()); + gvir_config_domain_interface_network_set_source(GVIR_CONFIG_DOMAIN_INTERFACE_NETWORK(interface), + "default"); devices = g_list_append(devices, GVIR_CONFIG_DOMAIN_DEVICE(interface)); + interface = GVIR_CONFIG_DOMAIN_INTERFACE(gvir_config_domain_interface_user_new()); + gvir_config_domain_interface_set_ifname(interface, "eth0"); + gvir_config_domain_interface_set_link_state(interface, + GVIR_CONFIG_DOMAIN_INTERFACE_LINK_STATE_UP); + gvir_config_domain_interface_set_mac(interface, "00:11:22:33:44:55"); + gvir_config_domain_interface_set_model(interface, "foo"); + devices = g_list_append(devices, GVIR_CONFIG_DOMAIN_DEVICE(interface)); + + /* input node */ GVirConfigDomainInput *input; -- 1.7.7.3

On Wed, Dec 07, 2011 at 11:02:32AM +0100, Christophe Fergeau wrote:
Hi,
This patch series add setters for the GVirConfigDomainInterface properties which are common to all classes deriving from GVirConfigDomainInterface. It also adds GVirConfigDomainInterfaceUser so that it's possible to create <interface type="user"> nodes.
ACK to both 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