diff --git a/diskimage_builder/elements/package-installs/README.rst b/diskimage_builder/elements/package-installs/README.rst index 4660b9753..c77922868 100644 --- a/diskimage_builder/elements/package-installs/README.rst +++ b/diskimage_builder/elements/package-installs/README.rst @@ -93,6 +93,9 @@ packages), you can use something like:: other_package: when: DIB_FEATURE_FLAG!=0 +You can also use a list of items in the ``when`` statement, which will +be effectively combined with *and*. + DEPRECATED: Adding a file under your elements pre-install.d, install.d, or post-install.d directories called package-installs- will cause the list of packages in that file to be installed at the beginning of the diff --git a/diskimage_builder/elements/package-installs/bin/package-installs-squash b/diskimage_builder/elements/package-installs/bin/package-installs-squash index 7ba71dad1..c59b35634 100755 --- a/diskimage_builder/elements/package-installs/bin/package-installs-squash +++ b/diskimage_builder/elements/package-installs/bin/package-installs-squash @@ -61,7 +61,7 @@ def _valid_for_arch(pkg_name, arch, not_arch): return not _is_arch_in_list(not_arch) -def _when(statement): +def _when(statements): '''evaulate a when: statement Evaluate statements of the form @@ -74,38 +74,48 @@ def _when(statement): ''' # No statement means install - if statement is None: + if statements is None: return True - # FOO = BAR - # var op val - match = re.match( - r"(?P[\w]+)(\s*)(?P=|!=)(\s*)(?P.*)", statement) - if not match: - print("Malformed when line: <%s>" % statement) - sys.exit(1) - match = match.groupdict() - var = match['var'] - op = match['op'] - val = match['val'] + if not isinstance(statements, list): + statements = [statements] - if var not in os.environ: - raise RuntimeError("The variable <%s> is not set" % var) + result = [] - logger.debug("when eval %s%s%s against <%s>" % - (var, op, val, os.environ[var])) + for s in statements: + # FOO = BAR + # var op val + match = re.match( + r"(?P[\w]+)(\s*)(?P=|!=)(\s*)(?P.*)", s) + if not match: + print("Malformed when line: <%s>" % s) + sys.exit(1) + match = match.groupdict() + var = match['var'] + op = match['op'] + val = match['val'] - if op == '=': - if val == os.environ[var]: - return True - elif op == '!=': - if val != os.environ[var]: - return True - else: - print("Malformed when op: %s" % op) - sys.exit(1) + if var not in os.environ: + raise RuntimeError("The variable <%s> is not set" % var) - return False + logger.debug("when eval %s%s%s against <%s>" % + (var, op, val, os.environ[var])) + + if op == '=': + if val == os.environ[var]: + result.append(True) + continue + elif op == '!=': + if val != os.environ[var]: + result.append(True) + continue + else: + print("Malformed when op: %s" % op) + sys.exit(1) + + result.append(False) + + return all(result) def collect_data(data, objs, element_name): diff --git a/diskimage_builder/elements/package-installs/tests/test_package_squash.py b/diskimage_builder/elements/package-installs/tests/test_package_squash.py index de7779e3d..5bebb5261 100644 --- a/diskimage_builder/elements/package-installs/tests/test_package_squash.py +++ b/diskimage_builder/elements/package-installs/tests/test_package_squash.py @@ -138,3 +138,39 @@ class TestPackageInstall(base.BaseTestCase): self.assertRaises(RuntimeError, installs_squash.collect_data, self.final_dict, objs, 'test_element') + + @mock.patch.object(os, 'environ', + dict( + DIB_A_FEATURE='1', + DIB_B_FEATURE='1', + DIB_C_FEATURE='1', + **os.environ)) + def test_skip_when_list(self): + '''Exercise the when flag with lists''' + objs = { + 'not_skipped_package': { + 'when': [ + 'DIB_A_FEATURE=1', + 'DIB_B_FEATURE=1', + 'DIB_C_FEATURE=1' + ] + }, + 'skipped_package': { + 'when': [ + 'DIB_A_FEATURE=1', + 'DIB_B_FEATURE=0', + 'DIB_C_FEATURE=1', + ] + }, + } + + result = installs_squash.collect_data( + self.final_dict, objs, 'test_element') + + expected = { + 'install.d': { + 'install': [('not_skipped_package', 'test_element')] + } + } + + self.assertThat(result, IsMatchingInstallList(expected)) diff --git a/releasenotes/notes/package-installs-when-list-cfc00032271bae75.yaml b/releasenotes/notes/package-installs-when-list-cfc00032271bae75.yaml new file mode 100644 index 000000000..8fa85ee8d --- /dev/null +++ b/releasenotes/notes/package-installs-when-list-cfc00032271bae75.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + The ``package-installs`` element can now take a list value for the + ``when`` environment filter.