Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
25035762 Bootable Volume Fails to be Created in Cinder with ZFS SA an…
…d ZFS drivers
- Loading branch information
Qiang Strony Zhang
committed
Nov 16, 2016
1 parent
d28912f
commit 9c78c7b
Showing
1 changed file
with
67 additions
and
0 deletions.
There are no files selected for viewing
67 changes: 67 additions & 0 deletions
67
components/openstack/cinder/patches/10-copy-image-to-volume.patch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,67 @@ | ||
| Workaround the qemu on Solaris to create bootable volumes. | ||
| The patch is Solaris-specific and not suitable for upstream. | ||
|
|
||
| --- cinder-8.0.0/cinder/image/image_utils.py.orig 2016-11-03 11:18:00.796414519 +0000 | ||
| +++ cinder-8.0.0/cinder/image/image_utils.py 2016-11-04 14:43:09.735267859 +0000 | ||
| @@ -27,7 +27,9 @@ we should look at maybe pushing this up | ||
| import contextlib | ||
| import math | ||
| import os | ||
| +import platform | ||
| import re | ||
| +import tarfile | ||
| import tempfile | ||
|
|
||
| from oslo_concurrency import processutils | ||
| @@ -55,8 +57,40 @@ CONF = cfg.CONF | ||
| CONF.register_opts(image_helper_opts) | ||
|
|
||
|
|
||
| +class QemuEmulation(object): | ||
| + def __init__(self, path): | ||
| + if tarfile.is_tarfile(path): | ||
| + # Solaris Unified Archive | ||
| + cmd = ('/usr/bin/env', 'LC_ALL=C', '/usr/sbin/archiveadm', 'info', '-vp', path) | ||
| + try: | ||
| + out, _err = utils.execute(*cmd) | ||
| + | ||
| + # the UAR image size is in the 4th line, 8th column | ||
| + data = out.splitlines()[3].split('|')[7] | ||
| + | ||
| + # cut off the trailing 'b' character | ||
| + self.virtual_size = data[:-1] | ||
| + self.disk_size = data[:-1] | ||
| + except processutils.ProcessExecutionError: | ||
| + # the image is a tarball but not a Unifed Archive | ||
| + self.virtual_size = os.path.getsize(path) | ||
| + self.disk_size = os.path.getsize(path) | ||
| + else: | ||
| + # simply set the size of the image on disk | ||
| + self.virtual_size = os.path.getsize(path) | ||
| + self.disk_size = os.path.getsize(path) | ||
| + | ||
| + # fill in the rest of attributes | ||
| + self.backing_file = None | ||
| + self.file_format = 'raw' | ||
| + self.cluster_size = None | ||
| + self.snapshots = [] | ||
| + self.encrypted = False | ||
| + | ||
| def qemu_img_info(path, run_as_root=True): | ||
| """Return an object containing the parsed output from qemu-img info.""" | ||
| + if platform.system() == 'SunOS': | ||
| + return QemuEmulation(path) | ||
| cmd = ('env', 'LC_ALL=C', 'qemu-img', 'info', path) | ||
| if os.name == 'nt': | ||
| cmd = cmd[2:] | ||
| @@ -275,6 +309,10 @@ def fetch_to_volume_format(context, imag | ||
| "can be used if qemu-img is not installed."), | ||
| image_id=image_id) | ||
|
|
||
| + if platform.system() == 'SunOS': | ||
| + # No QEMU support on Solaris now. | ||
| + qemu_img = False | ||
| + | ||
| tmp_images = TemporaryImages.for_image_service(image_service) | ||
| tmp_image = tmp_images.get(context, image_id) | ||
| if tmp_image: |