commit 37a2a790feca0b61838f62217c1e503f364d2dbb Author: CentOS Sources Date: Tue Oct 5 10:24:32 2021 -0400 import modulemd-tools-0.7-6.el8 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ab2cba4 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +SOURCES/modulemd-tools-0.7.tar.gz diff --git a/.modulemd-tools.metadata b/.modulemd-tools.metadata new file mode 100644 index 0000000..a9dfef5 --- /dev/null +++ b/.modulemd-tools.metadata @@ -0,0 +1 @@ +20c992eeb765a8651210d9151248bd09b97ac127 SOURCES/modulemd-tools-0.7.tar.gz diff --git a/SOURCES/modulemd-tools-0.7-1-to-modulemd-tools-0.7-6.patch b/SOURCES/modulemd-tools-0.7-1-to-modulemd-tools-0.7-6.patch new file mode 100644 index 0000000..7573528 --- /dev/null +++ b/SOURCES/modulemd-tools-0.7-1-to-modulemd-tools-0.7-6.patch @@ -0,0 +1,9216 @@ +diff --git a/.gitignore b/.gitignore +index dc28167..e457b03 100644 +--- a/.gitignore ++++ b/.gitignore +@@ -1,8 +1,6 @@ + /.tox/ +-/dir2module/*.egg-info/ +-/dir2module/build/ +-/dir2module/dist/ +-/repo2module/*.egg-info/ +-/repo2module/build/ +-/repo2module/dist/ ++/*/*.egg-info/ ++/*/build/ ++/*/dist/ + __pycache__/ ++.vscode/ +diff --git a/.tito/packages/modulemd-tools b/.tito/packages/modulemd-tools +index ab403cf..9f9c5a0 100644 +--- a/.tito/packages/modulemd-tools ++++ b/.tito/packages/modulemd-tools +@@ -1 +1 @@ +-0.7-1 ./ ++0.7-6 ./ +diff --git a/.tito/releasers.conf b/.tito/releasers.conf +index 6ccadd0..62fd4b9 100644 +--- a/.tito/releasers.conf ++++ b/.tito/releasers.conf +@@ -1,7 +1,7 @@ + [fedora] + releaser = tito.release.FedoraGitReleaser +-branches = master f32 f33 epel8 ++branches = rawhide f33 f34 f35 + + [copr] + releaser = tito.release.CoprReleaser +-project_name = frostyx/modulemd-tools +\ No newline at end of file ++project_name = frostyx/modulemd-tools +diff --git a/.tito/tito.props b/.tito/tito.props +index eab3f19..74b55a4 100644 +--- a/.tito/tito.props ++++ b/.tito/tito.props +@@ -1,5 +1,5 @@ + [buildconfig] +-builder = tito.builder.Builder +-tagger = tito.tagger.VersionTagger ++builder = tito.builder.UpstreamBuilder ++tagger = tito.tagger.ReleaseTagger + changelog_do_not_remove_cherrypick = 0 + changelog_format = %s (%ae) +diff --git a/.travis.yml b/.travis.yml +index ea4a3c1..62c815b 100644 +--- a/.travis.yml ++++ b/.travis.yml +@@ -16,5 +16,13 @@ jobs: + script: ./travis-stage.sh docker_pull && ./travis-stage.sh test + - env: TOXENV=py39 MODULEMD_TOOL=dir2module SITEPACKAGES=true + script: ./travis-stage.sh docker_pull && ./travis-stage.sh test ++ - env: TOXENV=py39 MODULEMD_TOOL=createrepo_mod SITEPACKAGES=true ++ script: ./travis-stage.sh docker_pull && ./travis-stage.sh test ++ - env: TOXENV=py39 MODULEMD_TOOL=modulemd-merge SITEPACKAGES=true ++ script: ./travis-stage.sh docker_pull && ./travis-stage.sh test ++ - env: TOXENV=py39 MODULEMD_TOOL=modulemd_tools SITEPACKAGES=true ++ script: ./travis-stage.sh docker_pull && ./travis-stage.sh test ++ - env: TOXENV=py39 MODULEMD_TOOL=bld2repo SITEPACKAGES=true ++ script: ./travis-stage.sh docker_pull && ./travis-stage.sh test + - env: TOXENV=flake8 + script: ./travis-stage.sh docker_pull && ./travis-stage.sh test +diff --git a/README.md b/README.md +index a947860..e7eeb6a 100644 +--- a/README.md ++++ b/README.md +@@ -39,7 +39,6 @@ For more information about `modulemd-merge`, please see + + + ### modulemd-generate-macros +- + Generate `module-build-macros` SRPM package, which is a central piece + for building modules. It should be present in the buildroot before any + other module packages are submitted to be built. +@@ -57,6 +56,50 @@ other tools yet, be cautious.** + [modulemd_tools/README.md](modulemd_tools/README.md) + + ++### bld2repo ++Simple tool for dowloading build required RPMs of a modular build from koji. ++ ++For more information about `bld2repo`, please see ++[bld2repo/README.md](bld2repo/README.md) ++ ++ ++## Installation instructions ++ ++The `modulemd-tools` package is available in the official Fedora ++repositories, and RHEL 8.5 and higher. As such, it can be easily ++installed with: ++ ++``` ++dnf install modulemd-tools ++``` ++ ++There is also a Copr repository providing up-to-date stable builds for ++EPEL8. It is recommended to use this repository for installing ++`modulemd-tools` on RHEL 8.4 and lower. ++ ++``` ++dnf copr enable frostyx/modulemd-tools-epel ++dnf install modulemd-tools ++``` ++ ++If you prefer to install the latest stable package from this ++repository, use ++ ++``` ++git clone https://github.com/rpm-software-management/modulemd-tools.git ++cd modulemd-tools ++sudo dnf builddep modulemd-tools.spec ++tito build --rpm --install ++``` ++ ++Alternatively, if you want to build and install a package from the ++latest commit, use ++ ++``` ++tito build --rpm --test --install ++``` ++ ++ + ## Use cases + + ### Creating a module repository from a regular repository +diff --git a/bld2repo/README.md b/bld2repo/README.md +new file mode 100644 +index 0000000..7b5f9b5 +--- /dev/null ++++ b/bld2repo/README.md +@@ -0,0 +1,25 @@ ++# bld2repo ++ ++Simple tool which will download modular build dependencies from a ++modular build in a koji instance and create a RPM repository out of it. ++ ++## usage ++ ++Provide a build id of modular build in koji and the cli tool will ++download all the rpms tagged in a build tag of a modular rpm build. ++ ++``` ++$ bld2repo --build-id 1234 ++``` ++ ++After the download is finished the tool will call createrepo_c on the ++working directory, creating a rpm repository. ++ ++The defaults are set to the current fedora koji instance. ++If you are using a different koji instance please adjust those ++values through script arguments. For more information about script ++arguments please run: ++ ++``` ++$ bld2repo -h ++``` +\ No newline at end of file +diff --git a/bld2repo/bld2repo/__init__.py b/bld2repo/bld2repo/__init__.py +new file mode 100644 +index 0000000..2a6c071 +--- /dev/null ++++ b/bld2repo/bld2repo/__init__.py +@@ -0,0 +1,142 @@ ++import os ++import sys ++import urllib.request ++import subprocess ++ ++import koji ++ ++ ++def get_buildrequire_pkgs_from_build(build_id, session, config): ++ """ ++ Function which queries koji for pkgs whom belong to a given build tag ++ of a koji build and paires rpms with their respective package. ++ ++ :param str build_id: build id of a build in koji. ++ :param koji.ClientSession session: koji connection session object ++ :return: list of pairings of package and rpms. ++ :rtype: list ++ """ ++ print("Retriewing build metadata from: ", config.koji_host) ++ build = session.getBuild(build_id) ++ if not build: ++ raise Exception("Build with id '{id}' has not been found.".format(id=build_id)) ++ ++ print("Build with the ID", build_id, "found.") ++ tags = session.listTags(build["build_id"]) ++ ++ build_tag = [t["name"] for t in tags if t["name"].endswith("-build")] ++ if not build_tag: ++ raise Exception("Build with id '{id}' is not tagged in a 'build' tag.".format(id=build_id)) ++ ++ tag_data = session.listTaggedRPMS(build_tag[0], latest=True, inherit=True) ++ ++ print("Found the build tag '", build_tag[0], "' associated with the build.") ++ tagged_rpms = tag_data[0] ++ tagged_pkgs = tag_data[1] ++ pkgs = [] ++ archs = [config.arch, "noarch"] ++ print("Gathering packages and rpms tagged in '", build_tag[0],"'.") ++ for pkg in tagged_pkgs: ++ pkg_md = { ++ "package": pkg, ++ "rpms": [], ++ } ++ ++ for rpm in tagged_rpms: ++ if pkg["build_id"] == rpm["build_id"] and rpm["arch"] in archs: ++ pkg_md["rpms"].append(rpm) ++ tagged_rpms.remove(rpm) ++ ++ if pkg_md["rpms"]: ++ pkgs.append(pkg_md) ++ print("Gathering done.") ++ return pkgs ++ ++ ++def add_rpm_urls(pkgs, config): ++ """ ++ For each rpm from a package creates an download url and adds it to the package. ++ ++ :param list pkgs: list of packages ++ :return pkgs: list of packages and their rpms ++ :rtype: list ++ :return rpm_num: number of rpms ++ :rtype: int ++ """ ++ rpm_num = 0 ++ for pkg in pkgs: ++ build_path = koji.pathinfo.build(pkg["package"]).replace(koji.pathinfo.topdir, "") ++ pkg["rpm_urls"] = [] ++ for rpm in pkg["rpms"]: ++ rpm_num += 1 ++ rpm_filename = "-".join([rpm["name"], rpm["version"], ++ rpm["release"]]) + "." + rpm["arch"] + ".rpm" ++ rpm_url = config.koji_storage_host + build_path + "/" + rpm["arch"] + "/" + rpm_filename ++ pkg["rpm_urls"].append(rpm_url) ++ ++ ++ return pkgs, rpm_num ++ ++ ++def download_file(url, target_pkg_dir, filename): ++ """ ++ Wrapper function for downloading a file ++ ++ :param str url: url to a file ++ :param str target_pkg_dir: the dir where the file should be downloaded ++ :param str filename: the name of the downloaded file ++ """ ++ abs_file_path = "/".join([target_pkg_dir, filename]) ++ try: ++ urllib.request.urlretrieve(url, abs_file_path) ++ except Exception as ex: ++ raise Exception("HTTP error for url: {url}\nError message: {msg}\nHTTP code: {code}".format( ++ url=ex.url, msg=ex.msg, code=ex.code)) ++ ++ ++def rpm_bulk_download(pkgs, rpm_num, working_dir): ++ """ ++ Downloads all the rpms from which belong to a package. ++ ++ :param list pkgs: list of pkgs with their rpms and urls to those rpms ++ :param int rpm_num: number of all the rpms included in pkgs ++ :param str working_dir: the dir where the rpms will be downloaded ++ """ ++ print("Starting bulk download of rpms...") ++ rpm_dwnlded = 0 ++ ++ for pkg in pkgs: ++ for url in pkg["rpm_urls"]: ++ # we print the status of the download ++ status = "[{done}/{total}]".format(done=rpm_dwnlded, total=rpm_num) ++ print(status, end="\r", flush=True) ++ # we store the rpm in a similar location as it is on the storage server ++ url_parts = url.split("/") ++ filename = url_parts[-1] ++ arch = url_parts[-2] ++ pkg_name = "-".join([url_parts[-5], url_parts[-4], url_parts[-3]]) ++ target_pkg_dir = "/".join([working_dir, pkg_name, arch]) ++ # we create the package dir if it is not created ++ if not os.path.exists(target_pkg_dir): ++ os.makedirs(target_pkg_dir) ++ else: ++ # if we downloaded the file already we skip ++ file_path = target_pkg_dir + "/" + filename ++ if os.path.exists(file_path): ++ rpm_dwnlded += 1 ++ continue ++ download_file(url, target_pkg_dir, filename) ++ rpm_dwnlded += 1 ++ ++ # update the status last time to mark all of the rpms downloaded ++ status = "[{done}/{total}]".format(done=rpm_dwnlded, total=rpm_num) ++ print(status) ++ print("Download successful.") ++ ++ ++def create_repo(working_dir): ++ print("Calling createrepo_c...") ++ args = ["createrepo_c", working_dir] ++ subprocess.Popen(args, cwd=working_dir).communicate() ++ print("Repo created.") ++ +diff --git a/bld2repo/bld2repo/cli.py b/bld2repo/bld2repo/cli.py +new file mode 100644 +index 0000000..bdf7197 +--- /dev/null ++++ b/bld2repo/bld2repo/cli.py +@@ -0,0 +1,58 @@ ++import argparse ++import os ++ ++from bld2repo import (get_buildrequire_pkgs_from_build, add_rpm_urls, rpm_bulk_download, ++ create_repo) ++from bld2repo.config import Config ++from bld2repo.utils import get_koji_session ++ ++ ++def get_arg_parser(): ++ description = ( ++ "When provided with a build id it will download all buildrequired RPMs" ++ "of a modular koji build into the provided directory and create a repository out of it." ++ ) ++ parser = argparse.ArgumentParser("bld2repo", description=description, ++ formatter_class=argparse.ArgumentDefaultsHelpFormatter) ++ parser.add_argument("-b", "--build-id", required=True, type=int, help="ID of a koji build.") ++ parser.add_argument("-d", "--result-dir", help="Directory where the RPMs are downloaded.", ++ default=".", type=str) ++ parser.add_argument("-a", "--arch", help=("For which architecture the RPMs should be download" ++ "ed. The 'noarch' is included automatically."), ++ default="x86_64", type=str) ++ parser.add_argument("-k", "--koji-host", type=str, ++ default="https://koji.fedoraproject.org/kojihub", ++ help="Koji host base url") ++ parser.add_argument("-s", "--koji-storage-host", type=str, ++ default="https://kojipkgs.fedoraproject.org", ++ help=("Koji storage storage host base url. Server where the RPMs are " ++ "stored. Required to be used together with `--koji-host`.")) ++ return parser ++ ++ ++def main(): ++ parser = get_arg_parser() ++ args = parser.parse_args() ++ ++ koji_host_dflt = parser.get_default("koji_host") ++ ++ if args.koji_host != koji_host_dflt: ++ koji_storage_dflt = parser.get_default("koji_storage_host") ++ if args.koji_storage_host == koji_storage_dflt: ++ parser.error("--koji-host and --koji-storage-host need to be used to together.") ++ ++ config = Config(args.koji_host, args.koji_storage_host, args.arch, args.result_dir) ++ session = get_koji_session(config) ++ ++ pkgs = get_buildrequire_pkgs_from_build(args.build_id, session, config) ++ ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ ++ rpm_bulk_download(pkgs, rpm_num, config.result_dir) ++ ++ create_repo(config.result_dir) ++ ++ ++if __name__ == "__main__": ++ main() ++ +diff --git a/bld2repo/bld2repo/config.py b/bld2repo/bld2repo/config.py +new file mode 100644 +index 0000000..6e53742 +--- /dev/null ++++ b/bld2repo/bld2repo/config.py +@@ -0,0 +1,8 @@ ++class Config(): ++ ++ def __init__(self, koji_host, koji_storage_host, arch, result_dir): ++ self.koji_host = koji_host ++ self.koji_storage_host = koji_storage_host ++ self.arch = arch ++ self.result_dir = result_dir ++ +diff --git a/bld2repo/bld2repo/utils.py b/bld2repo/bld2repo/utils.py +new file mode 100644 +index 0000000..9d3a2e1 +--- /dev/null ++++ b/bld2repo/bld2repo/utils.py +@@ -0,0 +1,9 @@ ++import koji ++ ++ ++def get_koji_session(config): ++ ++ session = koji.ClientSession(config.koji_host) ++ ++ return session ++ +diff --git a/bld2repo/requirements.txt b/bld2repo/requirements.txt +new file mode 100644 +index 0000000..5dd5f84 +--- /dev/null ++++ b/bld2repo/requirements.txt +@@ -0,0 +1 @@ ++koji +\ No newline at end of file +diff --git a/bld2repo/setup.py b/bld2repo/setup.py +new file mode 100644 +index 0000000..5c6a6be +--- /dev/null ++++ b/bld2repo/setup.py +@@ -0,0 +1,40 @@ ++#!/usr/bin/python3 ++# -*- coding: utf-8 -*- ++ ++import os.path ++ ++from setuptools import setup, find_packages ++ ++dirname = os.path.dirname(os.path.realpath(__file__)) ++ ++with open(os.path.join(dirname, "README.md"), "r") as fh: ++ long_description = fh.read() ++ ++with open(os.path.join(dirname, 'requirements.txt'), "r") as f: ++ requires = f.read().splitlines() ++ ++setup( ++ name='bld2repo', ++ version='0.1', ++ packages=find_packages(exclude=("tests",)), ++ url='https://github.com/rpm-software-management/modulemd-tools', ++ license='MIT', ++ author='Martin Čurlej', ++ author_email='mcurlej@redhat.com', ++ description=('Tool to download modular build dependencies of ' ++ 'a modular build from koji.'), ++ long_description=long_description, ++ long_description_content_type='text/markdown', ++ install_requires=requires, ++ entry_points={ ++ 'console_scripts': [ ++ 'bld2repo=bld2repo.cli:main'], ++ }, ++ classifiers=[ ++ "Programming Language :: Python :: 3", ++ "License :: OSI Approved :: MIT License", ++ "Operating System :: POSIX :: Linux", ++ ], ++ include_package_data=True, ++) ++ +diff --git a/bld2repo/test-requirements.txt b/bld2repo/test-requirements.txt +new file mode 100644 +index 0000000..55b033e +--- /dev/null ++++ b/bld2repo/test-requirements.txt +@@ -0,0 +1 @@ ++pytest +\ No newline at end of file +diff --git a/bld2repo/tests/__init__.py b/bld2repo/tests/__init__.py +new file mode 100644 +index 0000000..e69de29 +diff --git a/bld2repo/tests/test_bld2repo.py b/bld2repo/tests/test_bld2repo.py +new file mode 100644 +index 0000000..9255014 +--- /dev/null ++++ b/bld2repo/tests/test_bld2repo.py +@@ -0,0 +1,276 @@ ++import os ++from unittest import mock ++import tempfile ++ ++import pytest ++ ++from bld2repo import (get_buildrequire_pkgs_from_build, add_rpm_urls, rpm_bulk_download, ++ create_repo) ++from bld2repo.config import Config ++from tests.utils import load_test_data ++ ++ ++def test_get_buildrequire_pkgs_from_build_default(): ++ """ Test for gathering x86_64 build dependencies.""" ++ ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ ++ assert type(pkgs) == list ++ assert len(pkgs) == 50 ++ for pkg in pkgs: ++ for rpm in pkg["rpms"]: ++ assert rpm["arch"] in ["x86_64", "noarch"] ++ ++ ++def test_get_buildrequire_pkgs_from_build_aarch64(): ++ """ Test for gathering aarch64 build dependencies.""" ++ ++ config = Config("koji_fake_url", "koji_fake_storage", "aarch64", ".") ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ ++ assert type(pkgs) == list ++ assert len(pkgs) == 50 ++ for pkg in pkgs: ++ for rpm in pkg["rpms"]: ++ assert rpm["arch"] in ["aarch64", "noarch"] ++ ++ ++ ++def test_add_rpm_urls(): ++ """ Test for adding rpm urls to the pkgs dict for each package """ ++ ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ ++ expected_rpm_num = 0 ++ for pkg in pkgs: ++ assert len(pkg["rpms"]) == len(pkg["rpm_urls"]) ++ expected_rpm_num += len(pkg["rpms"]) ++ for rpm in pkg["rpms"]: ++ rpm_filename = ("-".join([rpm["name"], rpm["version"], rpm["release"]]) + ++ "." + rpm["arch"]) ++ pkg_md = pkg["package"] ++ expected_url = (config.koji_storage_host + "/vol/" + pkg_md["volume_name"] + ++ "/packages/" + pkg_md["package_name"] + "/" + pkg_md["version"] + "/" + ++ pkg_md["release"] + "/" + rpm["arch"] + "/" + rpm_filename + ".rpm") ++ assert expected_url in pkg["rpm_urls"] ++ ++ assert expected_rpm_num == rpm_num ++ ++ ++@mock.patch("bld2repo.download_file") ++def test_rpm_bulk_download(mock_download_file): ++ """ Test if the rpm files are downloaded. """ ++ ++ tmp_dir = tempfile.TemporaryDirectory() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ ++ def download_file(url, target_pkg_dir, filename): ++ """ Mock function which fakes rpm downloads """ ++ abs_file_path = "/".join([target_pkg_dir, filename]) ++ open(abs_file_path, "w").close() ++ ++ mock_download_file.side_effect = download_file ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ ++ # we gather all the files created on disk ++ created_rpm_files = [] ++ for _, _, f in os.walk(tmp_dir.name): ++ created_rpm_files += f ++ ++ # test if the number of created files is the same as provided by the metadata ++ assert len(created_rpm_files) == rpm_num ++ ++ # test if the filenames are the same as described in the metadata ++ for pkg in pkgs: ++ for rpm_url in pkg["rpm_urls"]: ++ rpm = rpm_url.split("/")[-1] ++ assert rpm in created_rpm_files ++ ++ ++ ++@mock.patch("bld2repo.download_file") ++def test_rpm_bulk_download_pkg_exist(mock_download_file): ++ """ Test if we create each pkg dir only once. """ ++ ++ tmp_dir = tempfile.TemporaryDirectory() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ ++ def download_file(url, target_pkg_dir, filename): ++ """ Mock function which fakes rpm downloads """ ++ abs_file_path = "/".join([target_pkg_dir, filename]) ++ open(abs_file_path, "w").close() ++ ++ mock_download_file.side_effect = download_file ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ ++ with mock.patch("bld2repo.os.makedirs") as mock_makedirs: ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ ++ assert not mock_makedirs.call_count ++ ++ ++@mock.patch("bld2repo.download_file") ++def test_rpm_bulk_download_rpm_file_exists(mock_download_file): ++ """ Test if we download each rpm file only once. If the file exists we skip it. """ ++ ++ tmp_dir = tempfile.TemporaryDirectory() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ ++ def download_file(url, target_pkg_dir, filename): ++ """ Mock function which fakes rpm downloads """ ++ abs_file_path = "/".join([target_pkg_dir, filename]) ++ open(abs_file_path, "w").close() ++ ++ mock_download_file.side_effect = download_file ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ ++ # the call_count should be the same as the number of rpms in the metadata. ++ # we called the rpm_bulk_download function twice, but the second time the download ++ # part should be skipped for the same dir. ++ assert mock_download_file.call_count == rpm_num ++ ++ ++@mock.patch("bld2repo.download_file") ++def test_create_repo(mock_download_file): ++ """ Test to create a rpm repository of out a dir. """ ++ tmp_dir = tempfile.TemporaryDirectory() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ build_tag_md = load_test_data("pki_core_build_tag") ++ ++ mock_session = mock.Mock() ++ ++ mock_session.getBuild.return_value = build ++ mock_session.listTags.return_value = tags ++ mock_session.listTaggedRPMS.return_value = build_tag_md ++ ++ ++ def download_file(url, target_pkg_dir, filename): ++ """ Mock function which fakes rpm downloads """ ++ abs_file_path = "/".join([target_pkg_dir, filename]) ++ open(abs_file_path, "w").close() ++ ++ mock_download_file.side_effect = download_file ++ ++ pkgs = get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ pkgs, rpm_num = add_rpm_urls(pkgs, config) ++ rpm_bulk_download(pkgs, rpm_num, tmp_dir.name) ++ create_repo(tmp_dir.name) ++ assert os.path.exists(tmp_dir.name + "/repodata" ) ++ ++ ++def test_no_build_found_exception(): ++ """ Test raise when no build found """ ++ mock_session = mock.Mock() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ mock_session.getBuild.return_value = {} ++ ++ with pytest.raises(Exception) as ex: ++ get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ ++ err_msg = ex.value.args[0] ++ assert "1234" in err_msg ++ assert "not been found" in err_msg ++ ++ ++def test_not_module_exception(): ++ """ Test raise when the build does not contain a build tag and is not a module. """ ++ mock_session = mock.Mock() ++ config = Config("koji_fake_url", "koji_fake_storage", "x86_64", ".") ++ ++ build = load_test_data("pki_core_build") ++ tags = load_test_data("pki_core_tags") ++ ++ mock_session.getBuild.return_value = build ++ # we remove the build tag from the tags list ++ tags.pop(1) ++ mock_session.listTags.return_value = tags ++ ++ with pytest.raises(Exception) as ex: ++ get_buildrequire_pkgs_from_build("1234", mock_session, config) ++ ++ err_msg = ex.value.args[0] ++ assert "1234" in err_msg ++ assert "not tagged" in err_msg ++ assert "'build' tag" in err_msg ++ +diff --git a/bld2repo/tests/test_data/pki_core_build.json b/bld2repo/tests/test_data/pki_core_build.json +new file mode 100644 +index 0000000..1b0aa1e +--- /dev/null ++++ b/bld2repo/tests/test_data/pki_core_build.json +@@ -0,0 +1,33 @@ ++{ ++ "build_id": 1557161, ++ "cg_id": null, ++ "completion_time": "2021-03-30 23:30:32.156112", ++ "completion_ts": 1617147032.15611, ++ "creation_event_id": 38240589, ++ "creation_time": "2021-03-30 23:15:00.109509", ++ "creation_ts": 1617146100.10951, ++ "epoch": null, ++ "extra": { ++ "source": { ++ "original_url": "git://pkgs.devel.redhat.com/rpms/pki-core?#026f2b900ad160e096ceec13f43d7bbce45a11ad" ++ } ++ }, ++ "id": 1557161, ++ "name": "pki-core", ++ "nvr": "pki-core-10.8.3-6.module+el8.2.0+10554+cf83aa72", ++ "owner_id": 4066, ++ "owner_name": "mbs", ++ "package_id": 31009, ++ "package_name": "pki-core", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "source": "git://pkgs.devel.redhat.com/rpms/pki-core#026f2b900ad160e096ceec13f43d7bbce45a11ad", ++ "start_time": "2021-03-30 23:15:00.102532", ++ "start_ts": 1617146100.10253, ++ "state": 1, ++ "task_id": 35853377, ++ "version": "10.8.3", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "cg_name": null ++} ++ +diff --git a/bld2repo/tests/test_data/pki_core_build_tag.json b/bld2repo/tests/test_data/pki_core_build_tag.json +new file mode 100644 +index 0000000..9f71b4e +--- /dev/null ++++ b/bld2repo/tests/test_data/pki_core_build_tag.json +@@ -0,0 +1,6647 @@ ++[ ++ [ ++ { ++ "arch": "src", ++ "build_id": 1557147, ++ "buildroot_id": 7226532, ++ "buildtime": 1617143722, ++ "epoch": null, ++ "extra": null, ++ "id": 9520081, ++ "metadata_only": false, ++ "name": "module-build-macros", ++ "payloadhash": "5386efe368f424c16cb2142b1ac4d8ec", ++ "release": "1.module+el8.2.0+10554+cf83aa72", ++ "size": 9095, ++ "version": "0.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557147, ++ "buildroot_id": 7226532, ++ "buildtime": 1617143723, ++ "epoch": null, ++ "extra": null, ++ "id": 9520082, ++ "metadata_only": false, ++ "name": "module-build-macros", ++ "payloadhash": "b33936c7e1636e0ff7ddc455ea8463f8", ++ "release": "1.module+el8.2.0+10554+cf83aa72", ++ "size": 15695, ++ "version": "0.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1557155, ++ "buildroot_id": 7226562, ++ "buildtime": 1617144387, ++ "epoch": null, ++ "extra": null, ++ "id": 9520101, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "5ddd4bb035472c3a797a2f16bf50d922", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 902749, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557155, ++ "buildroot_id": 7226562, ++ "buildtime": 1617144583, ++ "epoch": null, ++ "extra": null, ++ "id": 9520102, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "21df9049c1a406990a33f473b9e36cc7", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 1111887, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557155, ++ "buildroot_id": 7226562, ++ "buildtime": 1617144583, ++ "epoch": null, ++ "extra": null, ++ "id": 9520103, ++ "metadata_only": false, ++ "name": "jss-javadoc", ++ "payloadhash": "f3b9f8853e34402e05f12f7fa5e9cb6e", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 883271, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557155, ++ "buildroot_id": 7226562, ++ "buildtime": 1617144583, ++ "epoch": null, ++ "extra": null, ++ "id": 9520104, ++ "metadata_only": false, ++ "name": "jss-debugsource", ++ "payloadhash": "86714a8e4b9a304a9a45c2a1fc70f602", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 130171, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557155, ++ "buildroot_id": 7226562, ++ "buildtime": 1617144583, ++ "epoch": null, ++ "extra": null, ++ "id": 9520105, ++ "metadata_only": false, ++ "name": "jss-debuginfo", ++ "payloadhash": "6abefd43420061695119e9c1f4785285", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 244875, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557155, ++ "buildroot_id": 7226564, ++ "buildtime": 1617144536, ++ "epoch": null, ++ "extra": null, ++ "id": 9520106, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "6246f16398c4edd43fb8526565c28c6a", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 1310315, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557155, ++ "buildroot_id": 7226564, ++ "buildtime": 1617144536, ++ "epoch": null, ++ "extra": null, ++ "id": 9520107, ++ "metadata_only": false, ++ "name": "jss-javadoc", ++ "payloadhash": "2cbd49ffc66a4ae5a4341cd13e1cb87e", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 883359, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557155, ++ "buildroot_id": 7226564, ++ "buildtime": 1617144536, ++ "epoch": null, ++ "extra": null, ++ "id": 9520108, ++ "metadata_only": false, ++ "name": "jss-debugsource", ++ "payloadhash": "e75d2ffd1bedbdcc3022b058ad2f5fc1", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 130191, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557155, ++ "buildroot_id": 7226564, ++ "buildtime": 1617144536, ++ "epoch": null, ++ "extra": null, ++ "id": 9520109, ++ "metadata_only": false, ++ "name": "jss-debuginfo", ++ "payloadhash": "dc9f53777d00419f58c20d6163bc929b", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 198527, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557155, ++ "buildroot_id": 7226561, ++ "buildtime": 1617144738, ++ "epoch": null, ++ "extra": null, ++ "id": 9520110, ++ "metadata_only": false, ++ "name": "jss-debuginfo", ++ "payloadhash": "3bd9cc4657802c82069691adf5d6595c", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 246931, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557155, ++ "buildroot_id": 7226561, ++ "buildtime": 1617144738, ++ "epoch": null, ++ "extra": null, ++ "id": 9520111, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "40279a6010121f9cf5ce771f0e1b7739", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 1120635, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557155, ++ "buildroot_id": 7226561, ++ "buildtime": 1617144738, ++ "epoch": null, ++ "extra": null, ++ "id": 9520112, ++ "metadata_only": false, ++ "name": "jss-debugsource", ++ "payloadhash": "c66e3119de30bb26aa38077d2174ba0c", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 130187, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557155, ++ "buildroot_id": 7226561, ++ "buildtime": 1617144738, ++ "epoch": null, ++ "extra": null, ++ "id": 9520113, ++ "metadata_only": false, ++ "name": "jss-javadoc", ++ "payloadhash": "6a4f387cf416ec1bee360940e907d3eb", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 883299, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557155, ++ "buildroot_id": 7226563, ++ "buildtime": 1617144917, ++ "epoch": null, ++ "extra": null, ++ "id": 9520114, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "203f83aadea0c3fb9204f53dc6ee2b10", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 1110355, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557155, ++ "buildroot_id": 7226563, ++ "buildtime": 1617144917, ++ "epoch": null, ++ "extra": null, ++ "id": 9520115, ++ "metadata_only": false, ++ "name": "jss-javadoc", ++ "payloadhash": "fad27d0913b3a3e4da6e09d1852f638a", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 883779, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557155, ++ "buildroot_id": 7226563, ++ "buildtime": 1617144917, ++ "epoch": null, ++ "extra": null, ++ "id": 9520116, ++ "metadata_only": false, ++ "name": "jss-debugsource", ++ "payloadhash": "8519332071e1848015e74376b05b81c2", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 130171, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557155, ++ "buildroot_id": 7226563, ++ "buildtime": 1617144917, ++ "epoch": null, ++ "extra": null, ++ "id": 9520117, ++ "metadata_only": false, ++ "name": "jss-debuginfo", ++ "payloadhash": "64d2feb693135b0ad0572d19e765daf2", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 238115, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557155, ++ "buildroot_id": 7226565, ++ "buildtime": 1617144496, ++ "epoch": null, ++ "extra": null, ++ "id": 9520118, ++ "metadata_only": false, ++ "name": "jss", ++ "payloadhash": "d9dc94b4ae3ccd59b281ea53ff1ed81f", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 1115767, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557155, ++ "buildroot_id": 7226565, ++ "buildtime": 1617144496, ++ "epoch": null, ++ "extra": null, ++ "id": 9520119, ++ "metadata_only": false, ++ "name": "jss-javadoc", ++ "payloadhash": "7b7081ca8e7e0b384d71ad8b6af3ca5c", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 883267, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557155, ++ "buildroot_id": 7226565, ++ "buildtime": 1617144496, ++ "epoch": null, ++ "extra": null, ++ "id": 9520120, ++ "metadata_only": false, ++ "name": "jss-debugsource", ++ "payloadhash": "4fabf8fad06aa6d6cf7a4cd1a85ee8b4", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 130187, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557155, ++ "buildroot_id": 7226565, ++ "buildtime": 1617144496, ++ "epoch": null, ++ "extra": null, ++ "id": 9520121, ++ "metadata_only": false, ++ "name": "jss-debuginfo", ++ "payloadhash": "3706129d68c1450431944459c5102954", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "size": 241983, ++ "version": "4.6.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1166093, ++ "buildroot_id": 5854560, ++ "buildtime": 1586891116, ++ "epoch": null, ++ "extra": null, ++ "id": 7968610, ++ "metadata_only": false, ++ "name": "ldapjdk-javadoc", ++ "payloadhash": "e9ee4b8d3729845fe2af81f857b0ab3b", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "size": 50011, ++ "version": "4.21.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1166093, ++ "buildroot_id": 5854560, ++ "buildtime": 1586891116, ++ "epoch": null, ++ "extra": null, ++ "id": 7968608, ++ "metadata_only": false, ++ "name": "ldapjdk", ++ "payloadhash": "09639e0b6768d6afae48aceaf3dec167", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "size": 329383, ++ "version": "4.21.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1166093, ++ "buildroot_id": 5854560, ++ "buildtime": 1586891089, ++ "epoch": null, ++ "extra": null, ++ "id": 7968604, ++ "metadata_only": false, ++ "name": "ldapjdk", ++ "payloadhash": "41b57c082cbe2127e599c355e6d921a0", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "size": 2968532, ++ "version": "4.21.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1166092, ++ "buildroot_id": 5854561, ++ "buildtime": 1586891113, ++ "epoch": null, ++ "extra": null, ++ "id": 7968606, ++ "metadata_only": false, ++ "name": "tomcatjss", ++ "payloadhash": "42fac238ac917e90f227d9df8e116104", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "size": 44619, ++ "version": "7.4.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1166092, ++ "buildroot_id": 5854561, ++ "buildtime": 1586891089, ++ "epoch": null, ++ "extra": null, ++ "id": 7968603, ++ "metadata_only": false, ++ "name": "tomcatjss", ++ "payloadhash": "200c66e596e8e075466c068814f7fe95", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "size": 50428, ++ "version": "7.4.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146163, ++ "epoch": null, ++ "extra": null, ++ "id": 9520138, ++ "metadata_only": false, ++ "name": "pki-core", ++ "payloadhash": "056894c66286bb5df91a34c3b3211b42", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 7358838, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520139, ++ "metadata_only": false, ++ "name": "pki-symkey", ++ "payloadhash": "df6f7cfac55825244b742711d5ff821c", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 50259, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520140, ++ "metadata_only": false, ++ "name": "pki-base", ++ "payloadhash": "d374c978a701d1dbd86df50fc36ff766", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 296567, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520141, ++ "metadata_only": false, ++ "name": "python3-pki", ++ "payloadhash": "568bd0b566fd91604f8d68174c8ce772", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 162515, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520142, ++ "metadata_only": false, ++ "name": "pki-base-java", ++ "payloadhash": "d25a202dacb35eacbb85b24422998a81", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 719671, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520143, ++ "metadata_only": false, ++ "name": "pki-tools", ++ "payloadhash": "2d50fff207a49dcdecb82ec1336a52dd", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 721095, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520144, ++ "metadata_only": false, ++ "name": "pki-server", ++ "payloadhash": "0667da5b31adb35c9c11f66a2e9f5861", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 3128847, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520145, ++ "metadata_only": false, ++ "name": "pki-ca", ++ "payloadhash": "7a69786b9f40b1603d23b01eac350d4b", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 568935, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520146, ++ "metadata_only": false, ++ "name": "pki-kra", ++ "payloadhash": "18ba119caf4b402bb32b3d2e09aa49c3", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 199923, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520147, ++ "metadata_only": false, ++ "name": "pki-core-debugsource", ++ "payloadhash": "747c2604f77944b09dbe0e4efe67c147", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 369975, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520148, ++ "metadata_only": false, ++ "name": "pki-core-debuginfo", ++ "payloadhash": "94e493330d06df137d8783ec5d3399f6", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 50775, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520149, ++ "metadata_only": false, ++ "name": "pki-symkey-debuginfo", ++ "payloadhash": "f0ffbaf996a022f0381c2976a3572d55", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 130455, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1557161, ++ "buildroot_id": 7226589, ++ "buildtime": 1617146420, ++ "epoch": null, ++ "extra": null, ++ "id": 9520150, ++ "metadata_only": false, ++ "name": "pki-tools-debuginfo", ++ "payloadhash": "3bd96f423bb22a6b7bd542b697582641", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 340223, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520151, ++ "metadata_only": false, ++ "name": "pki-symkey", ++ "payloadhash": "127573a0327fecfa7aa874159b8a6888", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 56731, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520152, ++ "metadata_only": false, ++ "name": "pki-tools", ++ "payloadhash": "134310e107d937464fe860525844d5e8", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 730143, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520153, ++ "metadata_only": false, ++ "name": "pki-core-debugsource", ++ "payloadhash": "6e9df82d147e7341f33b51ba8a475d4e", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 369839, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520154, ++ "metadata_only": false, ++ "name": "pki-core-debuginfo", ++ "payloadhash": "c453f18850fa782c0b96cd23cd0f6b3c", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 51195, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520155, ++ "metadata_only": false, ++ "name": "pki-symkey-debuginfo", ++ "payloadhash": "a0432de5c6d7c6c1edc75ef41c76c54f", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 120439, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1557161, ++ "buildroot_id": 7226590, ++ "buildtime": 1617146323, ++ "epoch": null, ++ "extra": null, ++ "id": 9520156, ++ "metadata_only": false, ++ "name": "pki-tools-debuginfo", ++ "payloadhash": "7980a783980e44d6ad6eff89f83b48c5", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 288851, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520157, ++ "metadata_only": false, ++ "name": "pki-core-debuginfo", ++ "payloadhash": "d2e5ab71ee3ebece22d0e0b8a89909c5", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 50891, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520158, ++ "metadata_only": false, ++ "name": "pki-tools", ++ "payloadhash": "e7fbd1f167b96c13db9a587f22ef270b", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 729307, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520159, ++ "metadata_only": false, ++ "name": "pki-symkey", ++ "payloadhash": "d8621364f2b5b8a0322244f736ef77d6", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 55467, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520160, ++ "metadata_only": false, ++ "name": "pki-tools-debuginfo", ++ "payloadhash": "74d3f563beb3a5ad487ac78f6692013d", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 336207, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520161, ++ "metadata_only": false, ++ "name": "pki-symkey-debuginfo", ++ "payloadhash": "90664838b020243e992ef2f59dc81a1c", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 132579, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1557161, ++ "buildroot_id": 7226593, ++ "buildtime": 1617146989, ++ "epoch": null, ++ "extra": null, ++ "id": 9520162, ++ "metadata_only": false, ++ "name": "pki-core-debugsource", ++ "payloadhash": "e7ba64a58ccd74ff3e01bba22fac449e", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 369991, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520163, ++ "metadata_only": false, ++ "name": "pki-symkey", ++ "payloadhash": "3c250fe1b110ab722280a6dfe26e1d6f", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 49887, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520164, ++ "metadata_only": false, ++ "name": "pki-tools", ++ "payloadhash": "b11cbf59eea679e4561f1df50e198451", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 715175, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520165, ++ "metadata_only": false, ++ "name": "pki-core-debugsource", ++ "payloadhash": "5f13330512e8c94edac04981f4af37cc", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 369851, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520166, ++ "metadata_only": false, ++ "name": "pki-core-debuginfo", ++ "payloadhash": "e7b00a4eb0a8401a75cd5870d174a293", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 50923, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520167, ++ "metadata_only": false, ++ "name": "pki-symkey-debuginfo", ++ "payloadhash": "c98a2155b37b49356690119b5e1bbd82", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 128055, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1557161, ++ "buildroot_id": 7226592, ++ "buildtime": 1617146745, ++ "epoch": null, ++ "extra": null, ++ "id": 9520168, ++ "metadata_only": false, ++ "name": "pki-tools-debuginfo", ++ "payloadhash": "7d9a9c18fb60295e3f0314dee0ce450c", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 323555, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520169, ++ "metadata_only": false, ++ "name": "pki-symkey", ++ "payloadhash": "e4a3ffb739ab0ef25e48857593f7b2d9", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 53727, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520170, ++ "metadata_only": false, ++ "name": "pki-tools", ++ "payloadhash": "280e699ed4ac01b8c0b58c4de94336da", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 724995, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520171, ++ "metadata_only": false, ++ "name": "pki-core-debugsource", ++ "payloadhash": "e7e22f5e78358404db49ac6cfff2f105", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 369895, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520172, ++ "metadata_only": false, ++ "name": "pki-core-debuginfo", ++ "payloadhash": "5f6c99b7d21696d15dbea05e98c72d2e", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 51339, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520173, ++ "metadata_only": false, ++ "name": "pki-symkey-debuginfo", ++ "payloadhash": "4263e732a2f7b7081672faacdada98b4", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 133491, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1557161, ++ "buildroot_id": 7226591, ++ "buildtime": 1617146303, ++ "epoch": null, ++ "extra": null, ++ "id": 9520174, ++ "metadata_only": false, ++ "name": "pki-tools-debuginfo", ++ "payloadhash": "4a5896467f152a76cf510945e316a293", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "size": 333647, ++ "version": "10.8.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959046, ++ "buildroot_id": 5142752, ++ "buildtime": 1567154385, ++ "epoch": null, ++ "extra": null, ++ "id": 7305843, ++ "metadata_only": false, ++ "name": "slapi-nis-debugsource", ++ "payloadhash": "f90093708da4100deedc0ca79da65c91", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 133736, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959046, ++ "buildroot_id": 5142752, ++ "buildtime": 1567154385, ++ "epoch": null, ++ "extra": null, ++ "id": 7305842, ++ "metadata_only": false, ++ "name": "slapi-nis-debuginfo", ++ "payloadhash": "53b8b29332bda6b6fac755dc6abc909e", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 302496, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959046, ++ "buildroot_id": 5142752, ++ "buildtime": 1567154385, ++ "epoch": null, ++ "extra": null, ++ "id": 7305841, ++ "metadata_only": false, ++ "name": "slapi-nis", ++ "payloadhash": "34aa9b0b8d85caeac3c03795482fd7fe", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 169488, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959046, ++ "buildroot_id": 5142749, ++ "buildtime": 1567153770, ++ "epoch": null, ++ "extra": null, ++ "id": 7305840, ++ "metadata_only": false, ++ "name": "slapi-nis-debugsource", ++ "payloadhash": "2af51e16f744166094fa7d2d4d8cdc51", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 133752, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959046, ++ "buildroot_id": 5142749, ++ "buildtime": 1567153770, ++ "epoch": null, ++ "extra": null, ++ "id": 7305839, ++ "metadata_only": false, ++ "name": "slapi-nis", ++ "payloadhash": "63cfeeadb8c3763d0d75ba2c32bedc9d", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 152636, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959046, ++ "buildroot_id": 5142749, ++ "buildtime": 1567153770, ++ "epoch": null, ++ "extra": null, ++ "id": 7305838, ++ "metadata_only": false, ++ "name": "slapi-nis-debuginfo", ++ "payloadhash": "01d5582f04af40727d412b1b8738779e", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 281388, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959046, ++ "buildroot_id": 5142757, ++ "buildtime": 1567153793, ++ "epoch": null, ++ "extra": null, ++ "id": 7305837, ++ "metadata_only": false, ++ "name": "slapi-nis", ++ "payloadhash": "6d7940d55ef75f0ea0f1c03d0fc3cd62", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 159844, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959046, ++ "buildroot_id": 5142757, ++ "buildtime": 1567153793, ++ "epoch": null, ++ "extra": null, ++ "id": 7305836, ++ "metadata_only": false, ++ "name": "slapi-nis-debuginfo", ++ "payloadhash": "0507c68adb336fb4400383111bc3f184", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 290348, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959046, ++ "buildroot_id": 5142757, ++ "buildtime": 1567153793, ++ "epoch": null, ++ "extra": null, ++ "id": 7305835, ++ "metadata_only": false, ++ "name": "slapi-nis-debugsource", ++ "payloadhash": "92f56dd06b90c9ff21fc8e56b0401705", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 133768, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959046, ++ "buildroot_id": 5142761, ++ "buildtime": 1567153904, ++ "epoch": null, ++ "extra": null, ++ "id": 7305834, ++ "metadata_only": false, ++ "name": "slapi-nis-debuginfo", ++ "payloadhash": "5b7bbba2ee38d5c730fa0f29e5e8f19e", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 298284, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959046, ++ "buildroot_id": 5142761, ++ "buildtime": 1567153904, ++ "epoch": null, ++ "extra": null, ++ "id": 7305833, ++ "metadata_only": false, ++ "name": "slapi-nis", ++ "payloadhash": "7468af2ec15374fcd9d277173b9d1bae", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 155404, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959046, ++ "buildroot_id": 5142761, ++ "buildtime": 1567153904, ++ "epoch": null, ++ "extra": null, ++ "id": 7305832, ++ "metadata_only": false, ++ "name": "slapi-nis-debugsource", ++ "payloadhash": "ef43adb46bfa6e7f92a5243768ed3874", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 133720, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959046, ++ "buildroot_id": 5142761, ++ "buildtime": 1567153851, ++ "epoch": null, ++ "extra": null, ++ "id": 7305831, ++ "metadata_only": false, ++ "name": "slapi-nis", ++ "payloadhash": "bc20464aa5c058a86a5e9ef5998df07d", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "size": 647332, ++ "version": "0.56.3" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1022957, ++ "buildroot_id": 5374897, ++ "buildtime": 1574930685, ++ "epoch": null, ++ "extra": null, ++ "id": 7568333, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debuginfo", ++ "payloadhash": "fd6fe5cff8301f0a98bbb754de648110", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 249704, ++ "version": "11.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1022957, ++ "buildroot_id": 5374897, ++ "buildtime": 1574930685, ++ "epoch": null, ++ "extra": null, ++ "id": 7568332, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debugsource", ++ "payloadhash": "71c6010d9891c2ccc652a1c34b23c5d5", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 115964, ++ "version": "11.2" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1022957, ++ "buildroot_id": 5374897, ++ "buildtime": 1574930685, ++ "epoch": null, ++ "extra": null, ++ "id": 7568331, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "a1882d33f317d591e23c9181cd7c77d8", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 137312, ++ "version": "11.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1022957, ++ "buildroot_id": 5374888, ++ "buildtime": 1574930563, ++ "epoch": null, ++ "extra": null, ++ "id": 7568330, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "c767f27528e5e44152e862b40e3a6aea", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 142204, ++ "version": "11.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1022957, ++ "buildroot_id": 5374888, ++ "buildtime": 1574930563, ++ "epoch": null, ++ "extra": null, ++ "id": 7568329, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debuginfo", ++ "payloadhash": "0f6465da56c0792ea92007372fdd57fc", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 206524, ++ "version": "11.2" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1022957, ++ "buildroot_id": 5374888, ++ "buildtime": 1574930563, ++ "epoch": null, ++ "extra": null, ++ "id": 7568328, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debugsource", ++ "payloadhash": "91e8302402a95150d30b2ad2ac465bf7", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 116004, ++ "version": "11.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1022957, ++ "buildroot_id": 5374885, ++ "buildtime": 1574930522, ++ "epoch": null, ++ "extra": null, ++ "id": 7568327, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debugsource", ++ "payloadhash": "fc4468428bc66d73a44d468cca176a6e", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 115960, ++ "version": "11.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1022957, ++ "buildroot_id": 5374885, ++ "buildtime": 1574930522, ++ "epoch": null, ++ "extra": null, ++ "id": 7568326, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "f255964ac27cf19100f55b245ea37624", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 124464, ++ "version": "11.2" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1022957, ++ "buildroot_id": 5374885, ++ "buildtime": 1574930522, ++ "epoch": null, ++ "extra": null, ++ "id": 7568325, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debuginfo", ++ "payloadhash": "a6530da31160e009e41c3ba335212d86", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 247200, ++ "version": "11.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1022957, ++ "buildroot_id": 5374887, ++ "buildtime": 1574930544, ++ "epoch": null, ++ "extra": null, ++ "id": 7568324, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "acd1720fbc2fa05e19474fc78deb30c2", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 132000, ++ "version": "11.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1022957, ++ "buildroot_id": 5374887, ++ "buildtime": 1574930544, ++ "epoch": null, ++ "extra": null, ++ "id": 7568323, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debuginfo", ++ "payloadhash": "b443bff4b09e5edfc885774cbca3066c", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 249744, ++ "version": "11.2" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1022957, ++ "buildroot_id": 5374887, ++ "buildtime": 1574930544, ++ "epoch": null, ++ "extra": null, ++ "id": 7568322, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debugsource", ++ "payloadhash": "fc8a425c7793b78cd1034859a9b67de8", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 115972, ++ "version": "11.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1022957, ++ "buildroot_id": 5374884, ++ "buildtime": 1574930653, ++ "epoch": null, ++ "extra": null, ++ "id": 7568321, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "e04196439a7cc492d981a8862be0a894", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 126340, ++ "version": "11.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1022957, ++ "buildroot_id": 5374884, ++ "buildtime": 1574930653, ++ "epoch": null, ++ "extra": null, ++ "id": 7568320, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debugsource", ++ "payloadhash": "0170014497a75a7ab4ffbbe83bc59108", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 115948, ++ "version": "11.2" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1022957, ++ "buildroot_id": 5374884, ++ "buildtime": 1574930653, ++ "epoch": null, ++ "extra": null, ++ "id": 7568319, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap-debuginfo", ++ "payloadhash": "b39894204d96979bdcd8d83a8e52a180", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 249296, ++ "version": "11.2" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1022957, ++ "buildroot_id": 5374884, ++ "buildtime": 1574930583, ++ "epoch": null, ++ "extra": null, ++ "id": 7568318, ++ "metadata_only": false, ++ "name": "bind-dyndb-ldap", ++ "payloadhash": "d75641df0acdf646f168aff3e9766632", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "size": 375380, ++ "version": "11.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959041, ++ "buildroot_id": 5142729, ++ "buildtime": 1567153609, ++ "epoch": null, ++ "extra": null, ++ "id": 7305712, ++ "metadata_only": false, ++ "name": "python3-qrcode-core", ++ "payloadhash": "92fa61bb05a69197fc9999b1ce35ec18", ++ "release": "12.module+el8.1.0+4107+4a66eb87", ++ "size": 45720, ++ "version": "5.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959041, ++ "buildroot_id": 5142729, ++ "buildtime": 1567153609, ++ "epoch": null, ++ "extra": null, ++ "id": 7305711, ++ "metadata_only": false, ++ "name": "python3-qrcode", ++ "payloadhash": "b9703404d49f109eed30d2b17c4aadaf", ++ "release": "12.module+el8.1.0+4107+4a66eb87", ++ "size": 16852, ++ "version": "5.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959041, ++ "buildroot_id": 5142729, ++ "buildtime": 1567153604, ++ "epoch": null, ++ "extra": null, ++ "id": 7305710, ++ "metadata_only": false, ++ "name": "python-qrcode", ++ "payloadhash": "ab5d369595b9410d6c5bf6a4e164119a", ++ "release": "12.module+el8.1.0+4107+4a66eb87", ++ "size": 34334, ++ "version": "5.1" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1093586, ++ "buildroot_id": 5628520, ++ "buildtime": 1581969008, ++ "epoch": null, ++ "extra": null, ++ "id": 7787870, ++ "metadata_only": false, ++ "name": "softhsm-debuginfo", ++ "payloadhash": "7eb77c8d379075bc2fc28911f14128df", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 3325296, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1093586, ++ "buildroot_id": 5628520, ++ "buildtime": 1581969008, ++ "epoch": null, ++ "extra": null, ++ "id": 7787869, ++ "metadata_only": false, ++ "name": "softhsm-debugsource", ++ "payloadhash": "5469a5e312d9bc0973c43bccfe27ac9c", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 198928, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1093586, ++ "buildroot_id": 5628520, ++ "buildtime": 1581969008, ++ "epoch": null, ++ "extra": null, ++ "id": 7787868, ++ "metadata_only": false, ++ "name": "softhsm-devel", ++ "payloadhash": "b4cedc2be7c6302f99723ffbeaaec397", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 20196, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1093586, ++ "buildroot_id": 5628520, ++ "buildtime": 1581969008, ++ "epoch": null, ++ "extra": null, ++ "id": 7787867, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "2761cb844f9bde323472b5edfa2aa336", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 405032, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1093586, ++ "buildroot_id": 5628536, ++ "buildtime": 1581968754, ++ "epoch": null, ++ "extra": null, ++ "id": 7787866, ++ "metadata_only": false, ++ "name": "softhsm-devel", ++ "payloadhash": "fceec29eaf1600f611df16cabbb15cee", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 20248, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1093586, ++ "buildroot_id": 5628536, ++ "buildtime": 1581968754, ++ "epoch": null, ++ "extra": null, ++ "id": 7787865, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "dc82dfbb54003c2b15470c728d802015", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 431392, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1093586, ++ "buildroot_id": 5628536, ++ "buildtime": 1581968754, ++ "epoch": null, ++ "extra": null, ++ "id": 7787864, ++ "metadata_only": false, ++ "name": "softhsm-debugsource", ++ "payloadhash": "0ea441edc957bda88246b9ada22223ea", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 198956, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1093586, ++ "buildroot_id": 5628536, ++ "buildtime": 1581968754, ++ "epoch": null, ++ "extra": null, ++ "id": 7787863, ++ "metadata_only": false, ++ "name": "softhsm-debuginfo", ++ "payloadhash": "f53348b69a34302d095cb606358d7f8f", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 3209084, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1093586, ++ "buildroot_id": 5628513, ++ "buildtime": 1581968643, ++ "epoch": null, ++ "extra": null, ++ "id": 7787862, ++ "metadata_only": false, ++ "name": "softhsm-debuginfo", ++ "payloadhash": "cfe22351236e92e7c36184b92745bcd7", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 3272644, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1093586, ++ "buildroot_id": 5628513, ++ "buildtime": 1581968643, ++ "epoch": null, ++ "extra": null, ++ "id": 7787861, ++ "metadata_only": false, ++ "name": "softhsm-devel", ++ "payloadhash": "a7a828be5a388bf64d2b018fb6bc6b84", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 20200, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1093586, ++ "buildroot_id": 5628513, ++ "buildtime": 1581968643, ++ "epoch": null, ++ "extra": null, ++ "id": 7787860, ++ "metadata_only": false, ++ "name": "softhsm-debugsource", ++ "payloadhash": "6b2884105b125d033d13105a56ef9d4a", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 198932, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1093586, ++ "buildroot_id": 5628513, ++ "buildtime": 1581968643, ++ "epoch": null, ++ "extra": null, ++ "id": 7787859, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "1e118758f556fc86f4035c2d8032a640", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 364956, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1093586, ++ "buildroot_id": 5628529, ++ "buildtime": 1581968701, ++ "epoch": null, ++ "extra": null, ++ "id": 7787858, ++ "metadata_only": false, ++ "name": "softhsm-devel", ++ "payloadhash": "d24b5174ea695d912079cb79a8919d3b", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 20208, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1093586, ++ "buildroot_id": 5628529, ++ "buildtime": 1581968701, ++ "epoch": null, ++ "extra": null, ++ "id": 7787857, ++ "metadata_only": false, ++ "name": "softhsm-debugsource", ++ "payloadhash": "ff87f36d0e990470c5d9118ac717f465", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 198932, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1093586, ++ "buildroot_id": 5628529, ++ "buildtime": 1581968701, ++ "epoch": null, ++ "extra": null, ++ "id": 7787856, ++ "metadata_only": false, ++ "name": "softhsm-debuginfo", ++ "payloadhash": "b1978838c43926f7a971cf83aeeab5d4", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 3364692, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1093586, ++ "buildroot_id": 5628529, ++ "buildtime": 1581968701, ++ "epoch": null, ++ "extra": null, ++ "id": 7787855, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "9085518ff71de3b7a67f135935338fdf", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 413364, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1093586, ++ "buildroot_id": 5628516, ++ "buildtime": 1581968817, ++ "epoch": null, ++ "extra": null, ++ "id": 7787854, ++ "metadata_only": false, ++ "name": "softhsm-devel", ++ "payloadhash": "b1e2cd70d4bfb40c2653efaff9c27259", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 20180, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1093586, ++ "buildroot_id": 5628516, ++ "buildtime": 1581968817, ++ "epoch": null, ++ "extra": null, ++ "id": 7787853, ++ "metadata_only": false, ++ "name": "softhsm-debuginfo", ++ "payloadhash": "ae9490c754a24edc183bedaf97ba2e57", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 3297608, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1093586, ++ "buildroot_id": 5628516, ++ "buildtime": 1581968817, ++ "epoch": null, ++ "extra": null, ++ "id": 7787852, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "b4c0a9ec255ca5b140b7e60b59fb0097", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 374620, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1093586, ++ "buildroot_id": 5628516, ++ "buildtime": 1581968817, ++ "epoch": null, ++ "extra": null, ++ "id": 7787851, ++ "metadata_only": false, ++ "name": "softhsm-debugsource", ++ "payloadhash": "33f220a9dbae3b6cb5ec9b7822188599", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 198916, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1093586, ++ "buildroot_id": 5628516, ++ "buildtime": 1581968677, ++ "epoch": null, ++ "extra": null, ++ "id": 7787850, ++ "metadata_only": false, ++ "name": "softhsm", ++ "payloadhash": "2d0425a55df2783036c91a0525ba468d", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "size": 1091743, ++ "version": "2.4.0" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865697, ++ "metadata_only": false, ++ "name": "ipa-server-debuginfo", ++ "payloadhash": "ffa0a51d2d6b756de03b11d366a72299", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 755296, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865696, ++ "metadata_only": false, ++ "name": "ipa-client-debuginfo", ++ "payloadhash": "0189b0c5e014128c0025046b1f9baf84", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 346480, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865695, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad", ++ "payloadhash": "503faf5bb51d6c2d227c03685e80b2e4", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 282836, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865694, ++ "metadata_only": false, ++ "name": "ipa-client-samba", ++ "payloadhash": "e0ee70e426f4287e9dfef0e7404ae493", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 172340, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865693, ++ "metadata_only": false, ++ "name": "ipa-debugsource", ++ "payloadhash": "401ab56f514b4ea72744f0224935d4dc", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 469800, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865692, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad-debuginfo", ++ "payloadhash": "b03bd63371af22712bb2d05e2143c337", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 390796, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865691, ++ "metadata_only": false, ++ "name": "ipa-client", ++ "payloadhash": "a527f474c30d180de856d80433818956", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 282516, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865690, ++ "metadata_only": false, ++ "name": "ipa-server", ++ "payloadhash": "928b0bbb2f8cace3496c0ab44073bb6d", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 543532, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 1139326, ++ "buildroot_id": 5756014, ++ "buildtime": 1584549559, ++ "epoch": null, ++ "extra": null, ++ "id": 7865689, ++ "metadata_only": false, ++ "name": "ipa-debuginfo", ++ "payloadhash": "568095cc6cb98b7fddd16139751f4cfb", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 188276, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1139326, ++ "buildroot_id": 5756020, ++ "buildtime": 1584549335, ++ "epoch": null, ++ "extra": null, ++ "id": 7865688, ++ "metadata_only": false, ++ "name": "ipa-client", ++ "payloadhash": "483d6c579511344ba43d81bb3fa142cb", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 277012, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1139326, ++ "buildroot_id": 5756020, ++ "buildtime": 1584549335, ++ "epoch": null, ++ "extra": null, ++ "id": 7865687, ++ "metadata_only": false, ++ "name": "ipa-client-debuginfo", ++ "payloadhash": "2ac7e7730583a7f1b1620c212da27d84", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 336900, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1139326, ++ "buildroot_id": 5756020, ++ "buildtime": 1584549335, ++ "epoch": null, ++ "extra": null, ++ "id": 7865686, ++ "metadata_only": false, ++ "name": "ipa-client-samba", ++ "payloadhash": "af2cb4b435a93c4933ad3ba744666d20", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 172388, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 1139326, ++ "buildroot_id": 5756020, ++ "buildtime": 1584549335, ++ "epoch": null, ++ "extra": null, ++ "id": 7865685, ++ "metadata_only": false, ++ "name": "ipa-debugsource", ++ "payloadhash": "813ef6772e79f527bc2566a1145dae80", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 256432, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865684, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad-debuginfo", ++ "payloadhash": "b5f4dd139cf792962dde2143dfde5458", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 381044, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865683, ++ "metadata_only": false, ++ "name": "ipa-debugsource", ++ "payloadhash": "7d0a241e815544da844d4b47c91776c6", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 469756, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865682, ++ "metadata_only": false, ++ "name": "ipa-server-debuginfo", ++ "payloadhash": "e899f4a208281ad821d37ae92532e81d", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 733524, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865681, ++ "metadata_only": false, ++ "name": "ipa-client", ++ "payloadhash": "6a2585ac0ab1c55faeebdbf1cf3c0d2d", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 269832, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865680, ++ "metadata_only": false, ++ "name": "ipa-server", ++ "payloadhash": "7b0df1f267286ed8f4128b38f330ca98", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 501712, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865679, ++ "metadata_only": false, ++ "name": "ipa-client-debuginfo", ++ "payloadhash": "2df7e3aa65ed623a2898e50645a4ad34", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 339832, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865678, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad", ++ "payloadhash": "7eb4f5790b1894e8d6b5496d7abbfe63", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 267288, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865677, ++ "metadata_only": false, ++ "name": "ipa-debuginfo", ++ "payloadhash": "b9bcdb1617a79578eb3abee3f42134d3", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 188248, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 1139326, ++ "buildroot_id": 5756012, ++ "buildtime": 1584549272, ++ "epoch": null, ++ "extra": null, ++ "id": 7865676, ++ "metadata_only": false, ++ "name": "ipa-client-samba", ++ "payloadhash": "4445685b226efc848e9296342475d522", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 172344, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865675, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad-debuginfo", ++ "payloadhash": "0bfa9eb57a4037a05d9ee05fbe9002d9", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 387380, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865674, ++ "metadata_only": false, ++ "name": "ipa-server-debuginfo", ++ "payloadhash": "6105a90ea6071dfc0945a35bcb59335a", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 750100, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865673, ++ "metadata_only": false, ++ "name": "ipa-client", ++ "payloadhash": "ebe5e3a21b2f7b6d6bcb2d15433ca0a4", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 273568, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865672, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad", ++ "payloadhash": "0c487a8eac01f79152e126b580310ab6", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 272392, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865671, ++ "metadata_only": false, ++ "name": "ipa-debugsource", ++ "payloadhash": "ef699165ba4a4d3faa26cf806855c365", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 469792, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865670, ++ "metadata_only": false, ++ "name": "ipa-debuginfo", ++ "payloadhash": "abdc2a1115c51be89dde150f5f374214", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 188312, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865669, ++ "metadata_only": false, ++ "name": "ipa-client-debuginfo", ++ "payloadhash": "e53dea82314fe6705300476bd8c2a415", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 343004, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865668, ++ "metadata_only": false, ++ "name": "ipa-server", ++ "payloadhash": "a09d47b83601f4673133d9e0422ef7f5", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 522808, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 1139326, ++ "buildroot_id": 5756019, ++ "buildtime": 1584549386, ++ "epoch": null, ++ "extra": null, ++ "id": 7865667, ++ "metadata_only": false, ++ "name": "ipa-client-samba", ++ "payloadhash": "af059e6571bb089540878e4baec1c5c1", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 172352, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865666, ++ "metadata_only": false, ++ "name": "ipa-common", ++ "payloadhash": "94e5ae60c287885f06c9ec389a85ebde", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 782752, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865665, ++ "metadata_only": false, ++ "name": "ipa-server-dns", ++ "payloadhash": "b6ad4b703aca9e6f2ed266395cd38989", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 186424, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865664, ++ "metadata_only": false, ++ "name": "ipa-server-common", ++ "payloadhash": "1a99072a08cfbd6ed4209befbc125296", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 609540, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865663, ++ "metadata_only": false, ++ "name": "ipa-debugsource", ++ "payloadhash": "3b4f3b209f0b710c16900984328ad490", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 469780, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865662, ++ "metadata_only": false, ++ "name": "ipa-client", ++ "payloadhash": "0ad619451775b0f60dc32cff0b754101", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 269380, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865661, ++ "metadata_only": false, ++ "name": "ipa-debuginfo", ++ "payloadhash": "c363e23c0ddb4be57073d5f42d2c2f10", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 188260, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865660, ++ "metadata_only": false, ++ "name": "python3-ipaserver", ++ "payloadhash": "678236bd9416147fb577f0422962ce4c", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 1577588, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865659, ++ "metadata_only": false, ++ "name": "python3-ipaclient", ++ "payloadhash": "b8e4efc498ff4863ccd6805d04153341", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 675988, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865658, ++ "metadata_only": false, ++ "name": "ipa-server", ++ "payloadhash": "f2c91d5db28001a228674f54c972b444", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 509864, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865657, ++ "metadata_only": false, ++ "name": "ipa-client-debuginfo", ++ "payloadhash": "808a47ed4c745312416317558f124c89", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 342140, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865656, ++ "metadata_only": false, ++ "name": "ipa-python-compat", ++ "payloadhash": "71180dc9c37e08c70d1db3d01a7f63db", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 170068, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865655, ++ "metadata_only": false, ++ "name": "ipa-client-samba", ++ "payloadhash": "70c37de6e79e9a60d041ad3f55340419", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 172320, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865654, ++ "metadata_only": false, ++ "name": "ipa-server-debuginfo", ++ "payloadhash": "2d48195b214e2137b81d88b31cefb79f", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 742960, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865653, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad", ++ "payloadhash": "a1e36114395ebb8273c84cb27748c124", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 267036, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865652, ++ "metadata_only": false, ++ "name": "python3-ipalib", ++ "payloadhash": "530ab32a650e82ffb0deb6c153d7656d", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 723300, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865651, ++ "metadata_only": false, ++ "name": "ipa-client-common", ++ "payloadhash": "b35b2c7abfd517872227d5adb9ee2c0f", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 177620, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549647, ++ "epoch": null, ++ "extra": null, ++ "id": 7865650, ++ "metadata_only": false, ++ "name": "ipa-server-trust-ad-debuginfo", ++ "payloadhash": "7aa1b58bce84fb6623143047f350ae24", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 384480, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1139326, ++ "buildroot_id": 5756013, ++ "buildtime": 1584549222, ++ "epoch": null, ++ "extra": null, ++ "id": 7865649, ++ "metadata_only": false, ++ "name": "ipa", ++ "payloadhash": "56740cbc1789552bacf1cad0086a1d47", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "size": 12755704, ++ "version": "4.8.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959042, ++ "buildroot_id": 5142731, ++ "buildtime": 1567153754, ++ "epoch": null, ++ "extra": null, ++ "id": 7305744, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "cb60d0f892d87874597d48ee6dd0d2dd", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 502168, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959042, ++ "buildroot_id": 5142731, ++ "buildtime": 1567153754, ++ "epoch": null, ++ "extra": null, ++ "id": 7305743, ++ "metadata_only": false, ++ "name": "opendnssec-debuginfo", ++ "payloadhash": "a849a2485fbc22c8008e8e1f989c871e", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1366588, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 959042, ++ "buildroot_id": 5142731, ++ "buildtime": 1567153754, ++ "epoch": null, ++ "extra": null, ++ "id": 7305742, ++ "metadata_only": false, ++ "name": "opendnssec-debugsource", ++ "payloadhash": "f6087eb44c965076fd642e5e91ac01bb", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 356812, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 959042, ++ "buildroot_id": 5142733, ++ "buildtime": 1567153669, ++ "epoch": null, ++ "extra": null, ++ "id": 7305741, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "41f2ca6ad5b3eef882c0177fe9e88dab", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 513696, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 959042, ++ "buildroot_id": 5142733, ++ "buildtime": 1567153669, ++ "epoch": null, ++ "extra": null, ++ "id": 7305740, ++ "metadata_only": false, ++ "name": "opendnssec-debuginfo", ++ "payloadhash": "60078eebdfa0303e1caf8b566d3f156d", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1153776, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 959042, ++ "buildroot_id": 5142733, ++ "buildtime": 1567153669, ++ "epoch": null, ++ "extra": null, ++ "id": 7305739, ++ "metadata_only": false, ++ "name": "opendnssec-debugsource", ++ "payloadhash": "fc1690426a858b02a21f1d6985265efc", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 356788, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959042, ++ "buildroot_id": 5142730, ++ "buildtime": 1567153632, ++ "epoch": null, ++ "extra": null, ++ "id": 7305738, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "57681fde4f863cc2cad7fedfc24d5fab", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 440900, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959042, ++ "buildroot_id": 5142730, ++ "buildtime": 1567153632, ++ "epoch": null, ++ "extra": null, ++ "id": 7305737, ++ "metadata_only": false, ++ "name": "opendnssec-debuginfo", ++ "payloadhash": "06e9084da0becd2f43a95f7a1fe03d0f", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1294064, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 959042, ++ "buildroot_id": 5142730, ++ "buildtime": 1567153632, ++ "epoch": null, ++ "extra": null, ++ "id": 7305736, ++ "metadata_only": false, ++ "name": "opendnssec-debugsource", ++ "payloadhash": "ad9da763138f1561c3fee0c89a20525a", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 356768, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959042, ++ "buildroot_id": 5142732, ++ "buildtime": 1567153667, ++ "epoch": null, ++ "extra": null, ++ "id": 7305735, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "e6b8057bcda539c2dfa78031dcbba7e5", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 481944, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959042, ++ "buildroot_id": 5142732, ++ "buildtime": 1567153667, ++ "epoch": null, ++ "extra": null, ++ "id": 7305734, ++ "metadata_only": false, ++ "name": "opendnssec-debugsource", ++ "payloadhash": "d184fdad4733bc6db1eaca30e85ee1c9", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 356796, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 959042, ++ "buildroot_id": 5142732, ++ "buildtime": 1567153667, ++ "epoch": null, ++ "extra": null, ++ "id": 7305733, ++ "metadata_only": false, ++ "name": "opendnssec-debuginfo", ++ "payloadhash": "7d151707ef916094ff5a1455603d5021", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1354072, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959042, ++ "buildroot_id": 5142734, ++ "buildtime": 1567153822, ++ "epoch": null, ++ "extra": null, ++ "id": 7305732, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "bbb00958217861b62f061230e02372b3", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 475712, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959042, ++ "buildroot_id": 5142734, ++ "buildtime": 1567153822, ++ "epoch": null, ++ "extra": null, ++ "id": 7305731, ++ "metadata_only": false, ++ "name": "opendnssec-debuginfo", ++ "payloadhash": "0234dacac54856c6e29e43ea2639105d", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1376784, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 959042, ++ "buildroot_id": 5142734, ++ "buildtime": 1567153822, ++ "epoch": null, ++ "extra": null, ++ "id": 7305730, ++ "metadata_only": false, ++ "name": "opendnssec-debugsource", ++ "payloadhash": "a2675808d0394f4f435284cf316c605a", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 356788, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959042, ++ "buildroot_id": 5142734, ++ "buildtime": 1567153715, ++ "epoch": null, ++ "extra": null, ++ "id": 7305729, ++ "metadata_only": false, ++ "name": "opendnssec", ++ "payloadhash": "c673e008bd0eb5e6c0eee59279da1197", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 1055303, ++ "version": "1.4.14" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959051, ++ "buildroot_id": 5142778, ++ "buildtime": 1567154689, ++ "epoch": null, ++ "extra": null, ++ "id": 7305863, ++ "metadata_only": false, ++ "name": "python3-pyusb", ++ "payloadhash": "2f06b1a6396b2deb1e3142ace9f29393", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "size": 89016, ++ "version": "1.0.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959051, ++ "buildroot_id": 5142778, ++ "buildtime": 1567154678, ++ "epoch": null, ++ "extra": null, ++ "id": 7305862, ++ "metadata_only": false, ++ "name": "pyusb", ++ "payloadhash": "a3b6bf520787a1f0289cdb4fa594654c", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "size": 80859, ++ "version": "1.0.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959052, ++ "buildroot_id": 5142779, ++ "buildtime": 1567154822, ++ "epoch": null, ++ "extra": null, ++ "id": 7305865, ++ "metadata_only": false, ++ "name": "python3-jwcrypto", ++ "payloadhash": "d7e3b67ac9a9fd7545fadb48ed7b46f3", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 66048, ++ "version": "0.5.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959052, ++ "buildroot_id": 5142779, ++ "buildtime": 1567154802, ++ "epoch": null, ++ "extra": null, ++ "id": 7305864, ++ "metadata_only": false, ++ "name": "python-jwcrypto", ++ "payloadhash": "011fd8fccca627c86dfaf5f71698aa7a", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "size": 78370, ++ "version": "0.5.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959056, ++ "buildroot_id": 5142788, ++ "buildtime": 1567155087, ++ "epoch": null, ++ "extra": null, ++ "id": 7305870, ++ "metadata_only": false, ++ "name": "custodia", ++ "payloadhash": "00ca09ffaf44d5bc9906c330e12b16b6", ++ "release": "3.module+el8.1.0+4107+4a66eb87", ++ "size": 33268, ++ "version": "0.6.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959056, ++ "buildroot_id": 5142788, ++ "buildtime": 1567155087, ++ "epoch": null, ++ "extra": null, ++ "id": 7305869, ++ "metadata_only": false, ++ "name": "python3-custodia", ++ "payloadhash": "3abea9085628c4f7a662ce78ffce4c66", ++ "release": "3.module+el8.1.0+4107+4a66eb87", ++ "size": 123516, ++ "version": "0.6.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959056, ++ "buildroot_id": 5142788, ++ "buildtime": 1567155069, ++ "epoch": null, ++ "extra": null, ++ "id": 7305867, ++ "metadata_only": false, ++ "name": "custodia", ++ "payloadhash": "1abe9ba3e5d3682a0ac9b580db94d9d3", ++ "release": "3.module+el8.1.0+4107+4a66eb87", ++ "size": 148309, ++ "version": "0.6.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 959057, ++ "buildroot_id": 5142792, ++ "buildtime": 1567155080, ++ "epoch": null, ++ "extra": null, ++ "id": 7305868, ++ "metadata_only": false, ++ "name": "python3-yubico", ++ "payloadhash": "a31ddc3b4209da765b7ed9e760569c8c", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "size": 63820, ++ "version": "1.3.2" ++ }, ++ { ++ "arch": "src", ++ "build_id": 959057, ++ "buildroot_id": 5142792, ++ "buildtime": 1567155073, ++ "epoch": null, ++ "extra": null, ++ "id": 7305866, ++ "metadata_only": false, ++ "name": "python-yubico", ++ "payloadhash": "15a0d4d32df1932722723813ab8ae81b", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "size": 52063, ++ "version": "1.3.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1062086, ++ "buildroot_id": 5521032, ++ "buildtime": 1579344750, ++ "epoch": null, ++ "extra": null, ++ "id": 7699623, ++ "metadata_only": false, ++ "name": "ipa-healthcheck-core", ++ "payloadhash": "b39fbcaa3e1d36e9c5e93d782693015b", ++ "release": "4.module+el8.2.0+5496+53199ee7", ++ "size": 48820, ++ "version": "0.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1062086, ++ "buildroot_id": 5521032, ++ "buildtime": 1579344750, ++ "epoch": null, ++ "extra": null, ++ "id": 7699622, ++ "metadata_only": false, ++ "name": "ipa-healthcheck", ++ "payloadhash": "b42af8db410adc03dc71feb67ff4f42d", ++ "release": "4.module+el8.2.0+5496+53199ee7", ++ "size": 86016, ++ "version": "0.4" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1062086, ++ "buildroot_id": 5521032, ++ "buildtime": 1579344699, ++ "epoch": null, ++ "extra": null, ++ "id": 7699621, ++ "metadata_only": false, ++ "name": "ipa-healthcheck", ++ "payloadhash": "73d844ba7087621b02dfc0244b8522f9", ++ "release": "4.module+el8.2.0+5496+53199ee7", ++ "size": 93648, ++ "version": "0.4" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 909543, ++ "buildroot_id": 4970166, ++ "buildtime": 1560195826, ++ "epoch": null, ++ "extra": null, ++ "id": 7075152, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debuginfo", ++ "payloadhash": "91222d6c1c3b2791c7c2800c940ff247", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 563566, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 909543, ++ "buildroot_id": 4970166, ++ "buildtime": 1560195826, ++ "epoch": null, ++ "extra": null, ++ "id": 7075151, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debugsource", ++ "payloadhash": "c79d2396ace24ba292e88e0d687fc3fa", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 45726, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 909543, ++ "buildroot_id": 4970166, ++ "buildtime": 1560195826, ++ "epoch": null, ++ "extra": null, ++ "id": 7075150, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "39a53b085cd2667b0a18e2df482efc9d", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 749426, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 909543, ++ "buildroot_id": 4970164, ++ "buildtime": 1560195759, ++ "epoch": null, ++ "extra": null, ++ "id": 7075149, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debugsource", ++ "payloadhash": "0ed7433635ce5ec37b03c36905b014ae", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 45738, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 909543, ++ "buildroot_id": 4970164, ++ "buildtime": 1560195759, ++ "epoch": null, ++ "extra": null, ++ "id": 7075148, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "32eb260a4218b7ebe1e2345341ea3923", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 789166, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 909543, ++ "buildroot_id": 4970164, ++ "buildtime": 1560195759, ++ "epoch": null, ++ "extra": null, ++ "id": 7075147, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debuginfo", ++ "payloadhash": "92fb725a36de13541c74370c6d7b12df", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 584658, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 909543, ++ "buildroot_id": 4970162, ++ "buildtime": 1560195702, ++ "epoch": null, ++ "extra": null, ++ "id": 7075146, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "d03c85cae56c351a05a2d6c81d301230", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 801610, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 909543, ++ "buildroot_id": 4970162, ++ "buildtime": 1560195702, ++ "epoch": null, ++ "extra": null, ++ "id": 7075145, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debuginfo", ++ "payloadhash": "22946480024dcece0f050d346a183c06", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 574938, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 909543, ++ "buildroot_id": 4970162, ++ "buildtime": 1560195702, ++ "epoch": null, ++ "extra": null, ++ "id": 7075144, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debugsource", ++ "payloadhash": "679dacf9c2fe06fedb087d4f36212601", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 45698, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 909543, ++ "buildroot_id": 4970163, ++ "buildtime": 1560195727, ++ "epoch": null, ++ "extra": null, ++ "id": 7075143, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debuginfo", ++ "payloadhash": "5234b608d707d5d01a214778679b28ed", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 589922, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 909543, ++ "buildroot_id": 4970163, ++ "buildtime": 1560195727, ++ "epoch": null, ++ "extra": null, ++ "id": 7075142, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debugsource", ++ "payloadhash": "d4a98d17df99cbd009c3042ec2798500", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 45726, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 909543, ++ "buildroot_id": 4970163, ++ "buildtime": 1560195727, ++ "epoch": null, ++ "extra": null, ++ "id": 7075141, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "7f7bf097295708b27909c27f62d17028", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 823402, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 909543, ++ "buildroot_id": 4970165, ++ "buildtime": 1560195860, ++ "epoch": null, ++ "extra": null, ++ "id": 7075140, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "66c31b7b54b9edec7fb2f2b9620302bf", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 754750, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 909543, ++ "buildroot_id": 4970165, ++ "buildtime": 1560195860, ++ "epoch": null, ++ "extra": null, ++ "id": 7075139, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debugsource", ++ "payloadhash": "a14edba8b02e0b37ba2b944bee1d08a3", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 45706, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 909543, ++ "buildroot_id": 4970165, ++ "buildtime": 1560195860, ++ "epoch": null, ++ "extra": null, ++ "id": 7075138, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man-debuginfo", ++ "payloadhash": "d552b7b0fa82f2aaae31dca03c439513", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 561446, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "src", ++ "build_id": 909543, ++ "buildroot_id": 4970165, ++ "buildtime": 1560195765, ++ "epoch": null, ++ "extra": null, ++ "id": 7075137, ++ "metadata_only": false, ++ "name": "golang-github-cpuguy83-go-md2man", ++ "payloadhash": "27a42e4a8c996dce517f840d34d1d25b", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "size": 92364, ++ "version": "1.0.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910836, ++ "buildroot_id": 4975529, ++ "buildtime": 1560357356, ++ "epoch": null, ++ "extra": null, ++ "id": 7085414, ++ "metadata_only": false, ++ "name": "xsom", ++ "payloadhash": "6a11e1ee314c8ee9b7d80a5e8f4023a8", ++ "release": "19.20110809svn.module+el8.1.0+3366+6dfb954c", ++ "size": 406943, ++ "version": "0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910836, ++ "buildroot_id": 4975529, ++ "buildtime": 1560357356, ++ "epoch": null, ++ "extra": null, ++ "id": 7085413, ++ "metadata_only": false, ++ "name": "xsom-javadoc", ++ "payloadhash": "67a349a58ba9d3569eecdd73257f7322", ++ "release": "19.20110809svn.module+el8.1.0+3366+6dfb954c", ++ "size": 399079, ++ "version": "0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910836, ++ "buildroot_id": 4975529, ++ "buildtime": 1560357318, ++ "epoch": null, ++ "extra": null, ++ "id": 7085412, ++ "metadata_only": false, ++ "name": "xsom", ++ "payloadhash": "2d9d0b08e0fbc7371faa476194062bed", ++ "release": "19.20110809svn.module+el8.1.0+3366+6dfb954c", ++ "size": 397446, ++ "version": "0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144557, ++ "buildroot_id": 5775388, ++ "buildtime": 1584979939, ++ "epoch": null, ++ "extra": null, ++ "id": 7883876, ++ "metadata_only": false, ++ "name": "xmlstreambuffer-javadoc", ++ "payloadhash": "2f83bd13498529c23bdea22595a02093", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 103411, ++ "version": "1.5.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144557, ++ "buildroot_id": 5775388, ++ "buildtime": 1584979939, ++ "epoch": null, ++ "extra": null, ++ "id": 7883875, ++ "metadata_only": false, ++ "name": "xmlstreambuffer", ++ "payloadhash": "c6b64f7c0024f06cdfa64ab7eabb206e", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 88115, ++ "version": "1.5.4" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1144557, ++ "buildroot_id": 5775388, ++ "buildtime": 1584979913, ++ "epoch": null, ++ "extra": null, ++ "id": 7883874, ++ "metadata_only": false, ++ "name": "xmlstreambuffer", ++ "payloadhash": "de61e444265fa6385aa350fd9a1879ac", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 66264, ++ "version": "1.5.4" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910842, ++ "buildroot_id": 4975556, ++ "buildtime": 1560358106, ++ "epoch": null, ++ "extra": null, ++ "id": 7085440, ++ "metadata_only": false, ++ "name": "glassfish-fastinfoset-javadoc", ++ "payloadhash": "615b4d655f99e3d9010bf8ac22705541", ++ "release": "9.module+el8.1.0+3366+6dfb954c", ++ "size": 384739, ++ "version": "1.2.13" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910842, ++ "buildroot_id": 4975556, ++ "buildtime": 1560358106, ++ "epoch": null, ++ "extra": null, ++ "id": 7085439, ++ "metadata_only": false, ++ "name": "glassfish-fastinfoset", ++ "payloadhash": "cdcf749901a178ba96f7d98ad2a1d311", ++ "release": "9.module+el8.1.0+3366+6dfb954c", ++ "size": 361139, ++ "version": "1.2.13" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910842, ++ "buildroot_id": 4975556, ++ "buildtime": 1560357958, ++ "epoch": null, ++ "extra": null, ++ "id": 7085438, ++ "metadata_only": false, ++ "name": "glassfish-fastinfoset", ++ "payloadhash": "ddfbcd3503fc63d43c1b5f061209dbcd", ++ "release": "9.module+el8.1.0+3366+6dfb954c", ++ "size": 1592961, ++ "version": "1.2.13" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085641, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-runtime-parent", ++ "payloadhash": "a2f20686a86a5868c26716897f7c6402", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 11815, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085640, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-runtime", ++ "payloadhash": "a05c4445ab49a3fbbd798b4ce288cad1", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 958491, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085639, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-codemodel-annotation-compiler", ++ "payloadhash": "9fda037b1302bb006ad3e6099f0cebd1", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 22867, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085638, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-bom", ++ "payloadhash": "2655b9eac43c31cfdafba471fe39ca4d", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 28863, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085637, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-core", ++ "payloadhash": "c47d960603ca915b7800bc098d6028a3", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 160731, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085636, ++ "metadata_only": false, ++ "name": "glassfish-jaxb", ++ "payloadhash": "a1496aed9865697178bf09d2fa73ae8a", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 27939, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085635, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-txw2", ++ "payloadhash": "595eccf2607a7567c63af9822a74003b", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 91323, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085634, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-parent", ++ "payloadhash": "67c9ab1a26e29c7e0d051d72cb982e5a", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 15459, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085633, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-codemodel", ++ "payloadhash": "1d8fe4f1cde6b176b0031450b61bb33e", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 165075, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085632, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-external-parent", ++ "payloadhash": "93754edadd2033cac9af893792b6b9c2", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 11795, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085631, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-txw-parent", ++ "payloadhash": "6409edc38dac620781a62e7641456be5", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 11783, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085630, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-bom-ext", ++ "payloadhash": "253717f64501dd65cea9baf8542e6ca1", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 12235, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085629, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-codemodel-parent", ++ "payloadhash": "f1c598b74b476b0ddbf84f05dcdd342c", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 11835, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358486, ++ "epoch": null, ++ "extra": null, ++ "id": 7085628, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-rngom", ++ "payloadhash": "c240f7020303cf1480cf9fda67f6acef", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 306671, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910844, ++ "buildroot_id": 4975564, ++ "buildtime": 1560358365, ++ "epoch": null, ++ "extra": null, ++ "id": 7085627, ++ "metadata_only": false, ++ "name": "glassfish-jaxb", ++ "payloadhash": "202cca1166598be94131a52f8d0a6459", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 4612273, ++ "version": "2.2.11" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028063, ++ "buildroot_id": 5396389, ++ "buildtime": 1575497271, ++ "epoch": null, ++ "extra": null, ++ "id": 7595160, ++ "metadata_only": false, ++ "name": "jackson-parent", ++ "payloadhash": "3909120d61c10ea90fc37f04e58a4ee6", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 15643, ++ "version": "2.10" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1028063, ++ "buildroot_id": 5396389, ++ "buildtime": 1575497201, ++ "epoch": null, ++ "extra": null, ++ "id": 7595159, ++ "metadata_only": false, ++ "name": "jackson-parent", ++ "payloadhash": "24c7a7d9ce539c4ce0e482c73e17fac5", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 17851, ++ "version": "2.10" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028067, ++ "buildroot_id": 5396424, ++ "buildtime": 1575497963, ++ "epoch": null, ++ "extra": null, ++ "id": 7595174, ++ "metadata_only": false, ++ "name": "jackson-bom", ++ "payloadhash": "050cd824d1f3348276b3d8ccdc3b280c", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 16043, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1028067, ++ "buildroot_id": 5396424, ++ "buildtime": 1575497911, ++ "epoch": null, ++ "extra": null, ++ "id": 7595173, ++ "metadata_only": false, ++ "name": "jackson-bom", ++ "payloadhash": "1c0cccde10e18d945546011c409caebf", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 22590, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028074, ++ "buildroot_id": 5396475, ++ "buildtime": 1575499212, ++ "epoch": null, ++ "extra": null, ++ "id": 7595204, ++ "metadata_only": false, ++ "name": "jackson-core-javadoc", ++ "payloadhash": "2d0ae6a265f8f5292885a915ed4f3fb4", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 495683, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028074, ++ "buildroot_id": 5396475, ++ "buildtime": 1575499212, ++ "epoch": null, ++ "extra": null, ++ "id": 7595203, ++ "metadata_only": false, ++ "name": "jackson-core", ++ "payloadhash": "d59a579e076c0fc68efe780afc1a0d31", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 352427, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1028074, ++ "buildroot_id": 5396475, ++ "buildtime": 1575499040, ++ "epoch": null, ++ "extra": null, ++ "id": 7595202, ++ "metadata_only": false, ++ "name": "jackson-core", ++ "payloadhash": "87ea48a3c747d142f14002d06ccd51fc", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 450226, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028078, ++ "buildroot_id": 5396490, ++ "buildtime": 1575500030, ++ "epoch": null, ++ "extra": null, ++ "id": 7595219, ++ "metadata_only": false, ++ "name": "jackson-annotations-javadoc", ++ "payloadhash": "6fb351198e3657cbbf6640f06587755b", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 124103, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028078, ++ "buildroot_id": 5396490, ++ "buildtime": 1575500030, ++ "epoch": null, ++ "extra": null, ++ "id": 7595218, ++ "metadata_only": false, ++ "name": "jackson-annotations", ++ "payloadhash": "acba186a90620ddff770027842531d58", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 71851, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1028078, ++ "buildroot_id": 5396490, ++ "buildtime": 1575499891, ++ "epoch": null, ++ "extra": null, ++ "id": 7595217, ++ "metadata_only": false, ++ "name": "jackson-annotations", ++ "payloadhash": "6fa491fd6aa6ef37ae5d00c856dfbea6", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 69495, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028087, ++ "buildroot_id": 5396523, ++ "buildtime": 1575500533, ++ "epoch": null, ++ "extra": null, ++ "id": 7595222, ++ "metadata_only": false, ++ "name": "jackson-databind-javadoc", ++ "payloadhash": "3b495e1d0fde58519fb666ba52d5ada6", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 1923207, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1028087, ++ "buildroot_id": 5396523, ++ "buildtime": 1575500533, ++ "epoch": null, ++ "extra": null, ++ "id": 7595221, ++ "metadata_only": false, ++ "name": "jackson-databind", ++ "payloadhash": "b738db5a6e462ecc5edfd478a3d42d86", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 1332163, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1028087, ++ "buildroot_id": 5396523, ++ "buildtime": 1575500474, ++ "epoch": null, ++ "extra": null, ++ "id": 7595220, ++ "metadata_only": false, ++ "name": "jackson-databind", ++ "payloadhash": "198f466dddabd4cdb28cb189b23dc243", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "size": 1311643, ++ "version": "2.10.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910869, ++ "buildroot_id": 4975658, ++ "buildtime": 1560361371, ++ "epoch": null, ++ "extra": null, ++ "id": 7085805, ++ "metadata_only": false, ++ "name": "jackson-module-jaxb-annotations", ++ "payloadhash": "60a25e597045a87b9047cf228f551c47", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 45763, ++ "version": "2.7.6" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910869, ++ "buildroot_id": 4975658, ++ "buildtime": 1560361371, ++ "epoch": null, ++ "extra": null, ++ "id": 7085804, ++ "metadata_only": false, ++ "name": "jackson-module-jaxb-annotations-javadoc", ++ "payloadhash": "10aba002380ba58fb310eee0ffe9f58f", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 48471, ++ "version": "2.7.6" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910869, ++ "buildroot_id": 4975658, ++ "buildtime": 1560361336, ++ "epoch": null, ++ "extra": null, ++ "id": 7085803, ++ "metadata_only": false, ++ "name": "jackson-module-jaxb-annotations", ++ "payloadhash": "e74b2038fa5c73b59d1f2f79d438e746", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 55401, ++ "version": "2.7.6" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610159, ++ "epoch": null, ++ "extra": null, ++ "id": 7219347, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-providers-javadoc", ++ "payloadhash": "2bbe26ea5dbaaa23089673430a73dba3", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 86683, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610159, ++ "epoch": null, ++ "extra": null, ++ "id": 7219346, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-providers-parent", ++ "payloadhash": "d7f64f2381d61d7050e2b5c01ba5ea2b", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 12323, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610159, ++ "epoch": null, ++ "extra": null, ++ "id": 7219345, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-providers-datatypes", ++ "payloadhash": "e5ad82651b7fafdafd835b2fd9700d29", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 18059, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610159, ++ "epoch": null, ++ "extra": null, ++ "id": 7219344, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-json-provider", ++ "payloadhash": "d5f73c16799f01fe2accf178bda603f5", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 23819, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610159, ++ "epoch": null, ++ "extra": null, ++ "id": 7219343, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-providers", ++ "payloadhash": "f9aef76f86248c2e5023c5e17024cd71", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 44719, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "src", ++ "build_id": 941248, ++ "buildroot_id": 5077784, ++ "buildtime": 1564610086, ++ "epoch": null, ++ "extra": null, ++ "id": 7219342, ++ "metadata_only": false, ++ "name": "jackson-jaxrs-providers", ++ "payloadhash": "964f649fb7d235760a767e2856d4b2f4", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "size": 1272470, ++ "version": "2.9.9" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144584, ++ "buildroot_id": 5775496, ++ "buildtime": 1584982156, ++ "epoch": null, ++ "extra": null, ++ "id": 7883886, ++ "metadata_only": false, ++ "name": "resteasy-javadoc", ++ "payloadhash": "0be26935ed385e7df6305cbfbb80851c", ++ "release": "3.module+el8.2.0+5723+4574fbff", ++ "size": 1195355, ++ "version": "3.0.26" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144584, ++ "buildroot_id": 5775496, ++ "buildtime": 1584982156, ++ "epoch": null, ++ "extra": null, ++ "id": 7883885, ++ "metadata_only": false, ++ "name": "resteasy", ++ "payloadhash": "d0cf77aad674eac9b5b07d26901f247d", ++ "release": "3.module+el8.2.0+5723+4574fbff", ++ "size": 1115667, ++ "version": "3.0.26" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1144584, ++ "buildroot_id": 5775496, ++ "buildtime": 1584982113, ++ "epoch": null, ++ "extra": null, ++ "id": 7883884, ++ "metadata_only": false, ++ "name": "resteasy", ++ "payloadhash": "87aefc17f4a504d3bf45c96e964ae677", ++ "release": "3.module+el8.2.0+5723+4574fbff", ++ "size": 7816178, ++ "version": "3.0.26" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910796, ++ "buildroot_id": 4975406, ++ "buildtime": 1560355813, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085264, ++ "metadata_only": false, ++ "name": "velocity-javadoc", ++ "payloadhash": "4d867d28d3403b1736dd4b09b0ffcd44", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "size": 496935, ++ "version": "1.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910796, ++ "buildroot_id": 4975406, ++ "buildtime": 1560355813, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085263, ++ "metadata_only": false, ++ "name": "velocity", ++ "payloadhash": "f539a3469f3d1e3dca26a55b90ec2d8b", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "size": 446091, ++ "version": "1.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910796, ++ "buildroot_id": 4975406, ++ "buildtime": 1560355813, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085262, ++ "metadata_only": false, ++ "name": "velocity-manual", ++ "payloadhash": "aafa87e7eb2fa2530931c79e4924f127", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "size": 643783, ++ "version": "1.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910796, ++ "buildroot_id": 4975406, ++ "buildtime": 1560355813, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085261, ++ "metadata_only": false, ++ "name": "velocity-demo", ++ "payloadhash": "f5a5d39f2a63061a898a7a6b8fc35c61", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "size": 111555, ++ "version": "1.7" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910796, ++ "buildroot_id": 4975406, ++ "buildtime": 1560355538, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085260, ++ "metadata_only": false, ++ "name": "velocity", ++ "payloadhash": "dae5a51991e342401248c4af0be520fd", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "size": 1584450, ++ "version": "1.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144545, ++ "buildroot_id": 5775341, ++ "buildtime": 1584978871, ++ "epoch": null, ++ "extra": null, ++ "id": 7883860, ++ "metadata_only": false, ++ "name": "glassfish-jax-rs-api", ++ "payloadhash": "f38590be170d682a550d56fb95a60dd0", ++ "release": "6.module+el8.2.0+5723+4574fbff", ++ "size": 110203, ++ "version": "2.0.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144545, ++ "buildroot_id": 5775341, ++ "buildtime": 1584978871, ++ "epoch": null, ++ "extra": null, ++ "id": 7883859, ++ "metadata_only": false, ++ "name": "glassfish-jax-rs-api-javadoc", ++ "payloadhash": "a7f5044c11b2daa311a4188d9a30b4fc", ++ "release": "6.module+el8.2.0+5723+4574fbff", ++ "size": 266903, ++ "version": "2.0.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1144545, ++ "buildroot_id": 5775341, ++ "buildtime": 1584978836, ++ "epoch": null, ++ "extra": null, ++ "id": 7883858, ++ "metadata_only": false, ++ "name": "glassfish-jax-rs-api", ++ "payloadhash": "db548a69417c3aadb3bbe305cb272acd", ++ "release": "6.module+el8.2.0+5723+4574fbff", ++ "size": 235872, ++ "version": "2.0.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910805, ++ "buildroot_id": 4975413, ++ "buildtime": 1560355896, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085267, ++ "metadata_only": false, ++ "name": "pki-servlet-4.0-api", ++ "payloadhash": "5147afcccbdf4c9cb50e73222d3d3e42", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 285547, ++ "version": "9.0.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910805, ++ "buildroot_id": 4975413, ++ "buildtime": 1560355896, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085266, ++ "metadata_only": false, ++ "name": "pki-servlet-engine", ++ "payloadhash": "4fef9158a717b83186a8000002e4d8c1", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 4773691, ++ "version": "9.0.7" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910805, ++ "buildroot_id": 4975413, ++ "buildtime": 1560355541, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085265, ++ "metadata_only": false, ++ "name": "pki-servlet-engine", ++ "payloadhash": "dcfc7f1d5ccb07019e0e059511adc8bb", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 12498686, ++ "version": "9.0.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085174, ++ "metadata_only": false, ++ "name": "slf4j-javadoc", ++ "payloadhash": "f937e120576044bf6cc3730b516872ed", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 268659, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085172, ++ "metadata_only": false, ++ "name": "jcl-over-slf4j", ++ "payloadhash": "9204a295309bd63cfd541aec271cfd82", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 31311, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085170, ++ "metadata_only": false, ++ "name": "slf4j-ext", ++ "payloadhash": "9f6af88b474c170ba4b458e07c648322", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 57279, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085169, ++ "metadata_only": false, ++ "name": "slf4j-jcl", ++ "payloadhash": "feb88a5268168663948a66a72f9ed1e2", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 22747, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085168, ++ "metadata_only": false, ++ "name": "slf4j-sources", ++ "payloadhash": "c66b2217ce8b28703d77a22a18f70511", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 345179, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085165, ++ "metadata_only": false, ++ "name": "slf4j-manual", ++ "payloadhash": "29080e4ee21afe086da026c594b75930", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 132975, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085164, ++ "metadata_only": false, ++ "name": "slf4j-log4j12", ++ "payloadhash": "e5ceb10298bbf99d13003bc6a23f121f", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 27971, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085162, ++ "metadata_only": false, ++ "name": "slf4j-jdk14", ++ "payloadhash": "32c537a296550d2ded0b7730c4f2494c", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 24319, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085161, ++ "metadata_only": false, ++ "name": "slf4j", ++ "payloadhash": "d489685b31fc888d1694d0a3a0f7a75d", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 77571, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085160, ++ "metadata_only": false, ++ "name": "log4j-over-slf4j", ++ "payloadhash": "355aedb072fdbbca61b45112b7368ea6", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 36559, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355448, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085159, ++ "metadata_only": false, ++ "name": "jul-to-slf4j", ++ "payloadhash": "976b36a458034e7fc9c395c695b9a996", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 20659, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910788, ++ "buildroot_id": 4975391, ++ "buildtime": 1560355333, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085158, ++ "metadata_only": false, ++ "name": "slf4j", ++ "payloadhash": "4f3d111f920da849d1068e313be814aa", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "size": 3449598, ++ "version": "1.7.25" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910800, ++ "buildroot_id": 4975407, ++ "buildtime": 1560355439, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085157, ++ "metadata_only": false, ++ "name": "xml-commons-resolver-javadoc", ++ "payloadhash": "6a18d36e900dc38e557040db366a720c", ++ "release": "26.module+el8.1.0+3366+6dfb954c", ++ "size": 99247, ++ "version": "1.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910800, ++ "buildroot_id": 4975407, ++ "buildtime": 1560355439, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085156, ++ "metadata_only": false, ++ "name": "xml-commons-resolver", ++ "payloadhash": "72db3815a2eb2808fd34d431b2561c8c", ++ "release": "26.module+el8.1.0+3366+6dfb954c", ++ "size": 117151, ++ "version": "1.2" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910800, ++ "buildroot_id": 4975407, ++ "buildtime": 1560355406, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085155, ++ "metadata_only": false, ++ "name": "xml-commons-resolver", ++ "payloadhash": "d96242687a4b625591fb5ce7629070bc", ++ "release": "26.module+el8.1.0+3366+6dfb954c", ++ "size": 280185, ++ "version": "1.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910803, ++ "buildroot_id": 4975410, ++ "buildtime": 1560356070, ++ "epoch": null, ++ "extra": null, ++ "id": 7085275, ++ "metadata_only": false, ++ "name": "xerces-j2-demo", ++ "payloadhash": "7035cf2ab5b8cd5b9f01df1b89e37ea7", ++ "release": "34.module+el8.1.0+3366+6dfb954c", ++ "size": 177959, ++ "version": "2.11.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910803, ++ "buildroot_id": 4975410, ++ "buildtime": 1560356070, ++ "epoch": null, ++ "extra": null, ++ "id": 7085274, ++ "metadata_only": false, ++ "name": "xerces-j2-javadoc", ++ "payloadhash": "f0c1a4c150a28151a21fbf93fcf3e6b3", ++ "release": "34.module+el8.1.0+3366+6dfb954c", ++ "size": 1129083, ++ "version": "2.11.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910803, ++ "buildroot_id": 4975410, ++ "buildtime": 1560356070, ++ "epoch": null, ++ "extra": null, ++ "id": 7085273, ++ "metadata_only": false, ++ "name": "xerces-j2", ++ "payloadhash": "d2541a2c973ad12c91b34e3c239e664a", ++ "release": "34.module+el8.1.0+3366+6dfb954c", ++ "size": 1214555, ++ "version": "2.11.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910803, ++ "buildroot_id": 4975410, ++ "buildtime": 1560355730, ++ "epoch": null, ++ "extra": null, ++ "id": 7085272, ++ "metadata_only": false, ++ "name": "xerces-j2", ++ "payloadhash": "461fe024860e749fd2e6e6b0ee41f9ea", ++ "release": "34.module+el8.1.0+3366+6dfb954c", ++ "size": 1823348, ++ "version": "2.11.0" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 910789, ++ "buildroot_id": 4975396, ++ "buildtime": 1560355677, ++ "epoch": null, ++ "extra": null, ++ "id": 7085217, ++ "metadata_only": false, ++ "name": "python3-nss-debuginfo", ++ "payloadhash": "c7754f908877c4b7ca70b9a299c2ef79", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 494111, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 910789, ++ "buildroot_id": 4975396, ++ "buildtime": 1560355677, ++ "epoch": null, ++ "extra": null, ++ "id": 7085216, ++ "metadata_only": false, ++ "name": "python-nss-debugsource", ++ "payloadhash": "eadc3f26709c176852f14bd82de4ea3e", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 210255, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 910789, ++ "buildroot_id": 4975396, ++ "buildtime": 1560355677, ++ "epoch": null, ++ "extra": null, ++ "id": 7085215, ++ "metadata_only": false, ++ "name": "python-nss-doc", ++ "payloadhash": "c86d5ac6ae8f49f1c7409b77d4605ddc", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 323651, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "ppc64le", ++ "build_id": 910789, ++ "buildroot_id": 4975396, ++ "buildtime": 1560355677, ++ "epoch": null, ++ "extra": null, ++ "id": 7085214, ++ "metadata_only": false, ++ "name": "python3-nss", ++ "payloadhash": "5e2c4f53fec92e8010bb22c2dc056fd0", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 300583, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 910789, ++ "buildroot_id": 4975395, ++ "buildtime": 1560355398, ++ "epoch": null, ++ "extra": null, ++ "id": 7085213, ++ "metadata_only": false, ++ "name": "python-nss-doc", ++ "payloadhash": "4b4b46732aec4e344893505cbd97c6fe", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 323687, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 910789, ++ "buildroot_id": 4975395, ++ "buildtime": 1560355398, ++ "epoch": null, ++ "extra": null, ++ "id": 7085212, ++ "metadata_only": false, ++ "name": "python3-nss-debuginfo", ++ "payloadhash": "7dbe3b2fe595a0bbad060119c562f2ed", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 419939, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 910789, ++ "buildroot_id": 4975395, ++ "buildtime": 1560355398, ++ "epoch": null, ++ "extra": null, ++ "id": 7085211, ++ "metadata_only": false, ++ "name": "python3-nss", ++ "payloadhash": "67f3fb608106adbc0210a0a67c1c1185", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 295259, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "i686", ++ "build_id": 910789, ++ "buildroot_id": 4975395, ++ "buildtime": 1560355398, ++ "epoch": null, ++ "extra": null, ++ "id": 7085210, ++ "metadata_only": false, ++ "name": "python-nss-debugsource", ++ "payloadhash": "1efdfec3107233a2908f1bab04d1881e", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 210299, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 910789, ++ "buildroot_id": 4975393, ++ "buildtime": 1560355358, ++ "epoch": null, ++ "extra": null, ++ "id": 7085209, ++ "metadata_only": false, ++ "name": "python3-nss-debuginfo", ++ "payloadhash": "2d9cbf2427910da0be3684c4ba11c407", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 478795, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 910789, ++ "buildroot_id": 4975393, ++ "buildtime": 1560355358, ++ "epoch": null, ++ "extra": null, ++ "id": 7085208, ++ "metadata_only": false, ++ "name": "python3-nss", ++ "payloadhash": "0e876a14f6a56259d8154b07afe130c3", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 280295, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 910789, ++ "buildroot_id": 4975393, ++ "buildtime": 1560355358, ++ "epoch": null, ++ "extra": null, ++ "id": 7085207, ++ "metadata_only": false, ++ "name": "python-nss-doc", ++ "payloadhash": "15ebd7d68a04ff198b69806824cf5c41", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 323647, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "s390x", ++ "build_id": 910789, ++ "buildroot_id": 4975393, ++ "buildtime": 1560355358, ++ "epoch": null, ++ "extra": null, ++ "id": 7085206, ++ "metadata_only": false, ++ "name": "python-nss-debugsource", ++ "payloadhash": "f5177b64f4eb5b0e21327fd27bf4d8fa", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 210251, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 910789, ++ "buildroot_id": 4975394, ++ "buildtime": 1560355392, ++ "epoch": null, ++ "extra": null, ++ "id": 7085205, ++ "metadata_only": false, ++ "name": "python-nss-debugsource", ++ "payloadhash": "f705150882c1edd57a000f0070e54bb1", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 210267, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 910789, ++ "buildroot_id": 4975394, ++ "buildtime": 1560355392, ++ "epoch": null, ++ "extra": null, ++ "id": 7085204, ++ "metadata_only": false, ++ "name": "python-nss-doc", ++ "payloadhash": "154efb2d47a46ca592a248b3141e2cf4", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 323651, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 910789, ++ "buildroot_id": 4975394, ++ "buildtime": 1560355392, ++ "epoch": null, ++ "extra": null, ++ "id": 7085203, ++ "metadata_only": false, ++ "name": "python3-nss-debuginfo", ++ "payloadhash": "f8685725d1795bb4453f7fafb82c89a6", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 481967, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "x86_64", ++ "build_id": 910789, ++ "buildroot_id": 4975394, ++ "buildtime": 1560355392, ++ "epoch": null, ++ "extra": null, ++ "id": 7085202, ++ "metadata_only": false, ++ "name": "python3-nss", ++ "payloadhash": "c8926e322b42110b69ad8ded2059b0d3", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 292187, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 910789, ++ "buildroot_id": 4975399, ++ "buildtime": 1560355581, ++ "epoch": null, ++ "extra": null, ++ "id": 7085201, ++ "metadata_only": false, ++ "name": "python3-nss-debuginfo", ++ "payloadhash": "0ae5d8bbb40cd28c9e4dbb6aab53c94c", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 499579, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 910789, ++ "buildroot_id": 4975399, ++ "buildtime": 1560355581, ++ "epoch": null, ++ "extra": null, ++ "id": 7085200, ++ "metadata_only": false, ++ "name": "python-nss-debugsource", ++ "payloadhash": "b195be9d96317aeb9229bf4ea84375d9", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 210235, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 910789, ++ "buildroot_id": 4975399, ++ "buildtime": 1560355581, ++ "epoch": null, ++ "extra": null, ++ "id": 7085199, ++ "metadata_only": false, ++ "name": "python3-nss", ++ "payloadhash": "4f4c9a0bce27ad8cc8b21c39fc7b323e", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 287687, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "aarch64", ++ "build_id": 910789, ++ "buildroot_id": 4975399, ++ "buildtime": 1560355581, ++ "epoch": null, ++ "extra": null, ++ "id": 7085198, ++ "metadata_only": false, ++ "name": "python-nss-doc", ++ "payloadhash": "008e373b053d3c07e5bd8579406457f3", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 323619, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910789, ++ "buildroot_id": 4975399, ++ "buildtime": 1560355475, ++ "epoch": null, ++ "extra": null, ++ "id": 7085197, ++ "metadata_only": false, ++ "name": "python-nss", ++ "payloadhash": "360d26e078f21b4a01ea59e0f8e0129d", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 283977, ++ "version": "1.0.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910790, ++ "buildroot_id": 4975392, ++ "buildtime": 1560355442, ++ "epoch": null, ++ "extra": null, ++ "id": 7085167, ++ "metadata_only": false, ++ "name": "javassist-javadoc", ++ "payloadhash": "ad6b45bb4192c6e9c16a47bf066dd36e", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 799951, ++ "version": "3.18.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910790, ++ "buildroot_id": 4975392, ++ "buildtime": 1560355442, ++ "epoch": null, ++ "extra": null, ++ "id": 7085166, ++ "metadata_only": false, ++ "name": "javassist", ++ "payloadhash": "a9c1f2a18b412b517ea57a8ca447b343", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 697527, ++ "version": "3.18.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910790, ++ "buildroot_id": 4975392, ++ "buildtime": 1560355352, ++ "epoch": null, ++ "extra": null, ++ "id": 7085163, ++ "metadata_only": false, ++ "name": "javassist", ++ "payloadhash": "055564a9807be9471c080dd3f58f6497", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 1188275, ++ "version": "3.18.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910809, ++ "buildroot_id": 4975421, ++ "buildtime": 1560355743, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085222, ++ "metadata_only": false, ++ "name": "jakarta-commons-httpclient-manual", ++ "payloadhash": "831a80c37ef2f7bf4883f5ad21af9060", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "size": 680263, ++ "version": "3.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910809, ++ "buildroot_id": 4975421, ++ "buildtime": 1560355743, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085221, ++ "metadata_only": false, ++ "name": "jakarta-commons-httpclient-javadoc", ++ "payloadhash": "4b735a863005a3f02d618631da94fa70", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "size": 317767, ++ "version": "3.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910809, ++ "buildroot_id": 4975421, ++ "buildtime": 1560355743, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085220, ++ "metadata_only": false, ++ "name": "jakarta-commons-httpclient-demo", ++ "payloadhash": "84d674cbb00b2292a1b5f56756118baa", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "size": 54911, ++ "version": "3.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910809, ++ "buildroot_id": 4975421, ++ "buildtime": 1560355743, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085219, ++ "metadata_only": false, ++ "name": "jakarta-commons-httpclient", ++ "payloadhash": "3d878099e7f5348fffb2594d0837d44d", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "size": 252711, ++ "version": "3.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910809, ++ "buildroot_id": 4975421, ++ "buildtime": 1560355616, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085218, ++ "metadata_only": false, ++ "name": "jakarta-commons-httpclient", ++ "payloadhash": "4ff5dbaa4683ed023655f475c3aca324", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "size": 1899859, ++ "version": "3.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910799, ++ "buildroot_id": 4975405, ++ "buildtime": 1560355747, ++ "epoch": null, ++ "extra": null, ++ "id": 7085225, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-api-javadoc", ++ "payloadhash": "0970bc477a56e740aa733a9e76f3197f", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 212867, ++ "version": "2.2.12" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910799, ++ "buildroot_id": 4975405, ++ "buildtime": 1560355747, ++ "epoch": null, ++ "extra": null, ++ "id": 7085224, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-api", ++ "payloadhash": "f3e189d5001d224ce51f86aae2df51ab", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 102823, ++ "version": "2.2.12" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910799, ++ "buildroot_id": 4975405, ++ "buildtime": 1560355582, ++ "epoch": null, ++ "extra": null, ++ "id": 7085223, ++ "metadata_only": false, ++ "name": "glassfish-jaxb-api", ++ "payloadhash": "a229eb5c8c16046a7d531c081b323f26", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "size": 247856, ++ "version": "2.2.12" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910797, ++ "buildroot_id": 4975404, ++ "buildtime": 1560355487, ++ "epoch": null, ++ "extra": null, ++ "id": 7085182, ++ "metadata_only": false, ++ "name": "bea-stax-api", ++ "payloadhash": "031463ad022495097de4f49f08abc77d", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 36543, ++ "version": "1.2.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910797, ++ "buildroot_id": 4975404, ++ "buildtime": 1560355487, ++ "epoch": null, ++ "extra": null, ++ "id": 7085181, ++ "metadata_only": false, ++ "name": "bea-stax", ++ "payloadhash": "71076d2a3b5335081d51289f34b82df8", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 186679, ++ "version": "1.2.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910797, ++ "buildroot_id": 4975404, ++ "buildtime": 1560355487, ++ "epoch": null, ++ "extra": null, ++ "id": 7085180, ++ "metadata_only": false, ++ "name": "bea-stax-javadoc", ++ "payloadhash": "d4f7c66827294a371c2466a3a648cd18", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 117415, ++ "version": "1.2.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910797, ++ "buildroot_id": 4975404, ++ "buildtime": 1560355438, ++ "epoch": null, ++ "extra": null, ++ "id": 7085179, ++ "metadata_only": false, ++ "name": "bea-stax", ++ "payloadhash": "d2f3e218d099ecd91c6c89090f5da43b", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "size": 302260, ++ "version": "1.2.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910787, ++ "buildroot_id": 4975390, ++ "buildtime": 1560355352, ++ "epoch": null, ++ "extra": null, ++ "id": 7085154, ++ "metadata_only": false, ++ "name": "fasterxml-oss-parent", ++ "payloadhash": "3fdf1ae0babff5bf4fbbfcad26fed934", ++ "release": "6.module+el8.1.0+3366+6dfb954c", ++ "size": 19579, ++ "version": "26" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910787, ++ "buildroot_id": 4975390, ++ "buildtime": 1560355330, ++ "epoch": null, ++ "extra": null, ++ "id": 7085153, ++ "metadata_only": false, ++ "name": "fasterxml-oss-parent", ++ "payloadhash": "aa9f8dad383518ec4a0386dc9bdee8d8", ++ "release": "6.module+el8.1.0+3366+6dfb954c", ++ "size": 21378, ++ "version": "26" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910807, ++ "buildroot_id": 4975419, ++ "buildtime": 1560355650, ++ "epoch": null, ++ "extra": null, ++ "id": 7085195, ++ "metadata_only": false, ++ "name": "apache-commons-lang-javadoc", ++ "payloadhash": "b5ec483eb15d09255e3d0e563d40bfac", ++ "release": "21.module+el8.1.0+3366+6dfb954c", ++ "size": 440335, ++ "version": "2.6" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910807, ++ "buildroot_id": 4975419, ++ "buildtime": 1560355650, ++ "epoch": null, ++ "extra": null, ++ "id": 7085194, ++ "metadata_only": false, ++ "name": "apache-commons-lang", ++ "payloadhash": "9419b773aa18e62b0328fe3f631aa981", ++ "release": "21.module+el8.1.0+3366+6dfb954c", ++ "size": 288231, ++ "version": "2.6" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910807, ++ "buildroot_id": 4975419, ++ "buildtime": 1560355611, ++ "epoch": null, ++ "extra": null, ++ "id": 7085193, ++ "metadata_only": false, ++ "name": "apache-commons-lang", ++ "payloadhash": "0f1317e752e923f435c2404efc1ffc16", ++ "release": "21.module+el8.1.0+3366+6dfb954c", ++ "size": 577857, ++ "version": "2.6" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085345, ++ "metadata_only": false, ++ "name": "msv-demo", ++ "payloadhash": "f6c242ea890a87c7a2511091ac593233", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 32487, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085344, ++ "metadata_only": false, ++ "name": "msv-rngconv", ++ "payloadhash": "8996a507262b9ff1c10e0591d3cb0481", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 21779, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085343, ++ "metadata_only": false, ++ "name": "msv-xsdlib", ++ "payloadhash": "055e01e039710739521c616d1418ee6b", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 237275, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085342, ++ "metadata_only": false, ++ "name": "msv-msv", ++ "payloadhash": "ed6277b62bf5d8efe25f7236ba61c682", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 662083, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085341, ++ "metadata_only": false, ++ "name": "msv-javadoc", ++ "payloadhash": "d6d5bd9dfc802f472caa7ab05ca7b568", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 1258703, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085340, ++ "metadata_only": false, ++ "name": "msv-manual", ++ "payloadhash": "c91e911e8a5c26123375b2774d2dc7c9", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 56683, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356513, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085339, ++ "metadata_only": false, ++ "name": "msv-xmlgen", ++ "payloadhash": "8f6359c6ccb635a56f92b88d458115b0", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 57003, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910820, ++ "buildroot_id": 4975468, ++ "buildtime": 1560356399, ++ "epoch": 1, ++ "extra": null, ++ "id": 7085338, ++ "metadata_only": false, ++ "name": "msv", ++ "payloadhash": "71d384aac15a313c0e71ba1b3a57e142", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "size": 787060, ++ "version": "2013.6.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910811, ++ "buildroot_id": 4975434, ++ "buildtime": 1560355976, ++ "epoch": null, ++ "extra": null, ++ "id": 7085271, ++ "metadata_only": false, ++ "name": "apache-commons-collections", ++ "payloadhash": "1401c1d8bb40febccbffc110cc56a561", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 549339, ++ "version": "3.2.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910811, ++ "buildroot_id": 4975434, ++ "buildtime": 1560355976, ++ "epoch": null, ++ "extra": null, ++ "id": 7085270, ++ "metadata_only": false, ++ "name": "apache-commons-collections-javadoc", ++ "payloadhash": "6392a0b186e0e04382544831c3035be4", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 806803, ++ "version": "3.2.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910811, ++ "buildroot_id": 4975434, ++ "buildtime": 1560355976, ++ "epoch": null, ++ "extra": null, ++ "id": 7085269, ++ "metadata_only": false, ++ "name": "apache-commons-collections-testframework", ++ "payloadhash": "e1459253d926625c1a8591d2b3564048", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 112475, ++ "version": "3.2.2" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910811, ++ "buildroot_id": 4975434, ++ "buildtime": 1560355693, ++ "epoch": null, ++ "extra": null, ++ "id": 7085268, ++ "metadata_only": false, ++ "name": "apache-commons-collections", ++ "payloadhash": "ddd352323aae700c891b443b02a947ef", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "size": 646872, ++ "version": "3.2.2" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910798, ++ "buildroot_id": 4975403, ++ "buildtime": 1560355538, ++ "epoch": null, ++ "extra": null, ++ "id": 7085190, ++ "metadata_only": false, ++ "name": "xml-stylebook-demo", ++ "payloadhash": "f585b269f25ce8e5f11c7beb758d8e26", ++ "release": "0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "size": 68943, ++ "version": "1.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910798, ++ "buildroot_id": 4975403, ++ "buildtime": 1560355538, ++ "epoch": null, ++ "extra": null, ++ "id": 7085189, ++ "metadata_only": false, ++ "name": "xml-stylebook-javadoc", ++ "payloadhash": "aa50e9228e83a60ec287bd743fd34054", ++ "release": "0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "size": 70471, ++ "version": "1.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910798, ++ "buildroot_id": 4975403, ++ "buildtime": 1560355538, ++ "epoch": null, ++ "extra": null, ++ "id": 7085188, ++ "metadata_only": false, ++ "name": "xml-stylebook", ++ "payloadhash": "cf264265bd4e4a782ae7f225a4c69b1f", ++ "release": "0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "size": 58883, ++ "version": "1.0" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910798, ++ "buildroot_id": 4975403, ++ "buildtime": 1560355480, ++ "epoch": null, ++ "extra": null, ++ "id": 7085187, ++ "metadata_only": false, ++ "name": "xml-stylebook", ++ "payloadhash": "1d9ac9c5a61163da965e08608cf822cc", ++ "release": "0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "size": 1190166, ++ "version": "1.0" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910793, ++ "buildroot_id": 4975400, ++ "buildtime": 1560355507, ++ "epoch": null, ++ "extra": null, ++ "id": 7085186, ++ "metadata_only": false, ++ "name": "xml-commons-apis-javadoc", ++ "payloadhash": "11a62d09579e6424da93d4a05dabd5ff", ++ "release": "25.module+el8.1.0+3366+6dfb954c", ++ "size": 665219, ++ "version": "1.4.01" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910793, ++ "buildroot_id": 4975400, ++ "buildtime": 1560355507, ++ "epoch": null, ++ "extra": null, ++ "id": 7085185, ++ "metadata_only": false, ++ "name": "xml-commons-apis", ++ "payloadhash": "ede4ec6b775464946b6699aa6d1ed8d1", ++ "release": "25.module+el8.1.0+3366+6dfb954c", ++ "size": 239075, ++ "version": "1.4.01" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910793, ++ "buildroot_id": 4975400, ++ "buildtime": 1560355507, ++ "epoch": null, ++ "extra": null, ++ "id": 7085184, ++ "metadata_only": false, ++ "name": "xml-commons-apis-manual", ++ "payloadhash": "85a40348a4ff834a0f0ebd8cb2f75f40", ++ "release": "25.module+el8.1.0+3366+6dfb954c", ++ "size": 415895, ++ "version": "1.4.01" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910793, ++ "buildroot_id": 4975400, ++ "buildtime": 1560355370, ++ "epoch": null, ++ "extra": null, ++ "id": 7085183, ++ "metadata_only": false, ++ "name": "xml-commons-apis", ++ "payloadhash": "45e5483b26f6b8aeffab6192d446f6c0", ++ "release": "25.module+el8.1.0+3366+6dfb954c", ++ "size": 963846, ++ "version": "1.4.01" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910795, ++ "buildroot_id": 4975401, ++ "buildtime": 1560355460, ++ "epoch": null, ++ "extra": null, ++ "id": 7085178, ++ "metadata_only": false, ++ "name": "relaxngDatatype-javadoc", ++ "payloadhash": "367a0202ddea916b876d594e19c60a6b", ++ "release": "7.module+el8.1.0+3366+6dfb954c", ++ "size": 45343, ++ "version": "2011.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910795, ++ "buildroot_id": 4975401, ++ "buildtime": 1560355460, ++ "epoch": null, ++ "extra": null, ++ "id": 7085177, ++ "metadata_only": false, ++ "name": "relaxngDatatype", ++ "payloadhash": "5ab56fa7b0124fd8fd9b5a9815b0a532", ++ "release": "7.module+el8.1.0+3366+6dfb954c", ++ "size": 27039, ++ "version": "2011.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910795, ++ "buildroot_id": 4975401, ++ "buildtime": 1560355430, ++ "epoch": null, ++ "extra": null, ++ "id": 7085175, ++ "metadata_only": false, ++ "name": "relaxngDatatype", ++ "payloadhash": "25d1dadb72b0a2deee892e992fc3a58b", ++ "release": "7.module+el8.1.0+3366+6dfb954c", ++ "size": 22882, ++ "version": "2011.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356456, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085337, ++ "metadata_only": false, ++ "name": "xalan-j2-xsltc", ++ "payloadhash": "17c7ce492e4aa44a30bfab7953192ed1", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 1312275, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356456, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085336, ++ "metadata_only": false, ++ "name": "xalan-j2-manual", ++ "payloadhash": "1394253c1b433897efee69cb75cc8ff3", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 1843091, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356456, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085335, ++ "metadata_only": false, ++ "name": "xalan-j2-demo", ++ "payloadhash": "8f77f7793d76b6223910bab057bb66c3", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 4130303, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356456, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085334, ++ "metadata_only": false, ++ "name": "xalan-j2", ++ "payloadhash": "8690dbfec4d1087dfe0286f19351d7a1", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 1982295, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356456, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085333, ++ "metadata_only": false, ++ "name": "xalan-j2-javadoc", ++ "payloadhash": "897bbc711d12c2dcf7d3ead4433b5334", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 1853923, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910821, ++ "buildroot_id": 4975469, ++ "buildtime": 1560356384, ++ "epoch": 0, ++ "extra": null, ++ "id": 7085332, ++ "metadata_only": false, ++ "name": "xalan-j2", ++ "payloadhash": "4d365d5aabe0bdf50d0324a6f2c26f43", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "size": 3392377, ++ "version": "2.7.1" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910827, ++ "buildroot_id": 4975503, ++ "buildtime": 1560356894, ++ "epoch": null, ++ "extra": null, ++ "id": 7085402, ++ "metadata_only": false, ++ "name": "relaxngcc-javadoc", ++ "payloadhash": "0676a171c750f809c3838616dda56c64", ++ "release": "14.module+el8.1.0+3366+6dfb954c", ++ "size": 160235, ++ "version": "1.12" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 910827, ++ "buildroot_id": 4975503, ++ "buildtime": 1560356894, ++ "epoch": null, ++ "extra": null, ++ "id": 7085401, ++ "metadata_only": false, ++ "name": "relaxngcc", ++ "payloadhash": "67f7ec9c17ccb61dbbd97ebac2e846cc", ++ "release": "14.module+el8.1.0+3366+6dfb954c", ++ "size": 366155, ++ "version": "1.12" ++ }, ++ { ++ "arch": "src", ++ "build_id": 910827, ++ "buildroot_id": 4975503, ++ "buildtime": 1560356832, ++ "epoch": null, ++ "extra": null, ++ "id": 7085400, ++ "metadata_only": false, ++ "name": "relaxngcc", ++ "payloadhash": "5efcba4df3b65845f5a2884cc07384a6", ++ "release": "14.module+el8.1.0+3366+6dfb954c", ++ "size": 2133931, ++ "version": "1.12" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144552, ++ "buildroot_id": 5775376, ++ "buildtime": 1584979612, ++ "epoch": null, ++ "extra": null, ++ "id": 7883865, ++ "metadata_only": false, ++ "name": "stax-ex", ++ "payloadhash": "9b5656c8c4167f017817f65dcea2050f", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 55775, ++ "version": "1.7.7" ++ }, ++ { ++ "arch": "noarch", ++ "build_id": 1144552, ++ "buildroot_id": 5775376, ++ "buildtime": 1584979612, ++ "epoch": null, ++ "extra": null, ++ "id": 7883864, ++ "metadata_only": false, ++ "name": "stax-ex-javadoc", ++ "payloadhash": "3059769a5368e04b6b279847de2b7d70", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 73323, ++ "version": "1.7.7" ++ }, ++ { ++ "arch": "src", ++ "build_id": 1144552, ++ "buildroot_id": 5775376, ++ "buildtime": 1584979588, ++ "epoch": null, ++ "extra": null, ++ "id": 7883863, ++ "metadata_only": false, ++ "name": "stax-ex", ++ "payloadhash": "b42cad1ce475d57336c469a35d76c81d", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "size": 50376, ++ "version": "1.7.7" ++ } ++ ], ++ [ ++ { ++ "tag_id": 80063, ++ "tag_name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "id": 1557161, ++ "build_id": 1557161, ++ "version": "10.8.3", ++ "release": "6.module+el8.2.0+10554+cf83aa72", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2021-03-30 23:30:32.156112", ++ "start_time": "2021-03-30 23:15:00.102532", ++ "task_id": 35853377, ++ "creation_event_id": 38240589, ++ "creation_time": "2021-03-30 23:15:00.109509", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 31009, ++ "package_name": "pki-core", ++ "name": "pki-core", ++ "nvr": "pki-core-10.8.3-6.module+el8.2.0+10554+cf83aa72", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 80063, ++ "tag_name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "id": 1166092, ++ "build_id": 1166092, ++ "version": "7.4.1", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-04-14 19:05:27.833927", ++ "start_time": "2020-04-14 19:03:09.327430", ++ "task_id": 27929461, ++ "creation_event_id": 30835934, ++ "creation_time": "2020-04-14 19:03:09.327430", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 3207, ++ "package_name": "tomcatjss", ++ "name": "tomcatjss", ++ "nvr": "tomcatjss-7.4.1-2.module+el8.2.0+6294+b7db4606", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 80063, ++ "tag_name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "id": 1166093, ++ "build_id": 1166093, ++ "version": "4.21.0", ++ "release": "2.module+el8.2.0+6294+b7db4606", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-04-14 19:05:27.838380", ++ "start_time": "2020-04-14 19:03:09.334948", ++ "task_id": 27929462, ++ "creation_event_id": 30835935, ++ "creation_time": "2020-04-14 19:03:09.334948", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 1827, ++ "package_name": "ldapjdk", ++ "name": "ldapjdk", ++ "nvr": "ldapjdk-4.21.0-2.module+el8.2.0+6294+b7db4606", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 80063, ++ "tag_name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "id": 1557155, ++ "build_id": 1557155, ++ "version": "4.6.2", ++ "release": "12.module+el8.2.0+10554+cf83aa72", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2021-03-30 22:55:43.295439", ++ "start_time": "2021-03-30 22:44:59.531892", ++ "task_id": 35852065, ++ "creation_event_id": 38240172, ++ "creation_time": "2021-03-30 22:44:59.539155", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 3766, ++ "package_name": "jss", ++ "name": "jss", ++ "nvr": "jss-4.6.2-12.module+el8.2.0+10554+cf83aa72", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 80063, ++ "tag_name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "id": 1557147, ++ "build_id": 1557147, ++ "version": "0.1", ++ "release": "1.module+el8.2.0+10554+cf83aa72", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2021-03-30 22:36:11.143167", ++ "start_time": "2021-03-30 22:34:38.783064", ++ "task_id": 35851170, ++ "creation_event_id": 38239974, ++ "creation_time": "2021-03-30 22:34:38.790361", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 63471, ++ "package_name": "module-build-macros", ++ "name": "module-build-macros", ++ "nvr": "module-build-macros-0.1-1.module+el8.2.0+10554+cf83aa72", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 1062086, ++ "build_id": 1062086, ++ "version": "0.4", ++ "release": "4.module+el8.2.0+5496+53199ee7", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-01-18 10:52:42.572941", ++ "start_time": "2020-01-18 10:45:17.842872", ++ "task_id": 25853543, ++ "creation_event_id": 28651716, ++ "creation_time": "2020-01-18 10:45:17.842872", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 71890, ++ "package_name": "ipa-healthcheck", ++ "name": "ipa-healthcheck", ++ "nvr": "ipa-healthcheck-0.4-4.module+el8.2.0+5496+53199ee7", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959057, ++ "build_id": 959057, ++ "version": "1.3.2", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:52:00.858675", ++ "start_time": "2019-08-30 08:50:27.937792", ++ "task_id": 23245908, ++ "creation_event_id": 26065866, ++ "creation_time": "2019-08-30 08:50:27.937792", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 48014, ++ "package_name": "python-yubico", ++ "name": "python-yubico", ++ "nvr": "python-yubico-1.3.2-9.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959056, ++ "build_id": 959056, ++ "version": "0.6.0", ++ "release": "3.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:52:00.901940", ++ "start_time": "2019-08-30 08:50:26.423040", ++ "task_id": 23245907, ++ "creation_event_id": 26065865, ++ "creation_time": "2019-08-30 08:50:26.423040", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 57745, ++ "package_name": "custodia", ++ "name": "custodia", ++ "nvr": "custodia-0.6.0-3.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959052, ++ "build_id": 959052, ++ "version": "0.5.0", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:47:21.842483", ++ "start_time": "2019-08-30 08:44:58.038593", ++ "task_id": 23245840, ++ "creation_event_id": 26065820, ++ "creation_time": "2019-08-30 08:44:58.038593", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 57746, ++ "package_name": "python-jwcrypto", ++ "name": "python-jwcrypto", ++ "nvr": "python-jwcrypto-0.5.0-1.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959051, ++ "build_id": 959051, ++ "version": "1.0.0", ++ "release": "9.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:45:05.456528", ++ "start_time": "2019-08-30 08:43:31.570198", ++ "task_id": 23245841, ++ "creation_event_id": 26065814, ++ "creation_time": "2019-08-30 08:43:31.570198", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 16872, ++ "package_name": "pyusb", ++ "name": "pyusb", ++ "nvr": "pyusb-1.0.0-9.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959042, ++ "build_id": 959042, ++ "version": "1.4.14", ++ "release": "1.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:30:44.929465", ++ "start_time": "2019-08-30 08:26:10.146887", ++ "task_id": 23245684, ++ "creation_event_id": 26065672, ++ "creation_time": "2019-08-30 08:26:10.146887", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 47997, ++ "package_name": "opendnssec", ++ "name": "opendnssec", ++ "nvr": "opendnssec-1.4.14-1.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 1139326, ++ "build_id": 1139326, ++ "version": "4.8.4", ++ "release": "7.module+el8.2.0+6047+59605870", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-03-18 16:41:10.205454", ++ "start_time": "2020-03-18 16:31:40.883073", ++ "task_id": 27330869, ++ "creation_event_id": 30176561, ++ "creation_time": "2020-03-18 16:31:40.883073", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 4384, ++ "package_name": "ipa", ++ "name": "ipa", ++ "nvr": "ipa-4.8.4-7.module+el8.2.0+6047+59605870", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 1022957, ++ "build_id": 1022957, ++ "version": "11.2", ++ "release": "3.module+el8.2.0+4945+d8a939b5", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-11-28 08:45:15.174888", ++ "start_time": "2019-11-28 08:41:05.791483", ++ "task_id": 25009845, ++ "creation_event_id": 27592282, ++ "creation_time": "2019-11-28 08:41:05.791483", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 12568, ++ "package_name": "bind-dyndb-ldap", ++ "name": "bind-dyndb-ldap", ++ "nvr": "bind-dyndb-ldap-11.2-3.module+el8.2.0+4945+d8a939b5", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 1093586, ++ "build_id": 1093586, ++ "version": "2.4.0", ++ "release": "4.module+el8.2.0+5780+11c8542f", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-02-17 19:50:24.871320", ++ "start_time": "2020-02-17 19:42:31.001861", ++ "task_id": 26575317, ++ "creation_event_id": 29360880, ++ "creation_time": "2020-02-17 19:42:31.001861", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 48016, ++ "package_name": "softhsm", ++ "name": "softhsm", ++ "nvr": "softhsm-2.4.0-4.module+el8.2.0+5780+11c8542f", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959041, ++ "build_id": 959041, ++ "version": "5.1", ++ "release": "12.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:26:53.234912", ++ "start_time": "2019-08-30 08:26:07.970261", ++ "task_id": 23245686, ++ "creation_event_id": 26065671, ++ "creation_time": "2019-08-30 08:26:07.970261", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 48015, ++ "package_name": "python-qrcode", ++ "name": "python-qrcode", ++ "nvr": "python-qrcode-5.1-12.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 61343, ++ "tag_name": "module-idm-client-8020020200318161700-8aefd78c", ++ "id": 959046, ++ "build_id": 959046, ++ "version": "0.56.3", ++ "release": "2.module+el8.1.0+4107+4a66eb87", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-08-30 08:39:58.938737", ++ "start_time": "2019-08-30 08:28:34.912162", ++ "task_id": 23245688, ++ "creation_event_id": 26065705, ++ "creation_time": "2019-08-30 08:28:34.912162", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 9749, ++ "package_name": "slapi-nis", ++ "name": "slapi-nis", ++ "nvr": "slapi-nis-0.56.3-2.module+el8.1.0+4107+4a66eb87", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 22929, ++ "tag_name": "module-golang-ecosystem-1.0-8010020190610193038-ccff3eb7", ++ "id": 909543, ++ "build_id": 909543, ++ "version": "1.0.7", ++ "release": "13.module+el8.1.0+3342+b2bcedec", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-10 19:44:24.912517", ++ "start_time": "2019-06-10 19:40:37.722776", ++ "task_id": 22093565, ++ "creation_event_id": 25060641, ++ "creation_time": "2019-06-10 19:40:37.722776", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 49920, ++ "package_name": "golang-github-cpuguy83-go-md2man", ++ "name": "golang-github-cpuguy83-go-md2man", ++ "nvr": "golang-github-cpuguy83-go-md2man-1.0.7-13.module+el8.1.0+3342+b2bcedec", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1144584, ++ "build_id": 1144584, ++ "version": "3.0.26", ++ "release": "3.module+el8.2.0+5723+4574fbff", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-03-23 16:49:22.533970", ++ "start_time": "2020-03-23 16:47:47.187681", ++ "task_id": 27427014, ++ "creation_event_id": 30246146, ++ "creation_time": "2020-03-23 16:47:47.187681", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 13085, ++ "package_name": "resteasy", ++ "name": "resteasy", ++ "nvr": "resteasy-3.0.26-3.module+el8.2.0+5723+4574fbff", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 941248, ++ "build_id": 941248, ++ "version": "2.9.9", ++ "release": "1.module+el8.1.0+3832+9784644d", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-07-31 21:56:52.799032", ++ "start_time": "2019-07-31 21:52:57.339380", ++ "task_id": 22859408, ++ "creation_event_id": 25753876, ++ "creation_time": "2019-07-31 21:52:57.339380", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 45351, ++ "package_name": "jackson-jaxrs-providers", ++ "name": "jackson-jaxrs-providers", ++ "nvr": "jackson-jaxrs-providers-2.9.9-1.module+el8.1.0+3832+9784644d", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910869, ++ "build_id": 910869, ++ "version": "2.7.6", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 17:43:12.036872", ++ "start_time": "2019-06-12 17:41:41.564940", ++ "task_id": 22125211, ++ "creation_event_id": 25088144, ++ "creation_time": "2019-06-12 17:41:41.564940", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 45352, ++ "package_name": "jackson-module-jaxb-annotations", ++ "name": "jackson-module-jaxb-annotations", ++ "nvr": "jackson-module-jaxb-annotations-2.7.6-4.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1028087, ++ "build_id": 1028087, ++ "version": "2.10.0", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-12-04 23:02:55.539209", ++ "start_time": "2019-12-04 22:59:50.165698", ++ "task_id": 25162114, ++ "creation_event_id": 27708627, ++ "creation_time": "2019-12-04 22:59:50.165698", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 43280, ++ "package_name": "jackson-databind", ++ "name": "jackson-databind", ++ "nvr": "jackson-databind-2.10.0-1.module+el8.2.0+5059+3eb3af25", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1028078, ++ "build_id": 1028078, ++ "version": "2.10.0", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-12-04 22:54:09.385299", ++ "start_time": "2019-12-04 22:46:23.987102", ++ "task_id": 25162058, ++ "creation_event_id": 27708569, ++ "creation_time": "2019-12-04 22:46:23.987102", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 43278, ++ "package_name": "jackson-annotations", ++ "name": "jackson-annotations", ++ "nvr": "jackson-annotations-2.10.0-1.module+el8.2.0+5059+3eb3af25", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1028074, ++ "build_id": 1028074, ++ "version": "2.10.0", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-12-04 22:40:36.462594", ++ "start_time": "2019-12-04 22:33:13.006789", ++ "task_id": 25161968, ++ "creation_event_id": 27708521, ++ "creation_time": "2019-12-04 22:33:13.006789", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 43279, ++ "package_name": "jackson-core", ++ "name": "jackson-core", ++ "nvr": "jackson-core-2.10.0-1.module+el8.2.0+5059+3eb3af25", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1028067, ++ "build_id": 1028067, ++ "version": "2.10.0", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-12-04 22:19:26.978961", ++ "start_time": "2019-12-04 22:15:59.673943", ++ "task_id": 25161580, ++ "creation_event_id": 27708363, ++ "creation_time": "2019-12-04 22:15:59.673943", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 68020, ++ "package_name": "jackson-bom", ++ "name": "jackson-bom", ++ "nvr": "jackson-bom-2.10.0-1.module+el8.2.0+5059+3eb3af25", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1028063, ++ "build_id": 1028063, ++ "version": "2.10", ++ "release": "1.module+el8.2.0+5059+3eb3af25", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-12-04 22:08:12.115745", ++ "start_time": "2019-12-04 22:04:11.784565", ++ "task_id": 25161418, ++ "creation_event_id": 27708221, ++ "creation_time": "2019-12-04 22:04:11.784565", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 50635, ++ "package_name": "jackson-parent", ++ "name": "jackson-parent", ++ "nvr": "jackson-parent-2.10-1.module+el8.2.0+5059+3eb3af25", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910844, ++ "build_id": 910844, ++ "version": "2.2.11", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:55:09.958186", ++ "start_time": "2019-06-12 16:52:08.783199", ++ "task_id": 22124769, ++ "creation_event_id": 25087838, ++ "creation_time": "2019-06-12 16:52:08.783199", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 9726, ++ "package_name": "glassfish-jaxb", ++ "name": "glassfish-jaxb", ++ "nvr": "glassfish-jaxb-2.2.11-11.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910842, ++ "build_id": 910842, ++ "version": "1.2.13", ++ "release": "9.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:48:58.888641", ++ "start_time": "2019-06-12 16:42:56.398154", ++ "task_id": 22124569, ++ "creation_event_id": 25087790, ++ "creation_time": "2019-06-12 16:42:56.398154", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 37969, ++ "package_name": "glassfish-fastinfoset", ++ "name": "glassfish-fastinfoset", ++ "nvr": "glassfish-fastinfoset-1.2.13-9.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1144557, ++ "build_id": 1144557, ++ "version": "1.5.4", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-03-23 16:12:46.524009", ++ "start_time": "2020-03-23 16:11:11.780927", ++ "task_id": 27426620, ++ "creation_event_id": 30245857, ++ "creation_time": "2020-03-23 16:11:11.780927", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 60048, ++ "package_name": "xmlstreambuffer", ++ "name": "xmlstreambuffer", ++ "nvr": "xmlstreambuffer-1.5.4-8.module+el8.2.0+5723+4574fbff", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910836, ++ "build_id": 910836, ++ "version": "0", ++ "release": "19.20110809svn.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:36:05.606122", ++ "start_time": "2019-06-12 16:34:29.942008", ++ "task_id": 22124434, ++ "creation_event_id": 25087679, ++ "creation_time": "2019-06-12 16:34:29.942008", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 37983, ++ "package_name": "xsom", ++ "name": "xsom", ++ "nvr": "xsom-0-19.20110809svn.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1144552, ++ "build_id": 1144552, ++ "version": "1.7.7", ++ "release": "8.module+el8.2.0+5723+4574fbff", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-03-23 16:07:17.200775", ++ "start_time": "2020-03-23 16:05:41.101688", ++ "task_id": 27426549, ++ "creation_event_id": 30245800, ++ "creation_time": "2020-03-23 16:05:41.101688", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 12467, ++ "package_name": "stax-ex", ++ "name": "stax-ex", ++ "nvr": "stax-ex-1.7.7-8.module+el8.2.0+5723+4574fbff", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910827, ++ "build_id": 910827, ++ "version": "1.12", ++ "release": "14.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:28:53.545249", ++ "start_time": "2019-06-12 16:26:36.261882", ++ "task_id": 22124373, ++ "creation_event_id": 25087563, ++ "creation_time": "2019-06-12 16:26:36.261882", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 34342, ++ "package_name": "relaxngcc", ++ "name": "relaxngcc", ++ "nvr": "relaxngcc-1.12-14.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910821, ++ "build_id": 910821, ++ "version": "2.7.1", ++ "release": "38.module+el8.1.0+3366+6dfb954c", ++ "epoch": 0, ++ "state": 1, ++ "completion_time": "2019-06-12 16:21:24.143262", ++ "start_time": "2019-06-12 16:19:01.398195", ++ "task_id": 22124283, ++ "creation_event_id": 25087483, ++ "creation_time": "2019-06-12 16:19:01.398195", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 1100, ++ "package_name": "xalan-j2", ++ "name": "xalan-j2", ++ "nvr": "xalan-j2-2.7.1-38.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910820, ++ "build_id": 910820, ++ "version": "2013.6.1", ++ "release": "11.module+el8.1.0+3366+6dfb954c", ++ "epoch": 1, ++ "state": 1, ++ "completion_time": "2019-06-12 16:22:38.206178", ++ "start_time": "2019-06-12 16:18:51.956217", ++ "task_id": 22124282, ++ "creation_event_id": 25087478, ++ "creation_time": "2019-06-12 16:18:51.956217", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 2199, ++ "package_name": "msv", ++ "name": "msv", ++ "nvr": "msv-2013.6.1-11.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910795, ++ "build_id": 910795, ++ "version": "2011.1", ++ "release": "7.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:04:45.263988", ++ "start_time": "2019-06-12 16:02:22.213666", ++ "task_id": 22123719, ++ "creation_event_id": 25087217, ++ "creation_time": "2019-06-12 16:02:22.213666", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 2686, ++ "package_name": "relaxngDatatype", ++ "name": "relaxngDatatype", ++ "nvr": "relaxngDatatype-2011.1-7.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910793, ++ "build_id": 910793, ++ "version": "1.4.01", ++ "release": "25.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:05:54.069829", ++ "start_time": "2019-06-12 16:01:57.296925", ++ "task_id": 22123699, ++ "creation_event_id": 25087188, ++ "creation_time": "2019-06-12 16:01:57.296925", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 3720, ++ "package_name": "xml-commons-apis", ++ "name": "xml-commons-apis", ++ "nvr": "xml-commons-apis-1.4.01-25.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910800, ++ "build_id": 910800, ++ "version": "1.2", ++ "release": "26.module+el8.1.0+3366+6dfb954c", ++ "epoch": 0, ++ "state": 1, ++ "completion_time": "2019-06-12 16:04:14.369817", ++ "start_time": "2019-06-12 16:02:34.507234", ++ "task_id": 22123700, ++ "creation_event_id": 25087239, ++ "creation_time": "2019-06-12 16:02:34.507234", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 763, ++ "package_name": "xml-commons-resolver", ++ "name": "xml-commons-resolver", ++ "nvr": "xml-commons-resolver-1.2-26.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910798, ++ "build_id": 910798, ++ "version": "1.0", ++ "release": "0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:06:17.229810", ++ "start_time": "2019-06-12 16:02:22.601136", ++ "task_id": 22123701, ++ "creation_event_id": 25087220, ++ "creation_time": "2019-06-12 16:02:22.601136", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 759, ++ "package_name": "xml-stylebook", ++ "name": "xml-stylebook", ++ "nvr": "xml-stylebook-1.0-0.25.b3_xalan2.svn313293.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910811, ++ "build_id": 910811, ++ "version": "3.2.2", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:13:33.388340", ++ "start_time": "2019-06-12 16:07:24.210737", ++ "task_id": 22123703, ++ "creation_event_id": 25087331, ++ "creation_time": "2019-06-12 16:07:24.210737", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 33807, ++ "package_name": "apache-commons-collections", ++ "name": "apache-commons-collections", ++ "nvr": "apache-commons-collections-3.2.2-10.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910807, ++ "build_id": 910807, ++ "version": "2.6", ++ "release": "21.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:07:47.952306", ++ "start_time": "2019-06-12 16:06:10.260233", ++ "task_id": 22123704, ++ "creation_event_id": 25087303, ++ "creation_time": "2019-06-12 16:06:10.260233", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 33833, ++ "package_name": "apache-commons-lang", ++ "name": "apache-commons-lang", ++ "nvr": "apache-commons-lang-2.6-21.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910787, ++ "build_id": 910787, ++ "version": "26", ++ "release": "6.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:03:05.056755", ++ "start_time": "2019-06-12 16:01:31.536069", ++ "task_id": 22123706, ++ "creation_event_id": 25087166, ++ "creation_time": "2019-06-12 16:01:31.536069", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 43339, ++ "package_name": "fasterxml-oss-parent", ++ "name": "fasterxml-oss-parent", ++ "nvr": "fasterxml-oss-parent-26-6.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910797, ++ "build_id": 910797, ++ "version": "1.2.0", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:05:31.235114", ++ "start_time": "2019-06-12 16:02:22.471697", ++ "task_id": 22123705, ++ "creation_event_id": 25087219, ++ "creation_time": "2019-06-12 16:02:22.471697", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 1468, ++ "package_name": "bea-stax", ++ "name": "bea-stax", ++ "nvr": "bea-stax-1.2.0-16.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910799, ++ "build_id": 910799, ++ "version": "2.2.12", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:09:33.487726", ++ "start_time": "2019-06-12 16:02:24.543154", ++ "task_id": 22123708, ++ "creation_event_id": 25087223, ++ "creation_time": "2019-06-12 16:02:24.543154", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 37970, ++ "package_name": "glassfish-jaxb-api", ++ "name": "glassfish-jaxb-api", ++ "nvr": "glassfish-jaxb-api-2.2.12-8.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910809, ++ "build_id": 910809, ++ "version": "3.1", ++ "release": "28.module+el8.1.0+3366+6dfb954c", ++ "epoch": 1, ++ "state": 1, ++ "completion_time": "2019-06-12 16:09:21.928440", ++ "start_time": "2019-06-12 16:06:18.504802", ++ "task_id": 22123709, ++ "creation_event_id": 25087308, ++ "creation_time": "2019-06-12 16:06:18.504802", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 955, ++ "package_name": "jakarta-commons-httpclient", ++ "name": "jakarta-commons-httpclient", ++ "nvr": "jakarta-commons-httpclient-3.1-28.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910805, ++ "build_id": 910805, ++ "version": "9.0.7", ++ "release": "16.module+el8.1.0+3366+6dfb954c", ++ "epoch": 1, ++ "state": 1, ++ "completion_time": "2019-06-12 16:12:02.094701", ++ "start_time": "2019-06-12 16:05:03.209828", ++ "task_id": 22123713, ++ "creation_event_id": 25087291, ++ "creation_time": "2019-06-12 16:05:03.209828", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 71828, ++ "package_name": "pki-servlet-engine", ++ "name": "pki-servlet-engine", ++ "nvr": "pki-servlet-engine-9.0.7-16.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910790, ++ "build_id": 910790, ++ "version": "3.18.1", ++ "release": "8.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:04:40.971244", ++ "start_time": "2019-06-12 16:01:32.551323", ++ "task_id": 22123710, ++ "creation_event_id": 25087169, ++ "creation_time": "2019-06-12 16:01:32.551323", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 1717, ++ "package_name": "javassist", ++ "name": "javassist", ++ "nvr": "javassist-3.18.1-8.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910789, ++ "build_id": 910789, ++ "version": "1.0.1", ++ "release": "10.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:08:43.230692", ++ "start_time": "2019-06-12 16:01:32.429345", ++ "task_id": 22123716, ++ "creation_event_id": 25087168, ++ "creation_time": "2019-06-12 16:01:32.429345", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 12425, ++ "package_name": "python-nss", ++ "name": "python-nss", ++ "nvr": "python-nss-1.0.1-10.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910803, ++ "build_id": 910803, ++ "version": "2.11.0", ++ "release": "34.module+el8.1.0+3366+6dfb954c", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2019-06-12 16:14:39.929076", ++ "start_time": "2019-06-12 16:03:56.994817", ++ "task_id": 22123725, ++ "creation_event_id": 25087276, ++ "creation_time": "2019-06-12 16:03:56.994817", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 818, ++ "package_name": "xerces-j2", ++ "name": "xerces-j2", ++ "nvr": "xerces-j2-2.11.0-34.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910788, ++ "build_id": 910788, ++ "version": "1.7.25", ++ "release": "4.module+el8.1.0+3366+6dfb954c", ++ "epoch": 0, ++ "state": 1, ++ "completion_time": "2019-06-12 16:04:39.118435", ++ "start_time": "2019-06-12 16:01:32.421713", ++ "task_id": 22123721, ++ "creation_event_id": 25087167, ++ "creation_time": "2019-06-12 16:01:32.421713", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 3565, ++ "package_name": "slf4j", ++ "name": "slf4j", ++ "nvr": "slf4j-1.7.25-4.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 910796, ++ "build_id": 910796, ++ "version": "1.7", ++ "release": "24.module+el8.1.0+3366+6dfb954c", ++ "epoch": 0, ++ "state": 1, ++ "completion_time": "2019-06-12 16:10:57.401027", ++ "start_time": "2019-06-12 16:02:22.399510", ++ "task_id": 22123723, ++ "creation_event_id": 25087218, ++ "creation_time": "2019-06-12 16:02:22.399510", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 1190, ++ "package_name": "velocity", ++ "name": "velocity", ++ "nvr": "velocity-1.7-24.module+el8.1.0+3366+6dfb954c", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ }, ++ { ++ "tag_id": 59718, ++ "tag_name": "module-pki-deps-10.6-8020020200213065606-6a468ee4", ++ "id": 1144545, ++ "build_id": 1144545, ++ "version": "2.0.1", ++ "release": "6.module+el8.2.0+5723+4574fbff", ++ "epoch": null, ++ "state": 1, ++ "completion_time": "2020-03-23 15:54:44.540349", ++ "start_time": "2020-03-23 15:52:22.479426", ++ "task_id": 27426349, ++ "creation_event_id": 30245667, ++ "creation_time": "2020-03-23 15:52:22.479426", ++ "volume_id": 9, ++ "volume_name": "rhel-8", ++ "package_id": 59554, ++ "package_name": "glassfish-jax-rs-api", ++ "name": "glassfish-jax-rs-api", ++ "nvr": "glassfish-jax-rs-api-2.0.1-6.module+el8.2.0+5723+4574fbff", ++ "owner_id": 4066, ++ "owner_name": "mbs" ++ } ++ ] ++] ++ +diff --git a/bld2repo/tests/test_data/pki_core_tags.json b/bld2repo/tests/test_data/pki_core_tags.json +new file mode 100644 +index 0000000..07e93fd +--- /dev/null ++++ b/bld2repo/tests/test_data/pki_core_tags.json +@@ -0,0 +1,33 @@ ++[ ++ { ++ "arches": "aarch64 i686 ppc64le s390x x86_64", ++ "id": 80062, ++ "locked": false, ++ "maven_include_all": false, ++ "maven_support": false, ++ "name": "module-pki-core-10.6-8020020210330222148-bbc64e6e", ++ "perm": "module-tagger", ++ "perm_id": 64 ++ }, ++ { ++ "arches": "aarch64 i686 ppc64le s390x x86_64", ++ "id": 80063, ++ "locked": false, ++ "maven_include_all": false, ++ "maven_support": false, ++ "name": "module-pki-core-10.6-8020020210330222148-bbc64e6e-build", ++ "perm": "module-tagger", ++ "perm_id": 64 ++ }, ++ { ++ "arches": "", ++ "id": 80123, ++ "locked": false, ++ "maven_include_all": false, ++ "maven_support": false, ++ "name": "RHSA-2021:69566-pending", ++ "perm": "trusted", ++ "perm_id": 6 ++ } ++] ++ +diff --git a/bld2repo/tests/utils.py b/bld2repo/tests/utils.py +new file mode 100644 +index 0000000..3df45b0 +--- /dev/null ++++ b/bld2repo/tests/utils.py +@@ -0,0 +1,13 @@ ++import json ++import os ++ ++ ++def load_test_data(filename): ++ file_path = "test_data/{filename}.json".format(filename=filename) ++ dirname = os.path.dirname(os.path.abspath(__file__)) ++ abs_file_path = os.path.join(dirname, file_path) ++ with open(abs_file_path, "r") as fp: ++ data = json.load(fp) ++ ++ return data ++ +diff --git a/createrepo_mod/createrepo_mod/__init__.py b/createrepo_mod/createrepo_mod/__init__.py +new file mode 100644 +index 0000000..e69de29 +diff --git a/createrepo_mod/createrepo_mod.py b/createrepo_mod/createrepo_mod/createrepo_mod.py +similarity index 100% +rename from createrepo_mod/createrepo_mod.py +rename to createrepo_mod/createrepo_mod/createrepo_mod.py +diff --git a/createrepo_mod/requirements.txt b/createrepo_mod/requirements.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/createrepo_mod/setup.py b/createrepo_mod/setup.py +new file mode 100644 +index 0000000..0f92990 +--- /dev/null ++++ b/createrepo_mod/setup.py +@@ -0,0 +1,38 @@ ++#!/usr/bin/python3 ++# -*- coding: utf-8 -*- ++ ++from setuptools import setup, find_packages ++ ++with open("README.md", "r") as fh: ++ long_description = fh.read() ++ ++with open('requirements.txt') as f: ++ requires = f.read().splitlines() ++ ++setup( ++ name='createrepo_mod', ++ version='0.1', ++ packages=find_packages(), ++ url='https://github.com/rpm-software-management/modulemd-tools', ++ license='MIT', ++ author='Jakub Kadlcik', ++ author_email='frostyx@email.cz', ++ description=('A small wrapper around `createrepo_c` and `modifyrepo_c` ' ++ 'to provide an easy tool for generating module repositories.'), ++ long_description=long_description, ++ long_description_content_type='text/markdown', ++ # createrepo_mod also requires libmodulemd not available on PyPI ++ # and must be installed separately. ++ # On Fedora, this is done with `dnf install python3-libmodulemd` ++ install_requires=requires, ++ entry_points={ ++ 'console_scripts': [ ++ 'createrepo_mod=createrepo_mod.createrepo_mod:main'], ++ }, ++ classifiers=[ ++ "Programming Language :: Python :: 3", ++ "License :: OSI Approved :: MIT License", ++ "Operating System :: POSIX :: Linux", ++ ], ++ include_package_data=True, ++) +diff --git a/createrepo_mod/test-requirements.txt b/createrepo_mod/test-requirements.txt +new file mode 100644 +index 0000000..e079f8a +--- /dev/null ++++ b/createrepo_mod/test-requirements.txt +@@ -0,0 +1 @@ ++pytest +diff --git a/createrepo_mod/tests/conftest.py b/createrepo_mod/tests/conftest.py +new file mode 100644 +index 0000000..a5ba4c9 +--- /dev/null ++++ b/createrepo_mod/tests/conftest.py +@@ -0,0 +1,7 @@ ++import pytest ++ ++ ++@pytest.fixture(scope="session") ++def test_output_dir(tmpdir_factory): ++ test_output_dir = tmpdir_factory.mktemp("output") ++ return test_output_dir +diff --git a/createrepo_mod/tests/module_yamls/dummy.yaml b/createrepo_mod/tests/module_yamls/dummy.yaml +new file mode 100644 +index 0000000..cf32ceb +--- /dev/null ++++ b/createrepo_mod/tests/module_yamls/dummy.yaml +@@ -0,0 +1,40 @@ ++--- ++document: modulemd-defaults ++version: 1 ++data: ++ module: dummy ++ stream: rolling ++ profiles: ++ rolling: [everything] ++... ++--- ++document: modulemd ++version: 2 ++data: ++ name: dummy ++ stream: rolling ++ version: 1 ++ context: abcdef12 ++ summary: ++ description: >- ++ ++ license: ++ module: ++ - MIT ++ content: ++ - ++ profiles: ++ everything: ++ rpms: ++ - python-django-bash-completion ++ api: ++ rpms: ++ - python-django-bash-completion ++ components: ++ rpms: ++ python-django: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - python-django-bash-completion-0:3.0.10-3.fc33.noarch ++... +diff --git a/createrepo_mod/tests/test_createrepo_mod.py b/createrepo_mod/tests/test_createrepo_mod.py +new file mode 100644 +index 0000000..2cb1fc8 +--- /dev/null ++++ b/createrepo_mod/tests/test_createrepo_mod.py +@@ -0,0 +1,49 @@ ++import glob ++import logging ++import os.path ++import shutil ++ ++import pytest ++ ++from createrepo_mod.createrepo_mod import ( ++ run_createrepo, run_modifyrepo, find_module_yamls, dump_modules_yaml) ++ ++ ++logger = logging.getLogger(__name__) ++ ++dirname = os.path.dirname(os.path.realpath(__file__)) ++test_packages_dir = os.path.join(dirname, "packages") ++test_module_yamls_dir = os.path.join(dirname, "module_yamls") ++ ++ ++def test_run_createrepo(test_output_dir): ++ # I'd rather use shutil.copytree with dirs_exist_ok=True, but it requires Python 3.8+ ++ for package in glob.glob(os.path.join(test_packages_dir, "*.rpm")): ++ shutil.copy(package, test_output_dir) ++ retval = run_createrepo([test_output_dir]) ++ assert os.path.isdir(os.path.join(test_output_dir, "repodata")) ++ assert os.path.isfile(os.path.join(test_output_dir, "repodata", "repomd.xml")) ++ assert retval == 0 ++ ++ ++def test_find_module_yamls(): ++ assert len(find_module_yamls(test_module_yamls_dir)) > 0 ++ ++ ++@pytest.mark.skipif(shutil.which("modulemd-merge") is None, reason="requires modulemd-merge") ++def test_dump_modules_yaml(test_output_dir): ++ dump_modules_yaml(test_output_dir, find_module_yamls(test_module_yamls_dir)) ++ assert os.path.isfile(os.path.join(test_output_dir, "modules.yaml")) ++ ++ ++def test_run_modifyrepo(test_output_dir): ++ if not os.path.isfile(os.path.join(test_output_dir, "modules.yaml")): ++ logger.info("Seems like test_dump_modules_yaml was skipped. " ++ "Creating modules.yaml from dummy.yaml.") ++ shutil.copy(os.path.join(test_module_yamls_dir, "dummy.yaml"), ++ os.path.join(test_output_dir, "modules.yaml")) ++ ++ assert os.path.isfile(os.path.join(test_output_dir, "modules.yaml")) ++ retval = run_modifyrepo(test_output_dir) ++ assert glob.glob(os.path.join(test_output_dir, "repodata", "*-modules.yaml.gz")) ++ assert retval == 0 +diff --git a/dir2module/dir2module/dir2module.py b/dir2module/dir2module/dir2module.py +index 9902aec..6643a83 100755 +--- a/dir2module/dir2module/dir2module.py ++++ b/dir2module/dir2module/dir2module.py +@@ -20,13 +20,13 @@ gi.require_version("Modulemd", "2.0") + from gi.repository import Modulemd # noqa: E402 + + +-class Module(object): ++class ModuleBase: + """ +- Provide a high-level interface for representing modules and yaml generation +- based on their values. ++ Base class for modulemd things + """ ++ + def __init__(self, name, stream, version, context, arch, summary, +- description, module_license, licenses, package_nevras, requires): ++ description, module_license, licenses, packages, requires): + self.name = name + self.stream = stream + self.version = version +@@ -36,18 +36,69 @@ class Module(object): + self.description = description + self.module_license = module_license + self.licenses = licenses +- self.package_nevras = package_nevras ++ self.packages = packages + self.requires = requires + ++ @property ++ def filename_format(self): ++ """ ++ String format for the modulemd filename. It can contain the following ++ variables: ++ {N} - Module name ++ {S} - Module stream name ++ {V} - Module version ++ {C} - Module context ++ {A} - Module architecture ++ """ ++ raise NotImplementedError ++ ++ def dumps(self): ++ """ ++ Generate YAML based on input parameters and return it as a string ++ """ ++ raise NotImplementedError ++ + @property + def filename(self): + """ + Generate filename for a module yaml + """ +- return "{N}:{S}:{V}:{C}:{A}.modulemd.yaml".format( ++ return self.filename_format.format( + N=self.name, S=self.stream, V=self.version, + C=self.context, A=self.arch) + ++ def dump(self): ++ """ ++ Generate modulemd yaml based on input parameters write it into file ++ """ ++ with open(self.filename, "w") as moduleyaml: ++ moduleyaml.write(self.dumps()) ++ ++ @property ++ def package_names(self): ++ """ ++ Return the list of unique package names within this module ++ """ ++ return {package.header.name for package in self.packages} ++ ++ @property ++ def package_nevras(self): ++ """ ++ Return the list of unique package NEVRAs within this module ++ """ ++ return {package.nevra for package in self.packages} ++ ++ ++class Module(ModuleBase): ++ """ ++ Provide a high-level interface for representing modules and yaml generation ++ based on their values. ++ """ ++ ++ @property ++ def filename_format(self): ++ return "{N}:{S}:{V}:{C}:{A}.modulemd.yaml" ++ + def dumps(self): + """ + Generate modulemd yaml based on input parameters and return it as a string +@@ -70,16 +121,37 @@ class Module(object): + dependencies.add_runtime_stream(depname, depstream) + mod_stream.add_dependencies(dependencies) + ++ profile = Modulemd.Profile.new("common") ++ for pkgname in self.package_names: ++ profile.add_rpm(pkgname) ++ mod_stream.add_profile(profile) ++ + index = Modulemd.ModuleIndex.new() + index.add_module_stream(mod_stream) + return index.dump_to_string() + +- def dump(self): ++ ++class ModuleDefaults(ModuleBase): ++ """ ++ Provide a high-level interface for representing modulemd defaults files ++ """ ++ ++ @property ++ def filename_format(self): ++ return "{N}:{S}:{V}:{C}:{A}.modulemd-defaults.yaml" ++ ++ def dumps(self): + """ +- Generate modulemd yaml based on input parameters write it into file ++ Generate modulemd_defaults yaml based on input parameters and return it ++ as a string + """ +- with open(self.filename, "w") as moduleyaml: +- moduleyaml.write(self.dumps()) ++ mod_defaults = Modulemd.DefaultsV1.new(self.name) ++ mod_defaults.set_default_stream(self.stream) ++ mod_defaults.add_default_profile_for_stream(self.stream, "common") ++ ++ index = Modulemd.ModuleIndex.new() ++ index.add_defaults(mod_defaults) ++ return index.dump_to_string() + + + class Package(object): +@@ -220,7 +292,6 @@ def main(): + + packages = [Package(package) for package in packages] + licenses = {package.license for package in packages} +- nevras = {package.nevra for package in packages} + + requires = parse_dependencies(args.requires) + description = args.description \ +@@ -238,8 +309,10 @@ def main(): + raise RuntimeError("All packages need to contain the `modularitylabel` header. " + "To suppress this constraint, use `--force` parameter") + +- module = Module(name, stream, version, context, arch, args.summary, +- description, args.license, licenses, nevras, requires) ++ modargs = [name, stream, version, context, arch, args.summary, description, ++ args.license, licenses, packages, requires] ++ module = Module(*modargs) ++ module_defaults = ModuleDefaults(*modargs) + + if args.stdout: + print(module.dumps()) +@@ -247,6 +320,9 @@ def main(): + module.dump() + print("Created {0}".format(module.filename)) + ++ module_defaults.dump() ++ print("Created {0}".format(module_defaults.filename)) ++ + + if __name__ == "__main__": + try: +diff --git a/dir2module/tests/conftest.py b/dir2module/tests/conftest.py +index 9309b44..c6956cb 100644 +--- a/dir2module/tests/conftest.py ++++ b/dir2module/tests/conftest.py +@@ -15,7 +15,7 @@ def dummy_module(): + 'description': 'One dummy module for your tests', + 'module_license': 'No License', + 'licenses': [], +- 'package_nevras': [], ++ 'packages': [], + 'requires': {} + } + +diff --git a/man/bld2repo.1 b/man/bld2repo.1 +new file mode 100644 +index 0000000..ceb158b +--- /dev/null ++++ b/man/bld2repo.1 +@@ -0,0 +1,41 @@ ++.TH bld2repo "1" Manual ++.SH NAME ++bld2repo ++.SH SYNOPSIS ++.B bld2repo ++[-h] -b BUILD_ID [-d RESULT_DIR] [-a ARCH] [-k KOJI_HOST] [-s KOJI_STORAGE_HOST] ++.SH DESCRIPTION ++When provided with a build id it will download all buildrequired RPMsof a ++modular koji build into the provided directory and create a repository out of ++it. ++.SH OPTIONS ++ ++.TP ++\fB\-b\fR \fI\,BUILD_ID\/\fR, \fB\-\-build\-id\fR \fI\,BUILD_ID\/\fR ++ID of a koji build. ++ ++.TP ++\fB\-d\fR \fI\,RESULT_DIR\/\fR, \fB\-\-result\-dir\fR \fI\,RESULT_DIR\/\fR ++Directory where the RPMs are downloaded. ++ ++.TP ++\fB\-a\fR \fI\,ARCH\/\fR, \fB\-\-arch\fR \fI\,ARCH\/\fR ++For which architecture the RPMs should be downloaded. The 'noarch' is included ++automatically. ++ ++.TP ++\fB\-k\fR \fI\,KOJI_HOST\/\fR, \fB\-\-koji\-host\fR \fI\,KOJI_HOST\/\fR ++Koji host base url ++ ++.TP ++\fB\-s\fR \fI\,KOJI_STORAGE_HOST\/\fR, \fB\-\-koji\-storage\-host\fR \fI\,KOJI_STORAGE_HOST\/\fR ++Koji storage storage host base url. Server where the RPMs are stored. Required ++to be used together with `\-\-koji\-host`. ++ ++.SH AUTHORS ++.B bld2repo ++was written by Martin Čurlej . ++.SH DISTRIBUTION ++The latest version of bld2repo may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/man/createrepo_mod.1 b/man/createrepo_mod.1 +new file mode 100644 +index 0000000..9acdd7d +--- /dev/null ++++ b/man/createrepo_mod.1 +@@ -0,0 +1,21 @@ ++.TH createrepo_mod "1" Manual ++.SH NAME ++createrepo_mod ++.SH SYNOPSIS ++.B createrepo_mod ++[-h] directory_to_index ++.SH DESCRIPTION ++A small wrapper around createrepo_c and modifyrepo_c toprovide an easy tool ++for generating module repositories ++.SH OPTIONS ++.TP ++\fBdirectory_to_index\fR ++Directory to index ++ ++.SH AUTHORS ++.B createrepo_mod ++was written by Jakub Kadlčík . ++.SH DISTRIBUTION ++The latest version of createrepo_mod may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/man/dir2module.1 b/man/dir2module.1 +new file mode 100644 +index 0000000..728792e +--- /dev/null ++++ b/man/dir2module.1 +@@ -0,0 +1,55 @@ ++.TH dir2module "1" Manual ++.SH NAME ++dir2module ++.SH SYNOPSIS ++.B dir2module ++[-h] -m SUMMARY [-d DESCRIPTION] [-l LICENSE] [-r REQUIRES] [--force] [--stdout] (--dir DIR | --pkglist PKGLIST) nsvca ++.SH DESCRIPTION ++Recursively read RPMs from DIR or read them from specified pkglist.If any RPM ++is missing on unreadable, error out.Populate artifacts/rpms with RPM ++NEVRAs.Populate license/content with list of RPM licenses.Write ++N:S:V:C:A.modulemd.yaml in the current directory.Make sure the yaml is in ++modulemd v2 format. ++.SH OPTIONS ++.TP ++\fBnsvca\fR ++Module name, stream version, context and architecture in a N:S:V:C:A format ++ ++.TP ++\fB\-m\fR \fI\,SUMMARY\/\fR, \fB\-\-summary\fR \fI\,SUMMARY\/\fR ++Module summary ++ ++.TP ++\fB\-d\fR \fI\,DESCRIPTION\/\fR, \fB\-\-description\fR \fI\,DESCRIPTION\/\fR ++Module description ++ ++.TP ++\fB\-l\fR \fI\,LICENSE\/\fR, \fB\-\-license\fR \fI\,LICENSE\/\fR ++Module license ++ ++.TP ++\fB\-r\fR \fI\,REQUIRES\/\fR, \fB\-\-requires\fR \fI\,REQUIRES\/\fR ++Module runtime dependencies in a N:S format. For multiple dependencies, repeat ++this option ++ ++.TP ++\fB\-\-force\fR ++Suppress all constraints and hope for the best ++ ++.TP ++\fB\-\-stdout\fR ++By defult the output is saved in a file. Use this to suppress it and print to ++the STDOUT ++ ++.TP ++\fB\-\-dir\fR \fI\,DIR\/\fR ++.TP ++\fB\-\-pkglist\fR \fI\,PKGLIST\/\fR ++ ++.SH AUTHORS ++.B dir2module ++was written by Jakub Kadlčík . ++.SH DISTRIBUTION ++The latest version of dir2module may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/man/generate-manpages.sh b/man/generate-manpages.sh +index 73f38f8..abc0757 100755 +--- a/man/generate-manpages.sh ++++ b/man/generate-manpages.sh +@@ -3,10 +3,14 @@ + HOMEPAGE="https://github.com/rpm-software-management/modulemd-tools" + + +-python3 repo2module/setup.py \ +- --command-packages=click_man.commands man_pages \ +- --target ./man \ +- &> /dev/null ++argparse-manpage \ ++ --pyfile repo2module/repo2module/cli.py \ ++ --function get_arg_parser \ ++ --author "Stephen Gallagher" \ ++ --author-email "sgallagh@redhat.com" \ ++ --project-name "repo2module" \ ++ --url HOMEPAGE \ ++ > ./man/repo2module.1 + + + argparse-manpage \ +@@ -20,7 +24,7 @@ argparse-manpage \ + + + argparse-manpage \ +- --pyfile createrepo_mod/createrepo_mod.py \ ++ --pyfile createrepo_mod/createrepo_mod/createrepo_mod.py \ + --function get_arg_parser \ + --author "Jakub Kadlčík" \ + --author-email "jkadlcik@redhat.com" \ +@@ -30,7 +34,7 @@ argparse-manpage \ + + + argparse-manpage \ +- --pyfile modulemd-merge/modulemd-merge.py \ ++ --pyfile modulemd-merge/modulemd_merge/modulemd_merge.py \ + --function get_arg_parser \ + --author "Gerd v. Egidy" \ + --author-email "gerd.von.egidy@intra2net.com" \ +@@ -47,3 +51,13 @@ argparse-manpage \ + --project-name "modulemd-generate-macros" \ + --url HOMEPAGE \ + > ./man/modulemd-generate-macros.1 ++ ++ ++argparse-manpage \ ++ --pyfile bld2repo/bld2repo/cli.py \ ++ --function get_arg_parser \ ++ --author "Martin Čurlej" \ ++ --author-email "mcurlej@redhat.com" \ ++ --project-name "bld2repo" \ ++ --url HOMEPAGE \ ++ > ./man/bld2repo.1 +diff --git a/man/modulemd-generate-macros.1 b/man/modulemd-generate-macros.1 +new file mode 100644 +index 0000000..36a1e9a +--- /dev/null ++++ b/man/modulemd-generate-macros.1 +@@ -0,0 +1,31 @@ ++.TH modulemd-generate-macros "1" Manual ++.SH NAME ++modulemd-generate-macros ++.SH SYNOPSIS ++.B modulemd-generate-macros ++[-h] [--disttag DISTTAG] [--conflicts-from-file CONFLICTS_FROM_FILE] yaml ++.SH DESCRIPTION ++Generate `module\-build\-macros` SRPM package, which is a central piece for ++building modules. It should be present in the buildroot before any other ++module packages are submitted to be built. ++.SH OPTIONS ++.TP ++\fByaml\fR ++Path to modulemd YAML file ++ ++.TP ++\fB\-\-disttag\fR \fI\,DISTTAG\/\fR ++Disttag ++ ++.TP ++\fB\-\-conflicts\-from\-file\fR \fI\,CONFLICTS_FROM_FILE\/\fR ++Path to a file containing conflicts definitions and their reasoning. Content ++of this file gets simply pasted into the specfile ++ ++.SH AUTHORS ++.B modulemd\-generate\-macros ++was written by Jakub Kadlčík . ++.SH DISTRIBUTION ++The latest version of modulemd\-generate\-macros may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/man/modulemd-merge.1 b/man/modulemd-merge.1 +new file mode 100644 +index 0000000..f2e89e3 +--- /dev/null ++++ b/man/modulemd-merge.1 +@@ -0,0 +1,43 @@ ++.TH modulemd-merge "1" Manual ++.SH NAME ++modulemd-merge ++.SH SYNOPSIS ++.B modulemd-merge ++[-h] [-v] [-d] [-i] [-O] input [input ...] output ++.SH DESCRIPTION ++Merge several modules.yaml files (rpm modularity metadata) into one. ++.SH OPTIONS ++.TP ++\fBinput\fR ++input filename(s) or directories. ++repomd.xml files are parsed and modules hrefs contained are merged. ++If a directory is given, it is searched for repodata/repomd.xml ++and repomd.xml ++ ++.TP ++\fBoutput\fR ++YAML output filename ++ ++.TP ++\fB\-v\fR, \fB\-\-verbose\fR ++increase output verbosity ++ ++.TP ++\fB\-d\fR, \fB\-\-debug\fR ++debug output verbosity ++ ++.TP ++\fB\-i\fR, \fB\-\-ignore\-no\-input\fR ++ignore non\-existing input files ++ ++.TP ++\fB\-O\fR, \fB\-\-to\-stdout\fR ++print YAML output to stdout ++ ++.SH AUTHORS ++.B modulemd\-merge ++was written by Gerd v. Egidy . ++.SH DISTRIBUTION ++The latest version of modulemd\-merge may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/man/repo2module.1 b/man/repo2module.1 +new file mode 100644 +index 0000000..2a5c1e4 +--- /dev/null ++++ b/man/repo2module.1 +@@ -0,0 +1,38 @@ ++.TH repo2module "1" Manual ++.SH NAME ++repo2module ++.SH SYNOPSIS ++.B repo2module ++[-h] [--debug | --nodebug] [-n MODULE_NAME] [-s MODULE_STREAM] [-v MODULE_VERSION] [-c MODULE_CONTEXT] [-O] repo_path [modules_yaml] ++.SH DESCRIPTION ++Generates modules.yaml file with a module, that provides all RPM packages that ++are available within a repository. ++.SH OPTIONS ++.TP ++\fBrepo_path\fR ++.TP ++\fBmodules_yaml\fR ++.TP ++\fB\-\-debug\fR ++.TP ++\fB\-\-nodebug\fR ++.TP ++\fB\-n\fR \fI\,MODULE_NAME\/\fR, \fB\-\-module\-name\fR \fI\,MODULE_NAME\/\fR ++Default is the current directory name ++ ++.TP ++\fB\-s\fR \fI\,MODULE_STREAM\/\fR, \fB\-\-module\-stream\fR \fI\,MODULE_STREAM\/\fR ++.TP ++\fB\-v\fR \fI\,MODULE_VERSION\/\fR, \fB\-\-module\-version\fR \fI\,MODULE_VERSION\/\fR ++.TP ++\fB\-c\fR \fI\,MODULE_CONTEXT\/\fR, \fB\-\-module\-context\fR \fI\,MODULE_CONTEXT\/\fR ++.TP ++\fB\-O\fR, \fB\-\-to\-stdout\fR ++ ++.SH AUTHORS ++.B repo2module ++was written by Stephen Gallagher . ++.SH DISTRIBUTION ++The latest version of repo2module may be downloaded from ++.UR HOMEPAGE ++.UE +diff --git a/modulemd-merge/modulemd_merge/__init__.py b/modulemd-merge/modulemd_merge/__init__.py +new file mode 100644 +index 0000000..e69de29 +diff --git a/modulemd-merge/modulemd-merge.py b/modulemd-merge/modulemd_merge/modulemd_merge.py +similarity index 90% +rename from modulemd-merge/modulemd-merge.py +rename to modulemd-merge/modulemd_merge/modulemd_merge.py +index 65c5fad..89afb87 100755 +--- a/modulemd-merge/modulemd-merge.py ++++ b/modulemd-merge/modulemd_merge/modulemd_merge.py +@@ -117,6 +117,8 @@ def get_arg_parser(): + action="store_true") + parser.add_argument("-i", "--ignore-no-input", help="ignore non-existing input files", + action="store_true") ++ parser.add_argument("-O", "--to-stdout", help="print YAML output to stdout", ++ action="store_true") + + # positional arguments + parser.add_argument("input", nargs="+", help="input filename(s) or directories.\n" +@@ -154,14 +156,21 @@ def main(): + logging.info("merged result: {} modulemds and {} modulemd-defaults".format(len(modnames), + len(defstreams))) + +- logging.debug("Writing YAML to {}".format(args.output)) +- with open(args.output, 'w') as output: +- if len(modnames) == 0 and len(defstreams) == 0: +- # properly writing a completely empty yaml document +- logging.debug("Writing an empty YAML") +- output.write("") +- else: +- output.write(merged_index.dump_to_string()) ++ if args.to_stdout: ++ output = sys.stdout ++ else: ++ logging.debug("Writing YAML to {}".format(args.output)) ++ output = open(args.output, 'w') ++ ++ if len(modnames) == 0 and len(defstreams) == 0: ++ # properly writing a completely empty yaml document ++ logging.debug("Writing an empty YAML") ++ output.write("") ++ else: ++ output.write(merged_index.dump_to_string()) ++ ++ if not args.to_stdout: ++ output.close() + + + if __name__ == "__main__": +diff --git a/modulemd-merge/requirements.txt b/modulemd-merge/requirements.txt +new file mode 100644 +index 0000000..e69de29 +diff --git a/modulemd-merge/setup.py b/modulemd-merge/setup.py +new file mode 100644 +index 0000000..6d88209 +--- /dev/null ++++ b/modulemd-merge/setup.py +@@ -0,0 +1,37 @@ ++#!/usr/bin/python3 ++# -*- coding: utf-8 -*- ++ ++from setuptools import setup, find_packages ++ ++with open("README.md", "r") as fh: ++ long_description = fh.read() ++ ++with open('requirements.txt') as f: ++ requires = f.read().splitlines() ++ ++setup( ++ name='modulemd-merge', ++ version='0.1', ++ packages=find_packages(), ++ url='https://github.com/rpm-software-management/modulemd-tools', ++ license='MIT', ++ author='Gerd v. Egidy', ++ author_email='gerd.von.egidy@intra2net.com', ++ description='Merge several modules.yaml files (rpm modularity metadata) into one', ++ long_description=long_description, ++ long_description_content_type='text/markdown', ++ # modulemd-merge also requires libmodulemd and createrepo_c which are ++ # not available on PyPI and must be installed separately. ++ # On Fedora, this is done with `dnf install python3-libmodulemd python3-createrepo_c` ++ install_requires=requires, ++ entry_points={ ++ 'console_scripts': [ ++ 'modulemd-merge=modulemd_merge.modulemd_merge:main'], ++ }, ++ classifiers=[ ++ "Programming Language :: Python :: 3", ++ "License :: OSI Approved :: MIT License", ++ "Operating System :: POSIX :: Linux", ++ ], ++ include_package_data=True, ++) +diff --git a/modulemd-merge/test-requirements.txt b/modulemd-merge/test-requirements.txt +new file mode 100644 +index 0000000..3ea8172 +--- /dev/null ++++ b/modulemd-merge/test-requirements.txt +@@ -0,0 +1,2 @@ ++PyYAML ++pytest +diff --git a/modulemd-merge/tests/conftest.py b/modulemd-merge/tests/conftest.py +new file mode 100644 +index 0000000..d79b4d0 +--- /dev/null ++++ b/modulemd-merge/tests/conftest.py +@@ -0,0 +1,221 @@ ++from textwrap import dedent ++ ++import pytest ++ ++ ++@pytest.fixture ++def moduleB_yaml(): ++ return dedent(""" ++ --- ++ document: modulemd-defaults ++ version: 1 ++ data: ++ module: bar ++ stream: stable ++ profiles: ++ stable: [everything] ++ ... ++ --- ++ document: modulemd ++ version: 2 ++ data: ++ name: bar ++ stream: stable ++ version: 234 ++ context: fc33 ++ summary: Let's put some bar's summary here ++ description: >- ++ Let's put some bar's description here ++ license: ++ module: ++ - Bar License ++ content: ++ - A fresh bar license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - bar-utils ++ api: ++ rpms: ++ - bar-utils ++ components: ++ rpms: ++ bar-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - bar-utils-2:3-4.fc33.noarch ++ ... ++ """).lstrip() ++ ++ ++@pytest.fixture ++def two_modules_merged_yamls(): ++ return dedent(""" ++ --- ++ document: modulemd-defaults ++ version: 1 ++ data: ++ module: bar ++ stream: stable ++ profiles: ++ stable: [everything] ++ ... ++ --- ++ document: modulemd ++ version: 2 ++ data: ++ name: bar ++ stream: stable ++ version: 234 ++ context: fc33 ++ summary: Let's put some bar's summary here ++ description: >- ++ Let's put some bar's description here ++ license: ++ module: ++ - Bar License ++ content: ++ - A fresh bar license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - bar-utils ++ api: ++ rpms: ++ - bar-utils ++ components: ++ rpms: ++ bar-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - bar-utils-2:3-4.fc33.noarch ++ ... ++ --- ++ document: modulemd-defaults ++ version: 1 ++ data: ++ module: foo ++ stream: devel ++ profiles: ++ devel: [everything] ++ ... ++ --- ++ document: modulemd ++ version: 2 ++ data: ++ name: foo ++ stream: devel ++ version: 123 ++ context: fc33 ++ summary: Let's put some foo's summary here ++ description: >- ++ Let's put some foo's description here ++ license: ++ module: ++ - Foo License ++ content: ++ - A fresh foo license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - foo-utils ++ api: ++ rpms: ++ - foo-utils ++ components: ++ rpms: ++ foo-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - foo-utils-1:2-3.fc33.noarch ++ ... ++ """).lstrip() ++ ++ ++@pytest.fixture ++def module_with_repodata_dir(): ++ return dedent(""" ++ --- ++ document: modulemd-defaults ++ version: 1 ++ data: ++ module: dummy ++ stream: rolling ++ profiles: ++ rolling: [everything] ++ ... ++ --- ++ document: modulemd ++ version: 2 ++ data: ++ name: dummy ++ stream: rolling ++ version: 1 ++ context: abcdef12 ++ summary: ++ description: >- ++ ++ license: ++ module: ++ - MIT ++ content: ++ - ++ profiles: ++ everything: ++ rpms: ++ - python-django-bash-completion ++ api: ++ rpms: ++ - python-django-bash-completion ++ components: ++ rpms: ++ python-django: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - python-django-bash-completion-0:3.0.10-3.fc33.noarch ++ ... ++ --- ++ document: modulemd-defaults ++ version: 1 ++ data: ++ module: foo ++ stream: devel ++ profiles: ++ devel: [everything] ++ ... ++ --- ++ document: modulemd ++ version: 2 ++ data: ++ name: foo ++ stream: devel ++ version: 123 ++ context: fc33 ++ summary: Let's put some foo's summary here ++ description: >- ++ Let's put some foo's description here ++ license: ++ module: ++ - Foo License ++ content: ++ - A fresh foo license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - foo-utils ++ api: ++ rpms: ++ - foo-utils ++ components: ++ rpms: ++ foo-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - foo-utils-1:2-3.fc33.noarch ++ ... ++ """).lstrip() +diff --git a/modulemd-merge/tests/test_modulemd_merge.py b/modulemd-merge/tests/test_modulemd_merge.py +new file mode 100644 +index 0000000..25d7537 +--- /dev/null ++++ b/modulemd-merge/tests/test_modulemd_merge.py +@@ -0,0 +1,86 @@ ++import argparse ++import os.path ++from unittest.mock import patch ++ ++import pytest ++import yaml ++ ++from modulemd_merge import modulemd_merge ++ ++dirname = os.path.dirname(os.path.realpath(__file__)) ++test_data_dir = os.path.join(dirname, "testdata") ++test_repodata_dir = os.path.join(dirname, "testdata", "repodata") ++test_repomd_file = os.path.join(dirname, "testdata", "repodata", "repomd.xml") ++ ++ ++def _testrun_args(inputs, **kwargs): ++ args = {'verbose': True, 'debug': True, 'input': inputs, 'to_stdout': True, ++ 'ignore_no_input': False} ++ args.update(kwargs) ++ return argparse.Namespace(**args) ++ ++ ++def test_modulemd_merge_loading(): ++ assert modulemd_merge ++ ++ ++def test_modulemd_merge_two_yamls(capsys, two_modules_merged_yamls): ++ ++ inputs = (os.path.join(test_data_dir, "moduleA.yaml"), ++ os.path.join(test_data_dir, "moduleB.yaml")) ++ with patch("argparse.ArgumentParser.parse_args", return_value=_testrun_args(inputs)): ++ modulemd_merge.main() ++ ++ captured = capsys.readouterr() ++ assert [d for d in yaml.load_all(captured.out, Loader=yaml.SafeLoader)] == [ ++ d for d in yaml.load_all(two_modules_merged_yamls, Loader=yaml.SafeLoader)] ++ ++ ++def test_modulemd_merge_two_yamls_first_missing(capsys): ++ ++ inputs = (os.path.join(test_data_dir, "missing-file.yaml"), ++ os.path.join(test_data_dir, "moduleB.yaml")) ++ with patch("argparse.ArgumentParser.parse_args", return_value=_testrun_args(inputs)): ++ with pytest.raises(ValueError) as excinfo: ++ modulemd_merge.main() ++ ++ assert f"input file {test_data_dir}/missing-file.yaml does not exist" in str(excinfo.value) ++ ++ ++def test_modulemd_merge_two_yamls_first_missing_ignore_no_input(capsys, moduleB_yaml): ++ ++ inputs = (os.path.join(test_data_dir, "missing-file.yaml"), ++ os.path.join(test_data_dir, "moduleB.yaml")) ++ kwargs = {"ignore_no_input": True} ++ with patch("argparse.ArgumentParser.parse_args", return_value=_testrun_args(inputs, **kwargs)): ++ modulemd_merge.main() ++ ++ captured = capsys.readouterr() ++ assert [d for d in yaml.load_all(captured.out, Loader=yaml.SafeLoader)] == [ ++ d for d in yaml.load_all(moduleB_yaml, Loader=yaml.SafeLoader)] ++ ++ ++@pytest.mark.skip(reason="Requires binary files in the repo") ++def test_modulemd_merge_module_with_repodata_dir(capsys, module_with_repodata_dir): ++ ++ inputs = (os.path.join(test_data_dir, "moduleA.yaml"), ++ test_repodata_dir) ++ with patch("argparse.ArgumentParser.parse_args", return_value=_testrun_args(inputs)): ++ modulemd_merge.main() ++ ++ captured = capsys.readouterr() ++ assert [d for d in yaml.load_all(captured.out, Loader=yaml.SafeLoader)] == [ ++ d for d in yaml.load_all(module_with_repodata_dir, Loader=yaml.SafeLoader)] ++ ++ ++@pytest.mark.skip(reason="Requires binary files in the repo") ++def test_modulemd_merge_module_with_repomd_file(capsys, module_with_repodata_dir): ++ ++ inputs = (os.path.join(test_data_dir, "moduleA.yaml"), ++ test_repomd_file) ++ with patch("argparse.ArgumentParser.parse_args", return_value=_testrun_args(inputs)): ++ modulemd_merge.main() ++ ++ captured = capsys.readouterr() ++ assert [d for d in yaml.load_all(captured.out, Loader=yaml.SafeLoader)] == [ ++ d for d in yaml.load_all(module_with_repodata_dir, Loader=yaml.SafeLoader)] +diff --git a/modulemd-merge/tests/testdata/moduleA.yaml b/modulemd-merge/tests/testdata/moduleA.yaml +new file mode 100644 +index 0000000..97c3806 +--- /dev/null ++++ b/modulemd-merge/tests/testdata/moduleA.yaml +@@ -0,0 +1,40 @@ ++--- ++document: modulemd-defaults ++version: 1 ++data: ++ module: foo ++ stream: devel ++ profiles: ++ devel: [everything] ++... ++--- ++document: modulemd ++version: 2 ++data: ++ name: foo ++ stream: devel ++ version: 123 ++ context: fc33 ++ summary: Let's put some foo's summary here ++ description: >- ++ Let's put some foo's description here ++ license: ++ module: ++ - Foo License ++ content: ++ - A fresh foo license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - foo-utils ++ api: ++ rpms: ++ - foo-utils ++ components: ++ rpms: ++ foo-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - foo-utils-1:2-3.fc33.noarch ++... +diff --git a/modulemd-merge/tests/testdata/moduleB.yaml b/modulemd-merge/tests/testdata/moduleB.yaml +new file mode 100644 +index 0000000..f922b5e +--- /dev/null ++++ b/modulemd-merge/tests/testdata/moduleB.yaml +@@ -0,0 +1,40 @@ ++--- ++document: modulemd-defaults ++version: 1 ++data: ++ module: bar ++ stream: stable ++ profiles: ++ stable: [everything] ++... ++--- ++document: modulemd ++version: 2 ++data: ++ name: bar ++ stream: stable ++ version: 234 ++ context: fc33 ++ summary: Let's put some bar's summary here ++ description: >- ++ Let's put some bar's description here ++ license: ++ module: ++ - Bar License ++ content: ++ - A fresh bar license for your test suites ++ profiles: ++ everything: ++ rpms: ++ - bar-utils ++ api: ++ rpms: ++ - bar-utils ++ components: ++ rpms: ++ bar-utils: ++ rationale: Present in the repository ++ artifacts: ++ rpms: ++ - bar-utils-2:3-4.fc33.noarch ++... +diff --git a/modulemd-tools.spec b/modulemd-tools.spec +index 1bf1f59..d8b65f6 100644 +--- a/modulemd-tools.spec ++++ b/modulemd-tools.spec +@@ -1,6 +1,6 @@ + Name: modulemd-tools + Version: 0.7 +-Release: 1%{?dist} ++Release: 6%{?dist} + Summary: Collection of tools for parsing and generating modulemd YAML files + License: MIT + BuildArch: noarch +@@ -9,21 +9,16 @@ URL: https://github.com/rpm-software-management/modulemd-tools + Source0: https://github.com/rpm-software-management/modulemd-tools/archive/%{version}/%{name}-%{version}.tar.gz + + BuildRequires: createrepo_c +-BuildRequires: argparse-manpage + BuildRequires: python3-devel + BuildRequires: python3-setuptools + BuildRequires: python3-libmodulemd >= 2.9.3 +-BuildRequires: python3-click +-BuildRequires: python3-click-man + BuildRequires: python3-dnf + BuildRequires: python3-hawkey + BuildRequires: python3-createrepo_c + BuildRequires: python3-pyyaml +-BuildRequires: python3-parameterized + BuildRequires: python3-pytest + + Requires: createrepo_c +-Requires: python3-click + Requires: python3-dnf + Requires: python3-hawkey + Requires: python3-createrepo_c +@@ -52,6 +47,8 @@ modulemd-generate-macros - Generate module-build-macros SRPM package, which is + a central piece for building modules. It should be present in the buildroot + before any other module packages are submitted to be built. + ++bld2repo - Simple tool for dowloading build required RPMs of a modular build from koji. ++ + + %prep + %setup -q +@@ -66,7 +63,17 @@ cd dir2module + %py3_build + cd .. + +-PYTHONPATH=./modulemd_tools ./man/generate-manpages.sh ++cd createrepo_mod ++%py3_build ++cd .. ++ ++cd modulemd-merge ++%py3_build ++cd .. ++ ++cd modulemd_tools ++%py3_build ++cd .. + + + %install +@@ -78,24 +85,46 @@ cd dir2module + %py3_install + cd .. + +-cp createrepo_mod/createrepo_mod.py %{buildroot}%{_bindir}/createrepo_mod +-cp modulemd-merge/modulemd-merge.py %{buildroot}%{_bindir}/modulemd-merge ++cd createrepo_mod ++%py3_install ++cd .. ++ ++cd modulemd-merge ++%py3_install ++cd .. ++ ++cd modulemd_tools ++%py3_install ++cd .. ++ + cp modulemd-generate-macros/modulemd-generate-macros.py \ + %{buildroot}%{_bindir}/modulemd-generate-macros + +-cp -r modulemd_tools/modulemd_tools %{buildroot}%{python3_sitelib}/modulemd_tools +- + install -d %{buildroot}%{_mandir}/man1 + cp man/*.1 %{buildroot}%{_mandir}/man1/ + + + %check ++export PATH={buildroot}%{_bindir}:$PATH ++ + cd repo2module +-%{python3} -m pytest ++%{python3} -m pytest -vv + cd .. + + cd dir2module +-%{python3} -m pytest ++%{python3} -m pytest -vv ++cd .. ++ ++cd createrepo_mod ++%{python3} -m pytest -vv ++cd .. ++ ++cd modulemd-merge ++%{python3} -m pytest -vv -s ++cd .. ++ ++cd modulemd_tools ++%{python3} -m pytest -vv + cd .. + + +@@ -106,21 +135,77 @@ cd .. + %{python3_sitelib}/repo2module-*.egg-info/ + %{python3_sitelib}/dir2module + %{python3_sitelib}/dir2module-*.egg-info/ ++%{python3_sitelib}/createrepo_mod ++%{python3_sitelib}/createrepo_mod-*.egg-info/ ++%{python3_sitelib}/modulemd_merge ++%{python3_sitelib}/modulemd_merge-*.egg-info/ ++%{python3_sitelib}/modulemd_tools ++%{python3_sitelib}/modulemd_tools-*.egg-info/ + %{_bindir}/repo2module + %{_bindir}/dir2module + %{_bindir}/createrepo_mod + %{_bindir}/modulemd-merge + %{_bindir}/modulemd-generate-macros +-%{python3_sitelib}/modulemd_tools + + %{_mandir}/man1/repo2module.1* + %{_mandir}/man1/dir2module.1* + %{_mandir}/man1/createrepo_mod.1* + %{_mandir}/man1/modulemd-merge.1* + %{_mandir}/man1/modulemd-generate-macros.1.* ++%{_mandir}/man1/bld2repo.1.* + + + %changelog ++* Fri Aug 27 2021 Jakub Kadlcik 0.7-6 ++- Do not install bld2repo as RHEL8 doesn't have python3-koji ++ (jkadlcik@redhat.com) ++- Drop the Patch1 and make the change directly in this repository ++ (jkadlcik@redhat.com) ++- Use UpstreamBuilder instead of DistributionBuilder (jkadlcik@redhat.com) ++- Skip some tests because they require binary files (jkadlcik@redhat.com) ++ ++* Thu Aug 26 2021 Jakub Kadlcik 0.7-5 ++- Update to new upstream version ++ ++* Mon Aug 23 2021 Jakub Kadlcik 0.11-1 ++- modulemd_tools: compatibility for upgrade_ext on EPEL8 (frostyx@email.cz) ++- modulemd_tools: compatibility for read_packager_string on EPEL8 ++ (frostyx@email.cz) ++- dir2module: generate also profiles and modulemd-defaults file ++ (frostyx@email.cz) ++- modulemd_tools: use upgrade_ext instead of upgrade (frostyx@email.cz) ++- modulemd_tools: use read_packager_string instead of read_string ++ (frostyx@email.cz) ++- Add installation instructions (frostyx@email.cz) ++- bld2repo: do not create empty repos when --result-dir is used ++ (kdudka@redhat.com) ++- bld2repo: print status in a more intuitive format (kdudka@redhat.com) ++- tito: stop releasing for Fedora 32 (frostyx@email.cz) ++ ++* Mon Jun 14 2021 Jakub Kadlcik 0.10-1 ++- Added bld2repo (mcurlej@redhat.com) ++ ++* Fri Apr 09 2021 Jakub Kadlcik 0.9-1 ++- repo2module: drop python-click dependency (frostyx@email.cz) ++ ++* Tue Apr 06 2021 Jakub Kadlcik 0.8-1 ++- modulemd_tools: drop python3-parameterized dependency (frostyx@email.cz) ++- Package modulemd_tools helper lib (fvalder@redhat.com) ++- Add modulemd-merge tests (fvalder@redhat.com) ++- Add createrepo_mod tests (fvalder@redhat.com) ++- Replace master in fedora releaser to rawhide (frostyx@email.cz) ++ ++* Tue Mar 02 2021 Jakub Kadlčík - 0.7-4 ++- Rebuild for 8.5.0 ++ ++* Thu Feb 11 2021 Jakub Kadlčík - 0.7-3 ++- Bump spec to rebuild with gating enabled ++ ++* Tue Feb 09 2021 Jakub Kadlčík - 0.7-2 ++- Do not generate manpages on the fly ++- Drop python-parameterized dependency ++- Fix python3 macro for running tests ++ + * Tue Feb 09 2021 Jakub Kadlcik 0.7-1 + - Generate manpages on the fly + - Automated test builds incl. Docker/Travis +@@ -129,7 +214,7 @@ cd .. + - Drop libmodulemd dependency in favor of python3-libmodulemd + + * Sun Nov 22 2020 Jakub Kadlcik 0.6-1 +-- Generate manpages for all tools in this repository ++- Generate manpages for all tools in this repository + - modulemd-generate-macros: add a tool for generating module-build-macros + - modulemd_tools: add the first pieces of a python library (for internal usage only) + +diff --git a/modulemd_tools/modulemd_tools/yaml.py b/modulemd_tools/modulemd_tools/yaml.py +index 43f314f..ec964f6 100644 +--- a/modulemd_tools/modulemd_tools/yaml.py ++++ b/modulemd_tools/modulemd_tools/yaml.py +@@ -7,6 +7,7 @@ and all transformation functions are `str` -> `str`. + import os + import gi + import yaml ++from distutils.version import StrictVersion + + gi.require_version("Modulemd", "2.0") + from gi.repository import Modulemd # noqa: E402 +@@ -104,14 +105,9 @@ def update(mod_yaml, name=None, stream=None, version=None, context=None, + + """ + mod_stream = _yaml2stream(mod_yaml) +- +- # AFAIK It is not possible to change name and stream of an existing module, +- # so we need to workaround it by creating a new module with desired N:S and +- # then update it from the previous yaml + name = name or mod_stream.get_module_name() + stream = stream or mod_stream.get_stream_name() +- mod_stream = Modulemd.ModuleStreamV2.new(name, stream) +- mod_stream = mod_stream.read_string(mod_yaml, True, name, stream) ++ mod_stream = _modulemd_read_packager_string(mod_yaml, name, stream) + + if version: + mod_stream.set_version(version) +@@ -235,12 +231,12 @@ def upgrade(mod_yaml, version): + if parsed["version"] > version: + raise ValueError("Cannot downgrade modulemd version") + +- mod_stream = Modulemd.ModuleStream.read_string( ++ mod_stream = _modulemd_read_packager_string( + mod_yaml, +- True, + parsed["data"].get("name", ""), + parsed["data"].get("stream", "")) +- mod_stream_upgraded = mod_stream.upgrade(version) ++ ++ mod_stream_upgraded = _modulestream_upgrade_ext(mod_stream, version) + return _stream2yaml(mod_stream_upgraded) + + +@@ -295,7 +291,7 @@ def _generate_filename(mod_yaml): + + def _yaml2stream(mod_yaml): + try: +- return Modulemd.ModuleStream.read_string(mod_yaml, True, None, None) ++ return _modulemd_read_packager_string(mod_yaml) + except gi.repository.GLib.GError as ex: + raise ValueError(ex.message) + +@@ -307,3 +303,36 @@ def _stream2yaml(mod_stream): + return idx.dump_to_string() + except gi.repository.GLib.GError as ex: + raise RuntimeError(ex.message) ++ ++ ++def _modulemd_read_packager_string(mod_yaml, name=None, stream=None): ++ """ ++ For the time being we happen to be in a transition state when ++ `Modulemd.ModuleStream.read_string` is deprecated and throws warnings on ++ Fedora but we still use old libmodulemd (2.9.4) on RHEL8, which doesn't ++ provide its replacement in the form of `Modulemd.read_packager_string`. ++ """ ++ if StrictVersion(Modulemd.get_version()) < StrictVersion("2.11"): ++ mod_stream = Modulemd.ModuleStreamV2.new(name, stream) ++ mod_stream = mod_stream.read_string(mod_yaml, True, name, stream) ++ return mod_stream ++ ++ return Modulemd.read_packager_string(mod_yaml, name, stream) ++ ++ ++def _modulestream_upgrade_ext(mod_stream, version): ++ """ ++ For the time being we happen to be in a transition state when ++ `Modulemd.ModuleStream.upgrade` is deprecated and throws warnings on ++ Fedora but we still use old libmodulemd (2.9.4) on RHEL8, which doesn't ++ provide its replacement in the form of `Modulemd.ModuleStream.upgrade_ext`. ++ """ ++ if StrictVersion(Modulemd.get_version()) < StrictVersion("2.10"): ++ return mod_stream.upgrade(version) ++ ++ mod_upgraded = mod_stream.upgrade_ext(version) ++ return mod_upgraded.get_stream_by_NSVCA( ++ mod_stream.get_stream_name(), ++ mod_stream.get_version(), ++ mod_stream.get_context(), ++ mod_stream.get_arch()) +diff --git a/modulemd_tools/setup.py b/modulemd_tools/setup.py +new file mode 100644 +index 0000000..ac179b4 +--- /dev/null ++++ b/modulemd_tools/setup.py +@@ -0,0 +1,33 @@ ++#!/usr/bin/python3 ++# -*- coding: utf-8 -*- ++ ++from setuptools import setup, find_packages ++ ++with open("README.md", "r") as fh: ++ long_description = fh.read() ++ ++with open('requirements.txt') as f: ++ requires = f.read().splitlines() ++ ++setup( ++ name='modulemd_tools', ++ version='0.1', ++ packages=find_packages(exclude=("tests",)), ++ url='https://github.com/rpm-software-management/modulemd-tools', ++ license='MIT', ++ author='Jakub Kadlcik', ++ author_email='frostyx@email.cz', ++ description='Helper lib for working with modulemd YAML definitions', ++ long_description=long_description, ++ long_description_content_type='text/markdown', ++ # dir2module also requires libmodulemd and libdnf not available on PyPI ++ # and must be installed separately. ++ # On Fedora, this is done with `dnf install python3-libmodulemd python3-dnf` ++ install_requires=requires, ++ classifiers=[ ++ "Programming Language :: Python :: 3", ++ "License :: OSI Approved :: MIT License", ++ "Operating System :: POSIX :: Linux", ++ ], ++ include_package_data=True, ++) +diff --git a/modulemd_tools/tests/test_yaml.py b/modulemd_tools/tests/test_yaml.py +index e33e390..8090a2b 100644 +--- a/modulemd_tools/tests/test_yaml.py ++++ b/modulemd_tools/tests/test_yaml.py +@@ -1,7 +1,6 @@ + import os + import unittest + from unittest import mock +-from parameterized import parameterized + import yaml + from distutils.version import LooseVersion + from modulemd_tools.yaml import (is_valid, validate, create, update, dump, +@@ -327,11 +326,11 @@ class TestYaml(unittest.TestCase): + self.assertIn("Cannot downgrade modulemd version", + str(context.exception)) + +- @parameterized.expand([[None], [""], ["foo: bar"]]) +- def test_upgrade_empty_yaml(self, mod_yaml): +- with self.assertRaises(ValueError) as context: +- upgrade(mod_yaml, 2) +- self.assertIn("Missing modulemd version", str(context.exception)) ++ def test_upgrade_empty_yaml(self): ++ for mod_yaml in [None, "", "foo: bar"]: ++ with self.assertRaises(ValueError) as context: ++ upgrade(mod_yaml, 2) ++ self.assertIn("Missing modulemd version", str(context.exception)) + + def test_upgrade_unexpected_version(self): + # Neither current modulemd version cannot be unexpected +diff --git a/repo2module/repo2module/cli.py b/repo2module/repo2module/cli.py +index c91e08f..1d4ce27 100644 +--- a/repo2module/repo2module/cli.py ++++ b/repo2module/repo2module/cli.py +@@ -1,6 +1,6 @@ + # -*- coding: utf-8 -*- + +-import click ++import argparse + import createrepo_c as cr + import gi + import logging +@@ -71,48 +71,49 @@ def get_source_packages(packages): + + return source_packages + +- +-@click.command(help=("Generates modules.yaml file with a module, " +- "that provides all RPM packages that are available " +- "within a repository.")) +-@click.option('-d', '--debug/--nodebug', default=False) +-@click.option('-n', '--module-name', +- default=lambda: os.path.basename(os.environ.get('PWD')), +- show_default='Current directory name') +-@click.option('-s', '--module-stream', +- default='rolling', +- show_default=True) +-@click.option('-v', '--module-version', +- default=1, +- show_default=True) +-@click.option('-c', '--module-context', +- default='abcdef12', +- show_default=True) +-@click.option('-O', '--to-stdout', default=False, is_flag=True) +-@click.argument('repo_path', type=click.Path(exists=True)) +-@click.argument('modules_yaml', default='modules.yaml') +-def cli(debug, +- module_name, +- module_stream, +- module_version, +- module_context, +- to_stdout, +- repo_path, +- modules_yaml): +- +- if debug: ++def get_arg_parser(): ++ description = ("Generates modules.yaml file with a module, " ++ "that provides all RPM packages that are available " ++ "within a repository.") ++ parser = argparse.ArgumentParser("repo2module", description=description) ++ ++ debug = parser.add_mutually_exclusive_group() ++ debug.add_argument("--debug", action="store_true", default=False) ++ debug.add_argument("--nodebug", action="store_false", dest="debug") ++ ++ parser.add_argument("-n", "--module-name", ++ default=os.path.basename(os.environ.get("PWD")), ++ help="Default is the current directory name") ++ parser.add_argument("-s", "--module-stream", default="rolling") ++ parser.add_argument("-v", "--module-version", default=1, type=int) ++ parser.add_argument("-c", "--module-context", default="abcdef12") ++ parser.add_argument("-O", "--to-stdout", default=False, action="store_true") ++ parser.add_argument("repo_path") ++ parser.add_argument("modules_yaml", default="modules.yaml", nargs="?") ++ return parser ++ ++ ++def cli(): ++ parser = get_arg_parser() ++ args = parser.parse_args() ++ ++ if args.debug: + logging.basicConfig(level=logging.DEBUG) + +- abs_repo_path = os.path.abspath(repo_path) +- if not to_stdout: +- abs_modules_yaml = os.path.abspath(modules_yaml) ++ if not os.path.isdir(args.repo_path): ++ logging.error("No such directory: {0}".format(args.repo_path)) ++ exit(1) ++ ++ abs_repo_path = os.path.abspath(args.repo_path) ++ if not args.to_stdout: ++ abs_modules_yaml = os.path.abspath(args.modules_yaml) + + packages = parse_repodata(abs_repo_path) + + # Create module stream framework +- stream = Modulemd.ModuleStreamV2.new(module_name, module_stream) +- stream.set_version(module_version) +- stream.set_context(module_context) ++ stream = Modulemd.ModuleStreamV2.new(args.module_name, args.module_stream) ++ stream.set_version(args.module_version) ++ stream.set_context(args.module_context) + stream.set_summary('') + stream.set_description('') + stream.add_module_license("MIT") +@@ -135,15 +136,15 @@ def cli(debug, + stream.add_profile(common_profile) + + # Add defaults for this module +- defaults = Modulemd.DefaultsV1.new(module_name) +- defaults.set_default_stream(module_stream) +- defaults.add_default_profile_for_stream(module_stream, DEFAULT_PROFILE) ++ defaults = Modulemd.DefaultsV1.new(args.module_name) ++ defaults.set_default_stream(args.module_stream) ++ defaults.add_default_profile_for_stream(args.module_stream, DEFAULT_PROFILE) + + index = Modulemd.ModuleIndex.new() + index.add_module_stream(stream) + index.add_defaults(defaults) + +- if to_stdout: ++ if args.to_stdout: + sys.stdout.write(index.dump_to_string()) + return + +diff --git a/repo2module/requirements.txt b/repo2module/requirements.txt +index dca9a90..e69de29 100644 +--- a/repo2module/requirements.txt ++++ b/repo2module/requirements.txt +@@ -1 +0,0 @@ +-click +diff --git a/repo2module/tests/test_repo2module.py b/repo2module/tests/test_repo2module.py +index 4e7fe26..21d8130 100644 +--- a/repo2module/tests/test_repo2module.py ++++ b/repo2module/tests/test_repo2module.py +@@ -1,9 +1,6 @@ + import unittest + import os.path +- + import createrepo_c +-from click.testing import CliRunner +- + import repo2module.cli + from repo2module.cli import parse_repodata, get_source_packages + +@@ -31,8 +28,8 @@ def test_get_source_packages(): + + @unittest.skip("Does not work with the latest libmodulemd (2.12.0)") + def test_repo2module(module_yaml_output): +- runner = CliRunner() +- result = runner.invoke(repo2module.cli.cli, ['-n', 'dummy', '-O', test_repo_dir]) +- +- assert result.exit_code == 0 +- assert result.output == module_yaml_output ++ # runner = CliRunner() ++ # result = runner.invoke(repo2module.cli.cli, ['-n', 'dummy', '-O', test_repo_dir]) ++ # assert result.exit_code == 0 ++ # assert result.output == module_yaml_output ++ raise NotImplementedError +diff --git a/tox.ini b/tox.ini +index aea2b29..717b47c 100644 +--- a/tox.ini ++++ b/tox.ini +@@ -22,3 +22,7 @@ commands = - flake8 createrepo_mod dir2module modulemd-generate-macros modulemd- + + [flake8] + max-line-length = 100 ++ ++[pytest] ++log_cli = true ++log_cli_level = DEBUG diff --git a/SPECS/modulemd-tools.spec b/SPECS/modulemd-tools.spec new file mode 100644 index 0000000..119b0b0 --- /dev/null +++ b/SPECS/modulemd-tools.spec @@ -0,0 +1,251 @@ +Name: modulemd-tools +Version: 0.7 +Release: 6%{?dist} +Summary: Collection of tools for parsing and generating modulemd YAML files +License: MIT +BuildArch: noarch + +URL: https://github.com/rpm-software-management/modulemd-tools +Source0: https://github.com/rpm-software-management/modulemd-tools/archive/%{version}/%{name}-%{version}.tar.gz +Patch0: modulemd-tools-0.7-1-to-modulemd-tools-0.7-6.patch + +BuildRequires: createrepo_c +BuildRequires: python3-devel +BuildRequires: python3-setuptools +BuildRequires: python3-libmodulemd >= 2.9.3 +BuildRequires: python3-dnf +BuildRequires: python3-hawkey +BuildRequires: python3-createrepo_c +BuildRequires: python3-pyyaml +BuildRequires: python3-pytest + +Requires: createrepo_c +Requires: python3-dnf +Requires: python3-hawkey +Requires: python3-createrepo_c +Requires: python3-pyyaml +Requires: python3-libmodulemd >= 2.9.3 + + +%description +Tools provided by this package: + +repo2module - Takes a YUM repository on its input and creates modules.yaml + containing YAML module definitions generated for each package. + +dir2module - Generates a module YAML definition based on essential module + information provided via command-line parameters. The packages provided by + the module are found in a specified directory or a text file containing + their list. + +createrepo_mod - A small wrapper around createrepo_c and modifyrepo_c to provide + an easy tool for generating module repositories. + +modulemd-merge - Merge several modules.yaml files into one. This is useful for + example if you have several yum repositories and want to merge them into one. + +modulemd-generate-macros - Generate module-build-macros SRPM package, which is + a central piece for building modules. It should be present in the buildroot + before any other module packages are submitted to be built. + +bld2repo - Simple tool for dowloading build required RPMs of a modular build from koji. + + +%prep +%setup -q +%patch0 -p1 + + +%build +cd repo2module +%py3_build +cd .. + +cd dir2module +%py3_build +cd .. + +cd createrepo_mod +%py3_build +cd .. + +cd modulemd-merge +%py3_build +cd .. + +cd modulemd_tools +%py3_build +cd .. + + +%install +cd repo2module +%py3_install +cd .. + +cd dir2module +%py3_install +cd .. + +cd createrepo_mod +%py3_install +cd .. + +cd modulemd-merge +%py3_install +cd .. + +cd modulemd_tools +%py3_install +cd .. + +cp modulemd-generate-macros/modulemd-generate-macros.py \ + %{buildroot}%{_bindir}/modulemd-generate-macros + +install -d %{buildroot}%{_mandir}/man1 +cp man/*.1 %{buildroot}%{_mandir}/man1/ + + +%check +export PATH={buildroot}%{_bindir}:$PATH + +cd repo2module +%{python3} -m pytest -vv +cd .. + +cd dir2module +%{python3} -m pytest -vv +cd .. + +cd createrepo_mod +%{python3} -m pytest -vv +cd .. + +cd modulemd-merge +%{python3} -m pytest -vv -s +cd .. + +cd modulemd_tools +%{python3} -m pytest -vv +cd .. + + +%files +%doc README.md +%license LICENSE +%{python3_sitelib}/repo2module +%{python3_sitelib}/repo2module-*.egg-info/ +%{python3_sitelib}/dir2module +%{python3_sitelib}/dir2module-*.egg-info/ +%{python3_sitelib}/createrepo_mod +%{python3_sitelib}/createrepo_mod-*.egg-info/ +%{python3_sitelib}/modulemd_merge +%{python3_sitelib}/modulemd_merge-*.egg-info/ +%{python3_sitelib}/modulemd_tools +%{python3_sitelib}/modulemd_tools-*.egg-info/ +%{_bindir}/repo2module +%{_bindir}/dir2module +%{_bindir}/createrepo_mod +%{_bindir}/modulemd-merge +%{_bindir}/modulemd-generate-macros + +%{_mandir}/man1/repo2module.1* +%{_mandir}/man1/dir2module.1* +%{_mandir}/man1/createrepo_mod.1* +%{_mandir}/man1/modulemd-merge.1* +%{_mandir}/man1/modulemd-generate-macros.1.* +%{_mandir}/man1/bld2repo.1.* + + +%changelog +* Fri Aug 27 2021 Jakub Kadlcik 0.7-6 +- Do not install bld2repo as RHEL8 doesn't have python3-koji + (jkadlcik@redhat.com) +- Drop the Patch1 and make the change directly in this repository + (jkadlcik@redhat.com) +- Use UpstreamBuilder instead of DistributionBuilder (jkadlcik@redhat.com) +- Skip some tests because they require binary files (jkadlcik@redhat.com) + +* Thu Aug 26 2021 Jakub Kadlcik 0.7-5 +- Update to new upstream version + +* Mon Aug 23 2021 Jakub Kadlcik 0.11-1 +- modulemd_tools: compatibility for upgrade_ext on EPEL8 (frostyx@email.cz) +- modulemd_tools: compatibility for read_packager_string on EPEL8 + (frostyx@email.cz) +- dir2module: generate also profiles and modulemd-defaults file + (frostyx@email.cz) +- modulemd_tools: use upgrade_ext instead of upgrade (frostyx@email.cz) +- modulemd_tools: use read_packager_string instead of read_string + (frostyx@email.cz) +- Add installation instructions (frostyx@email.cz) +- bld2repo: do not create empty repos when --result-dir is used + (kdudka@redhat.com) +- bld2repo: print status in a more intuitive format (kdudka@redhat.com) +- tito: stop releasing for Fedora 32 (frostyx@email.cz) + +* Mon Jun 14 2021 Jakub Kadlcik 0.10-1 +- Added bld2repo (mcurlej@redhat.com) + +* Fri Apr 09 2021 Jakub Kadlcik 0.9-1 +- repo2module: drop python-click dependency (frostyx@email.cz) + +* Tue Apr 06 2021 Jakub Kadlcik 0.8-1 +- modulemd_tools: drop python3-parameterized dependency (frostyx@email.cz) +- Package modulemd_tools helper lib (fvalder@redhat.com) +- Add modulemd-merge tests (fvalder@redhat.com) +- Add createrepo_mod tests (fvalder@redhat.com) +- Replace master in fedora releaser to rawhide (frostyx@email.cz) + +* Tue Mar 02 2021 Jakub Kadlčík - 0.7-4 +- Rebuild for 8.5.0 + +* Thu Feb 11 2021 Jakub Kadlčík - 0.7-3 +- Bump spec to rebuild with gating enabled + +* Tue Feb 09 2021 Jakub Kadlčík - 0.7-2 +- Do not generate manpages on the fly +- Drop python-parameterized dependency +- Fix python3 macro for running tests + +* Tue Feb 09 2021 Jakub Kadlcik 0.7-1 +- Generate manpages on the fly +- Automated test builds incl. Docker/Travis +- Fix PEP8 in all tools +- modulemd_tools: temporarily skip some tests on EPEL8 or Fedora +- Drop libmodulemd dependency in favor of python3-libmodulemd + +* Sun Nov 22 2020 Jakub Kadlcik 0.6-1 +- Generate manpages for all tools in this repository +- modulemd-generate-macros: add a tool for generating module-build-macros +- modulemd_tools: add the first pieces of a python library (for internal usage only) + +* Thu Nov 05 2020 Jakub Kadlcik 0.5-1 +- Release for epel8 as well (frostyx@email.cz) +- Require createrepo_c for the createrepo_mod package (frostyx@email.cz) +- modulemd-merge: improve README.md file (frostyx@email.cz) +- repo2module: improve README.md file (frostyx@email.cz) +- dir2module: improve README.md file (frostyx@email.cz) +- Improve README.md file (frostyx@email.cz) +- createrepo_mod: improve README.md file (frostyx@email.cz) +- Loosen the python3-libmodulemd dependency to just libmodulemd + (frostyx@email.cz) +- createrepo_mod: use just createrepo_c if it has built-in module support + (frostyx@email.cz) +- Explicitly depend on python3-setuptools (frostyx@email.cz) +- createrepo_mod: dump modules.yaml into the correct directory + (frostyx@email.cz) + +* Mon Aug 10 2020 Jakub Kadlcik 0.4-1 +- createrepo_mod: support also non-module repositories (frostyx@email.cz) + +* Wed Jul 29 2020 Jakub Kadlcik 0.3-1 +- Add createrepo_mod and modulemd-merge scripts + +* Sun Jul 26 2020 Jakub Kadlčík - 0.2-1 +- Add createrepo_mod tool +- Add modulemd-merge tool +- Drop Source1, it is not needed anymore + +* Tue Jun 09 2020 Jakub Kadlčík - 0.1-1 +- Initial package