Change in vdsm[master]: qemuimg: add backing file to convert

Federico Simoncelli fsimonce at redhat.com
Wed Sep 24 22:02:11 UTC 2014


Federico Simoncelli has uploaded a new change for review.

Change subject: qemuimg: add backing file to convert
......................................................................

qemuimg: add backing file to convert

This patch adds the support for the backing file in the convert qemu-img
command.

Change-Id: I2d6f254f5750fa249809469ecc764a73c91914d4
Signed-off-by: Federico Simoncelli <fsimonce at redhat.com>
---
M lib/vdsm/qemuimg.py
M tests/qemuimgTests.py
2 files changed, 83 insertions(+), 9 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/vdsm refs/changes/54/33354/1

diff --git a/lib/vdsm/qemuimg.py b/lib/vdsm/qemuimg.py
index e845ba3..7b0d5a3 100644
--- a/lib/vdsm/qemuimg.py
+++ b/lib/vdsm/qemuimg.py
@@ -183,8 +183,21 @@
     return check
 
 
-def convert(srcImage, dstImage, stop, srcFormat=None, dstFormat=None):
+def _qcow2_backing_opts(backing, backingFormat):
+    options = []
+
+    options.append('backing_file=' + str(backing))
+    if backingFormat:
+        options.append('backing_fmt=' + str(backingFormat))
+
+    return options
+
+
+def convert(srcImage, dstImage, stop, srcFormat=None, dstFormat=None,
+            backing=None, backingFormat=None):
     cmd = [_qemuimg.cmd, "convert", "-t", "none"]
+    options = []
+    cwdPath = None
 
     if srcFormat:
         cmd.extend(("-f", srcFormat))
@@ -193,13 +206,26 @@
 
     if dstFormat:
         cmd.extend(("-O", dstFormat))
-        if dstFormat == FORMAT.QCOW2 and _supports_qcow2_compat('convert'):
-            cmd.extend(('-o', 'compat=' + QCOW2_COMPAT))
+
+        if dstFormat == FORMAT.QCOW2:
+            if _supports_qcow2_compat('convert'):
+                options.append('compat=' + QCOW2_COMPAT)
+
+            if backing:
+                if not os.path.isabs(backing):
+                    cwdPath = os.path.dirname(srcImage)
+
+                options.extend(
+                    _qcow2_backing_opts(backing, backingFormat))
+
+    if options:
+        cmd.extend(('-o', ','.join(options)))
 
     cmd.append(dstImage)
 
     (rc, out, err) = utils.watchCmd(
-        cmd, stop=stop, nice=utils.NICENESS.HIGH, ioclass=utils.IOCLASS.IDLE)
+        cmd, cwd=cwdPath, stop=stop, nice=utils.NICENESS.HIGH,
+        ioclass=utils.IOCLASS.IDLE)
 
     if rc != 0:
         raise QImgError(rc, out, err)
diff --git a/tests/qemuimgTests.py b/tests/qemuimgTests.py
index 73d897b..6e2adc9 100644
--- a/tests/qemuimgTests.py
+++ b/tests/qemuimgTests.py
@@ -185,21 +185,69 @@
             with FakeCmd(utils, 'watchCmd', convert):
                 qemuimg.convert('src', 'dst', True, dstFormat='qcow2')
 
-    def test_qcow2_compat_supported(self):
-        def qcow2_compat_supported(cmd, **kw):
-            self.check_supports_qcow2_compat(cmd, **kw)
-            return 0, 'Supported options:\ncompat ...\n', ''
+    def qcow2_compat_supported(self, cmd, **kw):
+        self.check_supports_qcow2_compat(cmd, **kw)
+        return 0, 'Supported options:\ncompat ...\n', ''
 
+    def test_qcow2_compat_supported(self):
         def convert(cmd, **kw):
             expected = [QEMU_IMG, 'convert', '-t', 'none', 'src', '-O',
                         'qcow2', '-o', 'compat=0.10', 'dst']
             self.assertEqual(cmd, expected)
             return 0, '', ''
 
-        with FakeCmd(utils, 'execCmd', qcow2_compat_supported):
+        with FakeCmd(utils, 'execCmd', self.qcow2_compat_supported):
             with FakeCmd(utils, 'watchCmd', convert):
                 qemuimg.convert('src', 'dst', True, dstFormat='qcow2')
 
     def check_supports_qcow2_compat(self, cmd, **kw):
         expected = [QEMU_IMG, 'convert', '-O', 'qcow2', '-o', '?', '/dev/null']
         self.assertEqual(cmd, expected)
+
+    def test_qcow2_no_backing_file(self):
+        def qcow2_no_backing_file(cmd, **kw):
+            assert cmd == [qemuimg._qemuimg.cmd, 'convert', '-t', 'none',
+                           'source', '-O', 'qcow2', '-o', 'compat=0.10',
+                           'target']
+            return 0, '', ''
+
+        with FakeCmd(utils, 'execCmd', self.qcow2_compat_supported):
+            with FakeCmd(utils, 'watchCmd', qcow2_no_backing_file):
+                qemuimg.convert('source', 'target', None, dstFormat='qcow2')
+
+    def test_qcow2_backing_file(self):
+        def qcow2_backing_file(cmd, **kw):
+            assert cmd == [qemuimg._qemuimg.cmd, 'convert', '-t', 'none',
+                           'source', '-O', 'qcow2', '-o',
+                           'compat=0.10,backing_file=backing', 'target']
+            return 0, '', ''
+
+        with FakeCmd(utils, 'execCmd', self.qcow2_compat_supported):
+            with FakeCmd(utils, 'watchCmd', qcow2_backing_file):
+                qemuimg.convert('source', 'target', None, dstFormat='qcow2',
+                                backing='backing')
+
+    def test_qcow2_backing_format(self):
+        def qcow2_backing_format(cmd, **kw):
+            assert cmd == [qemuimg._qemuimg.cmd, 'convert', '-t', 'none',
+                           'source', '-O', 'qcow2', '-o', 'compat=0.10',
+                           'target']
+            return 0, '', ''
+
+        with FakeCmd(utils, 'execCmd', self.qcow2_compat_supported):
+            with FakeCmd(utils, 'watchCmd', qcow2_backing_format):
+                qemuimg.convert('source', 'target', None, dstFormat='qcow2',
+                                backingFormat='qcow2')
+
+    def test_qcow2_backing_file_and_format(self):
+        def qcow2_backing_format(cmd, **kw):
+            assert cmd == [qemuimg._qemuimg.cmd, 'convert', '-t', 'none',
+                           'source', '-O', 'qcow2', '-o',
+                           'compat=0.10,backing_file=backing,'
+                           'backing_fmt=qcow2', 'target']
+            return 0, '', ''
+
+        with FakeCmd(utils, 'execCmd', self.qcow2_compat_supported):
+            with FakeCmd(utils, 'watchCmd', qcow2_backing_format):
+                qemuimg.convert('source', 'target', None, dstFormat='qcow2',
+                                backing='backing', backingFormat='qcow2')


-- 
To view, visit http://gerrit.ovirt.org/33354
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I2d6f254f5750fa249809469ecc764a73c91914d4
Gerrit-PatchSet: 1
Gerrit-Project: vdsm
Gerrit-Branch: master
Gerrit-Owner: Federico Simoncelli <fsimonce at redhat.com>


More information about the vdsm-patches mailing list