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