From c812e55ce2ad5c60e097a7d990c05bb852fb1925 Mon Sep 17 00:00:00 2001 From: Pavel Raiskup Date: Jan 31 2020 11:32:39 +0000 Subject: rpmbuild: add support for mock's module_enable We require new dict in get-build-task json: | modules: | toggle: | - enable: module1:stream1 | - enable: module2:stream2 .. and generate appropriate part of child.cfg file. Related: rhbz#1572596modules --- diff --git a/rpmbuild/copr_rpmbuild/builders/mock.py b/rpmbuild/copr_rpmbuild/builders/mock.py index f20eaa2..a53076d 100644 --- a/rpmbuild/copr_rpmbuild/builders/mock.py +++ b/rpmbuild/copr_rpmbuild/builders/mock.py @@ -29,6 +29,7 @@ class MockBuilder(object): self.logfile = self.config.get("main", "logfile") self.copr_username = task.get("project_owner") self.copr_projectname = task.get("project_name") + self.modules = task.get("modules") def run(self): open(self.logfile, 'w').close() # truncate logfile @@ -69,7 +70,8 @@ class MockBuilder(object): return template.render(chroot=self.chroot, task_id=self.task_id, buildroot_pkgs=self.buildroot_pkgs, enable_net=self.enable_net, use_bootstrap_container=self.use_bootstrap_container, repos=self.repos, pkg_manager_conf=self.pkg_manager_conf, - copr_username=self.copr_username, copr_projectname=self.copr_projectname) + copr_username=self.copr_username, copr_projectname=self.copr_projectname, + modules=self.enable_modules) def produce_srpm(self, spec, sources, configdir, resultdir): cmd = MOCK_CALL + [ @@ -110,6 +112,28 @@ class MockBuilder(object): ] subprocess.call(cmd) # ignore failure here, if any + @property + def enable_modules(self): + """ Return the list() of modules to be enabled """ + enable = [] + if self.modules is None: + return enable + + assert isinstance(self.modules, dict) + assert 'toggle' in self.modules + assert isinstance(self.modules['toggle'], list) + assert self.modules['toggle'] + + for toggle in self.modules['toggle']: + assert isinstance(toggle, dict) + # we only have 'enable' now + assert 'enable' in toggle + assert isinstance(toggle['enable'], str) + module = toggle['enable'].strip() + enable.append(module) + + return enable + def produce_rpm(self, srpm, configdir, resultdir): cmd = MOCK_CALL + [ "--rebuild", srpm, diff --git a/rpmbuild/mock.cfg.j2 b/rpmbuild/mock.cfg.j2 index 046770c..6126efd 100644 --- a/rpmbuild/mock.cfg.j2 +++ b/rpmbuild/mock.cfg.j2 @@ -23,7 +23,9 @@ config_opts['bootstrap_chroot_additional_packages'] = [] config_opts['bootstrap_module_enable'] = [] config_opts['bootstrap_module_install'] = [] {% endif %} - +{% for module in modules %} +config_opts["module_enable"] += "{{ module }}" +{%- endfor %} {% if repos %} config_opts['{{ pkg_manager_conf }}.conf'] += """ {% for repo in repos %} diff --git a/rpmbuild/tests/test_mock.py b/rpmbuild/tests/test_mock.py index 4f6e6c2..9cfe4f1 100644 --- a/rpmbuild/tests/test_mock.py +++ b/rpmbuild/tests/test_mock.py @@ -199,3 +199,54 @@ config_opts['use_bootstrap_container'] = False b2 = MockBuilder(dict(self.task, **{"chroot": "custom-1-x86_64"}), self.sourcedir, self.resultdir, self.config) assert b1.pkg_manager_conf == "yum" assert b2.pkg_manager_conf == "dnf" + + @pytest.mark.parametrize('modules', [ + ['postgresql:9.6'], + ['moduleA:S1', 'moduleA:S2'], + # we trim spaces around modules + [' moduleA:S1', ' moduleA:S2 '], + ]) + def test_module_mock_options(self, f_mock_calls, modules): + 'test that mock options for module-enable is correctly constructed' + self.task['modules'] = { + 'toggle': [{'enable': x} for x in modules], + } + MockBuilder(self.task, self.sourcedir, self.resultdir, + self.config).run() + + assert len(f_mock_calls) == 2 # srpm + rpm + + # srpm call isn't affected by modules + call = f_mock_calls[0] + assert call[0][0] == self.mock_srpm_call + + call = f_mock_calls[1] + assert call[0][0] == self.mock_rpm_call + + part_of_expected_output = ( + "config_opts['use_bootstrap_container'] = False\n" + "\n" + "\n" + "\n" + "{0}\n" + ).format('\n'.join( + ['config_opts["module_enable"] += "{0}"'.format(module.strip()) for module in modules] + )) + + config = ''.join(open(self.child_config, 'r').readlines()) + assert part_of_expected_output in config + + @pytest.mark.parametrize('modules', [ + [], # dict expected + "asf", + {}, # toggle required for now + {'toggle': []}, # can not be empty + {'toggle': ""}, # string required + {'toggle': [{'enable': 1}]}, # enable accepts string + ]) + def test_module_mock_assertions(self, f_mock_calls, modules): + 'test that assertions work' + self.task['modules'] = modules + with pytest.raises(AssertionError): + MockBuilder(self.task, self.sourcedir, self.resultdir, + self.config).run()