This mirrors disk_file/disk_device API so that it's possible to add CDROMs and floppies to a GVirDesignerDomain. This also adds the corresponding -C/-F options to virtxml --- Here is a reworked version of my patch to add support for CDROMs which does not override the 'format' parameter this time. Christophe examples/virtxml.c | 108 +++++++++++++++++++++--- libvirt-designer/libvirt-designer-domain.c | 127 +++++++++++++++++++++++++++++ libvirt-designer/libvirt-designer-domain.h | 14 ++++ libvirt-designer/libvirt-designer.sym | 4 + 4 files changed, 240 insertions(+), 13 deletions(-) diff --git a/examples/virtxml.c b/examples/virtxml.c index 49a7b4e..d4c5967 100644 --- a/examples/virtxml.c +++ b/examples/virtxml.c @@ -33,7 +33,9 @@ #include <unistd.h> #include <glib/gprintf.h> +GList *cdrom_str_list = NULL; GList *disk_str_list = NULL; +GList *floppy_str_list = NULL; GList *iface_str_list = NULL; OsinfoDb *db = NULL; @@ -173,16 +175,17 @@ cleanup: return TRUE; } + static void -add_disk(gpointer data, - gpointer user_data) +add_disk_generic(GVirDesignerDomain *domain, + const char *path, + GVirConfigDomainDiskGuestDeviceType type) { - GVirDesignerDomain *domain = (GVirDesignerDomain *) user_data; GVirConfigDomainDisk *disk; - char *path = (char *) data; char *format = NULL; struct stat buf; GError *error = NULL; + gboolean is_device; format = strchr(path, ','); if (format) { @@ -195,12 +198,30 @@ add_disk(gpointer data, exit(EXIT_FAILURE); } - if (!stat(path, &buf) && - !S_ISREG(buf.st_mode)) { - disk = gvir_designer_domain_add_disk_device(domain, path, &error); - } else { - disk = gvir_designer_domain_add_disk_file(domain, path, format, &error); + is_device = (!stat(path, &buf) && !S_ISREG(buf.st_mode)); + switch(type) { + case GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_CDROM: + if (is_device) + disk = gvir_designer_domain_add_cdrom_device(domain, path, &error); + else + disk = gvir_designer_domain_add_cdrom_file(domain, path, format, &error); + break; + case GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK: + if (is_device) + disk = gvir_designer_domain_add_disk_device(domain, path, &error); + else + disk = gvir_designer_domain_add_disk_file(domain, path, format, &error); + break; + case GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_FLOPPY: + if (is_device) + disk = gvir_designer_domain_add_floppy_device(domain, path, &error); + else + disk = gvir_designer_domain_add_floppy_file(domain, path, format, &error); + break; + default: + g_return_if_reached(); } + if (disk) g_object_unref(G_OBJECT(disk)); @@ -210,6 +231,42 @@ add_disk(gpointer data, } } + +static void add_cdrom(gpointer data, gpointer user_data) +{ + add_disk_generic(GVIR_DESIGNER_DOMAIN(user_data), + (const char *)data, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_CDROM); +} + + +static void add_disk(gpointer data, gpointer user_data) +{ + add_disk_generic(GVIR_DESIGNER_DOMAIN(user_data), + (const char *)data, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK); +} + + +static void add_floppy(gpointer data, gpointer user_data) +{ + add_disk_generic(GVIR_DESIGNER_DOMAIN(user_data), + (const char *)data, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_FLOPPY); +} + + +static gboolean +add_cdrom_str(const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + cdrom_str_list = g_list_append(cdrom_str_list, g_strdup(value)); + return TRUE; +} + + static gboolean add_disk_str(const gchar *option_name, const gchar *value, @@ -220,6 +277,18 @@ add_disk_str(const gchar *option_name, return TRUE; } + +static gboolean +add_floppy_str(const gchar *option_name, + const gchar *value, + gpointer data, + GError **error) +{ + floppy_str_list = g_list_append(floppy_str_list, g_strdup(value)); + return TRUE; +} + + static void add_iface(gpointer data, gpointer user_data) @@ -357,7 +426,7 @@ cleanup: } static OsinfoOs * -guess_os_from_disk(GList *disk_list) +guess_os_from_cdrom(GList *disk_list) { OsinfoOs *ret = NULL; GList *list_it = NULL; @@ -512,8 +581,12 @@ main(int argc, char *argv[]) "set hypervisor under which domain will be running", "PLATFORM"}, {"architecture", 'a', 0, G_OPTION_ARG_STRING, &arch_str, "set domain architecture", "ARCH"}, + {"cdrom", 'C', 0, G_OPTION_ARG_CALLBACK, add_cdrom_str, + "add CDROM to domain with PATH being source and FORMAT its format", "PATH[,FORMAT]"}, {"disk", 'd', 0, G_OPTION_ARG_CALLBACK, add_disk_str, "add disk to domain with PATH being source and FORMAT its format", "PATH[,FORMAT]"}, + {"floppy", 'F', 0, G_OPTION_ARG_CALLBACK, add_floppy_str, + "add floppy to domain with PATH being source and FORMAT its format", "PATH[,FORMAT]"}, {"interface", 'i', 0, G_OPTION_ARG_CALLBACK, add_iface_str, "add interface with NETWORK source. Possible ARGs: mac, link={up,down}", "NETWORK[,ARG=VAL]"}, {"resources", 'r', 0, G_OPTION_ARG_STRING, &resources_str, @@ -543,7 +616,7 @@ main(int argc, char *argv[]) if (!os) os = find_os_by_short_id(os_str); } else { - os = guess_os_from_disk(disk_str_list); + os = guess_os_from_cdrom(cdrom_str_list); } if (!os) { @@ -593,8 +666,12 @@ main(int argc, char *argv[]) NULL); } + g_list_foreach(cdrom_str_list, add_cdrom, domain); + g_list_foreach(disk_str_list, add_disk, domain); + g_list_foreach(floppy_str_list, add_floppy, domain); + g_list_foreach(iface_str_list, add_iface, domain); config = gvir_designer_domain_get_config(domain); @@ -683,6 +760,11 @@ is and ID which can be obtained via I<--list-platform>. Set domain's architecture +=item -C PATH[,FORMAT] --cdrom=PATH[,FORMAT] + +Add I<PATH> as a CDROM to the domain. To specify its format (e.g. raw, +qcow2, phy) use I<FORMAT>. + =item -d PATH[,FORMAT] --disk=PATH[,FORMAT] Add I<PATH> as a disk to the domain. To specify its format (e.g. raw, @@ -712,12 +794,12 @@ platform. Usually, the platform is guessed from the connection URI. Domain with Fedora 17 from locally stored ISO and one NIC with mac 00:11:22:33:44:55 and link set down: - # virtxml -d Fedora-17-x86_64-Live-KDE.iso \ + # virtxml -C Fedora-17-x86_64-Live-KDE.iso \ -i default,mac=00:11:22:33:44:55,link=down To add multiple devices just use appropriate argument multiple times: - # virtxml -d /tmp/Fedora-17-x86_64-Live-KDE.iso,raw \ + # virtxml -d /tmp/home.img,qcow2 \ -d /var/lib/libvirt/images/f17.img,qcow2 \ -i default,mac=00:11:22:33:44:55,link=down \ -i blue_network \ diff --git a/libvirt-designer/libvirt-designer-domain.c b/libvirt-designer/libvirt-designer-domain.c index 0d47d3c..2226d39 100644 --- a/libvirt-designer/libvirt-designer-domain.c +++ b/libvirt-designer/libvirt-designer-domain.c @@ -841,6 +841,7 @@ gvir_designer_domain_next_disk_target(GVirDesignerDomain *design, static GVirConfigDomainDisk * gvir_designer_domain_add_disk_full(GVirDesignerDomain *design, GVirConfigDomainDiskType type, + GVirConfigDomainDiskGuestDeviceType guest_type, const char *path, const char *format, gchar *target, @@ -960,6 +961,7 @@ GVirConfigDomainDisk *gvir_designer_domain_add_disk_file(GVirDesignerDomain *des ret = gvir_designer_domain_add_disk_full(design, GVIR_CONFIG_DOMAIN_DISK_FILE, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK, filepath, format, NULL, @@ -989,6 +991,7 @@ GVirConfigDomainDisk *gvir_designer_domain_add_disk_device(GVirDesignerDomain *d ret = gvir_designer_domain_add_disk_full(design, GVIR_CONFIG_DOMAIN_DISK_BLOCK, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_DISK, devpath, "raw", NULL, @@ -996,6 +999,130 @@ GVirConfigDomainDisk *gvir_designer_domain_add_disk_device(GVirDesignerDomain *d return ret; } +/** + * gvir_designer_domain_add_cdrom_file: + * @design: (transfer none): the domain designer instance + * @filepath: (transfer none): the path to a file + * @format: (transfer none): file format + * @error: return location for a #GError, or NULL + * + * Add a new disk to the domain. + * + * Returns: (transfer full): the pointer to new cdrom. + * If something fails NULL is returned and @error is set. + */ +GVirConfigDomainDisk *gvir_designer_domain_add_cdrom_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, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_CDROM, + filepath, + format, + NULL, + error); + return ret; +} + + +/** + * gvir_designer_domain_add_cdrom_device: + * @design: (transfer none): the domain designer instance + * @devpath: (transfer none): path to the device + * @error: return location for a #GError, or NULL + * + * Add given device as a new cdrom to the domain designer instance. + * + * Returns: (transfer full): the pointer to the new cdrom. + * If something fails NULL is returned and @error is set. + */ +GVirConfigDomainDisk *gvir_designer_domain_add_cdrom_device(GVirDesignerDomain *design, + const char *devpath, + 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_BLOCK, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_CDROM, + devpath, + "raw", + NULL, + error); + return ret; +} + + +/** + * gvir_designer_domain_add_floppy_file: + * @design: (transfer none): the domain designer instance + * @filepath: (transfer none): the path to a file + * @format: (transfer none): file format + * @error: return location for a #GError, or NULL + * + * Add a new disk to the domain. + * + * Returns: (transfer full): the pointer to new floppy. + * If something fails NULL is returned and @error is set. + */ +GVirConfigDomainDisk *gvir_designer_domain_add_floppy_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, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_FLOPPY, + filepath, + format, + NULL, + error); + return ret; +} + + +/** + * gvir_designer_domain_add_floppy_device: + * @design: (transfer none): the domain designer instance + * @devpath: (transfer none): path to the device + * @error: return location for a #GError, or NULL + * + * Add given device as a new floppy to the domain designer instance. + * + * Returns: (transfer full): the pointer to the new floppy. + * If something fails NULL is returned and @error is set. + */ +GVirConfigDomainDisk *gvir_designer_domain_add_floppy_device(GVirDesignerDomain *design, + const char *devpath, + 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_BLOCK, + GVIR_CONFIG_DOMAIN_DISK_GUEST_DEVICE_FLOPPY, + devpath, + "raw", + NULL, + error); + return ret; +} + + static const gchar * gvir_designer_domain_get_preferred_nic_model(GVirDesignerDomain *design, diff --git a/libvirt-designer/libvirt-designer-domain.h b/libvirt-designer/libvirt-designer-domain.h index 4d68ff6..99c280b 100644 --- a/libvirt-designer/libvirt-designer-domain.h +++ b/libvirt-designer/libvirt-designer-domain.h @@ -99,6 +99,13 @@ gboolean gvir_designer_domain_setup_container_full(GVirDesignerDomain *design, const char *arch, GError **error); +GVirConfigDomainDisk *gvir_designer_domain_add_cdrom_file(GVirDesignerDomain *design, + const char *filepath, + const char *format, + GError **error); +GVirConfigDomainDisk *gvir_designer_domain_add_cdrom_device(GVirDesignerDomain *design, + const char *devpath, + GError **error); GVirConfigDomainDisk *gvir_designer_domain_add_disk_file(GVirDesignerDomain *design, const char *filepath, const char *format, @@ -106,6 +113,13 @@ GVirConfigDomainDisk *gvir_designer_domain_add_disk_file(GVirDesignerDomain *des GVirConfigDomainDisk *gvir_designer_domain_add_disk_device(GVirDesignerDomain *design, const char *devpath, GError **error); +GVirConfigDomainDisk *gvir_designer_domain_add_floppy_file(GVirDesignerDomain *design, + const char *filepath, + const char *format, + GError **error); +GVirConfigDomainDisk *gvir_designer_domain_add_floppy_device(GVirDesignerDomain *design, + const char *devpath, + GError **error); GVirConfigDomainInterface *gvir_designer_domain_add_interface_network(GVirDesignerDomain *design, const char *network, diff --git a/libvirt-designer/libvirt-designer.sym b/libvirt-designer/libvirt-designer.sym index 79db09f..7a24f2c 100644 --- a/libvirt-designer/libvirt-designer.sym +++ b/libvirt-designer/libvirt-designer.sym @@ -10,8 +10,12 @@ LIBVIRT_DESIGNER_0.0.1 { gvir_designer_domain_get_platform; gvir_designer_domain_get_capabilities; + gvir_designer_domain_add_cdrom_file; + gvir_designer_domain_add_cdrom_device; gvir_designer_domain_add_disk_file; gvir_designer_domain_add_disk_device; + gvir_designer_domain_add_floppy_file; + gvir_designer_domain_add_floppy_device; gvir_designer_domain_add_interface_network; gvir_designer_domain_setup_resources; gvir_designer_domain_resources_get_type; -- 1.8.1.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list