From e7c20f3619053db555c7665bd23cb54a696287f4 Mon Sep 17 00:00:00 2001 From: Mike McLean Date: Aug 08 2017 15:46:37 +0000 Subject: PR#419: Koji support for custom Lorax templates in LiveMedia tasks Merges #419 https://pagure.io/koji/pull-request/419 --- diff --git a/builder/kojid b/builder/kojid index 7ca0338..8480422 100755 --- a/builder/kojid +++ b/builder/kojid @@ -705,6 +705,27 @@ class BuildRoot(object): rpm_info['external_repo'] = erepo rpm_info['location'] = erepo['external_repo_id'] + def path_without_to_within(self, path): + """ + Convert an absolute path from without the BuildRoot to one within. + + For example, if the BuildRoot is located at '/tmp/my/build/root', + calling path_without_to_within('/tmp/my/build/root/foo/bar') would + return '/foo/bar'). + + :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('/', koji.util.relpath(path, root)) + def resultdir(self): return "%s/%s/result" % (self.options.mockdir, self.name) @@ -3066,6 +3087,31 @@ class LiveMediaTask(ImageTask): # https://bugzilla.redhat.com/show_bug.cgi?id=1315541 bind_opts = {} + def fetch_lorax_templates_from_scm(self, build_root): + """ + Checkout the lorax templates from SCM for use by livemedia-creator. + + This will 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.path_without_to_within(checkout_dir), + self.opts['lorax_dir']) + def genISOManifest(self, image, manifile): """ Using iso9660 from pycdio, get the file manifest of the given image, @@ -3179,6 +3225,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_cli/commands.py b/cli/koji_cli/commands.py index 0e85b05..a221ad9 100644 --- a/cli/koji_cli/commands.py +++ b/cli/koji_cli/commands.py @@ -5249,6 +5249,13 @@ def handle_spin_livemedia(options, session, args): parser.add_option("--can-fail", action="store", dest="optional_arches", metavar="ARCH1,ARCH2,...", default="", help=_("List of archs which are not blocking for build (separated by commas.")) + 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. @@ -5257,6 +5264,9 @@ def handle_spin_livemedia(options, session, args): " build target, an architecture, 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') @@ -5638,6 +5648,7 @@ def _build_image(options, task_opts, session, args, img_type): 'format', 'install_tree_url', 'isoname', 'ksurl', 'ksversion', 'release', 'repo', 'scratch', 'skip_tag', 'specfile', 'title', 'vcpu', 'vmem', 'optional_arches', + 'lorax_dir', 'lorax_url', ] for opt in passthru_opts: val = getattr(task_opts, opt, None)