From 35a9c7a93da2b53f025ebec6f103d4107e7089d9 Mon Sep 17 00:00:00 2001 From: Tomas Kopecek Date: Jul 28 2017 08:53:04 +0000 Subject: allow some missing path sections in runroot config Fixes: https://pagure.io/koji/issue/527 Before path sections were expected to have zero-based numbering. If some item was missing, parsing ended there. Now we are more benevolent and we pick all path\d+ sections and sort them by ordering number. --- diff --git a/plugins/builder/runroot.py b/plugins/builder/runroot.py index e75471f..63b35f4 100644 --- a/plugins/builder/runroot.py +++ b/plugins/builder/runroot.py @@ -5,6 +5,7 @@ import koji import ConfigParser import os import platform +import re import koji.tasks from koji.tasks import scan_mounts @@ -63,11 +64,10 @@ class RunRootTask(koji.tasks.BaseTaskHandler): if cp.has_option('paths', 'path_subs'): self.config['path_subs'] = [x.split(',') for x in cp.get('paths', 'path_subs').split('\n')] - count = 0 - while True: - section_name = 'path%d' % count - if not cp.has_section(section_name): - break + # path section are in form 'path%d' while order is important as some + # paths can be mounted inside other mountpoints + path_sections = [p for p in cp.sections() if re.match('path\d+', p)] + for section_name in sorted(path_sections, key=lambda x: int(x[4:])): try: self.config['paths'].append({ 'mountpoint': cp.get(section_name, 'mountpoint'), @@ -77,7 +77,6 @@ class RunRootTask(koji.tasks.BaseTaskHandler): }) except ConfigParser.NoOptionError: raise koji.GenericError("bad config: missing options in %s section" % section_name) - count += 1 for path in self.config['default_mounts'] + self.config['safe_roots'] + [x[0] for x in self.config['path_subs']]: if not path.startswith('/'): diff --git a/tests/test_plugins/test_runroot_builder.py b/tests/test_plugins/test_runroot_builder.py index d82e710..feeb165 100644 --- a/tests/test_plugins/test_runroot_builder.py +++ b/tests/test_plugins/test_runroot_builder.py @@ -31,6 +31,9 @@ class FakeConfigParser(object): def read(self, path): return + def sections(self): + return self.CONFIG.keys() + def has_option(self, section, key): return section in self.CONFIG and key in self.CONFIG[section]