[libvirt] [sandbox PATCH 05/10] Add disk support to machine builder

Eren Yagdiran erenyagdiran at gmail.com
Wed Jun 24 14:41:22 UTC 2015


Use the new disk configuration in the container builder to provide disks in
qemu sandboxes. The disks are virtio devices, but those shouldn't be
known by the user.
---
 libvirt-sandbox/libvirt-sandbox-builder-machine.c | 38 ++++++++++++++++++++---
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
index 5e6bf72..4148d4b 100644
--- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
+++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
@@ -174,7 +174,8 @@ static gchar *gvir_sandbox_builder_machine_mkinitrd(GVirSandboxConfig *config,
     if (gvir_sandbox_config_has_networks(config))
         gvir_sandbox_config_initrd_add_module(initrd, "virtio_net.ko");
     if (gvir_sandbox_config_has_mounts_with_type(config,
-                                                 GVIR_SANDBOX_TYPE_CONFIG_MOUNT_HOST_IMAGE))
+                                                 GVIR_SANDBOX_TYPE_CONFIG_MOUNT_HOST_IMAGE) ||
+        gvir_sandbox_config_has_disks(config))
         gvir_sandbox_config_initrd_add_module(initrd, "virtio_blk.ko");
     gvir_sandbox_config_initrd_add_module(initrd, "virtio_console.ko");
 #if 0
@@ -503,9 +504,9 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
     GVirConfigDomainConsole *con;
     GVirConfigDomainSerial *ser;
     GVirConfigDomainChardevSourcePty *src;
-    GList *tmp = NULL, *mounts = NULL, *networks = NULL;
+    GList *tmp = NULL, *mounts = NULL, *networks = NULL, *disks = NULL;
     size_t nHostBind = 0;
-    size_t nHostImage = 0;
+    size_t nVirtioDev = 0;
     gchar *configdir = g_strdup_printf("%s/config", statedir);
     gboolean ret = FALSE;
 
@@ -538,6 +539,35 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
     g_object_unref(fs);
 
 
+    tmp = disks = gvir_sandbox_config_get_disks(config);
+    while(tmp){
+        GVirSandboxConfigDisk *dconfig = GVIR_SANDBOX_CONFIG_DISK(tmp->data);
+
+        if (GVIR_SANDBOX_IS_CONFIG_DISK(dconfig)){
+            gchar *device = g_strdup_printf("vd%c", (char)('a' + nVirtioDev++));
+
+            disk = gvir_config_domain_disk_new();
+            diskDriver = gvir_config_domain_disk_driver_new();
+            gvir_config_domain_disk_set_type(disk,
+                                             gvir_sandbox_config_disk_get_disk_type(dconfig));
+            gvir_config_domain_disk_driver_set_format(diskDriver,
+                                                      gvir_sandbox_config_disk_get_format(dconfig));
+            gvir_config_domain_disk_set_source(disk, gvir_sandbox_config_disk_get_source(dconfig));
+            gvir_config_domain_disk_set_target_bus(disk,
+                                                   GVIR_CONFIG_DOMAIN_DISK_BUS_VIRTIO);
+            gvir_config_domain_disk_set_target_dev(disk,
+                                                   device);
+            gvir_config_domain_disk_set_driver(disk, diskDriver);
+            gvir_config_domain_add_device(domain, GVIR_CONFIG_DOMAIN_DEVICE(disk));
+            g_object_unref(disk);
+            g_free(device);
+        }
+    tmp = tmp->next;
+    }
+
+    g_list_foreach(disks, (GFunc)g_object_unref, NULL);
+    g_list_free(disks);
+
     tmp = mounts = gvir_sandbox_config_get_mounts(config);
     while (tmp) {
         GVirSandboxConfigMount *mconfig = GVIR_SANDBOX_CONFIG_MOUNT(tmp->data);
@@ -563,7 +593,7 @@ static gboolean gvir_sandbox_builder_machine_construct_devices(GVirSandboxBuilde
             GVirSandboxConfigMountFile *mfile = GVIR_SANDBOX_CONFIG_MOUNT_FILE(mconfig);
             GVirSandboxConfigMountHostImage *mimage = GVIR_SANDBOX_CONFIG_MOUNT_HOST_IMAGE(mconfig);
             GVirConfigDomainDiskFormat format;
-            gchar *target = g_strdup_printf("vd%c", (char)('a' + nHostImage++));
+            gchar *target = g_strdup_printf("vd%c", (char)('a' + nVirtioDev++));
 
             disk = gvir_config_domain_disk_new();
             gvir_config_domain_disk_set_type(disk, GVIR_CONFIG_DOMAIN_DISK_FILE);
-- 
2.1.0




More information about the libvir-list mailing list