Common builder counts the disks devices and populates disks.cfg according to that.Disk
devices
are always come first than host-based images.In builder-machine, mounts of the host-based
images
will be mounted later.
---
libvirt-sandbox/libvirt-sandbox-builder-machine.c | 6 +-
libvirt-sandbox/libvirt-sandbox-builder.c | 73 +++++++++++++++++++++--
2 files changed, 71 insertions(+), 8 deletions(-)
diff --git a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
index 4148d4b..db956cf 100644
--- a/libvirt-sandbox/libvirt-sandbox-builder-machine.c
+++ b/libvirt-sandbox/libvirt-sandbox-builder-machine.c
@@ -283,9 +283,10 @@ static gboolean
gvir_sandbox_builder_machine_write_mount_cfg(GVirSandboxConfig *
error);
gboolean ret = FALSE;
GList *mounts = gvir_sandbox_config_get_mounts(config);
+ GList *disks = gvir_sandbox_config_get_disks(config);
GList *tmp = NULL;
size_t nHostBind = 0;
- size_t nHostImage = 0;
+ guint nVirtioDev = g_list_length(disks);
if (!fos)
goto cleanup;
@@ -304,7 +305,7 @@ static gboolean
gvir_sandbox_builder_machine_write_mount_cfg(GVirSandboxConfig *
fstype = "9p";
options = g_strdup("trans=virtio,version=9p2000.u");
} else if (GVIR_SANDBOX_IS_CONFIG_MOUNT_HOST_IMAGE(mconfig)) {
- source = g_strdup_printf("/dev/vd%c", (char)('a' +
nHostImage++));
+ source = g_strdup_printf("/dev/vd%c", (char)('a' +
nVirtioDev++));
fstype = "ext4";
options = g_strdup("");
} else if (GVIR_SANDBOX_IS_CONFIG_MOUNT_GUEST_BIND(mconfig)) {
@@ -351,6 +352,7 @@ static gboolean
gvir_sandbox_builder_machine_write_mount_cfg(GVirSandboxConfig *
cleanup:
g_list_foreach(mounts, (GFunc)g_object_unref, NULL);
g_list_free(mounts);
+ g_list_free(disks);
if (fos)
g_object_unref(fos);
if (!ret)
diff --git a/libvirt-sandbox/libvirt-sandbox-builder.c
b/libvirt-sandbox/libvirt-sandbox-builder.c
index bcad652..4ba7a84 100644
--- a/libvirt-sandbox/libvirt-sandbox-builder.c
+++ b/libvirt-sandbox/libvirt-sandbox-builder.c
@@ -312,14 +312,75 @@ static gboolean
gvir_sandbox_builder_construct_features(GVirSandboxBuilder *buil
return TRUE;
}
+static gboolean gvir_sandbox_builder_construct_disk_cfg(GVirSandboxConfig *config,
+ const gchar *statedir,
+ GError **error)
+{
-static gboolean gvir_sandbox_builder_construct_devices(GVirSandboxBuilder *builder
G_GNUC_UNUSED,
- GVirSandboxConfig *config
G_GNUC_UNUSED,
- const gchar *statedir
G_GNUC_UNUSED,
- GVirConfigDomain *domain
G_GNUC_UNUSED,
- GError **error G_GNUC_UNUSED)
+ guint nVirtioDev = 0;
+ gchar *dskfile = g_strdup_printf("%s/config/disks.cfg", statedir);
+ GFile *file = g_file_new_for_path(dskfile);
+ GFileOutputStream *fos = g_file_replace(file,
+ NULL,
+ FALSE,
+ G_FILE_CREATE_REPLACE_DESTINATION,
+ NULL,
+ error);
+ gboolean ret = FALSE;
+ GList *disks = gvir_sandbox_config_get_disks(config);
+ GList *tmp = NULL;
+ const gchar *tag;
+
+ if (!fos)
+ goto cleanup;
+
+ tmp = disks;
+ while (tmp) {
+ GVirSandboxConfigDisk *mconfig = GVIR_SANDBOX_CONFIG_DISK(tmp->data);
+ gchar *device = g_strdup_printf("/dev/vd%c", (char)('a' +
(nVirtioDev)++));
+ gchar *line;
+
+ tag = gvir_sandbox_config_disk_get_tag(mconfig);
+
+ line = g_strdup_printf("%s\t%s\n",
+ tag, device);
+ g_free(device);
+
+ if (!g_output_stream_write_all(G_OUTPUT_STREAM(fos),
+ line, strlen(line),
+ NULL, NULL, error)) {
+ g_free(line);
+ goto cleanup;
+ }
+ g_free(line);
+
+ tmp = tmp->next;
+ }
+
+ if (!g_output_stream_close(G_OUTPUT_STREAM(fos), NULL, error))
+ goto cleanup;
+
+ ret = TRUE;
+ cleanup:
+ g_list_foreach(disks, (GFunc)g_object_unref, NULL);
+ g_list_free(disks);
+ if (fos)
+ g_object_unref(fos);
+ if (!ret)
+ g_file_delete(file, NULL, NULL);
+ g_object_unref(file);
+ g_free(dskfile);
+ return ret;
+
+}
+
+static gboolean gvir_sandbox_builder_construct_devices(GVirSandboxBuilder *builder,
+ GVirSandboxConfig *config,
+ const gchar *statedir,
+ GVirConfigDomain *domain,
+ GError **error)
{
- return TRUE;
+ return gvir_sandbox_builder_construct_disk_cfg(config,statedir,error);
}
static gboolean gvir_sandbox_builder_construct_security_selinux (GVirSandboxBuilder
*builder,
--
2.1.0