]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: command: Refactor disk commandline formatting
authorPeter Krempa <pkrempa@redhat.com>
Fri, 1 Jun 2018 14:57:44 +0000 (16:57 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Tue, 5 Jun 2018 06:14:01 +0000 (08:14 +0200)
Now that we have one place that sets up all disk-related objects to
qemuBlockStorageSourceAttachDataPtr we can easily reuse the data in the
command-line formatter by implementing a worker which will convert the
data.

A huge advantage is that it will be way easier to integrate this with
-blockdev later on.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_command.c
src/qemu/qemu_command.h
src/qemu/qemu_hotplug.c

index 945738a1be79dfb328bb6a83d6855907963071cc..2f5cf4e70ec3f8b8efd4bd6da4fbb523d61c9718 100644 (file)
@@ -761,24 +761,6 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd,
 }
 
 
-/* qemuBuildDiskSrcTLSx509CommandLine:
- *
- * Returns 0 on success, -1 w/ error on some sort of failure.
- */
-static int
-qemuBuildDiskSrcTLSx509CommandLine(virCommandPtr cmd,
-                                   virStorageSourcePtr src,
-                                   virQEMUCapsPtr qemuCaps)
-{
-    if (src->haveTLS != VIR_TRISTATE_BOOL_YES)
-        return 0;
-
-    return qemuBuildTLSx509CommandLine(cmd, src->tlsCertdir,
-                                       false, true,
-                                       NULL, src->tlsAlias, qemuCaps);
-}
-
-
 static char *
 qemuBuildNetworkDriveURI(virStorageSourcePtr src,
                          qemuDomainSecretInfoPtr secinfo)
@@ -2207,31 +2189,40 @@ qemuBulildFloppyCommandLineOptions(virCommandPtr cmd,
 
 
 static int
-qemuBuildDiskUnmanagedPRCommandLine(virCommandPtr cmd,
-                                    virStorageSourcePtr src)
+qemuBuildObjectCommandline(virCommandPtr cmd,
+                           virJSONValuePtr objProps)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
-    virJSONValuePtr props = NULL;
-    int ret = -1;
 
-    if (!src->pr ||
-        virStoragePRDefIsManaged(src->pr))
+    if (!objProps)
         return 0;
 
-    if (!(props = qemuBuildPRManagerInfoProps(src)))
+    if (virQEMUBuildObjectCommandlineFromJSON(&buf, objProps) < 0) {
+        virBufferFreeAndReset(&buf);
         return -1;
-
-    if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0)
-        goto cleanup;
+    }
 
     virCommandAddArg(cmd, "-object");
     virCommandAddArgBuffer(cmd, &buf);
 
-    ret = 0;
- cleanup:
-    virBufferFreeAndReset(&buf);
-    virJSONValueFree(props);
-    return ret;
+    return 0;
+}
+
+
+static int
+qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd,
+                                                 qemuBlockStorageSourceAttachDataPtr data)
+{
+    if (qemuBuildObjectCommandline(cmd, data->prmgrProps) < 0 ||
+        qemuBuildObjectCommandline(cmd, data->authsecretProps) < 0 ||
+        qemuBuildObjectCommandline(cmd, data->encryptsecretProps) < 0 ||
+        qemuBuildObjectCommandline(cmd, data->tlsProps) < 0)
+        return -1;
+
+    if (data->driveCmd)
+        virCommandAddArgList(cmd, "-drive", data->driveCmd, NULL);
+
+    return 0;
 }
 
 
@@ -2243,35 +2234,20 @@ qemuBuildDiskCommandLine(virCommandPtr cmd,
                          unsigned int bootindex,
                          bool driveBoot)
 {
+    qemuBlockStorageSourceAttachDataPtr data = NULL;
     char *optstr;
-    qemuDomainStorageSourcePrivatePtr srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(disk->src);
-    qemuDomainSecretInfoPtr secinfo = NULL;
-    qemuDomainSecretInfoPtr encinfo = NULL;
-
-    if (srcPriv) {
-        secinfo = srcPriv->secinfo;
-        encinfo = srcPriv->encinfo;
-    }
-
-    if (qemuBuildDiskUnmanagedPRCommandLine(cmd, disk->src) < 0)
-        return -1;
-
-    if (qemuBuildDiskSecinfoCommandLine(cmd, secinfo) < 0)
-        return -1;
-
-    if (qemuBuildDiskSecinfoCommandLine(cmd, encinfo) < 0)
-        return -1;
 
-    if (qemuBuildDiskSrcTLSx509CommandLine(cmd, disk->src, qemuCaps) < 0)
+    if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps,
+                                                          driveBoot)))
         return -1;
 
-    virCommandAddArg(cmd, "-drive");
-
-    if (!(optstr = qemuBuildDriveStr(disk, driveBoot, qemuCaps)))
+    if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data, qemuCaps) < 0 ||
+        qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data) < 0) {
+        qemuBlockStorageSourceAttachDataFree(data);
         return -1;
+    }
 
-    virCommandAddArg(cmd, optstr);
-    VIR_FREE(optstr);
+    qemuBlockStorageSourceAttachDataFree(data);
 
     if (qemuDiskBusNeedsDeviceArg(disk->bus)) {
         if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) {
@@ -10482,20 +10458,22 @@ qemuBuildHotpluggableCPUProps(const virDomainVcpuDef *vcpu)
  * qemuBuildStorageSourceAttachPrepareDrive:
  * @disk: disk object to prepare
  * @qemuCaps: qemu capabilities object
+ * @driveBoot: bootable flag for disks which don't have -device part
  *
  * Prepare qemuBlockStorageSourceAttachDataPtr for use with the old approach
  * using -drive/drive_add. See qemuBlockStorageSourceAttachPrepareBlockdev.
  */
 qemuBlockStorageSourceAttachDataPtr
 qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
-                                         virQEMUCapsPtr qemuCaps)
+                                         virQEMUCapsPtr qemuCaps,
+                                         bool driveBoot)
 {
     qemuBlockStorageSourceAttachDataPtr data = NULL;
 
     if (VIR_ALLOC(data) < 0)
         return NULL;
 
-    if (!(data->driveCmd = qemuBuildDriveStr(disk, false, qemuCaps)) ||
+    if (!(data->driveCmd = qemuBuildDriveStr(disk, driveBoot, qemuCaps)) ||
         !(data->driveAlias = qemuAliasDiskDriveFromDisk(disk))) {
         qemuBlockStorageSourceAttachDataFree(data);
         return NULL;
index 0d7d2bac2a96ae1dd51a65dda50722efb13f55e8..aeb13ce18ad7183673db6593a6ed51c7fbea7e52 100644 (file)
@@ -105,7 +105,8 @@ char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
 
 qemuBlockStorageSourceAttachDataPtr
 qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
-                                         virQEMUCapsPtr qemuCaps);
+                                         virQEMUCapsPtr qemuCaps,
+                                         bool driveBoot);
 int
 qemuBuildStorageSourceAttachPrepareCommon(virStorageSourcePtr src,
                                           qemuBlockStorageSourceAttachDataPtr data,
index bad60b701c3860b99ed1ecd1117231380b2e3d49..8abe02adc6793876b7a9b4932f37db8d8e861fe2 100644 (file)
@@ -381,7 +381,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
     if (qemuDomainDiskAttachManagedPR(vm, disk, &managedPrmgrProps) < 0)
         goto error;
 
-    if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps)))
+    if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps,
+                                                          false)))
         goto error;
 
     if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data, priv->qemuCaps) < 0)