9c6c51
From fdbb929cb1f83931378f9910a2922bf9d68f0c04 Mon Sep 17 00:00:00 2001
9c6c51
Message-Id: <fdbb929cb1f83931378f9910a2922bf9d68f0c04@dist-git>
9c6c51
From: John Ferlan <jferlan@redhat.com>
9c6c51
Date: Fri, 2 Nov 2018 16:57:11 +0100
9c6c51
Subject: [PATCH] storage: Allow for inputvol to have any format for encryption
9c6c51
9c6c51
Commit 39cef12a9 altered/fixed the inputvol processing to create
9c6c51
a multistep process when using an inputvol to create an encrypted
9c6c51
output volume; however, it unnecessarily assumed/restricted the
9c6c51
inputvol to be of 'raw' format only.
9c6c51
9c6c51
Modify the processing code to allow the inputvol format to be checked
9c6c51
and used in order to create the encrypted volume.
9c6c51
9c6c51
Signed-off-by: John Ferlan <jferlan@redhat.com>
9c6c51
ACKed-by: Michal Privoznik <mprivozn@redhat.com>
9c6c51
(cherry picked from commit 80414718587ab8dd97025ec9145f30fa1a3654ed)
9c6c51
9c6c51
https://bugzilla.redhat.com/show_bug.cgi?id=1645459
9c6c51
9c6c51
Signed-off-by: Andrea Bolognani <abologna@redhat.com>
9c6c51
Reviewed-by: Jiri Denemark <jdenemar@redhat.com>
9c6c51
---
9c6c51
 src/storage/storage_util.c                    | 14 ++++++++++++-
9c6c51
 .../luks-convert-qcow2.argv                   |  9 ++++++++
9c6c51
 tests/storagevolxml2argvtest.c                |  4 ++++
9c6c51
 tests/storagevolxml2xmlin/vol-file-qcow2.xml  | 21 +++++++++++++++++++
9c6c51
 4 files changed, 47 insertions(+), 1 deletion(-)
9c6c51
 create mode 100644 tests/storagevolxml2argvdata/luks-convert-qcow2.argv
9c6c51
 create mode 100644 tests/storagevolxml2xmlin/vol-file-qcow2.xml
9c6c51
9c6c51
diff --git a/src/storage/storage_util.c b/src/storage/storage_util.c
9c6c51
index 19e58714ca..c5e773ab6d 100644
9c6c51
--- a/src/storage/storage_util.c
9c6c51
+++ b/src/storage/storage_util.c
9c6c51
@@ -692,6 +692,7 @@ storagePloopResize(virStorageVolDefPtr vol,
9c6c51
 struct _virStorageBackendQemuImgInfo {
9c6c51
     int format;
9c6c51
     const char *type;
9c6c51
+    const char *inputType;
9c6c51
     const char *path;
9c6c51
     unsigned long long size_arg;
9c6c51
     unsigned long long allocation;
9c6c51
@@ -1014,6 +1015,15 @@ virStorageBackendCreateQemuImgSetInfo(virStoragePoolObjPtr pool,
9c6c51
         return -1;
9c6c51
     }
9c6c51
 
9c6c51
+    if (inputvol &&
9c6c51
+        !(info->inputType =
9c6c51
+          virStorageFileFormatTypeToString(inputvol->target.format))) {
9c6c51
+        virReportError(VIR_ERR_INTERNAL_ERROR,
9c6c51
+                       _("unknown inputvol storage vol type %d"),
9c6c51
+                       inputvol->target.format);
9c6c51
+        return -1;
9c6c51
+    }
9c6c51
+
9c6c51
     if (info->preallocate && info->format != VIR_STORAGE_FILE_QCOW2) {
9c6c51
         virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
9c6c51
                        _("metadata preallocation only available with qcow2"));
9c6c51
@@ -1073,6 +1083,7 @@ virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
9c6c51
     struct _virStorageBackendQemuImgInfo info = {
9c6c51
         .format = vol->target.format,
9c6c51
         .type = NULL,
9c6c51
+        .inputType = NULL,
9c6c51
         .path = vol->target.path,
9c6c51
         .allocation = vol->target.allocation,
9c6c51
         .encryption = !!vol->target.encryption,
9c6c51
@@ -1145,7 +1156,8 @@ virStorageBackendCreateQemuImgCmdFromVol(virStoragePoolObjPtr pool,
9c6c51
             virCommandAddArgFormat(cmd, "%lluK", info.size_arg);
9c6c51
     } else {
9c6c51
         /* source */
9c6c51
-        virCommandAddArgFormat(cmd, "driver=raw,file.filename=%s",
9c6c51
+        virCommandAddArgFormat(cmd, "driver=%s,file.filename=%s",
9c6c51
+                               info.inputType ? info.inputType : "raw",
9c6c51
                                info.inputPath);
9c6c51
 
9c6c51
         /* dest */
9c6c51
diff --git a/tests/storagevolxml2argvdata/luks-convert-qcow2.argv b/tests/storagevolxml2argvdata/luks-convert-qcow2.argv
9c6c51
new file mode 100644
9c6c51
index 0000000000..9124f5f27c
9c6c51
--- /dev/null
9c6c51
+++ b/tests/storagevolxml2argvdata/luks-convert-qcow2.argv
9c6c51
@@ -0,0 +1,9 @@
9c6c51
+qemu-img create -f luks \
9c6c51
+--object secret,id=OtherDemo.img_encrypt0,file=/path/to/secretFile \
9c6c51
+-o key-secret=OtherDemo.img_encrypt0 \
9c6c51
+/var/lib/libvirt/images/OtherDemo.img 5242880K
9c6c51
+qemu-img convert --image-opts -n --target-image-opts \
9c6c51
+--object secret,id=OtherDemo.img_encrypt0,file=/path/to/secretFile \
9c6c51
+driver=qcow2,file.filename=/var/lib/libvirt/images/sparse-qcow2.img \
9c6c51
+driver=luks,file.filename=/var/lib/libvirt/images/OtherDemo.img,\
9c6c51
+key-secret=OtherDemo.img_encrypt0
9c6c51
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
9c6c51
index b795f83aee..6a9a080dd1 100644
9c6c51
--- a/tests/storagevolxml2argvtest.c
9c6c51
+++ b/tests/storagevolxml2argvtest.c
9c6c51
@@ -284,6 +284,10 @@ mymain(void)
9c6c51
             "pool-dir", "vol-file",
9c6c51
             "luks-convert", 0);
9c6c51
 
9c6c51
+    DO_TEST("pool-dir", "vol-luks-convert",
9c6c51
+            "pool-dir", "vol-file-qcow2",
9c6c51
+            "luks-convert-qcow2", 0);
9c6c51
+
9c6c51
     return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
9c6c51
 }
9c6c51
 
9c6c51
diff --git a/tests/storagevolxml2xmlin/vol-file-qcow2.xml b/tests/storagevolxml2xmlin/vol-file-qcow2.xml
9c6c51
new file mode 100644
9c6c51
index 0000000000..025e7e0239
9c6c51
--- /dev/null
9c6c51
+++ b/tests/storagevolxml2xmlin/vol-file-qcow2.xml
9c6c51
@@ -0,0 +1,21 @@
9c6c51
+<volume>
9c6c51
+  <name>sparse-qcow2.img</name>
9c6c51
+  <source/>
9c6c51
+  <capacity unit="TiB">1</capacity>
9c6c51
+  <allocation unit="bytes">0</allocation>
9c6c51
+  <target>
9c6c51
+    <path>/var/lib/libvirt/images/sparse-qcow2.img</path>
9c6c51
+    <format type="qcow2"/>
9c6c51
+    <permissions>
9c6c51
+      <mode>0</mode>
9c6c51
+      <owner>0744</owner>
9c6c51
+      <group>0</group>
9c6c51
+      <label>virt_image_t</label>
9c6c51
+    </permissions>
9c6c51
+    <timestamps>
9c6c51
+      <atime>1341933637.273190990</atime>
9c6c51
+      <mtime>1341930622.047245868</mtime>
9c6c51
+      <ctime>1341930622.047245868</ctime>
9c6c51
+    </timestamps>
9c6c51
+  </target>
9c6c51
+</volume>
9c6c51
-- 
9c6c51
2.19.1
9c6c51