summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristophe Fergeau <cfergeau@redhat.com>2013-03-27 23:56:48 +0100
committerChristophe Fergeau <cfergeau@redhat.com>2013-06-04 16:28:09 +0200
commitecd0e7aec56f255792130a4fc58bca6b7c600d20 (patch)
treeb8343e3112d43d26e1e2aca426f259a9707ff572
parentdbe87976dbf850b194bd96d2a31d37b622802cb4 (diff)
Improve VM skeleton created by gvir_designer_domain_setup_guest()
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. 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.
-rw-r--r--libvirt-designer/libvirt-designer-domain.c95
1 files changed, 95 insertions, 0 deletions
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)