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 a9c5c34..b361f7b 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 30fddf5..81fe353 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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list