diff options
Diffstat (limited to 'test/integration/targets/setup_rpm_repo/library/create_repo.py')
-rw-r--r-- | test/integration/targets/setup_rpm_repo/library/create_repo.py | 125 |
1 files changed, 125 insertions, 0 deletions
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() |