Let's install meson via pip whenever meson is not available at all or does not match the minimum required version. Signed-off-by: Fabiano Fidêncio <fidencio@xxxxxxxxxx> --- guests/lcitool | 25 ++++++++++++ guests/playbooks/update/tasks/packages.yml | 44 ++++++++++++++++++++++ guests/vars/mappings.yml | 17 +++++++++ 3 files changed, 86 insertions(+) diff --git a/guests/lcitool b/guests/lcitool index 5b5b622..2c08455 100755 --- a/guests/lcitool +++ b/guests/lcitool @@ -303,6 +303,7 @@ class Projects: with open(mappings_path, "r") as infile: mappings = yaml.safe_load(infile) self._mappings = mappings["mappings"] + self._pip_mappings = mappings["pip_mappings"] except Exception as ex: raise Exception("Can't load mappings: {}".format(ex)) @@ -340,6 +341,9 @@ class Projects: def get_mappings(self): return self._mappings + def get_pip_mappings(self): + return self._pip_mappings + def get_packages(self, project): return self._packages[project] @@ -583,6 +587,7 @@ class Application: def _action_dockerfile(self, args): mappings = self._projects.get_mappings() + pip_mappings = self._projects.get_pip_mappings() hosts = self._inventory.expand_pattern(args.hosts) if len(hosts) > 1: @@ -617,6 +622,7 @@ class Application: pkgs = {} cross_pkgs = {} + pip_pkgs = {} base_keys = ["default", package_format, os_name, os_full] cross_keys = [] if args.cross_arch: @@ -641,21 +647,28 @@ class Application: for key in keys: if key in mappings[package]: pkgs[package] = mappings[package][key] + if package in pip_mappings and key in pip_mappings[package]: + pip_pkgs[package] = pip_mappings[package][key] if package not in pkgs: continue + if package in pip_pkgs and pkgs[package] is not None: + del pip_pkgs[package] if cross_policy == "foreign" and pkgs[package] is not None: cross_pkgs[package] = pkgs[package] if pkgs[package] is None or cross_policy in ["skip", "foreign"]: del pkgs[package] pkg_align = " \\\n" + (" " * len("RUN " + package_manager + " ")) + pip_pkg_align = " \\\n" + (" " * len("RUN pip3 ")) print("FROM {}".format(facts["docker_base"])) varmap = {} varmap["package_manager"] = package_manager varmap["pkgs"] = pkg_align[1:] + pkg_align.join(sorted(set(pkgs.values()))) + varmap["pip_pkgs"] = pip_pkg_align[1:] + pip_pkg_align.join(sorted(set(pip_pkgs.values()))) + if package_format == "deb": if args.cross_arch: deb_arch = Util.native_arch_to_deb_arch(args.cross_arch) @@ -691,7 +704,14 @@ class Application: {package_manager} install --no-install-recommends -y {cross_pkgs} && \\ {package_manager} autoremove -y && \\ {package_manager} autoclean -y + """).format(**varmap)) + + if pip_pkgs: + sys.stdout.write(textwrap.dedent(""" + RUN pip3 install {pip_pkgs} + """).format(**varmap)) + sys.stdout.write(textwrap.dedent(""" ENV ABI "{cross_abi}" ENV CONFIGURE_OPTS "--host={cross_abi} \\ --target={cross_abi}" @@ -714,6 +734,11 @@ class Application: {package_manager} clean all -y """).format(**varmap)) + if pip_pkgs: + sys.stdout.write(textwrap.dedent(""" + RUN pip3 install {pip_pkgs} + """).format(**varmap)) + def run(self): args = self._parser.parse_args() if args.debug: diff --git a/guests/playbooks/update/tasks/packages.yml b/guests/playbooks/update/tasks/packages.yml index ec8a4c4..c041eab 100644 --- a/guests/playbooks/update/tasks/packages.yml +++ b/guests/playbooks/update/tasks/packages.yml @@ -100,3 +100,47 @@ package: name: '{{ flattened|sort }}' state: '{{ state }}' + +- set_fact: + pip_temp: {} + +- name: '{{ project }}: Verify pip mappings' + fail: + msg: 'No mappings defined for {{ item }}' + with_items: + '{{ packages }}' + when: + - pip_mappings[item] is undefined + +- name: '{{ project }}: Look up pip mappings (default)' + set_fact: + pip_temp: '{{ pip_temp|combine({ item: pip_mappings[item]["default"] }) }}' + with_items: + '{{ packages }}' + when: + - pip_mappings[item]["default"] is defined + +- set_fact: + pip_flattened: [] + +- name: '{{ project }}: Flatten pip package list' + set_fact: + pip_flattened: '{{ pip_flattened }} + [ "{{ pip_temp[item] }}" ]' + with_items: + '{{ temp }}' + when: + - pip_temp[item] != None + - pip_temp[item] not in pip_flattened + +- name: '{{ project }}: Install packages from pip (state={{ state }})' + pip: + name: '{{ pip_flattened|sort }}' + executable: pip3 + state: '{{ state }}' + with_items: + '{{ packages }}' + when: + - temp[item] is defined + - temp[item] == None + - pip_temp[item] is defined + - pip_temp[item] != None diff --git a/guests/vars/mappings.yml b/guests/vars/mappings.yml index 524cff2..ba0f1cf 100644 --- a/guests/vars/mappings.yml +++ b/guests/vars/mappings.yml @@ -1007,3 +1007,20 @@ mappings: deb: zlib1g-dev rpm: zlib-static cross-policy-deb: foreign + + +# Pip mappings are used to map the generic packages name used to define +# projects to the specific package name and version which will be used when +# installing them via pip. +# +# pip packages' name are not different between different OSes, thus only +# the default "priority" is taken into account. +# +# In case we need to stick to a specific version of a pip package, it can +# be represented by adding "==$version" to the pip package name, as done +# with the meson package. + +pip_mappings: + + meson: + default: meson==0.49.0 -- 2.23.0 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list