
On Mon, Sep 10, 2012 at 03:58:26PM +0200, Michal Privoznik wrote:
Let users add either files or devices as disks to domains. --- libvirt-designer/libvirt-designer-domain.c | 259 ++++++++++++++++++++++++++++ libvirt-designer/libvirt-designer-domain.h | 7 + libvirt-designer/libvirt-designer.sym | 3 + 3 files changed, 269 insertions(+), 0 deletions(-)
diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c index a8cabde..8e649d7 100644 --- a/libvirt-designer/libvirt-designer-domain.c +++ b/libvirt-designer/libvirt-designer-domain.c +static GVirConfigDomainDisk * +gvir_designer_domain_add_disk_full(GVirDesignerDomain *design, + GVirConfigDomainDiskType type, + const char *path, + const char *format, + gchar *target, + GError **error) +{ + GVirDesignerDomainPrivate *priv = design->priv; + GVirConfigDomainDisk *disk = NULL; + GVirConfigDomainDiskBus bus; + gchar *target_gen = NULL; + const gchar *bus_str = NULL; + GList *bus_str_list = NULL, *item = NULL; + + /* Guess preferred disk bus */ + bus_str = gvir_designer_domain_get_preferred_disk_bus_type(design, error); + if (!bus_str) { + /* And fallback if fails */ + bus_str_list = gvir_designer_domain_get_supported_disk_bus_types(design); + if (!bus_str_list) { + if (!*error) + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "Unable to find any disk bus type"); + goto error; + } + + item = g_list_first(bus_str_list); + bus_str = item->data; + if (!bus_str) + goto error; + } + + g_clear_error(error); + + disk = gvir_config_domain_disk_new(); + gvir_config_domain_disk_set_type(disk, type); + gvir_config_domain_disk_set_source(disk, path); + gvir_config_domain_disk_set_driver_name(disk, "qemu");
Opps, don't want to hardcode use of qemu here - need to make this conditional based on the <domain type='...'/> value.
+ if (format) + gvir_config_domain_disk_set_driver_type(disk, format); + if (g_str_equal(bus_str, "ide")) { + bus = GVIR_CONFIG_DOMAIN_DISK_BUS_IDE; + } else if (g_str_equal(bus_str, "virtio") || + g_str_equal(bus_str, "pci")) { + bus = GVIR_CONFIG_DOMAIN_DISK_BUS_VIRTIO; + } else if (g_str_equal(bus_str, "sata")) { + bus = GVIR_CONFIG_DOMAIN_DISK_BUS_SATA; + } else { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "unsupported disk bus type '%s'", bus_str); + goto error; + } + + gvir_config_domain_disk_set_target_bus(disk, bus); + + if (!target) { + target = target_gen = gvir_designer_domain_next_disk_target(design, bus); + if (!target_gen) { + g_set_error(error, GVIR_DESIGNER_DOMAIN_ERROR, 0, + "unable to generate target name for bus '%s'", bus_str); + goto error; + } + } + gvir_config_domain_disk_set_target_dev(disk, target); + + g_list_free(bus_str_list); + g_free(target_gen); + + gvir_config_domain_add_device(priv->config, GVIR_CONFIG_DOMAIN_DEVICE(disk)); + + return disk; + +error: + g_free(target_gen); + g_list_free(bus_str_list); + if (disk) + g_object_unref(disk); + return NULL; +} +/**
Minor note - my preference is to leave 2 blank lines between functions.
+ * gvir_designer_domain_add_disk_file: + * @design: (transfer none): the domain designer instance + * @filepath: (transfer none): the path to a file + * @format: (transfer none): disk format + * + * Add a new disk to the domain. + * + * Returns: (transfer none): the pointer to new disk. + * If something fails NULL is returned and @error is set. + */ +GVirConfigDomainDisk *gvir_designer_domain_add_disk_file(GVirDesignerDomain *design, + const char *filepath, + const char *format, + GError **error) +{ + g_return_val_if_fail(GVIR_DESIGNER_IS_DOMAIN(design), NULL); + + GVirConfigDomainDisk *ret = NULL; + + ret = gvir_designer_domain_add_disk_full(design, + GVIR_CONFIG_DOMAIN_DISK_FILE, + filepath, + format, + NULL, + error); + return ret; +}
I know you've pushed this series already, so fine to just post followup fixes as needed or push directly. Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|