[stable-2.10] Make yum_repository test more reliable (#73467)

* Improve setup_rpm_repo

- add handlers to remove repos
- add variable to control whethere or not repos are created

* Use local repo for all distros
* Change repo creation script to module.
(cherry picked from commit 997b2d2a19)

Co-authored-by: Sam Doran <sdoran@redhat.com>
This commit is contained in:
Sam Doran 2021-02-03 20:34:12 -05:00 committed by Matt Clay
parent 985a395cd9
commit 457dcf1313
13 changed files with 138 additions and 74 deletions

View file

@ -0,0 +1 @@
install_repos: yes

View file

@ -0,0 +1,5 @@
- name: remove repos
yum_repository:
state: absent
name: "{{ item }}"
loop: "{{ repos }}"

View file

@ -0,0 +1,94 @@
#!/usr/bin/python
from __future__ import (absolute_import, division, print_function)
__metaclass__ = type
import os
import sys
import tempfile
from collections import namedtuple
from ansible.module_utils.basic import AnsibleModule
try:
from rpmfluff import SimpleRpmBuild
from rpmfluff import YumRepoBuild
except ImportError:
from rpmfluff.rpmbuild import SimpleRpmBuild
from rpmfluff.yumrepobuild import YumRepoBuild
try:
from rpmfluff import can_use_rpm_weak_deps
except ImportError:
try:
from rpmfluff.utils import can_use_rpm_weak_deps
except ImportError:
can_use_rpm_weak_deps = None
RPM = namedtuple('RPM', ['name', 'version', 'release', 'epoch', 'recommends'])
SPECS = [
RPM('dinginessentail', '1.0', '1', None, None),
RPM('dinginessentail', '1.0', '2', '1', None),
RPM('dinginessentail', '1.1', '1', '1', None),
RPM('dinginessentail-olive', '1.0', '1', None, None),
RPM('dinginessentail-olive', '1.1', '1', None, None),
RPM('landsidescalping', '1.0', '1', None, None),
RPM('landsidescalping', '1.1', '1', None, None),
RPM('dinginessentail-with-weak-dep', '1.0', '1', None, ['dinginessentail-weak-dep']),
RPM('dinginessentail-weak-dep', '1.0', '1', None, None),
]
def create_repo(arch='x86_64'):
pkgs = []
for spec in SPECS:
pkg = SimpleRpmBuild(spec.name, spec.version, spec.release, [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)
repo = YumRepoBuild(pkgs)
repo.make(arch)
for pkg in pkgs:
pkg.clean()
return repo.repoDir
def main():
module = AnsibleModule(
argument_spec={
'arch': {'required': True},
'tempdir': {'type': 'path'},
}
)
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()

View file

@ -0,0 +1,2 @@
dependencies:
- setup_remote_tmp_dir

View file

@ -31,18 +31,22 @@
- ansible_facts.distribution in ['RedHat', 'CentOS'] - ansible_facts.distribution in ['RedHat', 'CentOS']
- ansible_facts.distribution_major_version is version('8', '>=') - ansible_facts.distribution_major_version is version('8', '>=')
- name: Copy script for creating a repo - set_fact:
copy: repos:
src: create-repo.py - "fake-{{ ansible_architecture }}"
dest: /tmp/create-repo.py - "fake-i686"
mode: 0755 - "fake-ppc64"
changed_when: yes
notify: remove repos
- name: Create RPMs and put them into a repo - name: Create RPMs and put them into a repo
shell: "{{ansible_python_interpreter}} /tmp/create-repo.py {{ ansible_architecture }}" create_repo:
arch: "{{ ansible_architecture }}"
tempdir: "{{ remote_tmp_dir }}"
register: repo register: repo
- set_fact: - set_fact:
repodir: "{{ repo.stdout_lines[-1] }}" repodir: "{{ repo.repo_dir }}"
- name: Install the repo - name: Install the repo
yum_repository: yum_repository:
@ -50,6 +54,7 @@
description: "fake-{{ ansible_architecture }}" description: "fake-{{ ansible_architecture }}"
baseurl: "file://{{ repodir }}" baseurl: "file://{{ repodir }}"
gpgcheck: no gpgcheck: no
when: install_repos | bool
- name: Copy comps.xml file - name: Copy comps.xml file
copy: copy:
@ -61,11 +66,13 @@
command: createrepo -g {{ repodir_comps.dest | quote }} {{ repodir | quote }} command: createrepo -g {{ repodir_comps.dest | quote }} {{ repodir | quote }}
- name: Create RPMs and put them into a repo (i686) - name: Create RPMs and put them into a repo (i686)
shell: "{{ansible_python_interpreter}} /tmp/create-repo.py i686" create_repo:
arch: i686
tempdir: "{{ remote_tmp_dir }}"
register: repo_i686 register: repo_i686
- set_fact: - set_fact:
repodir_i686: "{{ repo_i686.stdout_lines[-1] }}" repodir_i686: "{{ repo_i686.repo_dir }}"
- name: Install the repo (i686) - name: Install the repo (i686)
yum_repository: yum_repository:
@ -73,13 +80,16 @@
description: "fake-i686" description: "fake-i686"
baseurl: "file://{{ repodir_i686 }}" baseurl: "file://{{ repodir_i686 }}"
gpgcheck: no gpgcheck: no
when: install_repos | bool
- name: Create RPMs and put them into a repo (ppc64) - name: Create RPMs and put them into a repo (ppc64)
shell: "{{ansible_python_interpreter}} /tmp/create-repo.py ppc64" create_repo:
arch: ppc64
tempdir: "{{ remote_tmp_dir }}"
register: repo_ppc64 register: repo_ppc64
- set_fact: - set_fact:
repodir_ppc64: "{{ repo_ppc64.stdout_lines[-1] }}" repodir_ppc64: "{{ repo_ppc64.repo_dir }}"
- name: Install the repo (ppc64) - name: Install the repo (ppc64)
yum_repository: yum_repository:
@ -87,11 +97,6 @@
description: "fake-ppc64" description: "fake-ppc64"
baseurl: "file://{{ repodir_ppc64 }}" baseurl: "file://{{ repodir_ppc64 }}"
gpgcheck: no gpgcheck: no
when: install_repos | bool
- set_fact:
repos:
- "fake-{{ ansible_architecture }}"
- "fake-i686"
- "fake-ppc64"
when: ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux', 'Fedora'] when: ansible_distribution in ['RedHat', 'CentOS', 'ScientificLinux', 'Fedora']

View file

@ -0,0 +1,5 @@
yum_repository_test_package: dinginessentail
yum_repository_test_repo:
name: fakerepo
description: Fake Repo
baseurl: "file://{{ repodir }}"

View file

@ -0,0 +1,4 @@
- name: remove listtest repo
yum_repository:
name: listtest
state: absent

View file

@ -0,0 +1,4 @@
dependencies:
- role: setup_rpm_repo
vars:
install_repos: no

View file

@ -1,17 +1,6 @@
- name: Run tests - name: Run tests
when: ansible_facts.distribution in ['CentOS', 'Fedora'] when: ansible_facts.distribution in ['CentOS', 'Fedora']
block: block:
- name: Include distribution specific variables
include_vars: "{{ lookup('first_found', params) }}"
vars:
params:
files:
- "{{ ansible_facts.distribution }}-{{ ansible_facts.distribution_major_version }}.yml"
- "{{ ansible_facts.distribution }}.yml"
- default.yml
paths:
- vars
- name: ensure {{ yum_repository_test_package }} is uninstalled to begin with - name: ensure {{ yum_repository_test_package }} is uninstalled to begin with
action: "{{ ansible_facts.pkg_mgr }}" action: "{{ ansible_facts.pkg_mgr }}"
args: args:
@ -181,6 +170,7 @@
includepkgs: includepkgs:
- ccc - ccc
- ddd - ddd
notify: remove listtest repo
- name: Assert that lists were properly inserted - name: Assert that lists were properly inserted
assert: assert:
@ -195,24 +185,3 @@
repofile: "{{ lookup('file', '/etc/yum.repos.d/listtest.repo') }}" repofile: "{{ lookup('file', '/etc/yum.repos.d/listtest.repo') }}"
url_hostname: "{{ yum_repository_test_repo.baseurl | urlsplit('hostname') }}" url_hostname: "{{ yum_repository_test_repo.baseurl | urlsplit('hostname') }}"
url_hostname2: "{{ url_hostname | replace('download[0-9]?\\.', 'download2\\.', 1) }}" url_hostname2: "{{ url_hostname | replace('download[0-9]?\\.', 'download2\\.', 1) }}"
- name: CLEANUP | Remove list test repo
yum_repository:
name: listtest
state: absent
- name: CLEANUP | Remove {{ yum_repository_test_repo.name }}
yum_repository:
name: "{{ yum_repository_test_repo.name }}"
state: absent
- name: CLEANUP | Enable EPEL
yum_repository:
name: epel
state: present
description: "{{ yum_repository_epel.description | default(omit) }}"
metalink: "{{ yum_repository_epel.metalink | default(omit) }}"
mirrorlist: "{{ yum_repository_epel.mirrorlist | default(omit) }}"
gpgkey: "{{ yum_repository_epel.gpgkey }}"
gpgcheck: yes
when: ansible_facts.distribution == 'CentOS'

View file

@ -1,10 +0,0 @@
yum_repository_test_package: sshpass
yum_repository_test_repo:
name: epel
description: EPEL yum repo
baseurl: https://download.fedoraproject.org/pub/epel/$releasever/Everything/$basearch
yum_repository_epel:
description: Extra Packages for Enterprise Linux $releasever - $basearch
metalink: https://mirrors.fedoraproject.org/metalink?repo=epel-$releasever&arch=$basearch&infra=$infra&content=$contentdir
gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-{{ ansible_facts.distribution_major_version }}

View file

@ -1,10 +0,0 @@
yum_repository_test_package: sl
yum_repository_test_repo:
name: epel
description: EPEL yum repo
baseurl: https://archives.fedoraproject.org/pub/archive/epel/{{ ansible_facts.distribution_major_version }}/$basearch
yum_repository_epel:
description: Extra Packages for Enterprise Linux {{ ansible_facts.distribution_major_version }} - $basearch
mirrorlist: https://mirrors.fedoraproject.org/metalink?repo=epel-{{ ansible_facts.distribution_major_version }}&arch=$basearch
gpgkey: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-{{ ansible_facts.distribution_major_version }}

View file

@ -1,5 +0,0 @@
yum_repository_test_package: libbdplus
yum_repository_test_repo:
name: rpmfusion-free
description: RPM Fusion for Fedora {{ ansible_distribution_major_version }} - Free
baseurl: http://download1.rpmfusion.org/free/fedora/releases/{{ ansible_distribution_major_version }}/Everything/{{ ansible_architecture }}/os/