From c5046c81679cdbaa080aaedd95eb1b84839bd358 Mon Sep 17 00:00:00 2001 From: John Florian Date: Dec 21 2016 21:45:04 +0000 Subject: [PATCH 1/2] New - kojid.BuildRoot.relpath() This new method returns an absolute path within the chroot relative the BuildRoot's chroot. --- diff --git a/builder/kojid b/builder/kojid index 446ab2e..043da8e 100755 --- a/builder/kojid +++ b/builder/kojid @@ -693,6 +693,21 @@ class BuildRoot(object): rpm_info['external_repo'] = erepo rpm_info['location'] = erepo['external_repo_id'] + def relpath(self, path): + """ + :param path: + A reference within the BuildRoot but as an absolute path from + without a chroot. + :return: + The equivalent absolute path from within a chroot of the BuildRoot. + """ + root = self.rootdir() + if os.path.commonprefix([root, path]) != root: + raise ValueError( + 'path %r is not within the BuildRoot at %r' % (path, root) + ) + return os.path.join('/', os.path.relpath(path, root)) + def resultdir(self): return "%s/%s/result" % (self.options.mockdir, self.name) From b4302fe52d8983d8dd5eb8a8ffef057a2bdeee40 Mon Sep 17 00:00:00 2001 From: John Florian Date: Dec 27 2016 16:47:23 +0000 Subject: [PATCH 2/2] New - custom lorax templates for livemedia tasks This adds two new options (--lorax_url and --lorax_dir) to the Koji CLI so that it's now possible to use custom lorax templates for livemedia tasks. The custom templates must come from a supported, allowed SCM, which makes it trivial to inject the whole directory structure of template files that lorax expects. In addition to the CLI changes, kojid's LiveMediaTask handler recognizes these new options and acts accordingly by extending the livemedia-creator call via its --lorax-templates option. --- diff --git a/builder/kojid b/builder/kojid index 043da8e..2f878d0 100755 --- a/builder/kojid +++ b/builder/kojid @@ -2952,6 +2952,29 @@ class LiveMediaTask(ImageTask): # https://bugzilla.redhat.com/show_bug.cgi?id=1315541 bind_opts = {} + def fetch_lorax_templates_from_scm(self, build_root): + """ + Make a checkout of the lorax templates from SCM so that they may be + passed to livemedia-creator. Here we are operating outside the chroot + of the BuildRoot. The following options are essential: + - lorax_url points to the SCM containing the templates. + - lorax_dir provides a relative reference to the templates within + the checkout. + + :param build_root: + The BuildRoot instance to receive the checkout. + :return: + An absolute path (from within the chroot) to where livemedia-creator + can find the checked out templates. + """ + scm = SCM(self.opts['lorax_url']) + scm.assert_allowed(self.options.allowed_scms) + logfile = os.path.join(self.workdir, 'lorax-templates-checkout.log') + checkout_dir = scm.checkout(os.path.join(build_root.rootdir(), 'tmp'), + self.session, self.getUploadDir(), logfile) + return os.path.join(build_root.relpath(checkout_dir), + self.opts['lorax_dir']) + def genISOManifest(self, image, manifile): """ Using iso9660 from pycdio, get the file manifest of the given image, @@ -3065,6 +3088,10 @@ class LiveMediaTask(ImageTask): if arch == 'x86_64': cmd.append('--macboot') + if 'lorax_url' in self.opts: + templates_dir = self.fetch_lorax_templates_from_scm(broot) + cmd.extend(['--lorax-templates', templates_dir]) + # Run livemedia-creator rv = broot.mock(['--cwd', '/tmp', '--chroot', '--'] + cmd) diff --git a/cli/koji b/cli/koji index bfa42ca..1463633 100755 --- a/cli/koji +++ b/cli/koji @@ -5466,6 +5466,13 @@ def handle_spin_livemedia(options, session, args): help=_("SCM URL to spec file fragment to use to generate wrapper RPMs")) parser.add_option("--skip-tag", action="store_true", help=_("Do not attempt to tag package")) + parser.add_option('--lorax_dir', metavar='DIR', + help=_('The relative path to the lorax templates ' + 'directory within the checkout of "lorax_url".')) + parser.add_option('--lorax_url', metavar='URL', + help=_('The URL to the SCM containing any custom lorax ' + 'templates that are to be used to override the ' + 'default templates.')) (task_options, args) = parser.parse_args(args) # Make sure the target and kickstart is specified. @@ -5474,6 +5481,9 @@ def handle_spin_livemedia(options, session, args): " architecture, a build target, and a relative path to" + " a kickstart file.")) assert False # pragma: no cover + if task_options.lorax_url is not None and task_options.lorax_dir is None: + parser.error(_('The "--lorax_url" option requires that "--lorax_dir" ' + 'also be used.')) _build_image(options, task_options, session, args, 'livemedia') # This handler is for spinning appliance images @@ -5845,7 +5855,7 @@ def _build_image(options, task_opts, session, args, img_type): passthru_opts = [ 'isoname', 'ksurl', 'ksversion', 'scratch', 'repo', 'release', 'skip_tag', 'vmem', 'vcpu', 'format', 'specfile', - 'title', 'install_tree_url', + 'title', 'install_tree_url', 'lorax_dir', 'lorax_url', ] hub_opts = {} for opt in passthru_opts: