
- 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@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