[Kimchi-devel] [PATCH] [Kimchi] Implement image rebase to avoid backing file dependency

Jose Ricardo Ziviani joserz at linux.vnet.ibm.com
Thu May 5 20:42:03 UTC 2016


 - Runs a rebase on the image that has created using backing file to
   avoid such dependency. It's slower than using the backing file
   itself but faster than clonning and more reliable than trusting in
   backing files.

Signed-off-by: Jose Ricardo Ziviani <joserz at linux.vnet.ibm.com>
---
 i18n.py            |  1 +
 model/templates.py |  8 ++++++++
 utils.py           | 16 +++++++++++++++-
 3 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/i18n.py b/i18n.py
index 39f5e57..bcc8b96 100644
--- a/i18n.py
+++ b/i18n.py
@@ -292,6 +292,7 @@ messages = {
 
     "KCHUTILS0003E": _("Unable to choose a virtual machine name"),
     "KCHUTILS0006E": _("Cannot upgrade objectstore data."),
+    "KCHUTILS0007E": _("Impossible to rebase the image: %(error)s"),
 
     "KCHVMSTOR0002E": _("Invalid storage type. Types supported: 'cdrom', 'disk'"),
     "KCHVMSTOR0003E": _("The path '%(value)s' is not a valid local/remote path for the device"),
diff --git a/model/templates.py b/model/templates.py
index 131f86b..e8b9e51 100644
--- a/model/templates.py
+++ b/model/templates.py
@@ -34,6 +34,7 @@ from wok.xmlutils.utils import xpath_get_text
 from wok.plugins.kimchi.config import get_kimchi_version
 from wok.plugins.kimchi.kvmusertests import UserTests
 from wok.plugins.kimchi.model.cpuinfo import CPUInfoModel
+from wok.plugins.kimchi.utils import image_rebase
 from wok.plugins.kimchi.utils import pool_name_from_uri
 from wok.plugins.kimchi.vmtemplate import VMTemplate
 
@@ -400,6 +401,13 @@ class LibvirtVMTemplate(VMTemplate):
                 pool = self._get_storage_pool(v['pool'])
                 # outgoing text to libvirt, encode('utf-8')
                 pool.createXML(v['xml'].encode('utf-8'), 0)
+
+                # if using backing image, rebase the image to remove the
+                # dependency on that backing image
+                if 'base' in v \
+                   and 'path' in v['base'] \
+                   and 'path' in v:
+                    image_rebase(v['path'])
         except libvirt.libvirtError as e:
             raise OperationFailed("KCHVMSTOR0008E", {'error': e.message})
         return vol_list
diff --git a/utils.py b/utils.py
index c4cd07d..9b9a4dc 100644
--- a/utils.py
+++ b/utils.py
@@ -30,12 +30,26 @@ from urlparse import urlparse
 from wok.exception import InvalidParameter, OperationFailed
 from wok.plugins.kimchi import config
 from wok.plugins.kimchi.osinfo import get_template_default
-from wok.utils import wok_log
+from wok.utils import run_command, wok_log
 from wok.xmlutils.utils import xpath_get_text
 
 MAX_REDIRECTION_ALLOWED = 5
 
 
+def image_rebase(image_path):
+    wok_log.info('starting to rebase image %s' % image_path)
+    _, err, rc = run_command(['qemu-img',
+                              'rebase',
+                              '-b',
+                              '',
+                              image_path])
+    if rc or err:
+        error = '%s - %s' % (str(rc), err)
+        raise OperationFailed("KCHUTILS0007E", {'error': error})
+
+    wok_log.info('image rebased successfully')
+
+
 def _uri_to_name(collection, uri):
     expr = '/plugins/kimchi/%s/(.*?)$' % collection
     m = re.match(expr, uri)
-- 
2.7.4




More information about the Kimchi-devel mailing list