On 04.06.2013 16:33, Christophe Fergeau wrote:
Add various devices/configuration to libvirt XML config when
creating the VM. This configuration is generic enough that it
should be useful on all created VMs, that's why no public API is
added to set them up. However, they are split in several helpers
that can easily be exported if needed.
What this commit adds is:
- clock
- input device (a tablet which will act as a mouse)
- a console (Boxes is adding one, not sure if it's required...)
For maximum flexibility, we may want to let applications decide whether
they want a console or not.
I'd argue that majority cases do want a console or don't care about it.
So I guess it's okay if a console is added implicitly.
In addition to these devices, gvir_designer_domain_setup_guest()
now disables power management, and sets the domain to stop on
power off/crash, and to restart on reboots.
---
libvirt-designer/libvirt-designer-domain.c | 95 ++++++++++++++++++++++++++++++
1 file changed, 95 insertions(+)
diff --git a/libvirt-designer/libvirt-designer-domain.c
b/libvirt-designer/libvirt-designer-domain.c
index 2d4204f..e4f72e6 100644
--- a/libvirt-designer/libvirt-designer-domain.c
+++ b/libvirt-designer/libvirt-designer-domain.c
@@ -313,6 +313,95 @@ end:
}
+static void gvir_designer_domain_add_clock(GVirDesignerDomain *design)
+{
+ GVirConfigDomainClock *clock;
+ GVirConfigDomainTimer *timer;
+ GVirConfigDomainClockOffset offset;
+
+ clock = gvir_config_domain_clock_new();
+ offset = GVIR_CONFIG_DOMAIN_CLOCK_UTC;
+ if (design->priv->os != NULL) {
+ const gchar *short_id;
+
+ short_id = osinfo_product_get_short_id(OSINFO_PRODUCT(design->priv->os));
+ if (short_id != NULL && g_str_has_suffix(short_id, "win")) {
+ offset = GVIR_CONFIG_DOMAIN_CLOCK_LOCALTIME;
+ }
+ }
+ gvir_config_domain_clock_set_offset(clock, offset);
+
+ timer = GVIR_CONFIG_DOMAIN_TIMER(gvir_config_domain_timer_rtc_new());
+ gvir_config_domain_timer_set_tick_policy(timer,
+
GVIR_CONFIG_DOMAIN_TIMER_TICK_POLICY_CATCHUP);
+ gvir_config_domain_clock_add_timer(clock, timer);
+ g_object_unref(G_OBJECT(timer));
+
+ timer = GVIR_CONFIG_DOMAIN_TIMER(gvir_config_domain_timer_pit_new());
+ gvir_config_domain_timer_set_tick_policy(timer,
+
GVIR_CONFIG_DOMAIN_TIMER_TICK_POLICY_DELAY);
+ gvir_config_domain_clock_add_timer(clock, timer);
+ g_object_unref(G_OBJECT(timer));
+
+ gvir_config_domain_set_clock(design->priv->config, clock);
+ g_object_unref(G_OBJECT(clock));
+}
+
+static void gvir_designer_domain_add_power_management(GVirDesignerDomain *design)
+{
+ GVirConfigDomainPowerManagement *pm;
+
+ pm = gvir_config_domain_power_management_new();
+ gvir_config_domain_power_management_set_mem_suspend_enabled(pm, FALSE);
+ gvir_config_domain_power_management_set_disk_suspend_enabled(pm, FALSE);
+
+ gvir_config_domain_set_power_management(design->priv->config, pm);
+ g_object_unref(G_OBJECT(pm));
+}
+
+static void gvir_designer_domain_set_lifecycle(GVirDesignerDomain *design)
+{
+ gvir_config_domain_set_lifecycle(design->priv->config,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_ON_POWEROFF,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_DESTROY);
+ gvir_config_domain_set_lifecycle(design->priv->config,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_ON_REBOOT,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_RESTART);
+ gvir_config_domain_set_lifecycle(design->priv->config,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_ON_CRASH,
+ GVIR_CONFIG_DOMAIN_LIFECYCLE_DESTROY);
+}
+
+static void gvir_designer_domain_add_console(GVirDesignerDomain *design)
+{
+ GVirConfigDomainConsole *console;
+ GVirConfigDomainChardevSourcePty *pty;
+
+ console = gvir_config_domain_console_new();
+ pty = gvir_config_domain_chardev_source_pty_new();
+ gvir_config_domain_chardev_set_source(GVIR_CONFIG_DOMAIN_CHARDEV(console),
+ GVIR_CONFIG_DOMAIN_CHARDEV_SOURCE(pty));
+ g_object_unref(G_OBJECT(pty));
+
+ gvir_config_domain_add_device(design->priv->config,
+ GVIR_CONFIG_DOMAIN_DEVICE(console));
+ g_object_unref(G_OBJECT(console));
+}
+
+static void gvir_designer_domain_add_input(GVirDesignerDomain *design)
+{
+ GVirConfigDomainInput *input;
+
+ input = gvir_config_domain_input_new();
+ gvir_config_domain_input_set_device_type(input,
+ GVIR_CONFIG_DOMAIN_INPUT_DEVICE_TABLET);
+
+ gvir_config_domain_add_device(design->priv->config,
+ GVIR_CONFIG_DOMAIN_DEVICE(input));
+ g_object_unref(G_OBJECT(input));
+}
+
+
static void gvir_designer_domain_init(GVirDesignerDomain *design)
{
GVirDesignerDomainPrivate *priv;
@@ -670,6 +759,12 @@ gvir_designer_domain_setup_guest(GVirDesignerDomain *design,
gvir_config_capabilities_guest_domain_get_virt_type(domain));
gvir_config_domain_set_os(priv->config, os);
+ gvir_designer_domain_add_clock(design);
+ gvir_designer_domain_add_power_management(design);
+ gvir_designer_domain_set_lifecycle(design);
+ gvir_designer_domain_add_console(design);
+ gvir_designer_domain_add_input(design);
+
ret = TRUE;
cleanup:
if (domain != NULL)