add raw-xz option

This commit is contained in:
Jay Greguske 2014-07-29 21:33:49 -04:00 committed by Mike McLean
parent ef2e41a672
commit c1b42e0c67
2 changed files with 44 additions and 8 deletions

View file

@ -2096,6 +2096,18 @@ class BuildBaseImageTask(BuildImageTask):
spec_url, subtask, target_info, bld_info,
repo_info['id'])
# make sure we only import the user-submitted kickstart file one
# time, otherwise we will have collisions. Remove it from exactly
# 1 results hash from the subtasks
if opts.has_key('kickstart'):
saw_ks = False
for arch in results.keys():
ks = os.path.basename(opts.get('kickstart'))
if ks in results[arch]['files']:
if saw_ks:
results[arch]['files'].remove(ks)
saw_ks = True
self.logger.debug('Image Results for hub: %s' % results)
if opts.get('scratch'):
self.session.host.moveImageBuildToScratch(self.id, results)
@ -2728,7 +2740,7 @@ class OzImageTask(BaseTaskHandler):
if self.opts.get('ksurl'):
scm = SCM(self.opts['ksurl'])
scm.assert_allowed(self.options.allowed_scms)
logfile = os.path.join(self.workdir, 'checkout.log')
logfile = os.path.join(self.workdir, 'checkout-%s.log' % self.arch)
scmsrcdir = scm.checkout(self.workdir, self.session,
self.getUploadDir(), logfile)
kspath = os.path.join(scmsrcdir, os.path.basename(ksfile))
@ -2989,7 +3001,7 @@ class BaseImageTask(OzImageTask):
Some image formats require others to be processed first, which is why
we have to do this. raw files in particular may not be kept.
"""
supported = ('raw', 'vmdk', 'qcow', 'qcow2', 'vdi', 'rhevm-ova', 'vsphere-ova', 'docker')
supported = ('raw', 'raw-xz', 'vmdk', 'qcow', 'qcow2', 'vdi', 'rhevm-ova', 'vsphere-ova', 'docker')
for f in formats:
if f not in supported:
raise koji.ApplianceError('Invalid format: %s' % f)
@ -3014,6 +3026,7 @@ class BaseImageTask(OzImageTask):
of details for each image type we had to ask ImageFactory to build
"""
fcalls = {'raw': self._buildBase,
'raw-xz': self._buildXZ,
'vmdk': self._buildConvert,
'vdi': self._buildConvert,
'qcow': self._buildConvert,
@ -3079,10 +3092,10 @@ class BaseImageTask(OzImageTask):
"""
if image.target_image:
status = image.target_image.status
details = image.target_image.status_detail
details = image.target_image.status_detail['error']
else:
status = image.base_image.status
details = image.base_image.status_detail
details = image.base_image.status_detail['error']
self.logger.debug('check image results: %s' % status)
if status == 'FAILED':
scrnshot = self.getScreenshot()
@ -3094,10 +3107,11 @@ class BaseImageTask(OzImageTask):
if not self.session.checkUpload('', os.path.basename(self.ozlog)):
self.tlog.removeHandler(self.fhandler)
self.uploadFile(self.ozlog)
if 'No disk activity' in details:
details = 'Automated install failed or prompted for input. See the screenshot in the task results for more information.'
raise koji.ApplianceError('Image status is %s: %s' %
(status, details))
def _buildBase(self, template, params, wait=True):
"""
Build a base image using ImageFactory. This is a "raw" image.
@ -3121,6 +3135,29 @@ class BaseImageTask(OzImageTask):
self._checkImageState(base)
return base
def _buildXZ(self, format):
"""
Use xz to compress a raw disk image. This is very straightforward.
@args:
format - a string representing the image format, "raw-xz"
@returns:
a dict with some metadata about the image
"""
newimg = os.path.join(self.workdir, self.imgname + '.raw.xz')
rawimg = os.path.join(self.workdir, self.imgname + '.raw')
cmd = ['/bin/cp', self.base_img.base_image.data, rawimg]
conlog = os.path.join(self.workdir,
'xz-cp-%s-%s.log' % (format, self.arch))
log_output(self.session, cmd[0], cmd, conlog, self.getUploadDir(),
logerror=1)
cmd = ['/usr/bin/xz', '-z', rawimg]
conlog = os.path.join(self.workdir,
'xz-%s-%s.log' % (format, self.arch))
log_output(self.session, cmd[0], cmd, conlog, self.getUploadDir(),
logerror=1)
return {'image': newimg}
def _buildOVA(self, format):
"""
Build an OVA target image. This is a format supported by RHEV and
@ -3191,7 +3228,6 @@ class BaseImageTask(OzImageTask):
@returns
a dict with some metadata about the image
"""
newimg = os.path.join(self.workdir, self.imgname + '.%s' % format)
cmd = ['/usr/bin/qemu-img', 'convert', '-f', 'raw', '-O',
format, self.base_img.base_image.data, newimg]
@ -3293,7 +3329,7 @@ class BaseImageTask(OzImageTask):
# upload the results
for format in (f for f in self.formats.keys() if self.formats[f]):
newimg = images[format]['image']
if 'ova' in format:
if 'ova' in format or format == 'raw-xz':
newname = self.imgname + '.' + format.replace('-', '.')
elif format == 'docker':
newname = self.imgname + '.' + 'tar.gz'

View file

@ -5130,7 +5130,7 @@ def handle_spin_appliance(options, session, args):
def handle_image_build(options, session, args):
"""Create a disk image given an install tree"""
formats = ('vmdk', 'qcow', 'qcow2', 'vdi', 'rhevm-ova', 'vsphere-ova',
'docker')
'docker', 'raw-xz')
usage = _("usage: %prog image-build [options] <name> <version> " +
"<target> <install-tree-url> <arch> [<arch>...]")
usage += _("\n %prog image-build --config FILE")