[libvirt] [libvirt-designer PATCHv2 2/3] Add gvir_designer_domain_get_supported_devices()

Christophe Fergeau cfergeau at redhat.com
Thu Apr 18 16:08:20 UTC 2013


This method gathers the list of devices supported by the hypervisor,
and intersects this list with the list of devices supported
by the OS, natively or using a driver (added with
gvir_designer_domain_add_driver()). The lists can be filtered if
needed.

This commit changes gvir_designer_domain_get_supported_disk_bus_types()
to make use of that new helper. This will slightly change its behaviour
as before this commit, it will consider any block devices from
GVirDesignerDomain::os, while after this commit, it will only
consider block devices from GVirDesignerDomain::os that are supported
by GVirDesignerDomain::platform.

This will cause a change for example for OSes that only list
virtio-block as a supported block device, such as Fedora as
described in libosinfo v0.2.6-9-g7a8deb4
---
 configure.ac                               |  2 +-
 libvirt-designer/libvirt-designer-domain.c | 82 +++++++++++++++++++++++++++++-
 2 files changed, 81 insertions(+), 3 deletions(-)

diff --git a/configure.ac b/configure.ac
index c999826..f03e36d 100644
--- a/configure.ac
+++ b/configure.ac
@@ -10,7 +10,7 @@ AC_CANONICAL_HOST
 
 AM_SILENT_RULES([yes])
 
-LIBOSINFO_REQUIRED=0.2.3
+LIBOSINFO_REQUIRED=0.2.6
 LIBVIRT_GCONFIG_REQUIRED=0.0.9
 LIBVIRT_GOBJECT_REQUIRED=0.1.3
 GOBJECT_INTROSPECTION_REQUIRED=0.10.8
diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c
index f980cb5..f959215 100644
--- a/libvirt-designer/libvirt-designer-domain.c
+++ b/libvirt-designer/libvirt-designer-domain.c
@@ -237,6 +237,80 @@ static void gvir_designer_domain_class_init(GVirDesignerDomainClass *klass)
 }
 
 
+static OsinfoDeviceList *
+gvir_designer_domain_get_devices_from_drivers(GVirDesignerDomain *design,
+                                              OsinfoFilter *filter)
+{
+    GVirDesignerDomainPrivate *priv = design->priv;
+    OsinfoDeviceList *devices;
+    unsigned int i;
+
+
+    devices = osinfo_devicelist_new();
+
+    for (i = 0; i < osinfo_list_get_length(OSINFO_LIST(priv->drivers)); i++) {
+        OsinfoDeviceDriver *driver;
+        OsinfoDeviceList *driver_devices;
+
+        driver = OSINFO_DEVICE_DRIVER(osinfo_list_get_nth(OSINFO_LIST(priv->drivers), i));
+        driver_devices = osinfo_device_driver_get_devices(driver);
+        osinfo_list_add_filtered(OSINFO_LIST(devices),
+                                 OSINFO_LIST(driver_devices),
+                                 filter);
+    }
+
+    return devices;
+}
+
+
+/* Gets the list of devices matching filter that are natively supported
+ * by (OS) and (platform), or that are supported by (OS with a driver) and
+ * (platform).
+ * Drivers are added through gvir_designer_domain_add_driver()
+ */
+static OsinfoDeviceList *
+gvir_designer_domain_get_supported_devices(GVirDesignerDomain *design,
+                                           OsinfoFilter *filter)
+{
+    GVirDesignerDomainPrivate *priv = design->priv;
+    OsinfoDeviceList *os_devices;
+    OsinfoDeviceList *platform_devices;
+    OsinfoDeviceList *driver_devices;
+    OsinfoDeviceList *devices;
+
+    os_devices = osinfo_os_get_all_devices(priv->os, filter);
+    platform_devices = osinfo_platform_get_all_devices(priv->platform, filter);
+    driver_devices = gvir_designer_domain_get_devices_from_drivers(design, filter);
+
+    devices = osinfo_devicelist_new();
+
+    if (platform_devices == NULL)
+        goto end;
+
+    if (os_devices != NULL)
+        osinfo_list_add_intersection(OSINFO_LIST(devices),
+                                     OSINFO_LIST(os_devices),
+                                     OSINFO_LIST(platform_devices));
+
+    if (driver_devices != NULL)
+        osinfo_list_add_intersection(OSINFO_LIST(devices),
+                                     OSINFO_LIST(driver_devices),
+                                     OSINFO_LIST(platform_devices));
+
+end:
+    if (os_devices != NULL)
+        g_object_unref(os_devices);
+
+    if (platform_devices != NULL)
+        g_object_unref(platform_devices);
+
+    if (driver_devices != NULL)
+        g_object_unref(driver_devices);
+
+    return devices;
+}
+
+
 static void gvir_designer_domain_init(GVirDesignerDomain *design)
 {
     GVirDesignerDomainPrivate *priv;
@@ -724,13 +798,15 @@ cleanup:
 static GList *
 gvir_designer_domain_get_supported_disk_bus_types(GVirDesignerDomain *design)
 {
-    GVirDesignerDomainPrivate *priv = design->priv;
     OsinfoDeviceList *dev_list;
+    OsinfoFilter *filter = NULL;
     GHashTable *bus_hash = g_hash_table_new(g_str_hash, g_str_equal);
     GList *ret = NULL;
     GList *devs = NULL, *dev_iterator;
 
-    dev_list = osinfo_os_get_devices_by_property(priv->os, "class", "block", TRUE);
+    filter = osinfo_filter_new();
+    osinfo_filter_add_constraint(filter, OSINFO_DEVICE_PROP_CLASS, "block");
+    dev_list = gvir_designer_domain_get_supported_devices(design, filter);
     if (!dev_list)
         goto cleanup;
 
@@ -750,6 +826,8 @@ cleanup:
     g_list_free(devs);
     if (dev_list != NULL)
         g_object_unref(G_OBJECT(dev_list));
+    if (filter != NULL)
+        g_object_unref(G_OBJECT(filter));
     g_hash_table_destroy(bus_hash);
     return ret;
 }
-- 
1.8.1.4




More information about the libvir-list mailing list