They are useful to tell libvirt-designer about which drivers are install/will be installed in the OS associated with the domain. This in turns allows libvirt-designer code to use these devices when it's making some guesses about what to enable/not enable in the VM being created. --- libvirt-designer/libvirt-designer-domain.c | 79 ++++++++++++++++++++++++++++++ libvirt-designer/libvirt-designer-domain.h | 5 ++ libvirt-designer/libvirt-designer.sym | 3 ++ 3 files changed, 87 insertions(+) diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c index 5da8dd3..30fddf5 100644 --- a/libvirt-designer/libvirt-designer-domain.c +++ b/libvirt-designer/libvirt-designer-domain.c @@ -40,6 +40,8 @@ struct _GVirDesignerDomainPrivate OsinfoPlatform *platform; OsinfoDeployment *deployment; + OsinfoDeviceDriverList *drivers; + /* next disk targets */ unsigned int ide; unsigned int virtio; @@ -61,6 +63,11 @@ gvir_designer_domain_error_quark(void) return g_quark_from_static_string("gvir-designer-domain"); } +static gboolean error_is_set(GError **error) +{ + return ((error != NULL) && (*error != NULL)); +} + enum { PROP_0, PROP_CONFIG, @@ -160,6 +167,8 @@ static void gvir_designer_domain_finalize(GObject *object) g_object_unref(priv->deployment); if (priv->osinfo_db) g_object_unref(priv->osinfo_db); + if (priv->drivers) + g_object_unref(priv->drivers); G_OBJECT_CLASS(gvir_designer_domain_parent_class)->finalize(object); } @@ -235,6 +244,7 @@ static void gvir_designer_domain_init(GVirDesignerDomain *design) priv = design->priv = GVIR_DESIGNER_DOMAIN_GET_PRIVATE(design); priv->config = gvir_config_domain_new(); + priv->drivers = osinfo_device_driverlist_new(); } @@ -1184,3 +1194,72 @@ cleanup: return ret; } + +/** + * gvir_designer_domain_add_driver: + * @design: the domain designer instance + * @driver_id: OsInfo id of the driver to Add + * @error: return location for a #GError, or NULL + * + * Instructs libvirt-designer to assume that the driver identified by + * @driver_id is installed in the guest OS. This means that @design + * can use the device associated to @driver_id if needed. + * + * Returns: (transfer none): TRUE when successfully set, FALSE otherwise. + */ +gboolean gvir_designer_domain_add_driver(GVirDesignerDomain *design, + const char *driver_id, + GError **error) +{ + OsinfoEntity *driver; + OsinfoDeviceDriverList *drivers; + gboolean driver_added = FALSE; + + g_return_val_if_fail(GVIR_DESIGNER_IS_DOMAIN(design), FALSE); + g_return_val_if_fail(driver_id != NULL, FALSE); + g_return_val_if_fail(!error_is_set(error), FALSE); + + if (design->priv->os == NULL) { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, "Unknown OS"); + goto end; + } + + drivers = osinfo_os_get_device_drivers(design->priv->os); + driver = osinfo_list_find_by_id(OSINFO_LIST(drivers), driver_id); + g_return_val_if_fail(OSINFO_IS_DEVICE_DRIVER(driver), FALSE); + if (driver == NULL) { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "Unable to find driver %s in OS %s", driver_id, + osinfo_entity_get_id(OSINFO_ENTITY(design->priv->os))); + goto end; + } + + osinfo_list_add(OSINFO_LIST(design->priv->drivers), driver); + driver_added = TRUE; + +end: + return driver_added; +} + + +/** + * gvir_designer_domain_remove_all_drivers: + * @design: the domain designer instance + * @error: return location for a #GError, or NULL + * + * Removes all drivers used in @design. + * + * Returns: (transfer none): TRUE when successfully set, FALSE otherwise. + * @see_also gvir_designer_domain_add_driver() + */ +gboolean gvir_designer_domain_remove_all_drivers(GVirDesignerDomain *design, + GError **error) +{ + g_return_val_if_fail(GVIR_DESIGNER_IS_DOMAIN(design), FALSE); + g_return_val_if_fail(!error_is_set(error), FALSE); + + g_object_unref(design->priv->drivers); + design->priv->drivers = NULL; + + return TRUE; +} diff --git a/libvirt-designer/libvirt-designer-domain.h b/libvirt-designer/libvirt-designer-domain.h index 4d68ff6..83bc0e5 100644 --- a/libvirt-designer/libvirt-designer-domain.h +++ b/libvirt-designer/libvirt-designer-domain.h @@ -115,6 +115,11 @@ gboolean gvir_designer_domain_setup_resources(GVirDesignerDomain *design, GVirDesignerDomainResources req, GError **error); +gboolean gvir_designer_domain_remove_all_drivers(GVirDesignerDomain *design, + GError **error); +gboolean gvir_designer_domain_add_driver(GVirDesignerDomain *design, + const char *driver_id, + GError **error); G_END_DECLS #endif /* __LIBVIRT_DESIGNER_DOMAIN_H__ */ diff --git a/libvirt-designer/libvirt-designer.sym b/libvirt-designer/libvirt-designer.sym index 79db09f..750ebb2 100644 --- a/libvirt-designer/libvirt-designer.sym +++ b/libvirt-designer/libvirt-designer.sym @@ -10,6 +10,9 @@ LIBVIRT_DESIGNER_0.0.1 { gvir_designer_domain_get_platform; gvir_designer_domain_get_capabilities; + gvir_designer_domain_add_driver; + gvir_designer_domain_remove_all_drivers; + gvir_designer_domain_add_disk_file; gvir_designer_domain_add_disk_device; gvir_designer_domain_add_interface_network; -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list