diff options
Diffstat (limited to 'test/integration/targets/setup_rpm_repo')
13 files changed, 294 insertions, 0 deletions
diff --git a/test/integration/targets/setup_rpm_repo/aliases b/test/integration/targets/setup_rpm_repo/aliases new file mode 100644 index 0000000..65e8315 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/aliases @@ -0,0 +1 @@ +needs/target/setup_epel diff --git a/test/integration/targets/setup_rpm_repo/defaults/main.yml b/test/integration/targets/setup_rpm_repo/defaults/main.yml new file mode 100644 index 0000000..19c033b --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/defaults/main.yml @@ -0,0 +1 @@ +install_repos: yes diff --git a/test/integration/targets/setup_rpm_repo/files/comps.xml b/test/integration/targets/setup_rpm_repo/files/comps.xml new file mode 100644 index 0000000..e939182 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/files/comps.xml @@ -0,0 +1,36 @@ +<!DOCTYPE comps PUBLIC "-//Red Hat, Inc.//DTD Comps info//EN" "comps.dtd"> +<comps> + <group> + <id>customgroup</id> + <name>Custom Group</name> + <description></description> + <default>false</default> + <uservisible>true</uservisible> + <display_order>1024</display_order> + <packagelist> + <packagereq type="mandatory">dinginessentail</packagereq> + </packagelist> + </group> + + <group> + <id>customenvgroup</id> + <name>Custom Environment Group</name> + <description></description> + <default>false</default> + <uservisible>false</uservisible> + <display_order>1024</display_order> + <packagelist> + <packagereq type="mandatory">landsidescalping</packagereq> + </packagelist> + </group> + + <environment> + <id>customenvgroup-environment</id> + <name>Custom Environment Group</name> + <description></description> + <display_order>1024</display_order> + <grouplist> + <groupid>customenvgroup</groupid> + </grouplist> + </environment> +</comps> diff --git a/test/integration/targets/setup_rpm_repo/handlers/main.yml b/test/integration/targets/setup_rpm_repo/handlers/main.yml new file mode 100644 index 0000000..a0af3c9 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/handlers/main.yml @@ -0,0 +1,5 @@ +- name: remove repos + yum_repository: + state: absent + name: "{{ item }}" + loop: "{{ repos }}" diff --git a/test/integration/targets/setup_rpm_repo/library/create_repo.py b/test/integration/targets/setup_rpm_repo/library/create_repo.py new file mode 100644 index 0000000..e6a61ba --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/library/create_repo.py @@ -0,0 +1,125 @@ +#!/usr/bin/python + +from __future__ import (absolute_import, division, print_function) +__metaclass__ = type + +import subprocess +import sys +import tempfile + +from collections import namedtuple + +from ansible.module_utils.basic import AnsibleModule +from ansible.module_utils.common.respawn import has_respawned, probe_interpreters_for_module, respawn_module + +HAS_RPMFLUFF = True +can_use_rpm_weak_deps = None +try: + from rpmfluff import SimpleRpmBuild + from rpmfluff import YumRepoBuild +except ImportError: + try: + from rpmfluff.rpmbuild import SimpleRpmBuild + from rpmfluff.yumrepobuild import YumRepoBuild + except ImportError: + HAS_RPMFLUFF = False + +can_use_rpm_weak_deps = None +if HAS_RPMFLUFF: + try: + from rpmfluff import can_use_rpm_weak_deps + except ImportError: + try: + from rpmfluff.utils import can_use_rpm_weak_deps + except ImportError: + pass + + +RPM = namedtuple('RPM', ['name', 'version', 'release', 'epoch', 'recommends', 'arch']) + + +SPECS = [ + RPM('dinginessentail', '1.0', '1', None, None, None), + RPM('dinginessentail', '1.0', '2', '1', None, None), + RPM('dinginessentail', '1.1', '1', '1', None, None), + RPM('dinginessentail-olive', '1.0', '1', None, None, None), + RPM('dinginessentail-olive', '1.1', '1', None, None, None), + RPM('landsidescalping', '1.0', '1', None, None, None), + RPM('landsidescalping', '1.1', '1', None, None, None), + RPM('dinginessentail-with-weak-dep', '1.0', '1', None, ['dinginessentail-weak-dep'], None), + RPM('dinginessentail-weak-dep', '1.0', '1', None, None, None), + RPM('noarchfake', '1.0', '1', None, None, 'noarch'), +] + + +def create_repo(arch='x86_64'): + pkgs = [] + for spec in SPECS: + pkg = SimpleRpmBuild(spec.name, spec.version, spec.release, [spec.arch or arch]) + pkg.epoch = spec.epoch + + if spec.recommends: + # Skip packages that require weak deps but an older version of RPM is being used + if not can_use_rpm_weak_deps or not can_use_rpm_weak_deps(): + continue + + for recommend in spec.recommends: + pkg.add_recommends(recommend) + + pkgs.append(pkg) + + # HACK: EPEL6 version of rpmfluff can't do multi-arch packaging, so we'll just build separately and copy + # the noarch stuff in, since we don't currently care about the repodata for noarch + if sys.version_info[0:2] == (2, 6): + noarch_repo = YumRepoBuild([p for p in pkgs if 'noarch' in p.get_build_archs()]) + noarch_repo.make('noarch') + + repo = YumRepoBuild([p for p in pkgs if arch in p.get_build_archs()]) + repo.make(arch) + + subprocess.call("cp {0}/*.rpm {1}".format(noarch_repo.repoDir, repo.repoDir), shell=True) + else: + repo = YumRepoBuild(pkgs) + repo.make(arch, 'noarch') + + for pkg in pkgs: + pkg.clean() + + return repo.repoDir + + +def main(): + module = AnsibleModule( + argument_spec={ + 'arch': {'required': True}, + 'tempdir': {'type': 'path'}, + } + ) + + if not HAS_RPMFLUFF: + system_interpreters = ['/usr/libexec/platform-python', '/usr/bin/python3', '/usr/bin/python'] + + interpreter = probe_interpreters_for_module(system_interpreters, 'rpmfluff') + + if not interpreter or has_respawned(): + module.fail_json('unable to find rpmfluff; tried {0}'.format(system_interpreters)) + + respawn_module(interpreter) + + arch = module.params['arch'] + tempdir = module.params['tempdir'] + + # Save current temp dir so we can set it back later + original_tempdir = tempfile.tempdir + tempfile.tempdir = tempdir + + try: + repo_dir = create_repo(arch) + finally: + tempfile.tempdir = original_tempdir + + module.exit_json(repo_dir=repo_dir, tmpfile=tempfile.gettempdir()) + + +if __name__ == "__main__": + main() diff --git a/test/integration/targets/setup_rpm_repo/meta/main.yml b/test/integration/targets/setup_rpm_repo/meta/main.yml new file mode 100644 index 0000000..1810d4b --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/meta/main.yml @@ -0,0 +1,2 @@ +dependencies: + - setup_remote_tmp_dir diff --git a/test/integration/targets/setup_rpm_repo/tasks/main.yml b/test/integration/targets/setup_rpm_repo/tasks/main.yml new file mode 100644 index 0000000..be20078 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/tasks/main.yml @@ -0,0 +1,100 @@ +- block: + - name: Install epel repo which is missing on rhel-7 and is needed for rpmfluff + include_role: + name: setup_epel + when: + - ansible_distribution in ['RedHat', 'CentOS'] + - ansible_distribution_major_version is version('7', '==') + + - name: Include distribution specific variables + include_vars: "{{ lookup('first_found', params) }}" + vars: + params: + files: + - "{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_version }}.yml" + - "{{ ansible_facts.os_family }}-{{ ansible_facts.distribution_major_version }}.yml" + - "{{ ansible_facts.distribution }}.yml" + - "{{ ansible_facts.os_family }}.yml" + - default.yml + paths: + - "{{ role_path }}/vars" + + - name: Install rpmfluff and deps + action: "{{ ansible_facts.pkg_mgr }}" + args: + name: "{{ rpm_repo_packages }}" + + - name: Install rpmfluff via pip + pip: + name: rpmfluff + when: ansible_facts.os_family == 'RedHat' and ansible_distribution_major_version is version('9', '==') + + - set_fact: + repos: + - "fake-{{ ansible_architecture }}" + - "fake-i686" + - "fake-ppc64" + changed_when: yes + notify: remove repos + + - name: Create RPMs and put them into a repo + create_repo: + arch: "{{ ansible_architecture }}" + tempdir: "{{ remote_tmp_dir }}" + register: repo + + - set_fact: + repodir: "{{ repo.repo_dir }}" + + - name: Install the repo + yum_repository: + name: "fake-{{ ansible_architecture }}" + description: "fake-{{ ansible_architecture }}" + baseurl: "file://{{ repodir }}" + gpgcheck: no + when: install_repos | bool + + - name: Copy comps.xml file + copy: + src: comps.xml + dest: "{{ repodir }}" + register: repodir_comps + + - name: Register comps.xml on repo + command: createrepo -g {{ repodir_comps.dest | quote }} {{ repodir | quote }} + + - name: Create RPMs and put them into a repo (i686) + create_repo: + arch: i686 + tempdir: "{{ remote_tmp_dir }}" + register: repo_i686 + + - set_fact: + repodir_i686: "{{ repo_i686.repo_dir }}" + + - name: Install the repo (i686) + yum_repository: + name: "fake-i686" + description: "fake-i686" + baseurl: "file://{{ repodir_i686 }}" + gpgcheck: no + when: install_repos | bool + + - name: Create RPMs and put them into a repo (ppc64) + create_repo: + arch: ppc64 + tempdir: "{{ remote_tmp_dir }}" + register: repo_ppc64 + + - set_fact: + repodir_ppc64: "{{ repo_ppc64.repo_dir }}" + + - name: Install the repo (ppc64) + yum_repository: + name: "fake-ppc64" + description: "fake-ppc64" + baseurl: "file://{{ repodir_ppc64 }}" + gpgcheck: no + when: install_repos | bool + + when: ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux', 'Fedora'] diff --git a/test/integration/targets/setup_rpm_repo/vars/Fedora.yml b/test/integration/targets/setup_rpm_repo/vars/Fedora.yml new file mode 100644 index 0000000..004f42b --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/Fedora.yml @@ -0,0 +1,4 @@ +rpm_repo_packages: + - "{{ 'python' ~ rpm_repo_python_major_version ~ '-rpmfluff' }}" + - createrepo + - rpm-build diff --git a/test/integration/targets/setup_rpm_repo/vars/RedHat-6.yml b/test/integration/targets/setup_rpm_repo/vars/RedHat-6.yml new file mode 100644 index 0000000..6edee17 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/RedHat-6.yml @@ -0,0 +1,5 @@ +rpm_repo_packages: + - rpm-build + - python-rpmfluff + - createrepo_c + - createrepo diff --git a/test/integration/targets/setup_rpm_repo/vars/RedHat-7.yml b/test/integration/targets/setup_rpm_repo/vars/RedHat-7.yml new file mode 100644 index 0000000..6edee17 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/RedHat-7.yml @@ -0,0 +1,5 @@ +rpm_repo_packages: + - rpm-build + - python-rpmfluff + - createrepo_c + - createrepo diff --git a/test/integration/targets/setup_rpm_repo/vars/RedHat-8.yml b/test/integration/targets/setup_rpm_repo/vars/RedHat-8.yml new file mode 100644 index 0000000..6e14933 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/RedHat-8.yml @@ -0,0 +1,5 @@ +rpm_repo_packages: + - rpm-build + - createrepo_c + - createrepo + - python3-rpmfluff diff --git a/test/integration/targets/setup_rpm_repo/vars/RedHat-9.yml b/test/integration/targets/setup_rpm_repo/vars/RedHat-9.yml new file mode 100644 index 0000000..84849e2 --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/RedHat-9.yml @@ -0,0 +1,4 @@ +rpm_repo_packages: + - rpm-build + - createrepo_c + - createrepo diff --git a/test/integration/targets/setup_rpm_repo/vars/main.yml b/test/integration/targets/setup_rpm_repo/vars/main.yml new file mode 100644 index 0000000..8e924fc --- /dev/null +++ b/test/integration/targets/setup_rpm_repo/vars/main.yml @@ -0,0 +1 @@ +rpm_repo_python_major_version: "{{ ansible_facts.python_version.split('.')[0] }}" |