From 2d9a1c175709bd3864490fb4cf9a7941a65ad5d4 Mon Sep 17 00:00:00 2001 From: Igor Shishkin Date: Sun, 24 Nov 2024 11:04:43 +0300 Subject: [PATCH] Use unified interface for object sources (#236) Related #126 --------- Signed-off-by: Igor Shishkin --- README.md | 18 +- cli/lazyblob/lazyblob.go | 2 +- cli/service/service.go | 321 +------ cli/service/service_test.go | 887 +----------------- cli/service/source/local/local.go | 151 +++ cli/service/source/local/local_test.go | 65 ++ .../local/testdata/checksum/test_file.txt | 1 + .../testdata/dir/some_dir/some_file3.txt | 1 + .../source/local/testdata/dir/some_file1.txt | 1 + .../source/local/testdata/dir/some_file2.txt | 1 + cli/service/source/mock/mock.go | 23 + cli/service/source/source.go | 17 + cli/service/source/yum/gpg.go | 78 ++ cli/service/source/yum/gpg_test.go | 127 +++ .../source/yum/testdata/gpg/somekey.gpg | 41 + .../repo-sha1/Packages/testpkg-1-1.src.rpm | Bin .../repo-sha1/Packages/testpkg-1-1.x86_64.rpm | Bin ...08f41e5578d702d2bea21a2e7-filelists.xml.gz | Bin ...5a77124d370de1d08deae8f1cc6-primary.xml.gz | Bin ...5b59b27c27859bb1c17ac573e-other.sqlite.bz2 | Bin ...9b3dd9f40e61c65af499e-filelists.sqlite.bz2 | Bin ...894718ea227fea60f2b78ba-primary.sqlite.bz2 | Bin ...127d52228d01b0239010ddca14c8f-other.xml.gz | Bin .../testdata/repo-sha1/repodata/repomd.xml | 0 .../RPMS/x86_64/testpkg-1-1.x86_64.rpm | Bin .../repo-signed/SRPMS/testpkg-1-1.src.rpm | Bin ...e7d7d34cebeb55abce6ad40-primary.sqlite.bz2 | Bin ...753ac42a67c2afbdd2d48-filelists.sqlite.bz2 | Bin ...4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz | Bin ...83b706332314e97d1007f8f0c-filelists.xml.gz | Bin ...1c4e233efd99353716d856c245f-primary.xml.gz | Bin ...47cfad8f6287540beda0779f6-other.sqlite.bz2 | Bin .../testdata/repo-signed/repodata/repomd.xml | 0 .../repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm | Bin .../repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm | Bin .../testdata/repo/SRPMS/testpkg1-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg1-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg1-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg10-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg10-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg10-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg2-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg2-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg2-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg3-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg3-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg3-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg4-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg4-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg4-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg5-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg5-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg5-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg6-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg6-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg6-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg7-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg7-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg7-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg8-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg8-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg8-1-3.src.rpm | Bin .../testdata/repo/SRPMS/testpkg9-1-1.src.rpm | Bin .../testdata/repo/SRPMS/testpkg9-1-2.src.rpm | Bin .../testdata/repo/SRPMS/testpkg9-1-3.src.rpm | Bin ...85022f23f08f5d4932a37387053-primary.xml.gz | Bin ...80e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 | Bin ...b41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 | Bin ...b270414cabb3b46612703c85d731f-other.xml.gz | Bin ...56e7642fa24ca47610c52-filelists.sqlite.bz2 | Bin ...2596bcf8ebcd6a582d40ca9dd-filelists.xml.gz | Bin .../yum/testdata/repo/repodata/repomd.xml | 0 cli/service/source/yum/utils.go | 34 + cli/service/source/yum/utils_test.go | 23 + cli/service/source/yum/yum.go | 175 ++++ .../source/yum/yum_repo}/README.md | 0 .../yum/yum_repo}/mirrorlist/mirrorlist.go | 2 +- .../yum_repo}/mirrorlist/mirrorlist_test.go | 0 .../source/yum/yum_repo}/models/packages.go | 0 .../source/yum/yum_repo}/models/primarymd.go | 0 .../source/yum/yum_repo}/models/repomd.go | 0 .../repo-sha1/Packages/testpkg-1-1.src.rpm | Bin 0 -> 6156 bytes .../repo-sha1/Packages/testpkg-1-1.x86_64.rpm | Bin 0 -> 6722 bytes ...08f41e5578d702d2bea21a2e7-filelists.xml.gz | Bin 0 -> 282 bytes ...5a77124d370de1d08deae8f1cc6-primary.xml.gz | Bin 0 -> 688 bytes ...5b59b27c27859bb1c17ac573e-other.sqlite.bz2 | Bin 0 -> 669 bytes ...9b3dd9f40e61c65af499e-filelists.sqlite.bz2 | Bin 0 -> 787 bytes ...894718ea227fea60f2b78ba-primary.sqlite.bz2 | Bin 0 -> 1937 bytes ...127d52228d01b0239010ddca14c8f-other.xml.gz | Bin 0 -> 247 bytes .../testdata/repo-sha1/repodata/repomd.xml | 55 ++ .../RPMS/x86_64/testpkg-1-1.x86_64.rpm | Bin 0 -> 6734 bytes .../repo-signed/SRPMS/testpkg-1-1.src.rpm | Bin 0 -> 6115 bytes ...e7d7d34cebeb55abce6ad40-primary.sqlite.bz2 | Bin 0 -> 1985 bytes ...753ac42a67c2afbdd2d48-filelists.sqlite.bz2 | Bin 0 -> 859 bytes ...4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz | Bin 0 -> 282 bytes ...83b706332314e97d1007f8f0c-filelists.xml.gz | Bin 0 -> 314 bytes ...1c4e233efd99353716d856c245f-primary.xml.gz | Bin 0 -> 718 bytes ...47cfad8f6287540beda0779f6-other.sqlite.bz2 | Bin 0 -> 743 bytes .../testdata/repo-signed/repodata/repomd.xml | 55 ++ .../repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm | Bin 0 -> 6740 bytes .../repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm | Bin 0 -> 6741 bytes .../repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm | Bin 0 -> 6740 bytes .../repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm | Bin 0 -> 6742 bytes .../repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm | Bin 0 -> 6742 bytes .../testdata/repo/SRPMS/testpkg1-1-1.src.rpm | Bin 0 -> 6123 bytes .../testdata/repo/SRPMS/testpkg1-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg1-1-3.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg10-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg10-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg10-1-3.src.rpm | Bin 0 -> 6125 bytes .../testdata/repo/SRPMS/testpkg2-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg2-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg2-1-3.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg3-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg3-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg3-1-3.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg4-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg4-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg4-1-3.src.rpm | Bin 0 -> 6125 bytes .../testdata/repo/SRPMS/testpkg5-1-1.src.rpm | Bin 0 -> 6122 bytes .../testdata/repo/SRPMS/testpkg5-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg5-1-3.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg6-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg6-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg6-1-3.src.rpm | Bin 0 -> 6125 bytes .../testdata/repo/SRPMS/testpkg7-1-1.src.rpm | Bin 0 -> 6123 bytes .../testdata/repo/SRPMS/testpkg7-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg7-1-3.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg8-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg8-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg8-1-3.src.rpm | Bin 0 -> 6125 bytes .../testdata/repo/SRPMS/testpkg9-1-1.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg9-1-2.src.rpm | Bin 0 -> 6124 bytes .../testdata/repo/SRPMS/testpkg9-1-3.src.rpm | Bin 0 -> 6125 bytes ...85022f23f08f5d4932a37387053-primary.xml.gz | Bin 0 -> 4550 bytes ...80e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 | Bin 0 -> 4351 bytes ...b41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 | Bin 0 -> 9036 bytes ...b270414cabb3b46612703c85d731f-other.xml.gz | Bin 0 -> 2848 bytes ...56e7642fa24ca47610c52-filelists.sqlite.bz2 | Bin 0 -> 5554 bytes ...2596bcf8ebcd6a582d40ca9dd-filelists.xml.gz | Bin 0 -> 3000 bytes .../testdata/repo/repodata/repomd.xml | 55 ++ .../source/yum/yum_repo}/yum.go | 4 +- .../source/yum/yum_repo}/yum_test.go | 3 +- cli/service/source/yum/yum_test.go | 123 +++ cmd/cli/main.go | 39 +- 198 files changed, 1110 insertions(+), 1192 deletions(-) create mode 100644 cli/service/source/local/local.go create mode 100644 cli/service/source/local/local_test.go create mode 100644 cli/service/source/local/testdata/checksum/test_file.txt create mode 100644 cli/service/source/local/testdata/dir/some_dir/some_file3.txt create mode 100644 cli/service/source/local/testdata/dir/some_file1.txt create mode 100644 cli/service/source/local/testdata/dir/some_file2.txt create mode 100644 cli/service/source/mock/mock.go create mode 100644 cli/service/source/source.go create mode 100644 cli/service/source/yum/gpg.go create mode 100644 cli/service/source/yum/gpg_test.go create mode 100644 cli/service/source/yum/testdata/gpg/somekey.gpg rename cli/{ => service/source}/yum/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-sha1/repodata/repomd.xml (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo-signed/repodata/repomd.xml (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg1-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg1-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg1-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg10-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg10-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg10-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg2-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg2-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg2-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg3-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg3-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg3-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg4-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg4-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg4-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg5-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg5-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg5-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg6-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg6-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg6-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg7-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg7-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg7-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg8-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg8-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg8-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg9-1-1.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg9-1-2.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/SRPMS/testpkg9-1-3.src.rpm (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz (100%) rename cli/{ => service/source}/yum/testdata/repo/repodata/repomd.xml (100%) create mode 100644 cli/service/source/yum/utils.go create mode 100644 cli/service/source/yum/utils_test.go create mode 100644 cli/service/source/yum/yum.go rename cli/{yum => service/source/yum/yum_repo}/README.md (100%) rename cli/{yum => service/source/yum/yum_repo}/mirrorlist/mirrorlist.go (98%) rename cli/{yum => service/source/yum/yum_repo}/mirrorlist/mirrorlist_test.go (100%) rename cli/{yum => service/source/yum/yum_repo}/models/packages.go (100%) rename cli/{yum => service/source/yum/yum_repo}/models/primarymd.go (100%) rename cli/{yum => service/source/yum/yum_repo}/models/repomd.go (100%) create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/repomd.xml create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/repomd.xml create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg4-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg4-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg4-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-1.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-2.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-3.src.rpm create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz create mode 100644 cli/service/source/yum/yum_repo/testdata/repo/repodata/repomd.xml rename cli/{yum => service/source/yum/yum_repo}/yum.go (97%) rename cli/{yum => service/source/yum/yum_repo}/yum_test.go (99%) create mode 100644 cli/service/source/yum/yum_test.go diff --git a/README.md b/README.md index 63494ef..a79e48f 100644 --- a/README.md +++ b/README.md @@ -99,15 +99,20 @@ CLI interface for archived Flags: - --[no-]help Show context-sensitive help (also try --help-long and --help-man). + --[no-]help Show context-sensitive help (also try --help-long + and --help-man). -d, --[no-]debug Enable debug mode ($ARCHIVED_CLI_DEBUG) - -t, --[no-]trace Enable trace mode (debug mode on steroids) ($ARCHIVED_CLI_TRACE) - -s, --endpoint=ENDPOINT Manager API endpoint address ($ARCHIVED_CLI_ENDPOINT) + -t, --[no-]trace Enable trace mode (debug mode on steroids) + ($ARCHIVED_CLI_TRACE) + -s, --endpoint=ENDPOINT Manager API endpoint address + ($ARCHIVED_CLI_ENDPOINT) --[no-]insecure Do not use TLS for gRPC connection --[no-]insecure-skip-verify - Do not perform TLS certificate verification for gRPC connection + Do not perform TLS certificate verification for + gRPC connection --cache-dir="~/.cache/archived/cli/objects" - Stat-cache directory for objects ($ARCHIVED_CLI_STAT_CACHE_DIR) + Stat-cache directory for objects + ($ARCHIVED_CLI_STAT_CACHE_DIR) -n, --namespace="default" namespace for containers to operate on Commands: @@ -156,9 +161,6 @@ version publish object list list objects in the given container and version -object create - create object(s) from location - object url get URL for the object diff --git a/cli/lazyblob/lazyblob.go b/cli/lazyblob/lazyblob.go index 93307b6..f195932 100644 --- a/cli/lazyblob/lazyblob.go +++ b/cli/lazyblob/lazyblob.go @@ -34,7 +34,7 @@ func New(url, tempDir string, length uint64) LazyBLOB { "url": url, "length": length, "tempdir": tempDir, - }).Debug("lazyblob initialized") + }).Trace("initializing lazyblob ...") return &lazyblob{ url: url, diff --git a/cli/service/service.go b/cli/service/service.go index 134cd12..3944b98 100644 --- a/cli/service/service.go +++ b/cli/service/service.go @@ -1,26 +1,16 @@ package service import ( - "bytes" "context" - "crypto/sha256" - "encoding/hex" "fmt" "io" - "io/fs" "net/http" - "os" - "path/filepath" - "strings" - "github.com/ProtonMail/go-crypto/openpgp" "github.com/pkg/errors" - rpmutils "github.com/sassoftware/go-rpmutils" log "github.com/sirupsen/logrus" - "github.com/teran/archived/cli/lazyblob" + "github.com/teran/archived/cli/service/source" cache "github.com/teran/archived/cli/service/stat_cache" - "github.com/teran/archived/cli/yum" v1proto "github.com/teran/archived/manager/presenter/grpc/proto/v1" ) @@ -36,19 +26,16 @@ type Service interface { ListContainers(namespaceName string) func(ctx context.Context) error DeleteContainer(namespaceName, containerName string) func(ctx context.Context) error - CreateVersion(namespaceName, containerName string, shouldPublish bool, fromDir, fromYumRepo, rpmGPGKey, rpmGPGKeyChecksum *string) func(ctx context.Context) error + CreateVersion(namespaceName, containerName string, shouldPublish bool, src source.Source) func(ctx context.Context) error DeleteVersion(namespaceName, containerName, versionID string) func(ctx context.Context) error ListVersions(namespaceName, containerName string) func(ctx context.Context) error PublishVersion(namespaceName, containerName, versionID string) func(ctx context.Context) error - CreateObject(namespaceName, containerName, versionID, directoryPath string) func(ctx context.Context) error ListObjects(namespaceName, containerName, versionID string) func(ctx context.Context) error GetObjectURL(namespaceName, containerName, versionID, objectKey string) func(ctx context.Context) error DeleteObject(namespaceName, containerName, versionID, objectKey string) func(ctx context.Context) error } -const processStatusInterval int = 100 - type service struct { cache cache.CacheRepository cli v1proto.ManageServiceClient @@ -191,7 +178,7 @@ func (s *service) DeleteContainer(namespaceName, containerName string) func(ctx } } -func (s *service) CreateVersion(namespaceName, containerName string, shouldPublish bool, fromDir, fromYumRepo, rpmGPGKey, rpmGPGKeyChecksum *string) func(ctx context.Context) error { +func (s *service) CreateVersion(namespaceName, containerName string, shouldPublish bool, src source.Source) func(ctx context.Context) error { return func(ctx context.Context) error { log.Tracef("creating version ...") resp, err := s.cli.CreateVersion(ctx, &v1proto.CreateVersionRequest{ @@ -205,27 +192,10 @@ func (s *service) CreateVersion(namespaceName, containerName string, shouldPubli versionID := resp.GetVersion() log.Tracef("version created: `%s`", versionID) - if fromDir != nil && *fromDir != "" { - log.Tracef("--from-dir is requested with `%s`", *fromDir) - err = s.CreateObject(namespaceName, containerName, versionID, *fromDir)(ctx) - if err != nil { - return errors.Wrap(err, "error creating objects") - } - } else if fromYumRepo != nil && *fromYumRepo != "" { - log.Tracef("--from-yum-repo is requested with `%s`", *fromYumRepo) - var gpgKeyring openpgp.EntityList = nil - if *rpmGPGKey != "" { - log.Tracef("RPM GPG Key was passed so initialing GPG keyring ...") - gpgKeyring, err = getGPGKey(ctx, *rpmGPGKey, rpmGPGKeyChecksum) - if err != nil { - return err - } - } - - err := s.createVersionFromYUMRepository(ctx, namespaceName, containerName, versionID, *fromYumRepo, gpgKeyring) - if err != nil { - return errors.Wrap(err, "error creating objects") - } + if err := src.Process(ctx, func(ctx context.Context, obj source.Object) error { + return s.createObject(ctx, namespaceName, containerName, versionID, obj) + }); err != nil { + return errors.Wrap(err, "error processing source") } if shouldPublish { @@ -248,143 +218,6 @@ func (s *service) CreateVersion(namespaceName, containerName string, shouldPubli } } -func (s *service) createVersionFromYUMRepository(ctx context.Context, namespaceName string, containerName, versionID, url string, gpgKeyring openpgp.EntityList) error { - log.WithFields(log.Fields{ - "repository_url": url, - }).Info("running creating version from YUM repository ...") - - repo := yum.New(url) - packages, err := repo.Packages(ctx) - if err != nil { - return errors.Wrap(err, "error getting repository data") - } - - log.WithFields(log.Fields{ - "repository_url": url, - }).Info("handling YUM repository metadata files ...") - for k, v := range repo.Metadata() { - size := len(v) - - hasher := sha256.New() - n, err := hasher.Write(v) - if err != nil { - return err - } - - if n != size { - return io.ErrShortWrite - } - - checksum := hex.EncodeToString(hasher.Sum(nil)) - - log.Tracef("rpc CreateObject(%s, %s, %s, %s, %s, %d)", namespaceName, containerName, versionID, k, checksum, size) - resp, err := s.cli.CreateObject(ctx, &v1proto.CreateObjectRequest{ - Namespace: namespaceName, - Container: containerName, - Version: versionID, - Key: k, - Checksum: checksum, - Size: uint64(size), - }) - if err != nil { - return errors.Wrap(err, "error creating object") - } - - if uploadURL := resp.GetUploadUrl(); uploadURL != "" { - err := uploadBlob(ctx, uploadURL, bytes.NewReader(v), uint64(size)) - if err != nil { - return err - } - } - } - - log.WithFields(log.Fields{ - "repository_url": url, - "packages_count": len(packages), - }).Info("handling package files ...") - for cnt, pkg := range packages { - err := func(name, checksum, sourceURL string, size uint64) error { - lb := lazyblob.New(sourceURL, os.TempDir(), size) - defer func() { - if err := lb.Close(); err != nil { - log.Warnf("error removing scratch data: %s", err) - } - }() - - if pkg.ChecksumType != "sha256" { - filename, err := lb.Filename(ctx) - if err != nil { - return errors.Wrap(err, "error getting package filename") - } - - checksum, err = checksumFile(filename) - if err != nil { - return errors.Wrap(err, "error calculating checksum") - } - } - - log.Tracef("rpc CreateObject(%s, %s, %s, %s, %s, %d)", namespaceName, containerName, versionID, name, checksum, size) - resp, err := s.cli.CreateObject(ctx, &v1proto.CreateObjectRequest{ - Namespace: namespaceName, - Container: containerName, - Version: versionID, - Key: name, - Checksum: checksum, - Size: size, - }) - if err != nil { - return errors.Wrap(err, "error creating object") - } - - if uploadURL := resp.GetUploadUrl(); uploadURL != "" { - if gpgKeyring != nil { - log.Debug("verifying RPM GPG signature ...") - - fp, err := lb.Reader(ctx) - if err != nil { - return errors.Wrap(err, "error opening package file") - } - - _, sigs, err := rpmutils.Verify(fp, gpgKeyring) - if err != nil { - return errors.Wrapf(err, "error verifying package signature: %s", name) - } - - if len(sigs) == 0 { - log.Warnf("package `%s` does not contain signature", name) - } - } - - err := func(uploadURL string) error { - log.Tracef("Upload URL: `%s`", uploadURL) - - fp, err := lb.Reader(ctx) - if err != nil { - return errors.Wrap(err, "error getting reader for package file") - } - - return uploadBlob(ctx, uploadURL, fp, size) - }(uploadURL) - if err != nil { - return err - } - } - - if cnt%processStatusInterval == 0 { - log.WithFields(log.Fields{ - "repository_url": url, - }).Infof("%d files processed ...", cnt+1) - } - - return nil - }(pkg.Name, pkg.Checksum, strings.TrimSuffix(url, "/")+"/"+strings.TrimPrefix(pkg.Name, "/"), pkg.Size) - if err != nil { - return err - } - } - return nil -} - func (s *service) DeleteVersion(namespaceName, containerName, versionID string) func(ctx context.Context) error { return func(ctx context.Context) error { _, err := s.cli.DeleteVersion(ctx, &v1proto.DeleteVersionRequest{ @@ -436,100 +269,6 @@ func (s *service) PublishVersion(namespaceName, containerName, versionID string) } } -func (s *service) CreateObject(namespaceName, containerName, versionID, directoryPath string) func(ctx context.Context) error { - return func(ctx context.Context) error { - log.WithFields(log.Fields{ - "directory": directoryPath, - }).Info("scanning directory ...") - var cnt int - return filepath.Walk(directoryPath, func(path string, info fs.FileInfo, err error) error { - defer func() { cnt++ }() - - if err != nil { - return errors.Wrap(err, "walk: internal error") - } - - if info.IsDir() { - return nil - } - - shortPath := strings.TrimPrefix(path, directoryPath) - shortPath = strings.TrimPrefix(shortPath, "/") - size := info.Size() - - log.WithFields(log.Fields{ - "filename": shortPath, - "size": size, - }).Debug("file found") - - log.WithFields(log.Fields{ - "filename": shortPath, - "size": size, - }).Tracef("attempting to retrieve checksum from cache") - checksum, err := s.cache.Get(ctx, path, info) - if err != nil { - return errors.Wrap(err, "error retrieving checksum from cache") - } - - if checksum == "" { - log.WithFields(log.Fields{ - "filename": shortPath, - "size": size, - }).Debug("generating checksum") - checksum, err = checksumFile(path) - if err != nil { - return errors.Wrap(err, "error calculating file checksum") - } - - err := s.cache.Put(ctx, path, info, checksum) - if err != nil { - log.Warnf("error putting checksum calculation result into cache: %s", err) - } - } - log.WithFields(log.Fields{ - "filename": shortPath, - "size": size, - "checksum": checksum, - }).Debug("checksum") - - log.Tracef("rpc CreateObject(%s,%s, %s, %s, %s, %d)", namespaceName, containerName, versionID, shortPath, checksum, size) - resp, err := s.cli.CreateObject(ctx, &v1proto.CreateObjectRequest{ - Namespace: namespaceName, - Container: containerName, - Version: versionID, - Key: shortPath, - Checksum: checksum, - Size: uint64(size), - }) - if err != nil { - return errors.Wrap(err, "error creating object") - } - - if url := resp.GetUploadUrl(); url != "" { - log.Tracef("Upload URL: `%s`", url) - - fp, err := os.Open(path) - if err != nil { - return errors.Wrap(err, "error opening file") - } - defer fp.Close() - - if err := uploadBlob(ctx, url, fp, uint64(size)); err != nil { - return err - } - } - - if cnt%processStatusInterval == 0 { - log.WithFields(log.Fields{ - "directory": directoryPath, - }).Infof("%d files processed ...", cnt+1) - } - - return nil - }) - } -} - func (s *service) ListObjects(namespaceName, containerName, versionID string) func(ctx context.Context) error { return func(ctx context.Context) error { resp, err := s.cli.ListObjects(ctx, &v1proto.ListObjectsRequest{ @@ -583,28 +322,38 @@ func (s *service) DeleteObject(namespaceName, containerName, versionID, objectKe } } -func checksumFile(filename string) (string, error) { - info, err := os.Stat(filename) - if err != nil { - return "", errors.Wrap(err, "error performing stat on file") - } - fp, err := os.Open(filename) +func (s *service) createObject(ctx context.Context, namespaceName, containerName, versionID string, object source.Object) error { + log.WithFields(log.Fields{ + "path": object.Path, + "sha256": object.SHA256, + "length": object.Size, + }).Info("creating object ...") + + resp, err := s.cli.CreateObject(ctx, &v1proto.CreateObjectRequest{ + Namespace: namespaceName, + Container: containerName, + Version: versionID, + Key: object.Path, + Checksum: object.SHA256, + Size: object.Size, + }) if err != nil { - return "", errors.Wrap(err, "error opening file") + return errors.Wrap(err, "error creating object") } - defer fp.Close() - h := sha256.New() - n, err := io.Copy(h, fp) - if err != nil { - return "", errors.Wrap(err, "error reading file") - } + if url := resp.GetUploadUrl(); url != "" { + log.WithFields(log.Fields{ + "path": object.Path, + "sha256": object.SHA256, + "length": object.Size, + "url": url, + }).Info("uploading BLOB ...") - if n != info.Size() { - return "", errors.Errorf("file size is %d bytes while only %d was copied: early EOF", info.Size(), n) + if err := uploadBlob(ctx, url, object.Contents, object.Size); err != nil { + return err + } } - - return hex.EncodeToString(h.Sum(nil)), nil + return nil } func uploadBlob(ctx context.Context, url string, rd io.Reader, size uint64) error { @@ -618,7 +367,7 @@ func uploadBlob(ctx context.Context, url string, rd io.Reader, size uint64) erro log.WithFields(log.Fields{ "url": url, "length": size, - }).Tracef("size is set") + }).Tracef("Setting Content-Length ...") req.ContentLength = int64(size) } diff --git a/cli/service/service_test.go b/cli/service/service_test.go index 87d512e..54ef59b 100644 --- a/cli/service/service_test.go +++ b/cli/service/service_test.go @@ -2,24 +2,17 @@ package service import ( "context" - "io" - "net/http" - "net/http/httptest" "testing" - echo "github.com/labstack/echo/v4" - "github.com/labstack/echo/v4/middleware" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/suite" - ptr "github.com/teran/go-ptr" + sourceMock "github.com/teran/archived/cli/service/source/mock" cacheMock "github.com/teran/archived/cli/service/stat_cache/mock" ) const ( defaultNamespace = "default" - - mimeTypeMultipartFormData = "multipart/form-data" ) func init() { @@ -92,793 +85,19 @@ func (s *serviceTestSuite) TestDeleteContainer() { func (s *serviceTestSuite) TestCreateVersion() { s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil).Once() - fn := s.svc.CreateVersion(defaultNamespace, "container1", false, nil, nil, nil, nil) - s.Require().NoError(fn(s.ctx)) -} + s.sourceMock.On("Process").Return(nil).Once() -func (s *serviceTestSuite) TestCreateVersionAndPublish() { - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil).Once() - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, nil, nil, nil, nil) + fn := s.svc.CreateVersion(defaultNamespace, "container1", false, s.sourceMock) s.Require().NoError(fn(s.ctx)) } -func (s *serviceTestSuite) TestCreateVersionAndPublishWithEmptyPath() { +func (s *serviceTestSuite) TestCreateVersionAndPublish() { s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil).Once() s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String(""), nil, nil, nil) - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateVersionFromDirAndPublish() { - s.cacheMock.On("Get", "testdata/repo/somefile1").Return("", nil).Once() - s.cacheMock.On("Get", "testdata/repo/somefile2").Return("", nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4").Return(nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61").Return(nil).Once() + s.sourceMock.On("Process").Return(nil).Once() - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil, nil).Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", uint64(5)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", uint64(5)). - Return(ptr.String(""), nil). - Once() - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String("testdata/repo"), nil, nil, nil) - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateVersionFromYumRepoAndPublish() { - e := echo.New() - e.Use(middleware.Logger()) - e.Use(middleware.Recover()) - e.Static("/", "../yum/testdata/repo") - - srv := httptest.NewServer(e) - defer srv.Close() - - e2 := echo.New() - e2.Use(middleware.Logger()) - e2.Use(middleware.Recover()) - e2.PUT("/upload", func(c echo.Context) error { - if c.Request().Header.Get("Content-Length") != "6156" { - return c.NoContent(http.StatusLengthRequired) - } - - if c.Request().Header.Get("Content-Type") != mimeTypeMultipartFormData { - return c.NoContent(http.StatusUnsupportedMediaType) - } - return nil - }) - - uploadSrv := httptest.NewServer(e2) - defer uploadSrv.Close() - - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil, nil).Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz", "12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053", uint64(4550)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2", "3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5", uint64(9036)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz", "f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd", uint64(3000)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2", "a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52", uint64(5554)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz", "3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f", uint64(2848)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2", "27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32", uint64(4351)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/repomd.xml", "904c00f4c838f67d1c79113d7996840add665d513889b112bb715776607c151c", uint64(3078)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-1.x86_64.rpm", "49fd5f21e3d489e500eba418207d62bc241d9f512a23b14fecb8a7777ee01bc6", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-2.x86_64.rpm", "08b032391b745436fd9b2a19b3f74889a5965c24d27d1d818a0d49b66ac4f47a", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-3.x86_64.rpm", "d9c6b377f3484f5a6312164df290186d9ed5536a8e3e67ef1c7ae8c9b956794b", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-1.x86_64.rpm", "af60a18cd0517920acac3ff737e5595c4b2dc779dd9205f6731eeba54265dfd7", uint64(6740)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-2.x86_64.rpm", "6dc90f4258183bb61baa2a0a588732fa5db0fd165d1b7bf02ff0198fca93efdb", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-3.x86_64.rpm", "a68d0510bec578428402a029eac55e34e8784e96556e9f2d1c9424911c2a489f", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-1.x86_64.rpm", "88307ad55751656bb96132d8d448aa78ebafb28120634695f8207c8460ad7dff", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-2.x86_64.rpm", "e5dd6aac17915a9ada1b39e4efcb03e4ee3e6998ff910c0584ccb11f97721632", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-3.x86_64.rpm", "d216d06a4ff1569a98ff981469bbf2765300587f69dbf378a150c0cf8dfb4795", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-1.x86_64.rpm", "68170e526f756eeb06d33d77332000a67e8eb31eb004f28de509ed8aae72f8a6", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-2.x86_64.rpm", "f75513d7fc853e3f8d4c832700151dcb04d88388f367c4a29a0c702988fd9c80", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-3.x86_64.rpm", "ec036e47e7e711cf26b126c103e25bf0191a67bfc44089f18ee6c3ade8a334d1", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-1.x86_64.rpm", "e7de03570c76ec13cceff7bca33cec6fcff45e3c4c83e088b06764825542e78b", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-2.x86_64.rpm", "c9731ea0936b1c4debc4ebae7935687c4a5a5f9b538ab795c903adbce6ba5b70", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-3.x86_64.rpm", "5942505f4082335d8cde4e03bb9bb9080e86efb6a24dce6167a71abbe418a1d2", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-1.x86_64.rpm", "006ef00d887654372886d295c1dc03eff7b18c611c1d35c4081456300bf99d15", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-2.x86_64.rpm", "ab195eaac0cc29c13c5920e0bdb8f2dedcc20ca10861775d6a0ccce8bb81546c", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-3.x86_64.rpm", "f2149561e84c54c429869ec051b18b3c59a92313164fc2b678c08b182711e339", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-1.x86_64.rpm", "234b5d4a4ea3cd320292c374efdb2ca51876fac43f902d3816a8b04bd155a5c1", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-2.x86_64.rpm", "2665d47c785688562748b0d7c0637a2c9ff052cb12acf09a2b64d0da699843f2", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-3.x86_64.rpm", "84c25528dc5381c89656e52a6af6fa51c7cb9faa69cec3b5c196ffd4ba037c80", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-1.x86_64.rpm", "6b3edf4d9a1194b0b07c660281378375d258f25e1e74c7852f9fb209c0b1de4f", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-2.x86_64.rpm", "8c9d92872e4c3c462203682c63c79d61c00b398f84a4adf66f2da08e4c416a4b", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-3.x86_64.rpm", "845b31dbb4d80b13ace39ab2da1e19d68727d43de7b01fd5cf5c10e633f7707e", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-1.x86_64.rpm", "1ed2f5e08a1f57c68199c57271404945762bcba36d99c2c03a45d60ad8e53a75", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-2.x86_64.rpm", "dde30ee7035800604434e3b0928934c56fc382748cb3dc6a87ee7605a15af9a3", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-3.x86_64.rpm", "1fec4e8fcd788227fd836960f129b7c5384bf416aa78bdb7923dfdc431b208bf", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-1.x86_64.rpm", "0ba29dded6b136adb548396295f46ff4fa827d416cdfa25129ddaef5be2f2d96", uint64(6740)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-2.x86_64.rpm", "192d106bc5c19b9e8651dbd255f5f0a240b781b85a2af0ce58d1c5f8670158b6", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-3.x86_64.rpm", "ae2f90464235b2abeccf9c2607c51bab0b8a4f3afd6531026d62d54300b2e093", uint64(6742)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-1.src.rpm", "5906d8401381f428c28074563ed082425074cf4737ef38ca1bf21c3261aabd76", uint64(6123)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-2.src.rpm", "fb69e232a677646c0375e9cf999e5c8493368edcafd0e5fe6f901a7425f7d68e", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-3.src.rpm", "cf28031ec6d8ddc146b1f2ec37e4b7bbd7f4f751ae9b7730f709c43d0292bb79", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-1.src.rpm", "7f86347249889174a4bcfa2d20aec471e44275be06484f45a2d1afa4f61d8895", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-2.src.rpm", "151a800766bfb51b8f414878367f64028f3693dc323a01de2ccc10d96813f302", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-3.src.rpm", "370e830462c33db0cc11dcaa7f539773a651c1dde980bd1e92db601d85156419", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-1.src.rpm", "802c968cd29794edf721fcbc5924a68606df9a0648d89c648481bf77ff89c53c", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-2.src.rpm", "f26e8390a958c0fd0a15c07cf9ef2f93485b90ec701888013f1453b0946c7c47", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-3.src.rpm", "07a1e8b441c8e329cb07567bdbd845d833da6721dfc166c3510469f313ebd652", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-1.src.rpm", "3a557ebe499975f3c7b95e1b39ca3ff10369b51dec045d8f882a0cb587815db4", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-2.src.rpm", "4ad8107d6a8a9f32c3c2f4971756467ee536979cb246e53a9d238c824df665ea", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-3.src.rpm", "14b797a378b75c5c6793400f2d2f14b98099ba32b95828686ca7b14c8475d889", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-1.src.rpm", "7b981767615dd5c739f027bcc17aa91343d36aa5040e59f7614e401a35b2e703", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-2.src.rpm", "3f55e2dd76104d19baf4148342c0cdc5b0230879cca6c5b13c07f24a25d79a1d", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-3.src.rpm", "80ea7ece7614339e906e80920a5a5d5bf0881f3e9a0a02ab2831036e67ea4152", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-1.src.rpm", "182367519219c7f56c1213350372333219fa0d2f858072f524734308949daf61", uint64(6122)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-2.src.rpm", "904021dcfd97e54d3c5cbaa7742af844cc5c48adb4af4ba88495db30afd629d9", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-3.src.rpm", "7b74718b1f01b561f66d04706327269bf67981db6743c46858fe03e2868c6ef5", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-1.src.rpm", "96e669c98d8d79d0acc77f1d9b3246e6baabf2f49a7591d26ba69740b80574ee", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-2.src.rpm", "798464bf773513c123183fe00aa350459ec31568e2ee1895d8fef4d6dfbb2e28", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-3.src.rpm", "d9e1eaa79d2b80349186b3ec51a5331ca400994d9ba0a5fbcd6992fdf2234fcb", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-1.src.rpm", "8f76905b96b5476485fca223804a9900c3351f0b61e30f862ebc7e48f1232fca", uint64(6123)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-2.src.rpm", "263e504fd0be3d6903e03e4b5d3c820c6f06e474253d63bf7951223c3080cc17", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-3.src.rpm", "c04e4e225556951502e2ce533ac25d26decf63a768013c14bcec32dc60b88837", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-1.src.rpm", "6b0bb85fe30ae6e406a1dddb2af7126294e24fae64e79be67c426e94f90720ee", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-2.src.rpm", "cc3fd1c43ea62332e534e0f5d6a7df7f1c808725116109f33fe38453682d5ee7", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-3.src.rpm", "d5ccf0943d89947bb2f8b3ed8466d60e452f1b0daa881d5d3fe2c8584778883b", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-1.src.rpm", "ed76da35a9b4f4ea4e3828f6a978016cc6b4b9c0cd0548f2d4cbd6a695b1f6e9", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-2.src.rpm", "26dc22dbbbd6569c6d41d7c37b6e8b3d90ec24c76c075bfe8b0016de64bb2029", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-3.src.rpm", "869bf9b01e2ea53e02bb8666ca1118e2c9e5cef2598e9a1b1f67125531b3bd8e", uint64(6125)). - Return(ptr.String(""), nil). - Once() - - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String(""), ptr.String(srv.URL), ptr.String(""), nil) - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateVersionFromYumRepoAndPublishSHA1() { - e := echo.New() - e.Use(middleware.Logger()) - e.Use(middleware.Recover()) - e.Static("/", "../yum/testdata/repo-sha1") - - srv := httptest.NewServer(e) - defer srv.Close() - - e2 := echo.New() - e2.Use(middleware.Logger()) - e2.Use(middleware.Recover()) - e2.PUT("/upload", func(c echo.Context) error { - if c.Request().Header.Get("Content-Length") != "6156" { - return c.NoContent(http.StatusLengthRequired) - } - - if c.Request().Header.Get("Content-Type") != mimeTypeMultipartFormData { - return c.NoContent(http.StatusUnsupportedMediaType) - } - return nil - }) - - uploadSrv := httptest.NewServer(e2) - defer uploadSrv.Close() - - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil, nil).Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz", "1c07f3f3f0e6d09972c1d7852d1dbc9715d6fbdceee66c50e8356d1e69502d3b", uint64(688)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2", "c9b8ce03b503e29d9ec2faa2328e4f2082f0a5f71478ca6cb2f1a3ab75e676bc", uint64(1937)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz", "b56801c0a86f9a0136953e8c8e59cd35c1f18fc41e70ba8fcdcccfee068dfc8a", uint64(282)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2", "59bd3edd4edacac87e5e15494698f34a7f52277691635f927c185e92a681d9ee", uint64(787)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz", "56e566dfc63b0a7056b21cec661717a411f68cf98747d9a719557bce3a8ac41a", uint64(247)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2", "7eec446e0036d356d8e5694047d9fdb6af00f2fc62993b854232830cf9dbcff8", uint64(669)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/repomd.xml", "9f18801e8532f631e308a130a347f66eb3900d054df1d66dff53a69aa5b9e7d3", uint64(2601)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "Packages/testpkg-1-1.src.rpm", "684303227d799ffe1f0b39e030a12ad249931a11ec1690e2079f981cc16d8c52", uint64(6156)). - Return(ptr.String(uploadSrv.URL+"/upload"), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "Packages/testpkg-1-1.x86_64.rpm", "d9ae5e56ea38d2ac470f320cade63663dae6ab8b8e1630b2fd5a3c607f45e2ee", uint64(6722)). - Return(ptr.String(""), nil). - Once() - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String(""), ptr.String(srv.URL), ptr.String(""), nil) - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateVersionFromYumRepoAndPublishGPGNoSignature() { - e := echo.New() - e.Use(middleware.Logger()) - e.Use(middleware.Recover()) - e.Static("/", "../yum/testdata/repo") - - srv := httptest.NewServer(e) - defer srv.Close() - - e2 := echo.New() - e2.Use(middleware.Logger()) - e2.Use(middleware.Recover()) - e2.PUT("/upload", func(c echo.Context) error { - if c.Request().Header.Get("Content-Length") != "6156" { - return c.NoContent(http.StatusLengthRequired) - } - - if c.Request().Header.Get("Content-Type") != mimeTypeMultipartFormData { - return c.NoContent(http.StatusUnsupportedMediaType) - } - return nil - }) - - uploadSrv := httptest.NewServer(e2) - defer uploadSrv.Close() - - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil, nil).Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz", "12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053", uint64(4550)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2", "3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5", uint64(9036)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz", "f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd", uint64(3000)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2", "a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52", uint64(5554)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz", "3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f", uint64(2848)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2", "27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32", uint64(4351)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/repomd.xml", "904c00f4c838f67d1c79113d7996840add665d513889b112bb715776607c151c", uint64(3078)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-1.x86_64.rpm", "49fd5f21e3d489e500eba418207d62bc241d9f512a23b14fecb8a7777ee01bc6", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-2.x86_64.rpm", "08b032391b745436fd9b2a19b3f74889a5965c24d27d1d818a0d49b66ac4f47a", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg1-1-3.x86_64.rpm", "d9c6b377f3484f5a6312164df290186d9ed5536a8e3e67ef1c7ae8c9b956794b", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-1.x86_64.rpm", "af60a18cd0517920acac3ff737e5595c4b2dc779dd9205f6731eeba54265dfd7", uint64(6740)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-2.x86_64.rpm", "6dc90f4258183bb61baa2a0a588732fa5db0fd165d1b7bf02ff0198fca93efdb", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg10-1-3.x86_64.rpm", "a68d0510bec578428402a029eac55e34e8784e96556e9f2d1c9424911c2a489f", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-1.x86_64.rpm", "88307ad55751656bb96132d8d448aa78ebafb28120634695f8207c8460ad7dff", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-2.x86_64.rpm", "e5dd6aac17915a9ada1b39e4efcb03e4ee3e6998ff910c0584ccb11f97721632", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg2-1-3.x86_64.rpm", "d216d06a4ff1569a98ff981469bbf2765300587f69dbf378a150c0cf8dfb4795", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-1.x86_64.rpm", "68170e526f756eeb06d33d77332000a67e8eb31eb004f28de509ed8aae72f8a6", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-2.x86_64.rpm", "f75513d7fc853e3f8d4c832700151dcb04d88388f367c4a29a0c702988fd9c80", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg3-1-3.x86_64.rpm", "ec036e47e7e711cf26b126c103e25bf0191a67bfc44089f18ee6c3ade8a334d1", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-1.x86_64.rpm", "e7de03570c76ec13cceff7bca33cec6fcff45e3c4c83e088b06764825542e78b", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-2.x86_64.rpm", "c9731ea0936b1c4debc4ebae7935687c4a5a5f9b538ab795c903adbce6ba5b70", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg4-1-3.x86_64.rpm", "5942505f4082335d8cde4e03bb9bb9080e86efb6a24dce6167a71abbe418a1d2", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-1.x86_64.rpm", "006ef00d887654372886d295c1dc03eff7b18c611c1d35c4081456300bf99d15", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-2.x86_64.rpm", "ab195eaac0cc29c13c5920e0bdb8f2dedcc20ca10861775d6a0ccce8bb81546c", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg5-1-3.x86_64.rpm", "f2149561e84c54c429869ec051b18b3c59a92313164fc2b678c08b182711e339", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-1.x86_64.rpm", "234b5d4a4ea3cd320292c374efdb2ca51876fac43f902d3816a8b04bd155a5c1", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-2.x86_64.rpm", "2665d47c785688562748b0d7c0637a2c9ff052cb12acf09a2b64d0da699843f2", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg6-1-3.x86_64.rpm", "84c25528dc5381c89656e52a6af6fa51c7cb9faa69cec3b5c196ffd4ba037c80", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-1.x86_64.rpm", "6b3edf4d9a1194b0b07c660281378375d258f25e1e74c7852f9fb209c0b1de4f", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-2.x86_64.rpm", "8c9d92872e4c3c462203682c63c79d61c00b398f84a4adf66f2da08e4c416a4b", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg7-1-3.x86_64.rpm", "845b31dbb4d80b13ace39ab2da1e19d68727d43de7b01fd5cf5c10e633f7707e", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-1.x86_64.rpm", "1ed2f5e08a1f57c68199c57271404945762bcba36d99c2c03a45d60ad8e53a75", uint64(6741)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-2.x86_64.rpm", "dde30ee7035800604434e3b0928934c56fc382748cb3dc6a87ee7605a15af9a3", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg8-1-3.x86_64.rpm", "1fec4e8fcd788227fd836960f129b7c5384bf416aa78bdb7923dfdc431b208bf", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-1.x86_64.rpm", "0ba29dded6b136adb548396295f46ff4fa827d416cdfa25129ddaef5be2f2d96", uint64(6740)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-2.x86_64.rpm", "192d106bc5c19b9e8651dbd255f5f0a240b781b85a2af0ce58d1c5f8670158b6", uint64(6742)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg9-1-3.x86_64.rpm", "ae2f90464235b2abeccf9c2607c51bab0b8a4f3afd6531026d62d54300b2e093", uint64(6742)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-1.src.rpm", "5906d8401381f428c28074563ed082425074cf4737ef38ca1bf21c3261aabd76", uint64(6123)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-2.src.rpm", "fb69e232a677646c0375e9cf999e5c8493368edcafd0e5fe6f901a7425f7d68e", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg1-1-3.src.rpm", "cf28031ec6d8ddc146b1f2ec37e4b7bbd7f4f751ae9b7730f709c43d0292bb79", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-1.src.rpm", "7f86347249889174a4bcfa2d20aec471e44275be06484f45a2d1afa4f61d8895", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-2.src.rpm", "151a800766bfb51b8f414878367f64028f3693dc323a01de2ccc10d96813f302", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg10-1-3.src.rpm", "370e830462c33db0cc11dcaa7f539773a651c1dde980bd1e92db601d85156419", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-1.src.rpm", "802c968cd29794edf721fcbc5924a68606df9a0648d89c648481bf77ff89c53c", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-2.src.rpm", "f26e8390a958c0fd0a15c07cf9ef2f93485b90ec701888013f1453b0946c7c47", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg2-1-3.src.rpm", "07a1e8b441c8e329cb07567bdbd845d833da6721dfc166c3510469f313ebd652", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-1.src.rpm", "3a557ebe499975f3c7b95e1b39ca3ff10369b51dec045d8f882a0cb587815db4", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-2.src.rpm", "4ad8107d6a8a9f32c3c2f4971756467ee536979cb246e53a9d238c824df665ea", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg3-1-3.src.rpm", "14b797a378b75c5c6793400f2d2f14b98099ba32b95828686ca7b14c8475d889", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-1.src.rpm", "7b981767615dd5c739f027bcc17aa91343d36aa5040e59f7614e401a35b2e703", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-2.src.rpm", "3f55e2dd76104d19baf4148342c0cdc5b0230879cca6c5b13c07f24a25d79a1d", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg4-1-3.src.rpm", "80ea7ece7614339e906e80920a5a5d5bf0881f3e9a0a02ab2831036e67ea4152", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-1.src.rpm", "182367519219c7f56c1213350372333219fa0d2f858072f524734308949daf61", uint64(6122)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-2.src.rpm", "904021dcfd97e54d3c5cbaa7742af844cc5c48adb4af4ba88495db30afd629d9", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg5-1-3.src.rpm", "7b74718b1f01b561f66d04706327269bf67981db6743c46858fe03e2868c6ef5", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-1.src.rpm", "96e669c98d8d79d0acc77f1d9b3246e6baabf2f49a7591d26ba69740b80574ee", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-2.src.rpm", "798464bf773513c123183fe00aa350459ec31568e2ee1895d8fef4d6dfbb2e28", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg6-1-3.src.rpm", "d9e1eaa79d2b80349186b3ec51a5331ca400994d9ba0a5fbcd6992fdf2234fcb", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-1.src.rpm", "8f76905b96b5476485fca223804a9900c3351f0b61e30f862ebc7e48f1232fca", uint64(6123)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-2.src.rpm", "263e504fd0be3d6903e03e4b5d3c820c6f06e474253d63bf7951223c3080cc17", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg7-1-3.src.rpm", "c04e4e225556951502e2ce533ac25d26decf63a768013c14bcec32dc60b88837", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-1.src.rpm", "6b0bb85fe30ae6e406a1dddb2af7126294e24fae64e79be67c426e94f90720ee", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-2.src.rpm", "cc3fd1c43ea62332e534e0f5d6a7df7f1c808725116109f33fe38453682d5ee7", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg8-1-3.src.rpm", "d5ccf0943d89947bb2f8b3ed8466d60e452f1b0daa881d5d3fe2c8584778883b", uint64(6125)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-1.src.rpm", "ed76da35a9b4f4ea4e3828f6a978016cc6b4b9c0cd0548f2d4cbd6a695b1f6e9", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-2.src.rpm", "26dc22dbbbd6569c6d41d7c37b6e8b3d90ec24c76c075bfe8b0016de64bb2029", uint64(6124)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg9-1-3.src.rpm", "869bf9b01e2ea53e02bb8666ca1118e2c9e5cef2598e9a1b1f67125531b3bd8e", uint64(6125)). - Return(ptr.String(""), nil). - Once() - - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String(""), ptr.String(srv.URL), ptr.String("file://./testdata/gpg/somekey.gpg"), nil) - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateVersionFromYumRepoAndPublishGPGSigned() { - e := echo.New() - e.Use(middleware.Logger()) - e.Use(middleware.Recover()) - e.Static("/", "../yum/testdata/repo-signed") - - srv := httptest.NewServer(e) - defer srv.Close() - - e2 := echo.New() - e2.Use(middleware.Logger()) - e2.Use(middleware.Recover()) - e2.PUT("/upload", func(c echo.Context) error { - if c.Request().Header.Get("Content-Length") != "6115" { - return c.NoContent(http.StatusLengthRequired) - } - - if c.Request().Header.Get("Content-Type") != mimeTypeMultipartFormData { - return c.NoContent(http.StatusUnsupportedMediaType) - } - return nil - }) - - uploadSrv := httptest.NewServer(e2) - defer uploadSrv.Close() - - s.cliMock.On("CreateVersion", defaultNamespace, "container1").Return("version_id", nil, nil).Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz", "c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f", uint64(718)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2", "0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40", uint64(1985)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz", "64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c", uint64(314)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2", "464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48", uint64(859)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz", "4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a", uint64(282)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2", "f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6", uint64(743)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "repodata/repomd.xml", "4d207e2d80ec3aefb6f9e08f744f547f7171c94dc451d01fa24fe5c57ffb01a0", uint64(3069)). - Return(ptr.String(""), nil). - Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "SRPMS/testpkg-1-1.src.rpm", "cbce80483872b31a4b92a9ef0aea11f38e0f06db301781db53ba88a365bffd8e", uint64(6115)). - Return(ptr.String(uploadSrv.URL+"/upload"), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version_id", "RPMS/x86_64/testpkg-1-1.x86_64.rpm", "3ea740db3d27481b38231c9bd987c46bb6bdda480c60fbfcce84d7d88abf5051", uint64(6734)). - Return(ptr.String(""), nil). - Once() - s.cliMock.On("PublishVersion", defaultNamespace, "container1", "version_id").Return(nil).Once() - - fn := s.svc.CreateVersion(defaultNamespace, "container1", true, ptr.String(""), ptr.String(srv.URL), ptr.String("file://./testdata/gpg/somekey.gpg"), nil) + fn := s.svc.CreateVersion(defaultNamespace, "container1", true, s.sourceMock) s.Require().NoError(fn(s.ctx)) } @@ -903,90 +122,6 @@ func (s *serviceTestSuite) TestPublishVersion() { s.Require().NoError(fn(s.ctx)) } -func (s *serviceTestSuite) TestCreateObjectWithoutEndingSlashInThePath() { - s.cacheMock.On("Get", "testdata/repo/somefile1").Return("", nil).Once() - s.cacheMock.On("Get", "testdata/repo/somefile2").Return("", nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4").Return(nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61").Return(nil).Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", uint64(5)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", uint64(5)). - Return(ptr.String(""), nil). - Once() - - fn := s.svc.CreateObject(defaultNamespace, "container1", "version1", "testdata/repo") - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateObjectWithEndingSlashInThePath() { - s.cacheMock.On("Get", "testdata/repo/somefile1").Return("", nil).Once() - s.cacheMock.On("Get", "testdata/repo/somefile2").Return("", nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4").Return(nil).Once() - s.cacheMock.On("Put", "testdata/repo/somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61").Return(nil).Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", uint64(5)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", uint64(5)). - Return(ptr.String(""), nil). - Once() - - fn := s.svc.CreateObject(defaultNamespace, "container1", "version1", "testdata/repo/") - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateObjectWithCache() { - s.cacheMock.On("Get", "testdata/repo/somefile1").Return("a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", nil).Once() - s.cacheMock.On("Get", "testdata/repo/somefile2").Return("ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", nil).Once() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", uint64(5)). - Return(ptr.String(""), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", uint64(5)). - Return(ptr.String(""), nil). - Once() - - fn := s.svc.CreateObject(defaultNamespace, "container1", "version1", "testdata/repo/") - s.Require().NoError(fn(s.ctx)) -} - -func (s *serviceTestSuite) TestCreateObjectWithUploadURL() { - s.cacheMock.On("Get", "testdata/repo/somefile1").Return("a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", nil).Once() - s.cacheMock.On("Get", "testdata/repo/somefile2").Return("ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", nil).Once() - - srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - data, err := io.ReadAll(r.Body) - s.NoError(err) - defer r.Body.Close() - - s.Equal("1234\n", string(data)) - - s.Equal("/test-url", r.RequestURI) - s.Equal(mimeTypeMultipartFormData, r.Header.Get("Content-Type")) - })) - defer srv.Close() - - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile1", "a883dafc480d466ee04e0d6da986bd78eb1fdd2178d04693723da3a8f95d42f4", uint64(5)). - Return(ptr.String(srv.URL+"/test-url"), nil). - Once() - s.cliMock. - On("CreateObject", defaultNamespace, "container1", "version1", "somefile2", "ff5a972ba33179c7ec67c73e00a362b629c489f9d7c86489644db2bcd8c62c61", uint64(5)). - Return(ptr.String(""), nil). - Once() - - fn := s.svc.CreateObject(defaultNamespace, "container1", "version1", "testdata/repo/") - s.Require().NoError(fn(s.ctx)) -} - func (s *serviceTestSuite) TestDeleteObject() { s.cliMock.On("DeleteObject", defaultNamespace, "container1", "version1", "key1").Return(nil).Once() @@ -1012,10 +147,11 @@ func (s *serviceTestSuite) TestGetObjectURL() { type serviceTestSuite struct { suite.Suite - ctx context.Context - cliMock *protoClientMock - cacheMock *cacheMock.Mock - svc Service + ctx context.Context + cliMock *protoClientMock + cacheMock *cacheMock.Mock + svc Service + sourceMock *sourceMock.Mock } func (s *serviceTestSuite) SetupTest() { @@ -1023,6 +159,7 @@ func (s *serviceTestSuite) SetupTest() { s.cliMock = newMock() s.cacheMock = cacheMock.New() + s.sourceMock = sourceMock.New() s.svc = New(s.cliMock, s.cacheMock) } diff --git a/cli/service/source/local/local.go b/cli/service/source/local/local.go new file mode 100644 index 0000000..3f3be66 --- /dev/null +++ b/cli/service/source/local/local.go @@ -0,0 +1,151 @@ +package local + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "io" + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" + + "github.com/teran/archived/cli/service/source" + cache "github.com/teran/archived/cli/service/stat_cache" +) + +const ( + sourceType = "local" + + processStatusInterval int = 100 +) + +var _ source.Source = (*local)(nil) + +type local struct { + dir string + cache cache.CacheRepository +} + +func New(dir string, c cache.CacheRepository) source.Source { + log.WithFields(log.Fields{ + "dir": dir, + }).Trace("initializing local source ...") + + return &local{ + dir: dir, + cache: c, + } +} + +func (l *local) Process(ctx context.Context, handler func(ctx context.Context, obj source.Object) error) error { + log.WithFields(log.Fields{ + "source_type": sourceType, + "directory": l.dir, + }).Info("scanning directory ...") + + var cnt int + + return filepath.Walk(l.dir, func(path string, info fs.FileInfo, err error) error { + defer func() { cnt++ }() + + if err != nil { + return errors.Wrap(err, "walk: internal error") + } + + if info.IsDir() { + return nil + } + + shortPath := strings.TrimPrefix(path, l.dir) + shortPath = strings.TrimPrefix(shortPath, "/") + size := info.Size() + + log.WithFields(log.Fields{ + "filename": shortPath, + "size": size, + }).Debug("file found") + + log.WithFields(log.Fields{ + "filename": shortPath, + "size": size, + }).Tracef("attempting to retrieve checksum from cache") + + checksum, err := l.cache.Get(ctx, path, info) + if err != nil { + return errors.Wrap(err, "error retrieving checksum from cache") + } + + if checksum == "" { + log.WithFields(log.Fields{ + "filename": shortPath, + "size": size, + }).Debug("generating checksum") + checksum, err = checksumFile(path) + if err != nil { + return errors.Wrap(err, "error calculating file checksum") + } + + err := l.cache.Put(ctx, path, info, checksum) + if err != nil { + log.Warnf("error putting checksum calculation result into cache: %s", err) + } + } + + log.WithFields(log.Fields{ + "filename": shortPath, + "size": size, + "checksum": checksum, + }).Debug("checksum") + + fp, err := os.Open(path) + if err != nil { + return errors.Wrap(err, "error opening file") + } + defer fp.Close() + + if err := handler(ctx, source.Object{ + Path: shortPath, + Contents: fp, + SHA256: checksum, + Size: uint64(size), + }); err != nil { + return err + } + + if cnt%processStatusInterval == 0 { + log.WithFields(log.Fields{ + "directory": l.dir, + }).Infof("%d files processed ...", cnt+1) + } + + return nil + }) +} + +func checksumFile(filename string) (string, error) { + info, err := os.Stat(filename) + if err != nil { + return "", errors.Wrap(err, "error performing stat on file") + } + fp, err := os.Open(filename) + if err != nil { + return "", errors.Wrap(err, "error opening file") + } + defer fp.Close() + + h := sha256.New() + n, err := io.Copy(h, fp) + if err != nil { + return "", errors.Wrap(err, "error reading file") + } + + if n != info.Size() { + return "", errors.Errorf("file size is %d bytes while only %d was copied: early EOF", info.Size(), n) + } + + return hex.EncodeToString(h.Sum(nil)), nil +} diff --git a/cli/service/source/local/local_test.go b/cli/service/source/local/local_test.go new file mode 100644 index 0000000..c8bf79b --- /dev/null +++ b/cli/service/source/local/local_test.go @@ -0,0 +1,65 @@ +package local + +import ( + "context" + "testing" + + log "github.com/sirupsen/logrus" + "github.com/stretchr/testify/require" + + "github.com/teran/archived/cli/service/source" + "github.com/teran/archived/cli/service/source/mock" + statCacheMock "github.com/teran/archived/cli/service/stat_cache/mock" +) + +func init() { + log.SetLevel(log.TraceLevel) +} + +func TestChecksumFile(t *testing.T) { + r := require.New(t) + + cs, err := checksumFile("testdata/checksum/test_file.txt") + r.NoError(err) + r.Equal("0c15e883dee85bb2f3540a47ec58f617a2547117f9096417ba5422268029f501", cs) +} + +func TestSource(t *testing.T) { + r := require.New(t) + ctx := context.TODO() + + statCache := statCacheMock.New() + defer statCache.AssertExpectations(t) + + statCache.On("Get", "testdata/dir/some_file1.txt").Return("", nil).Once() + statCache.On("Put", "testdata/dir/some_file1.txt", "cb330beb8590577eb619d75183b14ac85d6b30a6777e8041d6c2d8a44888e7f1").Return(nil).Once() + + statCache.On("Get", "testdata/dir/some_file2.txt").Return("", nil).Once() + statCache.On("Put", "testdata/dir/some_file2.txt", "e45fbded5effe3178f7ca393f0228fb6799ead901c8a5b1354d6f1c44c2a8fa7").Return(nil).Once() + + statCache.On("Get", "testdata/dir/some_dir/some_file3.txt").Return("", nil).Once() + statCache.On("Put", "testdata/dir/some_dir/some_file3.txt", "94630c0572bba1a7dcc8e69a70ffbaaf132fc7f67f0c40416b73d53c10d9aa7a").Return(nil).Once() + + handle := new(handlerMock) + defer handle.AssertExpectations(t) + + handle.On("Handle", "some_file1.txt", uint64(18), "cb330beb8590577eb619d75183b14ac85d6b30a6777e8041d6c2d8a44888e7f1").Return(nil).Once() + handle.On("Handle", "some_file2.txt", uint64(18), "e45fbded5effe3178f7ca393f0228fb6799ead901c8a5b1354d6f1c44c2a8fa7").Return(nil).Once() + handle.On("Handle", "some_dir/some_file3.txt", uint64(18), "94630c0572bba1a7dcc8e69a70ffbaaf132fc7f67f0c40416b73d53c10d9aa7a").Return(nil).Once() + + s := New("testdata/dir", statCache) + + err := s.Process(ctx, func(ctx context.Context, obj source.Object) error { + return handle.Handle(obj) + }) + r.NoError(err) +} + +type handlerMock struct { + mock.Mock +} + +func (m *handlerMock) Handle(obj source.Object) error { + args := m.Called(obj.Path, obj.Size, obj.SHA256) + return args.Error(0) +} diff --git a/cli/service/source/local/testdata/checksum/test_file.txt b/cli/service/source/local/testdata/checksum/test_file.txt new file mode 100644 index 0000000..082b346 --- /dev/null +++ b/cli/service/source/local/testdata/checksum/test_file.txt @@ -0,0 +1 @@ +test data diff --git a/cli/service/source/local/testdata/dir/some_dir/some_file3.txt b/cli/service/source/local/testdata/dir/some_dir/some_file3.txt new file mode 100644 index 0000000..f3cd689 --- /dev/null +++ b/cli/service/source/local/testdata/dir/some_dir/some_file3.txt @@ -0,0 +1 @@ +test data file #3 diff --git a/cli/service/source/local/testdata/dir/some_file1.txt b/cli/service/source/local/testdata/dir/some_file1.txt new file mode 100644 index 0000000..42ee78a --- /dev/null +++ b/cli/service/source/local/testdata/dir/some_file1.txt @@ -0,0 +1 @@ +test data file #1 diff --git a/cli/service/source/local/testdata/dir/some_file2.txt b/cli/service/source/local/testdata/dir/some_file2.txt new file mode 100644 index 0000000..87928ea --- /dev/null +++ b/cli/service/source/local/testdata/dir/some_file2.txt @@ -0,0 +1 @@ +test data file #2 diff --git a/cli/service/source/mock/mock.go b/cli/service/source/mock/mock.go new file mode 100644 index 0000000..1481c4e --- /dev/null +++ b/cli/service/source/mock/mock.go @@ -0,0 +1,23 @@ +package mock + +import ( + "context" + + "github.com/teran/archived/cli/service/source" + "github.com/teran/archived/cli/service/stat_cache/mock" +) + +var _ source.Source = (*Mock)(nil) + +type Mock struct { + mock.Mock +} + +func New() *Mock { + return &Mock{} +} + +func (m *Mock) Process(ctx context.Context, handler func(ctx context.Context, obj source.Object) error) error { + args := m.Called() + return args.Error(0) +} diff --git a/cli/service/source/source.go b/cli/service/source/source.go new file mode 100644 index 0000000..c149638 --- /dev/null +++ b/cli/service/source/source.go @@ -0,0 +1,17 @@ +package source + +import ( + "context" + "io" +) + +type Object struct { + Path string + Contents io.Reader + SHA256 string + Size uint64 +} + +type Source interface { + Process(ctx context.Context, handler func(ctx context.Context, obj Object) error) error +} diff --git a/cli/service/source/yum/gpg.go b/cli/service/source/yum/gpg.go new file mode 100644 index 0000000..66b7e58 --- /dev/null +++ b/cli/service/source/yum/gpg.go @@ -0,0 +1,78 @@ +package yum + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "io" + "net/http" + "os" + "strings" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/pkg/errors" + log "github.com/sirupsen/logrus" +) + +func getGPGKey(ctx context.Context, filepath string, checksum *string) (openpgp.EntityList, error) { + p := strings.SplitN(filepath, "://", 2) + if len(p) != 2 { + return nil, errors.New("unexpected public key file path format. Please use file:///path/to/file.gpg or http://example.com/file.gpg") + } + + var data []byte + switch p[0] { + case "file": + fp, err := os.Open(p[1]) + if err != nil { + return nil, errors.Wrap(err, "error opening public key file") + } + defer fp.Close() + + data, err = io.ReadAll(fp) + if err != nil { + return nil, errors.Wrap(err, "error reading public key file") + } + case "http", "https": + req, err := http.NewRequestWithContext(ctx, http.MethodGet, filepath, nil) + if err != nil { + return nil, errors.Wrap(err, "error constructing HTTP request object") + } + + resp, err := http.DefaultClient.Do(req) + if err != nil { + return nil, errors.Wrap(err, "error performing HTTP request") + } + defer resp.Body.Close() + + data, err = io.ReadAll(resp.Body) + if err != nil { + return nil, errors.Wrap(err, "error reading public key data") + } + default: + return nil, errors.Errorf("unsupported key file access scheme: `%s`", p[0]) + } + + if checksum != nil && *checksum != "" { + h := sha256.New() + n, err := h.Write(data) + if err != nil { + return nil, errors.Wrap(err, "error calculating SHA256") + } + + if n != len(data) { + return nil, errors.Wrap(io.ErrShortWrite, "error writing data to hasher") + } + + if *checksum != hex.EncodeToString(h.Sum(nil)) { + return nil, errors.New("GPG Key checksum mismatch") + } + + log.WithFields(log.Fields{ + "sha256": *checksum, + }).Infof("GPG key checksum verified") + } + + return openpgp.ReadArmoredKeyRing(bytes.NewReader(data)) +} diff --git a/cli/service/source/yum/gpg_test.go b/cli/service/source/yum/gpg_test.go new file mode 100644 index 0000000..df3e772 --- /dev/null +++ b/cli/service/source/yum/gpg_test.go @@ -0,0 +1,127 @@ +package yum + +import ( + "context" + "net/http" + "net/http/httptest" + "os" + "testing" + + "github.com/ProtonMail/go-crypto/openpgp" + echo "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + "github.com/stretchr/testify/require" + ptr "github.com/teran/go-ptr" + + "github.com/teran/archived/repositories/blob/mock" +) + +func TestGetGPGKey(t *testing.T) { + ctx := context.TODO() + + m := &testHandlerMock{} + defer m.AssertExpectations(t) + + data, err := os.ReadFile("./testdata/gpg/somekey.gpg") + if err != nil { + t.Fatal(err) + } + + m.On("StaticFile", "/").Return(http.StatusOK, "text/plain", data).Twice() + + e := echo.New() + e.Use(middleware.Logger()) + e.Use(middleware.Recover()) + e.GET("/*", m.StaticFile) + + srv := httptest.NewServer(e) + defer srv.Close() + + type testCase struct { + name string + url string + keyChecksum *string + expKeyIDs []uint64 + expErrorText *string + } + + tcs := []testCase{ + { + name: "read from file", + url: "file://./testdata/gpg/somekey.gpg", + expKeyIDs: []uint64{11127004574349501168}, + }, + { + name: "read form HTTP URL", + url: srv.URL, + expKeyIDs: []uint64{11127004574349501168}, + }, + { + name: "read from file w/ checksum", + url: "file://./testdata/gpg/somekey.gpg", + keyChecksum: ptr.String("aa392a2005c38f10ce21034d6d1aaace5bbee1c3d98ac1ee06a42336d741473e"), + expKeyIDs: []uint64{11127004574349501168}, + }, + { + name: "read form HTTP URL w/ checksum", + url: srv.URL, + keyChecksum: ptr.String("aa392a2005c38f10ce21034d6d1aaace5bbee1c3d98ac1ee06a42336d741473e"), + expKeyIDs: []uint64{11127004574349501168}, + }, + { + name: "incorrect scheme", + expErrorText: ptr.String( + "unexpected public key file path format. Please use file:///path/to/file.gpg or http://example.com/file.gpg"), + }, + { + name: "unknown scheme", + url: "ftp://example.com/file.gpg", + expErrorText: ptr.String( + "unsupported key file access scheme: `ftp`"), + }, + { + name: "read from file w/ incorrect checksum", + url: "file://./testdata/gpg/somekey.gpg", + keyChecksum: ptr.String("deadbeef"), + expKeyIDs: []uint64{11127004574349501168}, + expErrorText: ptr.String("GPG Key checksum mismatch"), + }, + { + name: "read form HTTP URL w/ incorrect checksum", + url: srv.URL, + keyChecksum: ptr.String("deadbeef"), + expKeyIDs: []uint64{11127004574349501168}, + expErrorText: ptr.String("GPG Key checksum mismatch"), + }, + } + + for _, tc := range tcs { + t.Run(tc.name, func(t *testing.T) { + r := require.New(t) + + keys, err := getGPGKey(ctx, tc.url, tc.keyChecksum) + if tc.expErrorText != nil { + r.Error(err) + r.Equal(*tc.expErrorText, err.Error()) + } else { + r.NoError(err) + r.Equal(tc.expKeyIDs, func(el openpgp.EntityList) []uint64 { + keyIDs := []uint64{} + for _, key := range el { + keyIDs = append(keyIDs, key.PrimaryKey.KeyId) + } + return keyIDs + }(keys)) + } + }) + } +} + +type testHandlerMock struct { + mock.Mock +} + +func (m *testHandlerMock) StaticFile(c echo.Context) error { + args := m.Called(c.Request().RequestURI) + return c.Blob(args.Int(0), args.String(1), args.Get(2).([]byte)) +} diff --git a/cli/service/source/yum/testdata/gpg/somekey.gpg b/cli/service/source/yum/testdata/gpg/somekey.gpg new file mode 100644 index 0000000..be4bdfc --- /dev/null +++ b/cli/service/source/yum/testdata/gpg/somekey.gpg @@ -0,0 +1,41 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=DV6E +-----END PGP PUBLIC KEY BLOCK----- diff --git a/cli/yum/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm b/cli/service/source/yum/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm rename to cli/service/source/yum/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm diff --git a/cli/yum/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz b/cli/service/source/yum/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz rename to cli/service/source/yum/testdata/repo-sha1/repodata/4a11e3eeb25d21b08f41e5578d702d2bea21a2e7-filelists.xml.gz diff --git a/cli/yum/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz b/cli/service/source/yum/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz rename to cli/service/source/yum/testdata/repo-sha1/repodata/80779e2ab55e25a77124d370de1d08deae8f1cc6-primary.xml.gz diff --git a/cli/yum/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 b/cli/service/source/yum/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-sha1/repodata/b31561a27d014d35b59b27c27859bb1c17ac573e-other.sqlite.bz2 diff --git a/cli/yum/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 b/cli/service/source/yum/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 diff --git a/cli/yum/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 b/cli/service/source/yum/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-sha1/repodata/e7a8a53e7398f6c22894718ea227fea60f2b78ba-primary.sqlite.bz2 diff --git a/cli/yum/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz b/cli/service/source/yum/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz rename to cli/service/source/yum/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz diff --git a/cli/yum/testdata/repo-sha1/repodata/repomd.xml b/cli/service/source/yum/testdata/repo-sha1/repodata/repomd.xml similarity index 100% rename from cli/yum/testdata/repo-sha1/repodata/repomd.xml rename to cli/service/source/yum/testdata/repo-sha1/repodata/repomd.xml diff --git a/cli/yum/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm b/cli/service/source/yum/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm rename to cli/service/source/yum/testdata/repo-signed/SRPMS/testpkg-1-1.src.rpm diff --git a/cli/yum/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 b/cli/service/source/yum/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-signed/repodata/0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40-primary.sqlite.bz2 diff --git a/cli/yum/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 b/cli/service/source/yum/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 diff --git a/cli/yum/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz b/cli/service/source/yum/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz rename to cli/service/source/yum/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz diff --git a/cli/yum/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz b/cli/service/source/yum/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz rename to cli/service/source/yum/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz diff --git a/cli/yum/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz b/cli/service/source/yum/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz rename to cli/service/source/yum/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz diff --git a/cli/yum/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 b/cli/service/source/yum/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 rename to cli/service/source/yum/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 diff --git a/cli/yum/testdata/repo-signed/repodata/repomd.xml b/cli/service/source/yum/testdata/repo-signed/repodata/repomd.xml similarity index 100% rename from cli/yum/testdata/repo-signed/repodata/repomd.xml rename to cli/service/source/yum/testdata/repo-signed/repodata/repomd.xml diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg10-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-1.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-2.x86_64.rpm diff --git a/cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm b/cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm similarity index 100% rename from cli/yum/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm rename to cli/service/source/yum/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg1-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg1-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg1-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg1-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg1-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg1-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg1-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg10-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg10-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg10-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg10-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg10-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg10-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg10-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg2-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg2-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg2-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg2-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg2-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg2-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg2-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg3-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg3-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg3-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg3-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg3-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg3-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg3-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg4-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg4-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg4-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg4-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg4-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg4-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg4-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg5-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg5-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg5-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg5-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg5-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg5-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg5-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg6-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg6-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg6-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg6-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg6-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg6-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg6-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg7-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg7-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg7-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg7-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg7-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg7-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg7-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg8-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg8-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg8-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg8-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg8-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg8-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg8-1-3.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg9-1-1.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-1.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg9-1-1.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-1.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg9-1-2.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-2.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg9-1-2.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-2.src.rpm diff --git a/cli/yum/testdata/repo/SRPMS/testpkg9-1-3.src.rpm b/cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-3.src.rpm similarity index 100% rename from cli/yum/testdata/repo/SRPMS/testpkg9-1-3.src.rpm rename to cli/service/source/yum/testdata/repo/SRPMS/testpkg9-1-3.src.rpm diff --git a/cli/yum/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz b/cli/service/source/yum/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz similarity index 100% rename from cli/yum/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz rename to cli/service/source/yum/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz diff --git a/cli/yum/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 b/cli/service/source/yum/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 rename to cli/service/source/yum/testdata/repo/repodata/27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32-other.sqlite.bz2 diff --git a/cli/yum/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 b/cli/service/source/yum/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 rename to cli/service/source/yum/testdata/repo/repodata/3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5-primary.sqlite.bz2 diff --git a/cli/yum/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz b/cli/service/source/yum/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz similarity index 100% rename from cli/yum/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz rename to cli/service/source/yum/testdata/repo/repodata/3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f-other.xml.gz diff --git a/cli/yum/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 b/cli/service/source/yum/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 similarity index 100% rename from cli/yum/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 rename to cli/service/source/yum/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 diff --git a/cli/yum/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz b/cli/service/source/yum/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz similarity index 100% rename from cli/yum/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz rename to cli/service/source/yum/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz diff --git a/cli/yum/testdata/repo/repodata/repomd.xml b/cli/service/source/yum/testdata/repo/repodata/repomd.xml similarity index 100% rename from cli/yum/testdata/repo/repodata/repomd.xml rename to cli/service/source/yum/testdata/repo/repodata/repomd.xml diff --git a/cli/service/source/yum/utils.go b/cli/service/source/yum/utils.go new file mode 100644 index 0000000..fa4e525 --- /dev/null +++ b/cli/service/source/yum/utils.go @@ -0,0 +1,34 @@ +package yum + +import ( + "crypto/sha256" + "encoding/hex" + "io" + "os" + + "github.com/pkg/errors" +) + +func checksumFile(filename string) (string, error) { + info, err := os.Stat(filename) + if err != nil { + return "", errors.Wrap(err, "error performing stat on file") + } + fp, err := os.Open(filename) + if err != nil { + return "", errors.Wrap(err, "error opening file") + } + defer fp.Close() + + h := sha256.New() + n, err := io.Copy(h, fp) + if err != nil { + return "", errors.Wrap(err, "error reading file") + } + + if n != info.Size() { + return "", errors.Errorf("file size is %d bytes while only %d was copied: early EOF", info.Size(), n) + } + + return hex.EncodeToString(h.Sum(nil)), nil +} diff --git a/cli/service/source/yum/utils_test.go b/cli/service/source/yum/utils_test.go new file mode 100644 index 0000000..3ce26ba --- /dev/null +++ b/cli/service/source/yum/utils_test.go @@ -0,0 +1,23 @@ +package yum + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestChecksumFile(t *testing.T) { + r := require.New(t) + + sha256, err := checksumFile("testdata/gpg/somekey.gpg") + r.NoError(err) + r.Equal("aa392a2005c38f10ce21034d6d1aaace5bbee1c3d98ac1ee06a42336d741473e", sha256) +} + +func TestChecksumFileNotExistent(t *testing.T) { + r := require.New(t) + + _, err := checksumFile("testdata/gpg/not-existent.gpg") + r.Error(err) + r.Equal("error performing stat on file: stat testdata/gpg/not-existent.gpg: no such file or directory", err.Error()) +} diff --git a/cli/service/source/yum/yum.go b/cli/service/source/yum/yum.go new file mode 100644 index 0000000..90eff17 --- /dev/null +++ b/cli/service/source/yum/yum.go @@ -0,0 +1,175 @@ +package yum + +import ( + "bytes" + "context" + "crypto/sha256" + "encoding/hex" + "io" + "os" + "strings" + + "github.com/ProtonMail/go-crypto/openpgp" + "github.com/pkg/errors" + "github.com/sassoftware/go-rpmutils" + log "github.com/sirupsen/logrus" + + "github.com/teran/archived/cli/lazyblob" + "github.com/teran/archived/cli/service/source" + yum "github.com/teran/archived/cli/service/source/yum/yum_repo" +) + +const processStatusInterval = 100 + +var ( + _ source.Source = (*repository)(nil) + + ErrFileNotFound = errors.New("file not found") +) + +type repository struct { + repo yum.YumRepo + repoURL string + rpmGPGKeyURL *string + rpmGPGKeySHA256 *string +} + +func New(repoURL string, rpmGPGKeyURL, rpmGPGKeySHA256 *string) source.Source { + log.WithFields(log.Fields{ + "url": repoURL, + "gpg_key_url": rpmGPGKeyURL, + "gpg_key_sha256": rpmGPGKeySHA256, + }).Trace("initializing YUM source ...") + + return &repository{ + repo: yum.New(repoURL), + repoURL: repoURL, + rpmGPGKeyURL: rpmGPGKeyURL, + rpmGPGKeySHA256: rpmGPGKeySHA256, + } +} + +func (r *repository) Process(ctx context.Context, handler func(ctx context.Context, obj source.Object) error) error { + log.WithFields(log.Fields{ + "repository_url": r.repoURL, + }).Info("running creating version from YUM repository ...") + + packages, err := r.repo.Packages(ctx) + if err != nil { + return errors.Wrap(err, "error getting repository data") + } + + var gpgKeyring openpgp.EntityList = nil + + if r.rpmGPGKeyURL != nil && *r.rpmGPGKeyURL != "" { + log.Tracef("RPM GPG Key was passed so initialing GPG keyring ...") + gpgKeyring, err = getGPGKey(ctx, *r.rpmGPGKeyURL, r.rpmGPGKeySHA256) + if err != nil { + return err + } + } + + log.WithFields(log.Fields{ + "repository_url": r.repoURL, + }).Info("handling YUM repository metadata files ...") + for k, v := range r.repo.Metadata() { + size := len(v) + + hasher := sha256.New() + n, err := hasher.Write(v) + if err != nil { + return err + } + + if n != size { + return io.ErrShortWrite + } + + checksum := hex.EncodeToString(hasher.Sum(nil)) + + log.Tracef("handler(%s, %s, %d)", k, checksum, size) + if err := handler(ctx, source.Object{ + Path: k, + Contents: bytes.NewReader(v), + SHA256: checksum, + Size: uint64(size), + }); err != nil { + return errors.Wrap(err, "error calling object handler") + } + } + + log.WithFields(log.Fields{ + "repository_url": r.repoURL, + "packages_count": len(packages), + }).Info("handling package files ...") + + for cnt, pkg := range packages { + log.WithFields(log.Fields{ + "name": pkg.Name, + "checksum": pkg.Checksum, + "path": strings.TrimSuffix(r.repoURL, "/") + "/" + strings.TrimPrefix(pkg.Name, "/"), + "size": pkg.Size, + }).Trace("processing package ...") + + err := func(name, checksum, sourceURL string, size uint64) error { + lb := lazyblob.New(sourceURL, os.TempDir(), size) + defer func() { + if err := lb.Close(); err != nil { + log.Warnf("error removing scratch data: %s", err) + } + }() + + if pkg.ChecksumType != "sha256" { + filename, err := lb.Filename(ctx) + if err != nil { + return errors.Wrap(err, "error getting package filename") + } + + checksum, err = checksumFile(filename) + if err != nil { + return errors.Wrap(err, "error calculating checksum") + } + } + + fp, err := lb.Reader(ctx) + if err != nil { + return errors.Wrap(err, "error getting object reader") + } + + _, sigs, err := rpmutils.Verify(fp, gpgKeyring) + if err != nil { + return errors.Wrapf(err, "error verifying package signature: %s", name) + } + + if len(sigs) == 0 { + log.Warnf("package `%s` does not contain signature", name) + } + + fp, err = lb.Reader(ctx) + if err != nil { + return errors.Wrap(err, "error getting object reader") + } + + if err := handler(ctx, source.Object{ + Path: name, + Contents: fp, + SHA256: checksum, + Size: size, + }); err != nil { + return errors.Wrap(err, "error calling object handler") + } + + if cnt%processStatusInterval == 0 { + log.WithFields(log.Fields{ + "repository_url": r.repoURL, + }).Infof("%d files processed ...", cnt+1) + } + + return nil + }(pkg.Name, pkg.Checksum, strings.TrimSuffix(r.repoURL, "/")+"/"+strings.TrimPrefix(pkg.Name, "/"), pkg.Size) + if err != nil { + return err + } + } + return nil +} diff --git a/cli/yum/README.md b/cli/service/source/yum/yum_repo/README.md similarity index 100% rename from cli/yum/README.md rename to cli/service/source/yum/yum_repo/README.md diff --git a/cli/yum/mirrorlist/mirrorlist.go b/cli/service/source/yum/yum_repo/mirrorlist/mirrorlist.go similarity index 98% rename from cli/yum/mirrorlist/mirrorlist.go rename to cli/service/source/yum/yum_repo/mirrorlist/mirrorlist.go index 4c70945..5d19377 100644 --- a/cli/yum/mirrorlist/mirrorlist.go +++ b/cli/service/source/yum/yum_repo/mirrorlist/mirrorlist.go @@ -7,8 +7,8 @@ import ( "net/http" "strings" - "github.com/labstack/gommon/log" "github.com/pkg/errors" + log "github.com/sirupsen/logrus" ) type Mirrorlist interface { diff --git a/cli/yum/mirrorlist/mirrorlist_test.go b/cli/service/source/yum/yum_repo/mirrorlist/mirrorlist_test.go similarity index 100% rename from cli/yum/mirrorlist/mirrorlist_test.go rename to cli/service/source/yum/yum_repo/mirrorlist/mirrorlist_test.go diff --git a/cli/yum/models/packages.go b/cli/service/source/yum/yum_repo/models/packages.go similarity index 100% rename from cli/yum/models/packages.go rename to cli/service/source/yum/yum_repo/models/packages.go diff --git a/cli/yum/models/primarymd.go b/cli/service/source/yum/yum_repo/models/primarymd.go similarity index 100% rename from cli/yum/models/primarymd.go rename to cli/service/source/yum/yum_repo/models/primarymd.go diff --git a/cli/yum/models/repomd.go b/cli/service/source/yum/yum_repo/models/repomd.go similarity index 100% rename from cli/yum/models/repomd.go rename to cli/service/source/yum/yum_repo/models/repomd.go diff --git a/cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..6b82ce96f27da1019a8c4fcd65a9bf4e61869cc4 GIT binary patch literal 6156 zcmeI0U2GIp6vywj#g>9tr9?r*l_*fit}}CI@5~@Up)9sw4Kz?o;@8~yC|kDe+AeLS zjkMUBh=3v>J~V!W5+ASxN)-}8AT0>N6e36oY6uYp3M~+@q5;-(wwHwX=&Li$+5i6T zIrq%m|91D`^lj{KVCjEfR!mN$&~lvIp8_q zIp8_qIp8_qIp8_qIp8_qIp8_qIp8_)e|I1`6G-PzM02K3Gg3(jt!-7YFV*N3}4})U1pYS)WP~;bg`eMPT*nbfy z*1s$m75lv|_!Ush+k#&e{Dxp$$LFmS>G#UztdlG+TMMaz> zUkHKkcH-`d;KRwpfCrC8_@vy5vRI{4Rpr>TBT?r?v&^Z=AtHw>vmzyMOjx5qDX7A9 zRt>VClvJ4oZ9@sBy3Z=Rs>3Z_$aCkJ}p7$AdC%oc$g6Ih$RxDCMN|r@p#275j zSQ>W&I#FHCRwaenx@PH`OSuw~xXnYF;kc%ux;9K!H7+yCWtG_$b6|y=22?SL+LDrN zmLW6QhWV>3Ys^*@W^;vGlyj3B7Hl&$MR#-~q)3u#DK0fFSut$Ml_XiFrplOxU6Mb5 ziNtOEqGmn*9{exCm6E!;uwZWIb6I_FEam%hFMKz=yPO@j4^Q~! zax^ghPEC(GDiHWPxTE6tJ)_4(^%38h+5Pi-^1IT{MrLiAujHrqyi`|RRI}>F)mUD4 z_M-QPuPnOs$;R5$I(6j0s*hT?_EvZC1&4+{I?xfATYjeW>mSZF*pcj+w|1p;hWAr@ zZqBySvDXhADLq&`G5k=`nDc+Of3-LDo!C|V`-Zg8-j=OZTe0$4*8Cf0Eru!O|9h+L<7wjK? CcA&oi literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo-sha1/Packages/testpkg-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..42da835b9ba3d62e0965c72a8afbd025c4b067ce GIT binary patch literal 6722 zcmeI1U2GIp6vuDbMOr|u76anT_z}}aW;@>>iB+MrPzBnwfCWEb?wvc`f$h#_W|p?t zXdw_Hi3Xw%_@pLAi9*B#5)%VxM52lK5qTg1Vn{>_0mK(I5vb>E@7Bf_6Q6h5yZ`yk zx%b?2&%M($XRm&6?QDj?RhRN4Eo~lQUX)4e1n-T=eFW|R8t8zT}yRsLt}<-2Aoq}H5qqJTl0LEDom%k z=}?^-%+R^(2AopMv@~1i231{V!i0p>zdv@d;e`W7F8OB~-rU}~Z*M<@B!QuJ)iO}a zKrI8c4Ae4E%RnsywG7lUP|H9q1GNm)GEmDvEd!OB$i&3N9!Le$GzghiH*ui6@ishq z92(R$vU@?Xj}NUL8eUlUz&Z)mO=bwbBzU&q%Yx?$#yUy^v^xY}75uQ^YoJ(Hf%z-` zvCe}29~Jx?DB4#D{v8zUJ%axPMgMCB-vmWF6?{u@ev-533tLGr_QldvDj0nsZxM{^ z!v4d8=YV29Mg`+Kk&g<-IurK)RPddkXg?tsbBg?x;CY}J!#9HO0mbn@37!v%{l}p} z&a(?Z!46wNunv~J7ZmJu=m&YB;9Y{7LBW6Bd!R5V+bQ^v;ANob?@PhU1%EBL3l#l- zC%9kOPlIAS>xBKB;Ae%s8vk>`J`RfWKQH(X!MINl-wa$3+Wkq+j0xs~cM1*!?-pDT z{EA@QM_5m0zu>aq1A=j1VLh4Z`iF$Q8ZYiMj<3c$BKQg@#RV7UCs3z)lhw#+otNOuJ1EX zQ*FwrqN}QH2e?m_D~_U+R6eHFdUHw4au71~fWJQz)l~{@hInMlXaVaJnB>{hTWdLq zTWMHqrCyRJ;G+=I=Jsf?6!RqEerH(VtGq#;v{Y^QWNA16N&4qmk2g|?yh`U}xwnP) z#5@Rxr-le~SF%1yeF#I(DLDfw)JD$ADHX*}GiT&fr-G`LQ*%0*o^wgHHC=aH#c?nX zu!Ks(d)R+cj}`A~)jQ7%g-9NX;)0)pMNKV{$laPG2Zc0h^U7%iw}F?+fO14Pah4|V zgby=bO2eoKFaW4whk-ql^5>o)Xtujy^?XoKk|pD$a{wWPhjf5YOwz7FWoy{b==@fam-m1toT zT466*WA5j@REV7SVxJeeFEge>s7VSZRxZU+3b9AAoTPD7gqZ)+k5?>4u;mpul00Y` z@ZrTQ-!^$rvP^kq3(S_hjl?5|!g3mlqFsVNptOSEYo-VJTfC zE$(aY>XK4EoJxEca$X5#Y9O4AUV!G&<1@8`mpkTMSbOO3`A6`*tuLp6><~qF6yH*) z@2JeA%vY%9QP`+?)Zw+RY3 z(coQn4Q_D7c2%mV8shmP+#SASds=UfebOB4=sTWgk~8vVMC&gde}8-3X?{Asw7qrYY>0s+y$>B9 zVw?^_IO~@+!{tgD;UaDn0U?6;(Q`I|xx$5#r{F1RTiJBISnN0gK|{6Nt25MfQGu2U z`V>;ByfG?AEM?zF#hHg2bv#mt$;uhbX6SgBO$ueK-6}Ae#``_hNS9QIvzgp|iihmZ zb=)$tFp+5=sEJE#U{4USFQ8XQl`akC`@S%`fVwJ3qdC{*zR@V9(SIPWT79VM|CC}0 gvp8EX26ArPeT}ojEDXgqgWdvSS2MI zD*I)7nkYeR%}`H?Ov&*m+l`VL{e1b6=8^+nLFmNMnunnm@WhFDf#(h)cO@cMO5Z6~ zPL#4a(mpJHYpx&i>(=zdsJg3we7L!ut4!HUuw)5FXw~(2-24`6BUtXtT&C>QZRwLo z=P5fZEk5W9A^U5sUe!PfRbf$X?D=uv`+-NvdQg=dAwO9;Niy}psP8c6%xL6>5hbcI zJ+CT2e&AsPZEw}ix}$kp)e3G8MoJAuMsKDevS~yMci}E^E=xPWaYxbWn)h~z2Eyl+ z63`gPuikySzD(IEbR_Mdk*%%x#5j64x*fXwt}z`5RVa`nZ-kGueeESqBoBS?R)OoR zowYl1kG><{w1XCat10i%K5|On67)jz1}`hNOZV8U&k1F^R`qf_T7DJs4}HC(=@&)i`Q!hQ~&vboQPOY$;N-6zqPD0l^3$-?7BBq2zA z0d8D)BJp?_c#uf34*htQNXHS$f2OP0^B(ESi%w+aC4VBTaWen9vVQSUyjW~e(cS@k)>!9>+4$lUo*;+Mh%}x0@+~d8ey{`FzUP4v1i*K#22_a|LXt${Numx-)Nu!1A-m^0RR99 zKmt9pxB<}=+K2!KfB*mh05kvqXaE7GgiR72sf{%C0$|b_Fa*E=OieK`36YZk0Tnzb z(TFqvGynhq00000001PQni(N5QJE8JG}9o^+Ks5t)6@esG|*^0O{m7Egr)u`reY5g zLHl5iUTpTw8j7VE4`2cm7$Q_JUXVW%h_Fx$Kp_YS7fTBDTIPCxqpFclad1WbV(fN* zso-=TaSLTcN_466qXA<###iF%hf+Gl)iK~yEl9>@AY3*9Mp`@LyswVtaJ=mxXNNVc8=)0L#xOL34->^% zoEn2P%N@hMwy>Sy#@R8AXG?6HoVatP%#rDu-WubAa|&)FaFL+(3`XIzZm=_$ZAm*_ zXYwf!Mi#Eb>k7s(e! z9JbZ#;-v!|ktijd<-k{L>F?^T?=$N>WQ%O2fAa)2TxGl|X+k^dKRML1B9p8UA7 D^8+io literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 b/cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/c66ce2caa41ed83879f9b3dd9f40e61c65af499e-filelists.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..cb0a5971bead4654f05eb81430c9b2a0f2ce31f7 GIT binary patch literal 787 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 SPJcXK6l6>?`qRbi;r{?+*F%T^ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo-sha1/repodata/fdedb6ce109127d52228d01b0239010ddca14c8f-other.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..0c159dec1c6856688b6f65f39a02afdf9c00dd33 GIT binary patch literal 247 zcmVGKEI(t zo!X_7<)h>CaD6|fk$uv-^|LpSCIT3FJGi2}Jw zE2~oHGSO5*0rNPKfk0b`r@(Nvoq=t&QIxUziqB}7PdrwLNGt* x*eFN2&Mc*6BdwNL + + 1723748954 + + 80779e2ab55e25a77124d370de1d08deae8f1cc6 + 5f05d943af6b59a3a4b432b76eb417862335a35f + + 1723748954 + 688 + 2096 + + + 4a11e3eeb25d21b08f41e5578d702d2bea21a2e7 + c183131be21f5f7c5ddd9706c59e0589bf91a770 + + 1723748954 + 282 + 465 + + + fdedb6ce109127d52228d01b0239010ddca14c8f + d2838f0858a8a20576d663f9996b586272e6e6b7 + + 1723748954 + 247 + 394 + + + e7a8a53e7398f6c22894718ea227fea60f2b78ba + aa51549db14b4d21b28f426cf93fd25142aeedab + + 1723748954 + 1937 + 106496 + 10 + + + c66ce2caa41ed83879f9b3dd9f40e61c65af499e + 5d2cc3bac662e0dbea5a034cf99e236b1d9affcf + + 1723748954 + 787 + 28672 + 10 + + + b31561a27d014d35b59b27c27859bb1c17ac573e + 2dddccb3427bb9b2d5d81a3ae4b2e6668c57f651 + + 1723748954 + 669 + 24576 + 10 + + diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo-signed/RPMS/x86_64/testpkg-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..c1c180650a7439f2f9bdd133a6f4bc363421e512 GIT binary patch literal 6734 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≷XJ<38R!1dmt53 z5WTY?LJpe=AA9+FpWoN^J)Y-#y}}CM1E-~F4DRDGq694xbOI2nU^d1|v&I}tPC7Bs zqeeOOOg1Neg^kOJPE)uJdsg^b4PRM#PZ24={Y8lz(T0QgRx$fVee zmL)nTLDQs*F#6fzAgCP~*e#CG&|s7_{S#gI`_@|DYLrAE!0TPe7Z`07F-TI?l>=Am zh9DRZ;FDbxEupG#V(ao{?~g{}yv_tGji>m-Y*qQ${8+R)kHs*bwZ)3^2?Is`JmIn9Nm* zu#_8UfZPxe91@|%5N7J zM?LmBQgMO=g#8GC-(22lSnk*9-Ss8cv0{uJ7iH{CB z0Bw;MM>(d+1P2(6TmphgkVlGQ0`ZVht+-u4Cs7CdL12!VSd`F`?rgWI=njLal1MLP z9meEAn3X^Wxise*$wCl&P%SAP+k|8}I=uOZqzsJSX#>?Hx=+CfoK>Ledj47Bx(!bSjX`IFC<^b9{> z>*zEZ2MQg5*Uv8W%|)kVa^ucBMFJ8&kQJ8fSQdH1-Mp^xq*{4BZKFY$@8P@!ZoqDj zxNqW+IFBfr@*$$YIhN0!p&`vC@v&}h8Vv((k}5SCb6x1zXfpve48mDkGXVJWagJi= zHl_i9b|0F-#%taOtUY;*WjBs8^cRj`1Q~`Ono=z|381Ku4oGv0K0q^=s%vcX0=8+O zcd!)q$dgi52xz4-q{)*ePIG68PHgc6L{4>1Q=CoOQlrS78Yay`kU{SPNKyh~F`$>n zLJmBfBOD>VK*xkh&1N|1^Y+uMty{Pp2@UfJ9vC5TAYrJ;7zZxyfv_M8=mVp~O@CR9 z@eE)EL>(eeu3M-$L2Z*bHi#16HHU9CS#08}cdM3kvN4$4J0nv6-_wfXvM9=`_R;lT573FcgFnF~dwqR!|uP;A)!@_2&_C zptpe3`7IpE78qbiz!);sWFZ<$)o|P-NM#ajnex#ck1tn(zo8v?$nUPgc>vaX@r@n0 z>Tr(X1yo_g@g#= z6_FUkCd?Wn1oMvtL`1>;2U;>UK) literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48-filelists.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..bbb7f06527d22adda1fc5391c2936e2f3e25c719 GIT binary patch literal 859 zcmV-h1El;yT4*&fL0KkKS=@q!jQ|29fB*mY$cn;m|LXtm{Ncav-{>F!AOHXYKrjFd z0ssIDBMd+S+}VPLhK7hrc~3-nG(!k9Xgxs5>I^}k^$j#M0iXaf2em<}o|-^urqUS! zF%2+{3_}FKCLjzEiL{1B34@Id4GjR$7=fTN007fK13)qW00D%O1R7{W(rlV(O{wZ= zXa>?|lhLW8L)01p4dY`Ecsp=t9`h+BS*cX$_(dP5@YS}Y07hQP~z1C&DM;7hR%MTy3G;!iZn$6LMvo;9=8-YgW?Ky(} z-a@4Ht5b>|NS$x%An4%)6Dm%Iw+uHJp^`H#;1DBbenlJ!9@=1C;9=#aL@U3EFq$^3pCG zP^2XiC5Moa3TpEfFvc;!z_LWi7CQ0fPaB9%$rzR$eV+$&R`DtPf+TkpJ=(MPwP2iZI^=pl zR={|G^(^oL3&Vson*e#TBA||WZGAc{W1Y3og+lFvGCyn;M=x`tV*@BMw#02~h`JKX zuU^I<0xea+GX|9?B>*mOdYVUjX~zNW8{^K@PU$1kUgt_&C!H=ta!|0K;AxyN;v$}2 zLgR>e-Z+nZ{)ekEx&8s=SC8=gFe)f*ZfKfM^w&u|!hqm_Ko~d)gvErB@MIn?Jfzxa z3BG_rg+Op}!BD7!v8L$2o$`)2D`Z_$Ihv8syQtqWp4ptpZJG?)q(TOvkC4L7Ju9W2 z=NqZF%z`#|6902mZkzTtCO9Sh=ONp2*9NnyI;EvH*``PU?zx#!7*%t l4{~T&2Ou7yu8WVbNMr10F!v4^NE09UyOJrwgofl4ENBA8l4Sq@ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a-other.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..8e325df915f3e1f66b3124a873d68b88970a5934 GIT binary patch literal 282 zcmV+#0pHt zs}w<(qDv=&#NqB8xZU3_XZ0z|I!t4)?Z#*&W1M&x550bWdwmAI-#u-oe3XSTqbmAw z?e#I|`K7AP!+5=I_psmSS z^wibZNiryCZE_$cnZV?XZNV}%jt~G{XecEH(Q3qt^g7F$i=|e$#AC15C6+LywvSp$ z=IMSf)yk!m)M}CQeO863dO-cgbAqimC7$cngCz&Gv#}%Ypp8Bd1!6`ICI*uz#Zty| g%Y~3qV;cJh-VMS>@c$#Me*Uog0{0q+V7dVS0N$OEUH||9 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c-filelists.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..0ec4d93dfe8dfecf3eecd1a289b28969c53583da GIT binary patch literal 314 zcmV-A0mc3wiwFP!000001C^1%PQ)M-MfZLMVLt^5ZK-Kzc7B1b%>y1&GECc)R_F6& zOrr~R;fnBb-{qXpoo?4i-f&4_8ha`VP6>{7a$!98^yT^Kpy}!O(D@KChO{P<^JD7i zu&(nXV=;`|t#I1~3v?U1;tCE{U|)GkX0R7HW8NugZrZP8zMO;WsWlcgS6b?(G*W;v zZ3!)U4hTYcsgZkLJ0rPhv~Z@92DAoQSH^p%k&+Rv*wYo$nky-R#ST49i_MP_((P&l z=jlGrdU=vXDOoVyPxcwR^B(t(BF$*KPle3OcHp1r5}{E%qq(wCS{SKIDQs(8s~f9o zV`}3ZD9vrnz411SD%ZG7Z+yio@dx@%*RQquKRw&h!b}+1fH6*o_i2f)NW*U;-`{im M0J_znVF3aF0EEewBLDyZ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f-primary.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..39ab29efa6e4b39633c30361a4a4d031989e5d4b GIT binary patch literal 718 zcmV;<0x|s`iwFP!000001Km|iPuwsNzVj=LiiW7vgmN!t0FpT|nlaZa}U~Xhp3`S;Tw{p-@7lOW%RgP_K7O_=g zWT19mvZKig%_GTLv$&3$ogt3aPWUhXT;$ll{v3I=I(KiU$W zU_SIZ_Tn%_Mh;7dPo}nz`*qf+8$hM5ZJjjngEaM$)W=9nx>g6sR! zme#QFX{{x+0~8k@zFeMXWiCp=t1gIgPM6We5CCPuexC@ zJkAp8DJm&TX715<tS+Wq4~ZukDo?a~wuq=%i(v7BMfK3t#xX z>29?h=L{_%w4=F4?sn&R=^RF7%{NvZ=b!KkciILazlYAqzR!mn@;Z^-vG`jYzKPBP z;7RCN9VtHv85IHZ11eLYQkKXt79ti(@sN2k_DWGotIAL%%1TX?kr&bbL}y75KGInf zJ&;*Iv2v+e`5IFz@V0R&n_LFBQEcFz|iS<`0J_ z(_o0uEfIXE9*29pH*+_(IM6Go>u&X)_t}@^@Mm890;_$bsa6O80EiV| Ac>n+a literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6-other.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..610326baf1b9597a77dc0b4389f8f8c698ef31b9 GIT binary patch literal 743 zcmV5T4*&fL0KkKSvt=IP5=Sm|NH;*z>2_S|LXt${Ncav-)Nu!AOHda05Ado z0RR99Kmu}IG}B8BCW@Xl8b;LpDf&^hH1#&1&}a`+L4*L%&;SOFs3f3)i7_-Ow3-?N zAT%^&(?HN@0BsFJ)b#3GR)ns z?~&GPQLP6$pH&AJSC^IgwikE7M%rCu#!;?E)E|-72q$Mrkm$<7{rM-2Vx}cabrT3Mut$e&KM?pe?~*kOdTHNWKsoF|jU}NBexsL8TRr zDlQ~A+TE@4Dpd_FCUNYE5^OAhUA&kH^s0~uRaTg%8-#QWO97GEq?}fz(kPL~h-s<780T&kDi+S6j^(FF&Y*AkTNw~n Zm;Z~LbqCklV1gl>UC9*TLO|<05jf)0N3;L{ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/repomd.xml b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/repomd.xml new file mode 100644 index 0000000..c5075c2 --- /dev/null +++ b/cli/service/source/yum/yum_repo/testdata/repo-signed/repodata/repomd.xml @@ -0,0 +1,55 @@ + + + 1723990826 + + c99064d5c98a01f3720c735431ab1f449c56a1c4e233efd99353716d856c245f + 28cdc729e15f2869c655e87d4dc4d0f5a7d73000456ef469a0c9676f73cd7e60 + + 1723990826 + 718 + 2134 + + + 64f76a79439371fc632b7cac21b68f322142bc183b706332314e97d1007f8f0c + faba64fb9bf3aef0b8db23555f8d5c3808f718f6c21b08022e648a88c5b8ec75 + + 1723990826 + 314 + 513 + + + 4c25d51dbded8086515c32ce5753f7bd22d4b0d0ee9c45d3f580751fbd26e05a + bc8c9289c9a6619affee0f23d75f35ce8ceec63f61259269ab450db389bdfa8f + + 1723990826 + 282 + 442 + + + 0586c412097e75a9420880bb8256802008e79f2cbe7d7d34cebeb55abce6ad40 + 9583ed783f7ea07a4d8765aefd06b03be0e3320948c2f821b07b917990abf3d3 + + 1723990826 + 1985 + 106496 + 10 + + + 464b3eff37b3eee86b7e4f78efcf0e8911afa496a57753ac42a67c2afbdd2d48 + db74eec925446cb538de265886293b4b2cb73e0b67e1f917bd80e8cf18e8f8a0 + + 1723990826 + 859 + 28672 + 10 + + + f16e9edf15ee11cb5a79dd9466f58bbe2a481db47cfad8f6287540beda0779f6 + 23304cf8cfcc2abf8d4fd0b4eccc3bf39caef0f67ca2511ec2ffa8e64bce3249 + + 1723990826 + 743 + 24576 + 10 + + diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..83840003e9815436977b67710628cc80ded4144d GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg1-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..0c751209ecc332d2ab93207647d761ec5b4c2dd3 GIT binary patch literal 6742 zcmeI1YjD)o6@c&BOEBi;1ZeE=S{@B1pj~OT(rOzF7(cLy!4!w^NP$XMSL-$F)uPoJ zn}mi8gcb-61W4*kNDPz!1v+F>N=Y*0L4g$LgF;D)GXz2)5HNvuhF4A9bLG2~X@7Lu z->dP}(Ra_eN9UY-WtijE?N?he5nL{tB<%Ryu)qnNNGJY}%Y{1q`>MvB7hP;F3!$8! z!SiSso#A;c$Q*caw+@Coa{UHIcX)W9;~BwP*Mp2(sR2Tn7eTra%HSDa0SW#x0wBR( z=C@2=%=Fioz6_xr70X;7xsfXijrh(Wx34iTxNUB~K6|E}xv=J~lIDk(HI{bDFpl({ z*S%jY8EX?ujd^uahqAlmr1TpLyP+Ky)?Z)#&GgDm>e8dYN{J=30=eaE&YqMH&)NO{nfUi)>C)<>$&Rf+Xr?l zJ^s^Gvv2ktxN_LAw_h5wcC5Q~!tSnHdLG#Gc@wVaeSB%|Vc5q@ za^I4^*Ix9yQzKvg(@$Qkn{~|f<}1pvopTvH|b8GUH-%=lO5$d=bOZU0Q|@!;rHck5Q3XnIe;nu2+v;Gm{!K`a=8=qG+Lph!B=g^(ifSdt7~ zK#CHOG=n$zknGojsvw1eevQYvUkv#TUDb41l7fb21pJbQRYD|HQTd=DNxC6~csT?I z2cfKempwzmbqm*BdE)TK6@MN1bsHSRQI0BoOIILWfpi7Z6-ZYgU4e83(iKQoAYFlU z1=1BrSKxoEfYTFcZ*N}&%bRRUEzn zlIklM-vUYfO<{Z&B-PJm{13)75Ag4%zUYWDrna;-6=zI+QMMRogQWI0W11(eM?K?i zjQ298c~krM8PmL}{fCTcO(`E>+#4i~;V|PqAnE!uj2{L`?Z1KnHFxKN1U;mJXdld- z2NLuy>WA_pjDO5HA0+s9Z2?L1FJ-)o@pzEb-zSXA7$0R^4wCx+Bjf2ze*z?pX9m-M z&iDsRPvfQUo5l1O8Pk2C{%$hXKtg;OG$CrQcW~w+#)R<;j19)i8Pk1)^_eRf(|v+` zGPg2LGTy8?0+5|Se+^^~LcP{>=wXSY?{yF) z#N(VZuC4IO5JU?=lZFodz6XdzV=F)`F2-4o}sOw&fr zEtLoD^Li5&_FC~;gy45idrEUJ)qIGElLNyY4`XSOvhN?hWWw@kk(f_Y6V(XZL?c>$ zky#tJNFqV>(nyp{Qfo$u;-DaV1+R$iue(PG`U8?8D}IS)0x39yKEwW_EZXo+ zHNC4zG-`75O)IKa8>E2lhJ zUOHn=RprzvMI{CB`i}YW73JfKrca+!SXEU57L}8#JRChri2^5D*aRQ!h0h{-wQ4iL zRjZaxVnpXK79iAw4d<4NTc!=Mn--U_Ei(o&|5rb1EM~%%J8nE&tsH=xYT@dFj-$fW zL7266GDZr*@H#7k;bm%~A%?5r1!gkAC1dj=F`ctjElSJ5BEeBOLaBJ5f}p_0eT;BC zVxk3b29OY99}3rzA?JKNTsTI5pWM5~nMo@~xWcd+iFp!qS3L=AMdJ2IPhnM2dAY|X z^|pu9L(QE~?k$9~LI1(}k~z_galn6q9kcrC=?7iZ_46z5i3L$i6CKF!m45f z{TTBSA5?=pIP()(mjsCfh{h{^0Y3Vmj0I?J>j9Z3hVvI1=RXAP?QM&|WlsKX-(6Jw zT{qfTn%ghFtnbDAh0%AHx3%=ze{8~_89TO4sB2r7-L|eMyQyjT=FN+goL814em-;Y z%+Fq%wy^R0ZRg&2;n=_T1*6BUF=OV0 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..e66e5d16a89ca92d48bdb6827324cbba8d95514a GIT binary patch literal 6740 zcmeHMdr(x@89xhH@PQ(t1hvyOO{X||ckg?5RbmuH)`}XDh^VFaaW34r>|O7@3#^?4 zO=GNPN-#cJ4XM!>qNz=cjp^vviuEx@P0g5Ei+O0Bl%k{7G_^LPlzwM95U2g4lmGX^ zxxf26-*>+Ao$s8x%lx?ci(4P1Be*;+cHG$V8jfW+h9f;+|MH*#|2?Srmt7v(mxWNy zE_i+vS|&Vi0?dJlhxBr|BhPVY+3@g<-e&}3J;N!#NgNPL?*hy~D2=831|Y;s69FM! z`roL12DRU&_ELm~&RORDf(RHeGl^UW;>nbo|sgsqTL1!Owp4 z((9Yt^J{mGny~n4N6$A8Jp05a%Yr|@yYs_8EiImu7|rz3tJo%-N>+1{4(9q*j;oLF_K>&CX5 z(beNWN1I>CJej_$;_cZ@vtP?@-4UI_ZdVSYAs?Q+JnX{G_JZGDyf|oI!Q;$4-&)jN9G!5p;r)-+y)mg_`{dg@ zACBbwqiVxz$Da!3-P^gvYO$}an%r6GKVznS?~T*ViHlDTK3Bf1eb1PidGCA~Zho^g z`x#C9^o!i#_sou~=Rz9?b$cJamYddLCd%IGS@87w8S;kb+m}qN88Da4e&NLUs+aX4 zZ{3-CV8y*76`S_A|9w}{i$ATGu^tQsv>?_vUQl&`3-F4eYJ#Myf~X3*qR6bm1~?vJ zl@Cc$h*uOz!?G?391cjLBnpP2Va#$NUY9vZR|C9&c~<0fPUAHgfCWhpVAX(wgHYDt zg9~R(ZQU_($kF|Q_eWI+D&QDSNt#l(R0UEMNL3(Jfm8)j6-ZSeRe@9mQWZ#5AXR}> z1-@PdlA1_QPtPhC1{wxJ59lUAkUMrj*Hmbrb7X7)BtAMc&{UFFpDqHr2}*-T_%%Sn ziM~Skb;^fQPIQxj&`2y|C;AHE<0!uc2s#TQx(cxqU4_Jhe3JZgKw<}7CCUE@NbGYc z{}&*Mw}A3)Kw|$s<^QIftOMd_kXWQeC?~!|nu<|QVi9grJ_wNbyOa+GB=u;doUEJh zgOn3piTEF;d>A0Hw^L5)K==vD^8iT>rzsx^NXB2GJRgwwe+CU|p79VM*kLJ%=wKNI zfMEBKIE0U;d@bdLfDqsFIv`np3FZ4Jp9M(boua&y^0SnO0ZIH1D6gdUKLC<^7E}Aj zlrN=rk}sKW8MSv&PWFYwyGywW2>GRv1rdL}m#43y98CHqRo_vM?Q{01P&ZzW(R*lz>oAT(lQuN{UY?ITVC zLO#iJ2L2;RT$nF|oFl^j0tn6-b11(??ehsQM*aFI;^1c?sHNTo^UJ(3MO&`a;Q#GF z$T(Bbt;hy13aX+6LmI>(SD++ZSvC_@M4cGcOvA)FikQ)OBWeuF)w0;@vl`yU9>5f)6+_C+t8TG4*Q;Q%<#8eB5 zt-6?v9S7?rW(3bw>aa7u&qjJ?m^DzkulnXIiHM~not;vp9?!S2VK(*;q2{nt<+wVe zA^2FI2>P_>lYO961CqPs6MbATNjcfa`2_S}-Myd?ic(M(LjtJ;5sPWC?1=7zMfEQcG4psYV?pI5Ph|Ummx>VDN1Gwo8X7N@Y`6gRa^>8 ztzzpqigiZQI7roT;n*@U+j1dy%Vr$cwxW>p|Ba(WqZVv=GK`n0lSQ~GwpLrzdr+8q zNVCq3M{!XNOlO-KOr|)As8$OTSaFAmM;pwj&bW#iA?2W%Xc0IRsfm)$lm2VE6}O|9nO38iQLjUG)$3@s8FMFkr9a`NGQFoj<^8ef!n6EvGl$jaMIsuB^CgFhQj2ATk>Y#~T4QU|<7F z92+7pCoAZ(5i|r==U6Ey@~kFvEU3sT%Nv3e(nMYmd8{O7%F<*-Rbfa-P+3LdRW2m6 z5K;_jLCMg9ykGeCSFogu9QY*vL6iK0pr_~lDhQcVc);I{YDZ?E z7fwlDX&li4lLzxlgkH7k6p4_ZSuuUNEa@}JX6{sV!_@B07% literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg10-1-2.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..60d97dd1619e604d380ffdb15082db01947d0eec GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..f7bddff5fbb2d8960acd4d80ddbd269b8005a23d GIT binary patch literal 6741 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg2-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..a45469039b322ef6b51d7db46eac21ef3600d9b1 GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg3-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..2f5f359f7e7ce1f8c03fc4d658af29ea517a8f81 GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-2.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..1cc31e6ef6fb2812ee3196476b24d0fc289f00b7 GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg4-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..2fdbb4660bab1722e65fd8508c804ded98870986 GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-2.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..a9fd93386d70ef7552adfa66fab0711b4af5b41e GIT binary patch literal 6742 zcmeHMX>b(B6>dq35dwj@4T!Md!V$-;c8;CdEh8`pB$N`CEO7{8EP7^oR*P0U%gn4U zLq$q~6Ji7Aa2#S1Y$9wZVVh7fi4SCjD`0Gc9SpeaBAhn2aqM7lftA<0y@X1Bq>|q| zrJk?9ey?A@_quzfeY)Cy?b8edPntt)Ct4fyaXcr`f&b%4L*4#;*2-5dq_MF~gmT)T zKM`7Y=&u9JfrWb|IJ{BXUTE3Sxi8U2FgL9)<5#HyLKznTT?nOn8NUJu_R=Llu$S>A zlTT&x>r6f!q28s-)Bfy2X_;u;ppmZpl|z)RwYdZTIOo*oYhRl7!rYm>4-1dqIrLULG{9w?>1%1w2 z;j$;{b54Bnqa)GzOOJ|uyY;zsuKM)5Cl9~y`I2(^vb)#lhK<|K6bzYu(`q|1SN#<# zUi`PtI}5(<==s@wWxIB-o3z&1GGl}oI6m*<{cGc0TEC(SpPEZMl>`Ju1QZpp4*GvV}4ZoT#Pk6+ul@Y4r6D~j4T zP0VkLY})@-&*Kj@-^jW!EbFi14nzaL{XyWxUE^KGs?LY(^!h``%=2U04jx;YTdbu~##^T!i;hmlhdwaAm$liBw-sz6wD-BPtu%6p`=nu1+dyhKa zFS4kzFn8qNkAAu7v|hZsWLZ^f@v?V5Zfyz9zBT(pD;3BuB&bTI8`KD z->h=RPW|=h9WTE$VAX*?P5fxVfn~$6E@8#c6+xCHKX337uVG15L`nAhv;Zd1kpxv2 zknZIT8T)kN<$b*1(|o$F%DQIgsuqw`L*iA55AX`Fi<&6#Vn7L~ykC-h0v2Ei?1zJc zP-e%Ova#OZT`JT|f=f?cdNcb79K#85QR>N45TuU%0MausSKntkjg+R1E~z8 zGLXu^|CWJxO{A-L&0t)b%0^O@an>4%ccxs-r`Lno9gh)|m5e~R(JfK>k+G|0K@en5~zD2Ud< zTtfgso<{9ZK9upFF`fqq_S0Slr12LqzMb)6Kx*#*`kMR;fYX1o1RZM;qkoq&1 z$v~CgqGPWli=v^!hyr@D*QW$DO(1Fj%c4dMsFKC4!OJpD zC-F+gLF>F8+tNH%v<@No?CDBM?uMEN9&xfXCT`?mnxw3ITYk*8^3_lzU&VF}0yE)| znpbGnMJ;06L@x@3$s@Rq*kh71Ix;mBgxvjWtQT zCyU-SBpf!m2Ga`b9ti4gh=?l_+?)}1%mN&9Oz0Ze;ec|cx{zp&4I`vcBT*-0Mt}t2 z$0C|(>0D6LIJ+U_Xf*@`(NL7Qxj8r-hBvV+(<(4bs}79WM2lG=rwPWRLmFk?0si!_8HI_F?DOw++U(ZX&f~7!od{=x{=$0nczV~#jyE@F3AcB>bu)7c3}wa~gYzTBhXaa+y*{|pybl{h zA%244@dga6>6rLL-7s_k?x11#u`H;Pf)$@G@**!_f8s`F%7Ug4-GBcGO4zDP22iggQ8!b q*$4lk$sf7r@Sg4cp4^}P%u}!K-Vykh`+|=x?HF5Bw96O6|x1 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg5-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..624ce5bf9f69948ca9ef11f793332f1d270fa618 GIT binary patch literal 6742 zcmeHLX>b(B74DT5BqT(Hu`!2?mk<(RnAPswlSB?eAP^A;MJE7{U>VotUEV1p#Ah6TqB_gNPAPUXOYSmHbF0zqd=> z-+cXEzkcs^&#dZQdFASIEO2%S0&mC3t=m zdImf{1DFdNckSRXBHuyiIq=ZA;~BwPUw6u{5Cw$NF97-xN()hb84&EH@ql12{Th`I zr}FDmJ_@03Ws80L{m7Sz2KVgmFKFp4y*w-Lft{1jo?o?b#0w8DZYk-MX1>$6J}0jZ z4|TDv#)1ZJKv`XKlXBme+3l0E?e1R=Sad0W-J#3ttsWosQv51FD>i!OZJ6%yH8K596fR8xiD_skXZf22P5A+ zE=;a?qvsak`2I`t&&UTePPVnZy<<|pLwkNW|7xdgD~9%b`L7RMnlb#fEbUyY*?qM6 zctOkfuj=PU-xzZGvy2ZHtsQj#r+crd7w@e3_S5U;p4GM;U0pNtL$>}80~gk>3RTAT zedqNJt$2E5@~WbKC);ivjL$yvaFzCMg|X&v_1vQSaOU%WlxuG8YOVkHp?7jSt-i86 zYv0NIzijxZTh{uUkCbid_V(-1Plpa#+uZr~cfXp}^|Fk!XN+3eSh;o6N6+prjxFu; z`LY|Q9zJpARNl7i0mtUmpWgIm=0w>i=MSDe@$ppOn3ZQ&?w|jYoOpXq)r*@iw)SrL z&GDIA7d$r0`01W2-(%*y|5l&rAxSf_EVDd|HC7ckR^TOG;doUw1w+;hffadGR}3Ty zqM;~;Dk@lJHC^U3RgpDQ3WdUg8fFcXRdqR}C|cMQ1uP4!CP|8_N`_(zCd-L%aS+Pf zyZ2yG(OXZ>z1_I#$R|%NJ9itd;rBgJYDi@um4Q?SQW;2PAeDhs22vSFWgwM-R0dKR zNM+!E%YauCX>V_DhGkI0K?GolJ#dPe-M!9e-0gT?(YQ%atH;HI+(vV zAjo~h4&i+$UqpF6AlUb90wnR5P`-`wk$}YB5z0qV{x0REfW-bW%BN8I2|(h{R4V@y z<anUr4of_FkHdiA zk9W^NzX!1k`}xT|BK!+LQ1+Kmev!(@5nhav^-&Z?9IAw3X`o`&M^t^>bD1fslu(46Ax)hjN z)i!Vp8;q`p!BxkFd&|Ua%LU&pn{iy*ihXGe6{Om$|*^jg@!N;pg+))Xk}D6G&Ih3SZp@m?OLCPuy|ciS*4VaG62RHH^>0f(Gwz|rkU+#M1qnowL?8gOxw z8^BGFbI+B#3*l~%AFK;Qc4W9aTVGR*qwiZk+CY8_GZU`K$jIcdsVRyqi89ZL605@d zt!tbfhB~xvn3}{1Fk(T0I& pRORKMg8m2IJFxA(g@<#NFWvgv12y%*Cw5s!@>*Uwu`cc#@K01W^hy8# literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..0965268ffa81e225bd2ff06b400817f81df06ce1 GIT binary patch literal 6741 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-2.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..3a65e7b61e9eeb93750bf520863e95ebfb7eda5f GIT binary patch literal 6742 zcmeHMX>b(B6>do@B*dkdaLF<(P$`6ARy#X)Vga&{j1mb61eTy|l-`-1)xv6bnVCf^ zIWCSE!ePWEA5hrFiJcfQM*g9Ij}QlOnxqH?Wm6Sg5RA=bKp28d1){uO^%5%ikxG8= zlzP7Y`n`Vr-s|p>>gn3f>wn2W@T57!cA^UcGRJd1I`DryX(;pGXSMFSl*Y!g5z2iF z`jen#LB9fKbLIKo>&kUdF!x1bgWsAlS>e z!Q@k!yo<@FAvCaJRoWk1C@mXJ7&_Wj*g8Vlz94_dp4xL?Z~ArVwqdJU%QDl=V~>Uh z{{aG$Dhb6)=K14jomWz~&3`NJ#YPS@wZ zGC6ngXH9W$+l3LfP|LkI=8SY~bJl@#18*s9c;D};Z>_uC_lxt_JhSur-TG)6;VY|u zHSVh)4QPM={E45gDtmQ!;k*}j|D>a%{jv2YPaMqbFq((Id9iJq_h@Cm#WRnfL7(55 zFtlQ4`;j4H*WQc2U$*FWpk)7}D>|M&I~48zuiWcHr;ZiZi>8zk<<8E+{+diuN0@pt*!_EFP~iOt$) zH;Wd;a@Otry8C|ryRS-XOhFO+s>Z9LW?+nEzp1JM@v4#^3x;WWy^1U<3h^V&i-{`f zg6PvsiB|+s;SEjD3D&$`UX~;YYgq6~g5U7^P0X9JAoG&0Va>0|vVk=?I0$9$b4`8x z#M!OQ8@2_$*m`Z=->$+jd?F!Ay;2!SWgwM-R0dKRNM#_Efm8-k8AxRym4Q?SQW^N) zGLWc=^z`&BfoV{~KK)&0(BFV4vq55fRy)R z{0if=zCz`+ZqgUpAjWBZg>pCJ*8!oeIRkwFmwr_)S16hq_9F-vOlZ3dX+! zr1oYqejkv^=P~{d#%Ua2-$iZF7Gj+0($Z9vacYZli}4&ls_!sPt`h6Z({PKzjR;e{G`9ljDG`2{c8ct0(lo;E<%Gh^~zyNLO%EqAo!Cw zXP`fr+J*I8^c+$C6(A_PDj2`at(T5XDQsq#C+9@{f4R; zrY4z+Us!Em7;+YJcJgo6Hpl1O9J zBDPJ8vS5fz$Bo1upOn#&slfo`?q6foxH%NT31xd4UPP)bVg}<6rZ922J=b;&a76HU zJtD^=(Ib1j38ZhyBYJo>L3!E3dj#}w-rc<76D3tv1fE6$AtV~@!~UaeTJTO5y&Fg< z6ycg8R><%`P!B>xT$RtwnIR`qgkw$wx+Zowpj^a1pXiPaBP6bqs1uBYfdt^kB6`F! zxPY#6c2m&N8wd!Z!6gwu?YideCqiTAMo1;g`E=qU{n@|XQQD_mP0Xq!125cE5 zObkxfd2rQs;M{UiE8>9f5sR}OD-s5u|EnDw4o6_i6K338qb$M;TY5uL?@{3vft!s^ zEKG_5u$&dtVKHnshxG%wcF?>e=kXUt#c!ccb1F*y|}P&HO`?3Lh7^Aa|RLR11} zXzbNYtQ(j}vY}uzP#4u%1RN$f-K2gU$%`3nF zRt=Mv6sSM@1g}r`%c9_uB~68d$hzWFWl13#{WkahLD184Zwd5s3pxt#qlO>2&@an| z=SPE&wZ~iPp8Z7pGV8gQwB^|qEo0iQpMJXP4R^-o&Do>hUZUoGs^LS_bBP$LKSik1I{hfh@o~0i|j^wxQJoQ>MZR|e*37+g8 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg6-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..860a626e5262ff833cc4d1df4b3e00bc702ab20f GIT binary patch literal 6742 zcmeI0eRLGn6~Nyn3ke_56a)gK=^{`=aW*?Uv-5E<;WHtz5dt9)Yys!v&1T7FXPKD| z0r50aJ_O{$gQ6)yN$Uv|LMtdIrKMPb2BGyJl(rP@sfa>AkDm7L zox^)~e(%0_-@W&}*>LV>yRN>Uj^Ob)*mmNzVS!;8jtu-Cj|cVm_f_k5cX;SnCPLY- z!Fv(340wMLWHxNvx0|6yo+Hq*;H78xJA$>IuTlPtOh72T1Ed$Bv;gHRAi-W54-)L9 zU!(d-RDYf7OA&gYe3j>IFY;uf(F2Eh3)T%5e^Q$}pl#NN7dEyOZyU5~T}h8L zWaZZ3aSpbWm|w^BsCTdIr2c2;`gGM-XRW;X(80Z1hb?XFJb!#sRq>EFt*qL=&b-}P zRg`wtcd+H;jflAC*uXn~%pTbK@bb*}bI-5+a>?m0)_r|%?d%c1db#-BZ?(?cvSVY; z{GC-ZMvVJMTdz%jANQBfR}a4V(d6cqihj0~wfEAV4b}VaG;+_`!_Im2Gx9ytP2^4L>w9Aa2eW&^{%v-@Ao> z@KrpbP4X?joKu=n)=}L&zGml@(JSX?Oq+l0NPFg{3%?vY=7n=(wAOF7Ej`n@aBURUwr$q@4vNwLHVEJD^EW&_S!eToZVYr zJNM&2Jnh>}J0E+lnh{b%oF<4E3qghBgNh_8 zoPb0@7X_A6MV2+Nq^oj33Gytf1O?XMcvY1-mE{yzixpWHR93@$P-JmXka$Tj3=u94 zLYW8Gk7!#~oO7zO&r>U+gA#vR1=sK~SC#5g8AxRym4Q?SQW;2PAeDhs22vSFWgwM- zR0dKR_}?<%)o~r>MMkOl&^w>ItwCo6*8aHRfs+C$K@L!i5}`IF5d!4 z^yQRqgCzE*Q@#t5=;u=YiZY1jC z3=;GnVu$b$$}1`7g9Q7Y?I20~C6r&MJQ*ah_YUP!%D1VrZR-JIS?8B<+I< z$GvATzdx}H`+3PdBK!$RnCva5e2MBS2v0=G`Y2)%hh{*r)Hl82313{%YLzhl&jDBj zmBhyt!3gr4sz60bgCX*WC1ur56r-w`9miV4h+rK>Be6sSYLJ9^0^dF7S@;^=^-@4l zbxGC@Ib?{O&IKioH&lVeAyHQXyufjW4kIGW69OSo*0dm2WkujLY$zf*6Zf%9(?M>R zjDys9{kEm~t#}d45XNEmYWudxbcQPfo2$#$tyk1H%}L>lfbq3SaGN!!uE z5zZg*^9+l4zu*tJlJp@z?`I_!S;5cxIdp&CeXJPdLy{l`1riB_;5PCO=Z`W;!8=*> zuEEi$$t*OjsP2cL?uCe$sX-rOL>;qGNjN6F8j8aJGNw8oYmN;gxIx2lCt}6`!tl?+ znrZ1wSkoALVZ_mDFeu`YIQB8KlxP%sY+0sNXqZ+V7_+gKup-VP7>_^7Oqy3Rb^465 zlG*brr&dj$SX>C(caKjlFPkv2x_aLD%F1GxF?C9%k0DpdE_A(xLnwf=D6p_zqc~JB zHHxL<7}gn0W5HG1fqTouEz<$tO^dM|%Z!1~|J9BXi5QYOQIZboi57(`l=KHO2nx-(kC7IS zm}oKF0mRDmLt(ljWZaL33CGCq$-QTSnXqD*86Q?6F`rFN)n{u~B%czB2v2W2Cn>TZiG0w|gE9;CX+sDFWKIqVL0RNOiW-muoa+8cxc?#O>gsF+liB(E3htts zkzVwplAPT5s-YeE&qRN*y7TFtt6!eLM_PA0Uf|KFYj5Q zDYbKN$}P8#7WVn^)J-?0?JK^}>sWN!f;{igUQ4cReo~rM@%)Rynz?A;^;^d5A8au_ rV!_CK@ISlXd?$C^uG3rMp5gxlo=NHK literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..b8d9191d235ee5fbe0462d8e776da19ebe6e2902 GIT binary patch literal 6741 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg7-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..bf6bcc4c613e04a080f59202797d0bb1e558d52e GIT binary patch literal 6742 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-1.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..89045ad83d4109f928ec24dc0987eabffc34970a GIT binary patch literal 6741 zcmeHMYj6|S6~2DNF$9BozgszkV8APDSNnw6!5ACN7;tR^COq8L?p;ek){5N~mZ3?2 z8Q#H#(lA39NT3V_3=Byd2<1`01PoycZApfDk4_w<&{8X~>;gH@L z!)oya2U}{$t>eY0d$-Ik`+)<`#0t{B;V<6)-NFY~+E1JQ#@@|eEV)#AXUqI^8+x_x zm^3^0LdC(ki|#+)uJ&zvIIoF2D+bz3hAjQeW#FP6XYZB^^| zOBvj)*K^13Xem6t{n(~wpF3VY(bdt?RJflVJ8NU_-J=E{Iy>#f%9P608;#;xyZz*q z(fzKy8F^u9|A((74}CYg`F^i6ZCO{h)?^&bzTA31ef7}I!+Ag0aCmg)JD;CVuHSJo zt>x5+5#>wY{przPkJ*3l_THWYO2-U(^hVY>$^YuPdAYHltsb&<>SqhS`PN(AG4!{s z9cUoGZdYsD>ACaPoc!B)EBWR}`3GMq`cC}Qo_oI!FCTERsPE*C;~#IvooD?qDDL2)Czu#`8ICjh@)b$_aPx&KS3+ZQ(miAw| z;B1;wu)-@k4+1xa&m6z|dUNl67q>`)!K;d)$*Lq93a4qJq>>>^qU_aJSyZvi%3d$> z$-2gJl40ng$jXYKsESYHIGI%hQR4)jWeuIkmx|71BnhKI*{l< zq67b12jZGYEEZb^%Rs|G=n36K2DxJ=OuYyLbdJe59(H$llT2)_kL z_%oD$K{?S^h@I#r-C*>hoaifryD0w>5OfwqbQR)HbQKa0@`>}W0f`-Sl{mi-NbIGQ ze+Nk7l~djUNbCzJe?&Q{1LCKWSY!k#C%#0Q3R6yE5pGf59gz4tl#@D1KcbZPp!^u+ zq;BGWf^t$f@jp#D=_%nKP~H!atblfS#ug0t7phf`|^5Iv5b_ zNhA*8LnvQOc{U)#Px>VwslS-=!<0`3B=MRlpF;U%%1Z!A{Hv5#QTsJOlFuA!Z=rl1 zwUd0w`{q-7E9GQgNW2G>`v4)oWKt0E*E@O2GRiUKD=9Z9Uq?CFM_8Y-fpW4>P*2KU z%0Wko^8=JG288#gbk$!+?OpkjeI@I=@~x-54Upuw1n_CF-v!J>sPE=ZJ1mLY`<@4c zeB$Q}{QHu)@V-=XjtIXA2+pacl;5KEGQtZ{mp+PE_*V&HsjIwfnk%eo3)LF@-xILN z_;7H$DjFQ`^{J|?bjnExNyQ~q(~8i{kR8TazzAR+1p}c-6h&pRTI69N_$-G{V|=~r zQGL3s=!PN~l2`X~vX?h}B8vq{S3SJw^%^?NNZ==W1WC~}4*L{U^lI2pC9)^+%Q8&| z#cy485S`a;TbkPn*CGVpJ+Us!<5IIBBSz#$$0JN2P3r#S$c@-mt}hVE^{KWWL6~5` zmtAPqhAnK{ST7C)@pQEo+oQW|WM)#J2734JxiYmrXsU5%dy2Xkms!{dL?17q<`VlQ z+tDEruiNA1L7?W{qT3Tkau?jZn+4?>rdiR=y1nShzPnh7;{{pd6^>K_CBz4LhW$tB zMDXqsz5O^CG?_Zn3hHhs>T!vPnZdajBj}iUYQ!<&(NG-*C}a9w#+qZp4326z>;%jZ zkQ(^0ux461Q=@5&T^DdPKL$fM5XLTMwi*n=9b1-ZR(W zjPlBo;yKk7GiH_-7UjX~JLe~tmP{8G@X@H;x(#nXu*YFfOK6T%T&8Qr1{|mX2fP9p}IgwXB^cRB<-M?XhAqaUHL!@FpfH^kGVu=&QxhWJCy%d*X2c3%rl3X*gj_b+RhO+bP(edLB>Z@j^HonuO#X+D=J>z%PTr7=mM4$UVu-ZrWrb~N}Q_coFHLNz=qcOx0Q5{?vn(WS9p(M zurg@Uio)x>p?Gw!p-DckB(u7Q)i_r5C|)cG0_WoeA2@P86(Yr>#Q#GOi?uI<+MuD~wL@F8UkU!^&p$chSv>2dtZnYd#fIv)VmG{a>(I#-N&KjP9aU_q=^@q+j)hu!^KV~)$YiPW-J)AV+U;d=;LI3~& literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-2.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..067311860c6e0f672cc1ceebb0eec2399f16882a GIT binary patch literal 6742 zcmeHMeRLGn6@N*VvIMYEP(V-?Lk9pqfEloGk4_G6l=53>J)!f1&OU;lD}Z1xRRjck zX@6z%aZG-l$qNvAplET*M-G(YM8h8$XRmgD{bc)& zmODGA-){fZi&vWG=4Wo1ntfrm=j4#y=|k_v#t+_pv~9}H<`2%)EE%fiuWOw-yoWJl z_e%FfZEI=G()z(a>p%S4PZTvA)O4cBDlcIH zsfrc|>ayRf1T=|PRLSepFwwB=C%RYXgR(3VRSu|%EDO3WU_}jLk?@ij)Pk}g(*uT( zbKmY`ce3a2iRJiOhmF*K*Z2k;!;x`O@|Da$G6TsBBr}lAKr#c#3?ws<%s?^&$qXbj zkj%jUmVtOpq@$yw0j5C>1EKrsCJK~0-iD!3(4fxYSPn>aG-yy$i9dnl`F>n7cx{g825U!mN^_%%SNvmjbmq58D0LhXS+aef1k%Au|j=QjbV zyomAd0ja%-jNbvI@)?ZZWt_$V_8rs~ZDGc#E-g((8K<@=HyKX{r201FG)|h2TE=@Y zzK3xdH`U+EIE|a??`NFml=6=m?+r+OIKueDfOP(O#`^$L{Xap2oICmgf*e9Yv<~Lz z2MF>MYKQVi8Go7aOhB-o@;)GqKacTkjOPPVdxsb=VEh>4g@Dxl3C7Er{0l(p&r~Kq z!}#+|PW`3pO=t2;jMIIg_SzW_0)l_3G$5+4b@H?Z#tGw%jO&cQ!Z_VWn4h+kak@_s zPud2?V~lTRyao`~PfNrryQol<-I-u z1b^b^4D@?ZyRe>vo+HZt3<%1OBF4XF@)F8(P@+DHc;rKqpjhgfSTeyC#p*0vN&a&H zCh12Xy^JN@CkjD~m4FIE^pW!l%O~Wb$q_3`)Q}z`8VZLZv07BCNEMRUsj~oXV|>2i zg_0K3uk?UlmjzAmDT1g6C7$?Y4SPjN5OfVjWYCkmekf+CJ`xOINl=N7Wx6Nv$21HZ z#b1dyXr0$>nX222RwD%8o{og%UZ|Pi5hsbm;uc2JB&FZqJTc4k1Va%|5L;CU%!EV1 z%p9XSY7)yLT3#qjp2gL~8kUgJk#V6)$lbrjN^o7+z;R`(0N0Qbljxz^dsCRW(3)o1 z8aN`jy>5}?k?5A(-Z;{?-z~a%s9eJ^FS&WQfbP$`iir;$Ji@kaZw|Hw%T z-ie}j6$yt8ZjNDwH8%uxFGR!@`&^tJwvB8YvkmC#*yez8MsOxkZ3{+7txBSH$cO-` zgddZrhN*Fts>)e&Lbh5(KoAW@iHj@4;V`_3X&Pp>ZkW|z%pz*c4B2%s9?jy$Rpb>< zoK%=MwW73m^2D6nY*@Z?Jin-LY)*N3#hB94T+k?fw$#PZqhw{ry@gHiz+QMvqE%s= z0at}hjYNpXsVWbyS~i?pE@~P!_->e-Wt&C>eEzR?a3o^DmdDMwxN1p+7dF+Z?9QXY z)qtDTb}T}&D`7b^q{3p@s*9*quz(S>xL9OPD57yT4u)wum?vr&j!?oM$RG$*{XUM= zXvjeIa0U<`U>Ak!jF5|89qI6B!SHwkI#!{+>=!g$*L-jXbzQ-dFDS}Tan=N0;C)!>ypc}Hr^-arB~g^&qG~=- z#lC=7fB~#%I`5Yy4f_PIPYp_<;FJ6T1rj2uvQLrxG6~RcbLSrf9UcE@fPO~iF3%lQ z^`ry6lh=1ZH1ycE+WPY8`^B%i&V4=5=q#!qyz*Mxl;ZWSv^8s-gWhdWGFHB1&777q zt!-7=yryCMW`B0zFRzlHPO4rWNYy@A!K-7{1fkk@%{h+ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg8-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..d9a56b059aa6215151967676087d487c1a4fbf6a GIT binary patch literal 6742 zcmeHLZFCgX8NSIbk^s>N2mw;gawr0a%}+Nx zA3#e(6)b2$Dy0$*qDTP^Sg@j?wB@ToYEP|I4?pmW+DiD2ijkfI>3b)4DX0C>)BfH$ z-22RP-}k=vz3;uV;XGG5uAcQEcrqMpJIVT5iD4O@4E!HY2I}|kv)1qH%AjLe2<7gC z_abQh;e8WeE-XB#k3)|#PD0CpmwWo&5zNiFpYkij0U=KppckRcAmx_cT;;gLibjz%{b;o8Chu3urc1i`Vrxm>hm9XW8P<9JhQ9x`QdBVm-Wju-Wk=H zliz?JaOKb<%JJ1ZL_OGbNIrz*h>mvUzP@rh``vS`lB2cH&` zfxXwZM}?x-cRpABt73k`h)^)yhgV(B%VxJXzxv?n$@`kSPw$VMJzezS`1jTLgGXzw=S9D_`TnIMLT4wRYJ6>2 zd&||(Z;##h^I^{;BgZ*Uj-L^JbmfiW+mQiJE!z2)BUMXkZWms)3)=d<$DIqjRdj?u z)!l!8zeVRut(TSF?k&4dUhnAr{Eh2dyQZR}mwwj%buG@z{&w)AQU5SGxeE6i^N$~W zvd~sKJ@*=K=3iKSKJxkFBCqHQCrX%?Lt&klu%d^sA#th@6htrznUL{>m@FeJ!| z$_so@3JVgi@=93Jbv5R9=xh}Q(eFjOTBK{}uaewcEyZ{mN1 zaS>v_pNBK&WF;OwoS`~tOC5nh5)`Y2)%kLH3{>YGzF)0b4VdZiZs=KxFsC2@u# z8l1qZiXzDx43Q^X7O9?DiXKkbNvy?;7}ildmS}24t&+G{6#9Ht!Pn@{mx79_OR{dr zAtTJ|JSXvjp^7X9=}Q5SckipXo&P{QO)+{ZFa2f1BpA4KQ% z+m`0Hk_`yKZ%=Q^a%Za(AR|T;Cb|(GB1IZ-cMCMxRzQs<0;*!yAqW$XsS`@fhNOjU z8|!7UIG&|6V0&W9MnBB7%2H^sdA4 zxXHAbR$TYPrtWMJF_oN;G2)I{s5Chyyc&wb0A);dDb^etMsTZ!lTOS`0I7w47S>El zXKFQ#v0Gw}R)@imj3u#;nWx0#&|}LotwO`J8X%aBwI(a(EQ9f60W)oJS>>F$k+S)V zqm>WODJd<4<@?5`S45_kR97!9jz&wtqjFZ%$B?UJ7rNQPAq3zo0v6Wm6o&#+r&u~p zV4cx47E-kxxVKEwG9Ad>v>4m5%mn28U*jl=gb7FPhVd~Cq5z#@X?2BtSA}VYG#i|z z1TL(F<*b+niz)W9gjNR&m`yg*lxT@1bjDHCI4K9sM2o`}O63C;1cPSW#gUebnP@rO z0mRDmLt*-M$haR5Q=1^aCwHEyW|Nh`OmVFeOZaSZsyN zVO~;X5!7nV&^eh^!77G=GAP|5Cx?ZQq6Xz4ue!ey?tch+dvCTu$lM7B1GiA!I4{~! zmY1JgJF08K58`jGySd_?bw8gf#P;r)(R{Oa-*ZL9_iWiRaonypDfijO?TZK2Xi9y} zH}b9uxi%`L4 zcpeEO2cFjg7Qn)J-5l=7_bH5gczC4y8NpoNV~k&?1_))g17;zV!83jh5d39GfZ#9l zCex2)`ddst0ij1Ht?(VnLcUz|^nhVmB`t%L59ST+zi;}v%WrHMx2bSNOIdb?d2H}w z`9tf;D3{n;JYbLp)U!uHO5YLb)tP=lz2e3@ z$>NSDr>K9C^>;5_GVk;|U2-IE=+%Xh(znhZmQKn~T)k5mTQjn`>Xo*A4Ko+7Z{2hE zO2*jdp2@j2=GC5C7dBS6t~k81^m2Z|`PtiEU-vWIRy=y^JB2wp7boA&S-U~AKQpKD z!#*wDG;!ZA<~=2E7=B6;|1{?^cl}yq^TD5X?P)F&s`gZV>%&0%m{3FUudZu5s?W|2 ze|G<)omXcWPX@;gT6c18^TvWDKN8Ww-hUYBo?e!>i|bf)@XO;*4X8Mkad8z{{*xb! z?^D-$nG(~ZalkX z(+KBY)!ctvT>Xr@wYR^w+R=WpAKuoLw{c0uU*k)c@A}?=t@np6t>~jvd|dFwAsMyz z|D^NR=ONBr5}UUd9g_RILimYV9sOJCjhHPwVi zWuN`p?0j!`<7>w+bdHU!3ahH77%G-R8m}liRd2J5SzLp6CBbtQ8tingtV|8 z6eTQZe3(~dq6xAQk}<|S2y_!Zs!l{q!o*Z`f>l9ML#m>fvZ3Ih3YJ$0?sx}8&%%H{N7iaUYGc5Fo{D#+`XbObK^ZV8?*OE{7vonL zr~MVGr+t$iFnTji`zw_D8NUGteHKLfD%76#Rj5CR$K$sFsUG?&9=`)f^^+LC3rPJ{ zF@6t_>Sr^4pK+Q8_|Kxg=!h{+ZE0&N!8r9rxy^V_Kx*$YPV=PoXkt8%@%@a`ys3RF z<1}w-e~@unQ_6qMct1cI!*3by4@l>qW4sWM+FyhLHP0Fd2zp2b(LPw#AVARjs2|D) zGrpYhB0%u(dk>K2U&i=u#>WFvf1fixf$`&vmjhD&Uobv{>31n)l zy%(9jopHJ^)ZgD2*8w5E44M$NH@bOdGvkEurHq@5uVkF=Bh1fyopHKPkWc3Oj3*i2 z&UgbLte=_6zme%v@zQ;z^HcFIVEh^&jc*}f4(M+I79iC3jcz?m@$`L<0zy3AIRpE? z)Gw@;Mb8oCmjJ;yYZBufOh1M42uk%wkpMqap;_v$nljm+(C|F1mi(sxCYi?u-P2?< zD2ckJsbLHvdMRb)GbWEi)8bBo;HViT28u=F$tKjK%5!9?+h#Gmjoy5f*K|V-8)i6U zDxx6Y?J z%Azq+q16*-cuGelW23cDyMM{1XbWPN<{3K^v<5Q8CT6th!4#%0cWNBhfI!3mACRCy zEd}HN?;*X10#ZOwJu1inAt0iM>+TnnpcGPNDJ;@VAO&yGXV`y~OB>#)rgt5Q#VoGT zvSUU7l6sIL;wpoF&WyQMsg`stcr-Pa1Ik(YT!LK(B%}$Ggd4TuKx*M*6KvTASBo*{ zG)7%qM?jH?CWxP#uEk<-C$??brKV-qgENQVq#bn^fILymjh$0gSv9r1?1eeimD8#s z<4R%qZu$60+{3t^cDmr@w3Arq@X z(NslKHbn`(Kf<8qVHGo|k&qz?VB`IV#`}YytLvL)a9L3FVaYvI*FOubIa)X*v0_Mj z(W2NdPk-|^-|$?`u#JJ_Z(0uY`SL*1mi6n8Z!dUs+2SQHy|rQQssZxlX>ZSb^VKsy z=NIDsPfVLRYhY$@=7LZxz=uP?8L;)e^B|sNKSuEw(0Ks0C2nhC^ z*QtCmm48F!QxWP_{-Wcc3psMonEYX`!j^&Zu0;ipzCWkqt93g{U+@27OQ2hpetdAO zXF)BVXk$}}c{E&yav#b|%fEWz;d|06%f{xf|Kj;o+qRtlt3LPUN1>s;ll_yk-ilp) zbxHovz906x_1lg?;XjCzimT=61!!L`VDB4rcuDD@R%)d-gTX7#TD=p5E0mW&4o@!Y{+i8=stV zb>K61UuvC^j11n^UHmrp`iZ;v;K?5z>i0&d*WnAt=M4SXKB5=WZB(Uwk;R;SkR{_sgNT9K+^Tjs5ffrVB?~A8Ecl#QEum zlU$#6PHPzbk0(F7nLIPA?HBSw_OWd*m-}B^R&ybLe!w_xT)eUKPdgn)x4yZt?zvxW z@onBbD%>7Ab@cMH6Gqf^Gs2raeqI#(sw4=CEU-aM_G=m|^Dq>|0?TotE(xrvs6iy? ze2|mB}8Yu5U`3IDf zxQYIL%1PWrzm0N|Q^Jo>-Vc!YaE$Ut0m=Lh%KHNn{qxWu=dJ;OAcs&8se`!&0)pH@ z><~VP^5-cZ1qk*XI{``j0m}DMJ_V52`-JkTl%Jry43OCW9p%+jehQHIGndN0p!^vs zC;pQ4=2Q74%E`VEd*4wW1O)%GNI*ni>*CHP$}#0DDAy@pMLF3=nD1OoIoT(O$N47Z z3CiE5ybci7cc$a7r}DJFWM9erw7*LzzXnMBTMC#B@^1k15bC?GOAb>~^1dGff&4#Zvd|nbX~IMO~zX@P7`#B>niH ztBRyUwJNA6KEDb>~u z#?h$3)Ej10^FUDdLqtpk?`HILsORmQ51*lHMqARdWhH#0|xM&XT3(=dy4!>k2k7FH8x#9jj9@h6zcHGzuRRb_#> zHI)@l%`Pb|g5|r$r<9jXDygonDXy$61&xXsm2QR{C95dqEo?#|>_wr8wXkASV8V*2 z;TYB!Rpr1{%Z78y#7)Bn-wl(oY}1H=&;Qkq5{ntI2CsOzXOb>L>L zorvM05G-d#R9H;0mc-OBEMO!oCK0QT#5BfMf>DwV>WLbKBb4?BG6(`ye}E%39x>2T zI0K0D(~H7%MaZNs4-<-!@5%jVl94cDm?;h^k(k>eyXv-7GZMF-a2HpWl$E({++e$L z1LQpA%KeFOHpnlm$_*!DzN_8Ezr_2D7}I*29GskltusC(dlkQ|Dy$doH0M=xEMp&5 z;9>o`qG}5E3YxBKJlsKD_bCz|6lF#BY62&4yyEM+kvS5t%2?ASQIz4LYCNe#`&j`7 z6rZMZURlx-cbcG|H)>zuT@)VaLfZlZ z3gVF;>}^ioYUAc z`oQ9ohc3R1e^OPu)}N)l_X6AAyxMu-yXnkpV;&oyJ5b!yG+|NAE8APY&yU|YcLe@L mQ#kB!`{BKPR({-b&ClOGbU3uw)BJ()NkPl*Q=8+C5&r~)yXtZP literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm b/cli/service/source/yum/yum_repo/testdata/repo/RPMS/x86_64/testpkg9-1-3.x86_64.rpm new file mode 100644 index 0000000000000000000000000000000000000000..075f9f8f84b31d20691d750473c89f3a5d3f22ba GIT binary patch literal 6742 zcmeI0eQ;FO6~ON%3nYA*mI@*nx~S1md7It${VD;IKqLqxY+xXuq4#}l7B>5q_ueJ} z5kp&oe3*ekEgz%hON1g67)9v-rBYEoDwUz73|fJh|xeT6eVj=vWRyd7I&V z1hgLTz6xX>Y}~txp+~;oLhA!B-Miiqto411@?|msq3m{$euT0@lrMn z)sLe3t5iP*p}yl5`+nm`z8v&;{~`XO)`8NtS^4+BJ>`7c$}OYU4_Mq<-Yv^KK4^BI z{CeX_*RXLSs2dHaXKr3vzkYXbw6G=T;Ir9}HP@di`SYR+Wtgq+n6AXW8ozJj6=_BF zmg}1$dybslTl&tN+B@>~$H!JZ(=dE*-v_@xpAYUncV_;JtB1z*3)-S<8*Xn}^LpQx zOEz}DbGGNPKMuaK_Q1dc7bY}3-P(e0KK=Devw!eN zvOzk#;cD~s&yQGtxc%z9f0W+$zS&&x#HgdO53@fVxu#;-;TyY`uKxAW{xh%cTYqxl z$lQfKV*8Sk$ndz; zjy!?>-q8Kr$ukpX=6-K=NgY11bNQ+1M|LegRJ-iMpLYCwkKD3TYrKBt&Gl=~92neQ z^UcAsK7ac3Que9dcz-!Q)I4C}l-7>pi>E&H`QBenO114j*=u^ko<{~H4t9Iz^!B&g z)-9`Ed2a8qi?jbS)eME#v8jheRpL0F6*z$pg|W=(oT6zOHo%H5vv6?` z$~m}TU)$P6kG+r^%sMX0YX=p;H5~4#GF>JEnG9qykjX$M1DOnDGLXqYCIguaWHOM+ zKqdqKTL!$ENM~nfGc1D|2157LO=Ku{Y=EJW(4fxYUjdTL(V;<2#e33q5vZG>ENFx~ zKoagn`7_F-zC!e*ZjuY_KFXxNLO4MA3P`B4AW~N$^GRKW*aLq&{t_h7LtVw=Yaoe! z9OWAziMn7QzmmsX(~yX*dlCG?g^62cPW!NNj{n=_olp$ zGKrha-%pvuP39k>Oma&2J<8t!Nqjg)`F@aO{dvj*K$7`?g$6nIKL8T+5DFr7F#kZ1 zp!X3wgde25h;kuFuuem|FTFxWWL_T+0B#<$_pu*l$TH@=LqYwU!qLT3F67# zN;yUO4ayB5VgKxO{Ebwf_LrP1S)cZI4&_TAiGOoJ_5l4=ka-C8TiKjvMJdNFQe%lC6+3kZ%*11AVVPB* zv<=5G^zvBTn1JgIXJ}eSMn=V=kh_14RpB{t3wx8DF}T5~vJErVbax3=S2)ugR|iM9 zU?|8lVZ;Z;V91lC7lM2+EPEIhgW({D?#+83EU~;Gi!v*cNFW5Sk#{(MltT*M>7sX? z5szC;qh-hSAOv+cM8s6G0mh8GRxwVw7QC9+WdIpVooQ&U10zP0W+dI1l>mssKikkO zTW6x0#yE{JSF1BXk&Gpc05b*08ReCcNfqTa zGpZ{mN6JPQ!}eX{PmQZ6Et@)ZMoD$`XqZtsp*p~jtK<}W-ohai!C4g9hF*tVDwsNK z>qf%R8BGg=tBwozmPy){3%*-69h^v5aO9qu08=mW&|zDvEAF}~Oar)C z@1_z)aTK<*V;XFRojD1u4mPk-4wFhW#u7T?Vl__EK|RspaD~$TKn6jfnfEZ#k}(U- zg*$-43jI)+t_T_L<6)u+@_TakDYa5|!eC0GIF<-F8c!-3{?|CBCqQjkHab_dpqTXO-&Ku6J>=kXUeL|ONOcN zrY>!k2}il`i~s-t literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..ca5541421c566f2e58066fcc931dac9484de15e1 GIT binary patch literal 6123 zcmeI0dsGzX8OFa|R#p>&o(qW?v??m?@jBwZq9NmZeBD(REuj2$l0=@w?5Ta)&Ujv1HdJ8D@3mB&L zTw4Dpty4xdz` z{>r1)+iFdUI-i6DM~>CE=7jzb(f+%diVtcZ338VuZCPr0G~v`U!sq?9*7>PPDVzUQ zs;}{u&UcpIdMa;t!yn%cny{?Bc*zl=`}fO3>im zFlJm}=y2Ko!M{W=)-rAs-pTFl**VXW$xa;k^qrU`Zw0mVt=JQIGdg1b#tqh>O`H2F zW?z5(Y-jS;2lsi^)K9`^ZoF0>abo1=(5gFE)(pP+^e*EG{lNEH)UNj2fRw4$*8a&a zE-xgZ6Em%gT8=gbbge2<7e93GyMnTB|Mpp_{`c;RwTE-2JbLM^KlN{jpOX;9Z*1%7 zDPN{Dy)@GpFw$}1{m`RfDFwnORh6sML(^R+rc~^9q$IC2HmqX~l-s{tv~%t7a_!h; zQ)YQxO~JZoz2UWyUlb>t^{f|%bl$+PYX{CH8-9pfz5kH7Wy{&`&Od&-BR1G|VL{%R z$bpx(z3=I4i`X&L5nEPz()r-Ed5;ukaZ4;&Y3)@Z@vm2r^~Xa>dSWMM<^7UAF|5EcM7FDEgcfjv}-vPe^eh2&x_#N;&;CI09fZu`t%>iE~;`Mr);WWrF z2>D5Fk^%oWli*M`49qz&55YMK49HY`+gL6Fxe3w3K<)=c4y8Om8S@paV{Q@*BZ4yK zE69nIhd?1`A(*S+e9Tp_pG5fvDAplY@zrmEV!eR!9Z>8yoANzStUpP4gfgxJ`Wvtp zj%vy{7osWRqKv(e>nVqT;(Yusj_2b#(T^s|VU*vajO)hvA5g}1-BeJ#-+apHlz$Bh{d6-Zqass3 z4OU?2ubV~d=quKXDVI`4#s0qm#rYMKQE~onDL(;SUnu$OpM6_;jG0Zm>8e3f{8V8>$I281VVIe;=D z&6>c&`Z-kwi$t3UUh%3$bSwsSJns;kqN8eS%OU;(6a8anJ1aZuG@>YU7gnN zI2d(hkJ*qQOsY<6Sh3H!uHnGu&0(&}Hir2PGO-2F#_o;(viba8I)i*L6ct{%==VIALi zLH%>XW3IbjXdS1TZ=AnBJZ9q7@el8K;}5MpU+wEoZQizS!kpLkIE}}`dMD0o3$~`0 zge;xgv|3KxxlF7nndXvl7*?f-hgk>wdnuc}2J_<{O2t*1`L literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..ec0126e15c86dd060d3106d01f3948ec3b646fea GIT binary patch literal 6124 zcmeI0dsJ0b9>@0u6tEP;@e#5V$#KxSm-BvTjv0aAD{_%uOVsn)cm?FjLl{GaGT)#L zR7=Qm5^$xm9DEGfip&g68PG8_ZLCp55>V5r@ewk2e*3bS)tdQh=I?vf+V{IZ`}fCITZ-PQSKLHf#`Ts!U&(ruF z8c#rI(9DgtV*$t(gq|8UCLpHd3Higch@o}!uC$j{$L$=xu_V5qA8s6}4~)pLp3Skc zv}F#{T7d=xhxWyP)ApDrZdT)}VJ)={wM{Qfcww8Ea9e+}Ct%Xz<>fW_beYiq^q(Tk zucGWLZk2yqAMv1~d24*x=3$}Croc4^JMz-kU7hV*IAZ$z%l$_-$wxLd>`9f|OCP1} z3;WW}wtUp?x4SI=PG=H##J+0(mXkwL@||m&Qb%_eJbQe^N7{^YcVApu5#N2X{7}{^ zS5#8Qq?YE_9%fyhd!w?ZwDj6RGj8J*8Nwq?mt!0zF=}l zadN?zVaJLZGP{l+cz=BN+94^qbq7BFynM>p{YmGmW8dhHGaK~=v3u0=#CZ))ckZP@ zRS%Ax*w(iC?2@J*r;We%=**8*AzRk86g^syFzWp2F|U8W@4)oVoPK^wr?$2%yZ0Vb zU;T6S#IC9x-!%Pw$E4Nu&f!13zP&hYajB> z8nG_rC>AW1H93{lObd&Q%*!IrVji=yB1<}J3A&{4yuzr6HAG1=vB>HSmP}PPINh*V z6$^|kVU>rCk}P7Zn^?wzV5*#Mi3+b-vLRT4#i{V(z^j<7_&YzC_>ba9CFGe)dp5m# z7~ZuUZ^-xIbHL|-&jFtUJ_mdb_#E&#;B&y|fX@M+13m}-HwU~u5s$}H2-~2CfzU7d zCNc1Pa||p^fkFBlq#r_ZOc>Bp@m_s>5$KyBKNy5NKnXuaxsx*KuaG$Dn*_rMp-lQK zgd-{628BKgB7GH-Px>mPoLT<{W7U3+)13*bW`7KWNlXDV3@+m(~`3PllZj%2AWpZwk{~2ZCDd7gn zLqSRYpD7OqCGoSAM}U&}Wfn!^*2$z4odQ=ze74`-0N>F>gz`$7I7#Unv;=p zl4eD^H6u++wf=hnHsi+dPEEp`!0Vc(s0J*-WqUO~(K#y)y|gUbZ5b}?vP_ijT9%uS z@)c>3MBZ-5DXR4D-;EWS=X6D}ptodb3M-h5%yB9sh?-#XnyMQTuZpT7tAb%D0*@`8 zF)(Lh$&z$S>TMYz6q%KonS;C^2*Llg=ijFxcSC3Z8CmX(beA3-o0;Lxva+)+Gv1YM z&DJuk?D2@k$jbAsR5(4X@ealz*jXevBnRVFR&uZo9{uvrk*v%Kq9VyWLrw-4+{!!p z=0SZ8-o9sY5MvNB+^$TNy3*xFy{8Du&B1mBG1%02jhJ9!PL>%<7A?zUv1Kt9%k!$t zs0_zrT~#onTc#o!vZ%8vC$O5X@sdJri-H(Q!5FL1RkN^;S;c^koXU&3%$uBP8YYi9 zRm7qy8W==2G*QKtW~sWuN}{66q=@$m(BtU|g?Z@c&G0V4<>z1g`xj>%XF^ZjFL=Lo zVuw+ee0c&FFj|U8pOCv@ziVaM@pI$G+M`eA}|klngE=AFhKPhMc~X6F~rUHHq1 zu5F8Izgl~(HsQJEU5?FRD@GlflH4}o;Hl4x_^~TPKG`|)=EZqe-q=_AarzIj8xjZS z?dS}9uj_*=_v)MG7Td1v{&l!Rdge)I!qn@tCsrJF>_)4n&vv@@RF8SY6=puYecaf? z$>W0-UbVMZmJRyu&`TYkU01fx9G&XEIxsDD{l=%)2j{7Uy9W605yM?enyUOF-%Pvt zx6E4?zv=$t;n!kj%v)Zy^J3*Weeqe(lE9a1_MVAdbnz4u&4d@1+*djte&~v?sfr3* u^L1Qv literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg1-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..440dbaf5932468368a38e6f5260be76f31b67675 GIT binary patch literal 6124 zcmeHLYgANK7(D}&2wIrV_R-X~52GCT|-3@l2?un4PF zRzjkdWTI(k`AAY+Mk=Wlsf9eGPyy*-52EQi!=crxU-f(LT4(m%XMg9LbN1YswPtr# zb)EM{$b?MUdRDg6kwRN&3yc2WWkNUnbK$z}-I|p$s;HDOkFodeA^K`qGr*>_OdNe<)ez%Mc?3M)Q{DN2B+yWv-M1QxmD92L4Jb+ z2J{mn{awj#I>H(kT=aRmGEn+_Q{h?l)>**;5kC}}SK4Z3m3IHOYgGG5`=QhgANVgF zXa3>x!!PAuJ+&{xbu4k#+zVc9MNQw^Zam++x8dDty*q>(7JjsL<2%{2=g+om5=PXQ z)OLp39&k-wn?KQCt-8J{_tNLwixs<8*PhOcEpBakt8U?srQe#Tm2N6slQtx-ICwRR@&h>2_H?k(JqH*wZHXU_0j z(lva?=;Dg|jprE~;x(R98D7;ij*)mp;v_@XWKbA}7BxYq1V%Sl zMrT=(Vrf?4WL4!DQRD?tQ)Eeo2L~R-gceJ)v$_1tnD|Ez_2hr@%w~AjvfYyB#p8g- z0gnS72RsgV9Pl{calqq%#{rK69tS)Q{5J>OnTX5fDuiW_VIcIk++-^J-<$wbGhpDH z1Lq;QMuP#Fiu)SKMIbjpUNA840L0v%@XLhbdpvnKdy4r{!bbq&`cDZT1&H+q z!bbyQ{Q?Z|+-D3R*4qdV>gT3F!ovXJOr}skyx(ZTErj0#2>ncR2*-#y@zW;;IP^Eg z5gq%A^#sC`2*-%~F9yW*4-$?M*DodfAwaBagyYWz^8tVHJl<~>(RIQH{51$)*{=^T z1H}Cc39kdh>x&3)1H}EGA^Z{`t|$Hu?;yI{-$*o&M!Sx#NG8+KhosrKb7a#5}%Bn$ZIhMHBC z?)5`7iqdpiGgw1XB}3w6hG9gVmlzR(Ayt+{gVAlepem|LLFB~o93@baWEhMfuqw~s zZg7QUrl)5k_X|Ssy>|U|8W7>b@xvq2nU-o-!XnetoSAx7maawHQ}tLmP0unTqT!j@ z_7pfh%&}I=%2{Z{Sp_TQMq04aRu=vJ&>^%4yOIQn;oUoNza4%{_l41SAmAO?lNB3- zkm|Ijqm(?m6WQFgzALf~i-Z(~kr)Hcrl_nU(3HTl3~T6y&a)gRGNPo3BCTnxVaTE& z8JeL9aIdL0T~ugB)%tsJkkIj>O7SAA=q#jjGAjwRO`##WlUW;$ms1L)cN)XlAd537 zkp*3%L_=0Y&AlV{51`A{hrg%+k6c z-|SB8_~?@K%DnL@&gP+xl-0#kRu9gx6>jqL-o^*nmz~(`6;kTB+LYeec&@j4&l6MU zF3Q+k-dK5BS=!)QHt7ECRi`488;?_AR8YyfpQVmp-?m3@-#l?p!Ix1d>z`eJvi#V= iL%jvBRZVNZHe+GW*ZFkG-KVbb`KE|hBLlPH7wS&}gJRSG literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..9d5d46cc1cb65cec2c3539453a3425c34090969e GIT binary patch literal 6124 zcmeI0e^eCL702HK3X0H0jRq1MFos|inAw?~omDIvg@F7JDHI{7nV-0og$*pJ21wMJ zHi;>zfu@9LepF*cl)#CaqjHRbQd6uL4m4P8BMDWvs03(gCMeYN;X$FE?;wq@ zpz$wgJc*Ft)E5n>{fHreESMGH7h4r-so(hEeIMjpy;i+1;qBQkRwYjI(L2KC1U+ci zmO8Z(sVGL(o+eYL7$@R!hQNDsCui4h7;63NSA9M4lSXUL<+TjED+cO_6{ne5z~J;fuwK$dSS8QOVD| zvNk$ijoUV#=8e>DNR4QT_KmG`9cfXy*6Z*4>`b z+8OytWzn_F;nVW7S$iKobHr!c$@iZ>)qO&!S@XdcmEHY4E-t;eF2Uv7x%P@aMeCD#GjxU$wF10lUw@!bf_Ciod z&0>D+Y`|l`2#E~6Tb202*0e3Kj9Fu?B5M{Dg%xFylZdEUby={Ocv)9C zQIJ@XQO%NOViiGF6v3jXRtqaJ3THA~89|dJRyC_;omFH`)Fp<47YAO&EdTwpCl&8% z-m~wuKU9BNwjSP5pG}^S_vGz>w*%e|cst;O)Tw)&Y+v z;&!{Yz-{1R5b_=0Bo=;eM!-}&4D>nB55XK226!r-W5O2!--P(UKz4y5qrZaucgn$( z(Knd_18ZR%{T1X0%C|xNV4$ypar9NNo=ABJ6yxBlc;cg=7*C~q2NdgNQXT`v_&Un> zDC0h$z8}`YQAinc!I~lt%2*4zgz{8S%y&`_1jT;fZ*#1N`$j%S8GR+pZ=w7>P>i3V zjD0{pOZh%f%s)?gHYmm~QobJ)<5yrn&;3F{G2Tx(Y@7`31;zY)%BYzCB;~cB7*{Fd{{^{}GS1_A zC;F>V-b~{<$(3^RuvRU7C2T^WRoQEW>HiHficMzP3Ab+%1fNC$%<;Snq-~l zR6$a7fq{EqN-|j{jMMOv;$kQ9oCtx>wfo!Mz={Z&ilf9~FSN-~%Zu%f60NjUQxk24 zTDoM{O6Lm1mfOiQFAKzc@OiO87 zYW(?<&i87wN>Wc4F7Katdijp$fBZ=FXJzldJ}<>`NwX|lad&W^%Rg_y=&|$DMox0R zZF6Te|H|(AtnA!-y|&hmljilM)!7@8nnuozCZ{zD1956)K~nzVxZziep6YlfFjn2& zo&8BbL}bF1j~nv@?W0@eIfwH6+dBjK{DYg*ncr+Xu-mz)d~GVZTeGXFtNYf{I~w_P zjme%AR-b8XX z>J2xS6yEH;RNmCQEp|ap>AP>||E^1Z@}m33th_@5oo)HOA2CsESnw-@qU&Gvwj3>U w=g&U;`nOlJ(^pYLTs74dJZk~>F)=iENF^!9&lf^VpQ1I68D*#H0l literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg10-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..1e67c0f0d493ceaaa48aeabf6abcf5726c89864b GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..138abd62412db82d716921fa58e2ebaabf3b0da7 GIT binary patch literal 6124 zcmeI0eN<@75qS}ujwsO%2|-8281B7uU*n`43Dne$W7J}xa$jkZmx*Bvv_ykS zEqskyqgHp1isL7d`YI?Gdy%U_1Es-^UQhXdq2!O97ORVD${psSjo9oiIMXgzvF)G0DJP;FZE!0y> z^%A+rrs+#jXozJb{(MZ>kofQ>wR}e!dX1|7iyrZbrE6L8f_=3IU(Ff)=B1_EzV);< z>nSwcm5@KT8f|-Lf`6XdX}HZRR|e zzVlq4&AT_vnDJ*io$b%qeW!DMrD^R~DTTGUU9KCJn{Q-vPUOt>ACEn}vVO+(wo@H* z^TIwK*O-0bNYVM67uFjCC*JJo>IwKN;-k7Pmvbvt480ilYK}smxLh%?$2#F`%j+Li zFZ*%l-n^=$hk7qAdcvq38?^Yx+<$K?TeH>eteh61*>}`=61oy>Cp1Eqm?-d6J%8bu4wp-kS53HO@(S;V*m>mGDku)jv*dNgmrV`TIxey6=SjbwfoR zb?E8vbUozlm=Djj9kE(2Y&|sX+@@C!WPTApCvoWA#aFhj*naiI7ah+#ip|pgBEDfx zy(fIlnatp;B?I1$=J!6EJ2NFEz4P|^vWB~?+G$zTy{u0v{&;ocf!k{fB0_3DJUu0G z-(bI9_LNHVyr#&MBVol}WL#Nrw`F)SN8*&c1 z;aMy7h5T=R2mB8B9q>Egcfjv}-vPe^eh2&x_#N;&;CJAEbHLXV@p`>0;WX%BAoQ!g zNizK3jDw}=Fmay)_d{@w1`~QJzA@4lfxZa}fQh*e6muBi?+D}m3XbExNeIlbgmHfb zb1dO&pwMSQxUYiqabE@36A2H1;yCnGeDVK+;`m&`w?J{d`GoI*;`k!MLxk}@puQQ` z!n1%d&V|+#auUY1FqaSx1;zRJzc@Z0?-Tn`MtBV2M#6aCIKPQ7-Z#!aP8fTNxrOj} zP@LaJI0_WU&k(*J6vw+^g6HOFP#o_e{J=1qA_-3hg*}-PK=J)%5KbaI6BO#1W)a4U znfPg*4Gi^7nIw*V#qlh{*@Us;`U^mDelB6GI6sf@LQovn2;YcMe0~+-9#C9=E#YrKaX#^PTpx-1{7pk6{YXT^D+`*FvGX(M z#X4nmiJY(hegRH4JkdYNyuq+`MV3WLg(VoKsBvhc&y6va!&dWo^8T@+r;RXqz4VdegDAz_6Uivl8RG6W`_VC4B>H z@JNGqr;S>k9x6*!4CBwm(%*9{iIGRT*~M;cmi9Hj}eB1n{`Qicu=%RKbt z?2Ir*Ol*`hEbt-h23qYMJ;3JWDVF0;@M&m~)b{v<|*h(c*4z zE!uhb>?zAjozA^GKaV?B*S9--PVI*J)vLWn7Y+u#KW?zRG56ZtPf})OfBMjb{YiyQ z5x2*u%oD9^6Rg!iU5`A`S$<|HbK|bIM~_~W(*E|t@vtM!Nq0k=Hn``%)BkcXJ>}B6 zrRQA>BfF0sI=`RJ`>8(lWXrqxX4jMtx@Ye=aIVFC{K-=xQ|Fy!s}={{sD8MkYWv%X zqnf8SwY>LMdvoo<#QsKW>*Z6IBW+D9`U|FS)Te)K8|}=JQyVhk!*?IfLJ1|+U*4^b z$ypx7KXXIxOWYF~`F+;2W5(Q>*q^$~eY3nbEG0To6ep7peC#5;`Jl{ qD&MlPJ-W1W@I~)>m%G(E)XE&IJw0jPmGbvrOAfsGTy`n^Lj4Sy17>vq literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg2-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..b906b793fa327a8f1f46e5ea2b3dd772bb51ce1a GIT binary patch literal 6124 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%0DZn6$QLzc$_{v!palij|NiEp^Gr

OQ2&&- z=15~oh$q#3{S?-#)Ja&%0$F>&#Ws|C}{Fs^!C6G^4cs z#`gNjFI2^gzZ$^3DeuR{{UdjEWaK}m^rs&!AFAw$n42&rBx{@J!Q7=Uy}a(giqz%~ u&&~3NL2mk6e9s@huJY}2mA5Ajw{vF?ee&_2?p8L{&YmB#>y0w_h58qnTV6r{ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..8e317737f514e27b0d538c2674381ca41fc8c7b1 GIT binary patch literal 6124 zcmeI0dr(x@9mmh|FbGTBNLP^ogw`}D?0TPj@6}AK!4ObZjKRhSVD6KkJT|Z(0;!3L z3K7P}c9^!NrU@FENY%ut!KjT9WE@gs&^T%oQPhF(5bFbJh3)Swhfb#btNnY=&bi{$jkeL~{~IP0_@5WnHg=oHS`b2(dN_Xp z=2LL~8&C_pwRw!;h)m5eL*Zn?*g4!6GCf1MA15H>-whgokRL_34;1S8aiCDo|1OCy zAn`#GPe$nJ)GE`-0Avb6@l#?0X4g&=8rDWykG$4-XXoCRKA2inn-u70v_(XPM&{|i zaO;I~zFpHxQ1C>{czk<@8CC9@mwc%+`u1L{txPbN?Z5Q9s9|)WZ&zmaa!RgE+hVzT zpdoUSU+AB2_O6TxGP^pvU%b95uJ}RumC3PpdXvOirb(ZjT6gyJo7<~;H{So!(q8;p zLfxv5yUv6&`=UR2eEHsGRa}zyVQ-eWa39+L+>C@DHlBK;ZgpwY?~g3oG_$U(>*qrQ z8;-`kS!HhAy)Pg)yV!^ifAX^p8~3C?ylFeKD!y)0LeKI3s8?!VSk|?!!x=I1%F3;a zw?2s6{miBby}^xFTJFRooGf(}RrhxVr|#@5IWRqgFPWlj31QDCCX9Y#4s1F#v%I;q zUd_6F{d~x6`NR9|54WbAZmmrG$l1}{+3-QrmcPyUdcS9LO`mrZ%qV z?=Xhv+#hWSJ!ErP_Cy_D^j(@YXiel_JG(DVd^qEx-+a@OPZd)@`T&{ zsraX)3(mvW{unVjpbRZFn|kICPo4FKbHzyI)e_<8Zl^W3I&H${^TRh69BA+J49!1z zE3fUIrpi3WunH|u4u+K(iluc?ka@~rC`o5zPT(0uRCPqrlqxHX&WRk&D~zPml%N~5 zAt|E3O02AEyhIdLj zc;*tuxzL(IF2cAL=0d{3pg14@7suD*ePTaK37ZKw5ytz*`Ns(3edGKu31d$&w-C01 z;{2}(PX)#CbA-b|ar`Pw@H}7|D30GE95KeGpAe1%g*};Ofa3d2B5Wi4GAPtDB@@Pq znfMuy0u1#{OGq61isR{omlMW{>#qRC`5A<<;{4YMXM*CmMi_rCn8*Fa>-c_)NL(j8 z?yo`kt+9C6PEcI`ZNjHP@%5Vt-vY(;p?`w!FYGob&L{qc^^myN-$XRtk3=-Q(xEvS zvvi3w#wDw34uzl>b=+R5=23z6`2xvL1Z*e*LY5L2(-xX48yQ0%c>$Ha2n5unyOG5 ztve`|rvzD0Bwi6D>^5v7QW?pir~zm4roRi%5)428n)j|RIz?Gp zhblI-6t}nL&pi6w8B4__*TIGhu_yNSG=?tv!;Zt-wt2qD9P)oZY-oK`#=t+1&rM$5 z{L?9)+VYM)J#3xp6eFu=MAkGr-kn?$eRy8_ty!O)wU?jW(f$13#(Y=X3BTFe`xo@` z=`W^MfBsSCql~G6NABkRCD$B2&vwpr=+3m08NsvGwfFQD)26{!3%^?UDj#~I&QzhE z;bI&1ESx_WTtGj!$33{WabdZ=^|^yv-E3EPP4hx5`_I1~>)|7A3oa~xs vt zOt5H?G@>DBP~-6^u?f`_jSC=RBH0X9qsAo}BpTWzmFkh{?~a$AoaC?e@44sP_kExH z`@P?L_cw3mocZ3~cjuxRArmtB^dg@pFPF8^HU|BF!-T?rd|~;1zlp3xA{4s|&L_hB z8JzzKG!|~%{~^N>nNGnR04EU-&*8a{X&~X-H~}HEAJl?S7)AJNP^cH?0EK$yZ%F(} z67MGQDF{6>eS_(^1(_nzxWOYWY2}H+-n?P)4fC&lxuq_vX2^!}?C>z7ZKyI}Sb?75 z)4lQ%yQY_*sD811@sDRl2VSV!-jq3Tk1MNt#E9&-lP5ek@9ZZZm5x!SWIvuhF>~DC zs}|KZc@48_kDYyKc!@1~{(;GLiJJd@YD@JyzPmkJzl|8~IB4^US((W@X3FmUW-( z9<(*OAphwR5!IeW89hBE1*5+YD`Wb1Hkh_mpUC*-jKoK+zq`5P1V7?g_swTgTMsT? ziW--=YI6>*seIKP_HlSwPDbjL_FEr*&|Wz8`=qmeOXKUy;?G=+9IZ6}Vd2ZZHPJQ zTHsyt1w)}jr~{!6ggOxFK&S(u4um=o>OiOip$>#P5b8jv1OHnGf}Thq5LgA5fro+6 z4}6m}_`f+4meOHjp9A|LI7fpCo=R}^`6A$(pfH%2J3%o=6TU?l`ztt(eUpALV+dn^ z1#=4FJD}jRAndE)eC(^>dLrR}fZ{m#D#7@_KyiFJ;T}+2Zw}!Hpg6vea4%uJ52$a! zweZX*jB~-7LLS1n7G^KuC{Ub_|BK`6@jh`smJ{wz_%LC-Z=C-(!g${}|2@LErC!sz+648i3PB14^ z=FFOr;*r%nIamMb0$gmgC3VTX!8lk&mPJX0B^ajC?57sY$U^g$6nS*jZMby}<-3;@ zFGtHoei4t~ZpiuluHg0c4pm_^gE2&gVRcqF44#r?TGBcnb@CD0n~!zSn{O?goPJ;Y8u-^%Ug0mB%I(7I?gRQIW1? zyYuy#a)Dkn7LgcUdD5K=yN5N_PT3tc8aeE|oeC<=+i5$Cez@rrT3{TU$O|kTe3Ibp z@GXM_Yh<6n+xJX%+!%yZkGl}%u5^2l6wHk*_8B%2X|l*0ipKE{2WPN4R97W|=S6|# zC0-F3O;S}sW*J6TXhl{SRTOki6jei|6jfz|{Y8CmSlcdzO{J$0r$$hlOK&qwT-&AtRb)A^|?!rRZY9o8+iAoAqjkdGHaOd1u$5f46y~uI|3EwzBTGNhe~=J9FcqZU`fdRL!q5>5+Tlck8zIUlX?TLx0ckV=Is5y*fK@ x@9E=LiYvZle(?tDuRl;4*fh7eWms>E_2~Ary85qHG`{%s-t~`P^1(0Ee*jseT)Y4P literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg3-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..5df70ed752b48c043d73adde079ca730dbfe7978 GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..9851e0991d302c2ea2b51c4e053e14beeef5a5b1 GIT binary patch literal 6122 zcmeI0eN>cH9>?zkQv$w#p@irjM#Gm{8J_o-)>0QGk(VQ=iDu&SiW38jGlLNs>QOe+ z#1hlYG*}5&3RzcIvdr*6S@}|FTAC+VMFm;~k1OqIrP<#dE}hQqU%P+LopYb>^SQr! ze{=6|o|$vzd-I)J--RMXAQFN6n$e4*VWK7+)2 zNPHGT!_r@(j@u9whJG6})|ON;O4^q{W@O`nw(FI(GpinasUqdR5bI>zZ-$O3FsJ!U zk6P$3%oQjiJZd2BUq1NW5c#Q0dwg=|*~4!}&fULswUSm)eQ#NN*5a*e(&`qh@KqK~ zxD;~Ce!KqkP8Y?lkF)QNjn02}^oG`B<0oDI+vLt#Z_C~Kt-TvxOGxm(u9la1uAO>c z9v4?~X3gwlKb2&3IlE$>dO5WzWpZb7!#e%O)#u(?d)-shySep=FnfteGi^;rKIF5W zEL&M$^J3X&j_Lz`c9Ai!eKIw_HMwPs@RacJgbjEzY zygH@ytC;h#9~YmcN3M$4U%K|YT(#Ny{9*%L>5e~W`^(af6B8at*)r^O&)B2Nf+|Ldqvs9YZbXsCKR)Gfx9>wf5dCKisUBkc5&0HI?KIdD-f(eumZsf1S=4%K(GSA3Ir?gzf~aMiTM5g)vyda41|8= zn(5)M6*F!on4 z+X>$S1)l|BUj@&{z6#DK6TS_KNizcs~9wj@RRJ;(C-29zysCVSH{p|0rR6Zalw=)j|qnJpm@J2gcAur0Sfu3S%k4- zCiS$X0z-ak4vFKs;`ltmIfSv|{0l+x{KbT^;`vJnKMjiG24VcUU>>M19>@FjlDJ8D zpuQI27y9GTm7qBPYQmp@;`QqYw}ayR8wg(m#q&vhqdQ4FP~T)U;71|`Uh}}5v}e!B zu)9?~U(GZBdjJ+&Cr8~=MT_M*O;u$@haqUx^C_u088gxRLa*D@otD!ykjq(ET!Knu zF;~P-H_Ta66IlOeNwOG4mql5URZ&+3l@q{GVlp#PG-rXC9m$#yAJ<;K7{b9ioE{C?h%;2Zw%rXgedZydaCb!UlE{csu--frd3~ zz~CL&lLHq9A>HjPLV2Z5H|jUO!is%XqKr&IXAMTs1zna!M$s&RV>LxrS;f+LT{BpY zW*AoFL_<*+hUavi6Gfip41?AfotS808q1iLEU1PoY634vy2eO?A@c^!Nwh&521Dx_ zC&;YK7~ttioFdAs$%~fEX|&7>c=v%HK)=5ae^I02H^Q?7EhKc)maMd9I_kuaE8n{E zXs6yd;&L5pix8-IAe+IyueY5U1O|FeU_H|Dhb{_vhn z3&wtA>7mYn@xP;QkqgA6XA82SAyl`Ui#qVE?svLLg zPbYW(@W-~^4^Kb2iMqOXe4Im^@=(sK>E^^;r*pT@MN`L5e3zepE~;!)le8^8dds4^ z5w?b&7;pCMK}DD9d~KdL(`z?#@AdrQuLqlFY-?Wk!I-A3a_W5CCjQX%Z0eOyh2HMQ z6|S2ve7orQ_P5`8FMEzF+sV)!s}6&(+5=OUs^lBP)O3r^j21 qU%kUV^fuRVpu79$_#0gn%Dv6=S4z3*`WJUfhvw!li)4N9`}A*gf>%BO literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..9fa8e8c9fe76d1f9200de0b2392cf3b3405cf2c7 GIT binary patch literal 6124 zcmeI0dsI}_9>@0#4+j$EnS$QL90@hX^P2OBTi4=|B$f|M!~o9|CXhkEKuHra(=0NH zd{ydNX_0Aolci;qsye@!xBV?usUjl`CW)2kUd3BO_Jc(Z+@yQ4c zNnU08%o~|3Xu_SNy(dW+S4%=z!jhVBi^?2d0a)3q<-f7iRNB^NtwzQr|Pw;eTSS<*6LunsuOV9qG`xoCdah*A1Lua;E&LZF5fcDaw(z=^B z?=hto8o7JN<$SnlmXBYL@5E7`^*;7yXin5C_Ycb4)7JjZk!#U>e9Fv)an4)m=}#6+ z+vjNdwW6f!+m5qo2UZ`u?uhCOEUpXi4GMq#P}1gA&aLlmryB2~7x#>fyT)IBZP}89 zgPLV!i&(Jo-p<&6XKiV1+}*G!_C)8#=9-hIEyoXh8(JPb*>8GT`(1apveP4?m-d#l z`ZRx;F?{u?{ehbrdLO&FAo=SoOHM#c;kwbEhTHt#5*ShH>WU^y?ac{V@vehwx5fA0NWA!RNu{}Z@qzay ziO+wO_|=MKM;_f5Jon50mhQAJU9YIYN5^jK+dF3EiT+EoQ?)Bs`%H7%+p>mTi;0ye znKLBS&ZrclNi3}@vd)PdqsWSC7ihtdbd^_i3aPB1P_)LenxwP3D65blOA;+}x?N`_ zPS7+-q7=ifaI{W|3N3M(on|?fZ}>H2={^Fcn0Bq!gwE0-y7G$BbPAF zh1L|xCyZ-hE+Fg=iu3V*al9Vy6Z=s@crf7_!g${}|5L(v-#GseVeBd9BZR|1asF|_ z!$5Jof$(rp96t*KJogR<#qk!x5x3bCN;n!6_GGex;^$2y97FhFP^f2`Oc*O>;-_~K zFw{3qBXR62j;9b#C5#ophzXstY zx8os|pt$}r!bd^z`sIXMKym#S2>%R<^NGJ97fIahZyXxvM>jW$|>Lc1^-e5RZk!4X*VG0gYX<}09)C4puuP|R%9fm{KP_83yVF@Y``AiVjbzFs&E zkracz?FP+JETwBSqf3SaJu*dQC`nLQngT;a zmF0N`Tr(KxqOrO`(U1m>G*XM93{J7DEXymDT@wVmNJ*+>h;~+kMJxmjo>LfJRiUJz z=>p5Cv?x#vL&-A7xqWs20J>a#_=_4iYBjt|aG1SbT04Ep7gS(f_tTs2e&e?f=Z?<{ z3ojo!VhCS#-{D5<{ynlIWNm2B)!L>#O%2k5gX`*l?swHbyF7~9N_S-cwD9<@3yvSJ zre0aUpjr2OyRGczvk$kOh#D2}`hzD+=Z$S%Q?bM+qv5{l9oHXN5gNucR@=_k*rpig znsUDxKDl?db;YWH`k*^!%-d7>RqOlp<0h@&8uEC=Ic|BTujQqL)7}|Vs>eR_iACDigw>&xObY1up-d~*ge)PI;*08gY_?z|fw2(0YyEdetX#c6b-E(6d9ZSAT z8~tikSMs=MVZ&}KW4)C2`^;i;tgw=Dkz3J<3Mk2ODy3n1`*esVjnCsNVtR_+B^w literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg5-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..8367399ea4a69b1a6215970d824cf8fd3e572869 GIT binary patch literal 6124 zcmeI0dsJ0b9>@2Aiy)6;MhO%OXfZy>dpYli+NhX_a4j$@Y7jY3y*%W`z2pON=|WS% ztbC+SGlMBPQ^pvp5>s@NR3cpkWa^~MQY%Ljf|*(QV2O8r`?6`ZX8x+b?^$c#@A>TC zZ~xBOzkBXo>wJ6neSaYsAqr7m)8loQEEMdFokPFupis#FF5J|3jUsbl2t_x*`EOx_ z!ueLvXt;Fb5W^>;j>Cw8lMzGba9@b}72#f-fKc!?P#Z!)G~pgls29Y8LcQQV5`T=u z`$;?#q5GU0sAD!ng`r0tNVcVI8Y8_`k`UAU%%!Va_RiWByJ1sCNRV|Z-i%5pGpBpa z3U#r=Fke97Bcq4oJ8~k?_CIgUc4Vdve7d9Sj&yiTO!I4YLei!aYNO^E|efllu%d5}LJ}~3+FQ=9zG!^AuWjv{E zTh_j_t!wb^hqHHHkY9g$PkUtXx++)6@AIFR?tIo@V||^qaUu2R7EnJZyLrdV^R10% z23CG>_ND)0#a-$^Wv+Y=hQcX!yLDY3i$)Z3AK z$2Qat+UC?Nj*JVu+1;ylbkrypSVUf-Y5@SgQtI-|@7kmTq2A_O`xT@8%kq`G zzlUed>kkD!0v!l+Akcw82Lc@kbRf`yKnDUH2y`IOfj|cW9r$@2@OvUYpKlc`0}lhC zpZF$e@V=Q0Q`2Bzp9A|LILCkio{Ik%_C>%qK|wGuUkAk;LHIku*k8eM?3;{)aX(?~ zuV79h4DY$vXF=Fk!TH!%!S!Uq{{qEv@KyZro1i%EBzzkb*PBOp5ERD?3Ev}(_W|{7 zxE3CzgmErdQ^-vi*TP&uI2;t`<9Bhq9`6(PV=3WC!XFaG`^Nb#gz>&{{zrsyPcfe$ z90Q8;PZN#>#qkcpaiBPU5eD?!HU<>Ozacz!h^f(pCxF79s1#6qzZrz>glB_7Jt~th zR?MWIwmHC1pUNR|+*cgWBb-kdE3W@6D9$e+j1}h>5uOi<;|5{;ymhNI z@Nj=E!qr3ZQCmQ9{Z)idg5vdS2!8{L>(>(g78K``{*Jm%;{N{5M8ke0Vi1S&z?@8) zmoqoXt?DJ}Li7J8U@<3v++AMpY1$( z_Bm3+%$WqyXo?nW9i|kOS=Akw^9k|f3l)A>q#N%@^)&4-p(h#^=8(L z{_t{U{F~nXy^UF+j<$AVK(2`>&z~~IX(-Nvr>KOd;&K{0GiR1KV$g;H-M6x&?d(6+ zHO8!X_E7C3At%Oddmy;x-s~wI#q+Bl8fbm|#TlzR7kOLS=6wFdT&~z2quf61s3^1= mydxgHIoR#{x}cj`=WD9%yISY!Sys6Ja>UEWZOgpy5A|Q!R#o2s literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..04f3c537f290bbb1fab8777cf67f1e4ef2dda7cc GIT binary patch literal 6124 zcmeHLeNLZ%SHf5Zg{`CkVNK*-NV_)S3Q=f?sP-Cr{EWh!#+rDIR@|1__vj?FuJKBRu<+UU&f6$`09xJs{Y zDPE_vU1^Oddi#^?vrA{%k3`j&U43KL{N%Jhv&(X6-ARvS)m|sJd+LSeA&-CQPPy*A z=;0a1i|e+BeVn{uwmGBooqbhDw>EcGv0Z0w9O?-SpT6rKDH{j&O}Z6Q-uafBKJn+L zCa#|I>4k`YJ-V|d^)D+1qTOFxrW`Ka6u$ah^T5jGdnVGcwucWU zjIKPmXXqVWV{}&4MV(hQR?{fWrm%v}N-U+=D9(^YhUXZWmyo9Dv@GZ}ZD@?BvI+-g3Ui$HFI{9s^y0}%7Eg#SP|&R4LGbCWSJenU9U zS1^wxyc-a57KC#ZT#s`V+)pI@79iFkSMln7fLMQ$@H>FG-(te=0b<=w_%PvkAJ9Jl z_rfEOa9j(~6mk-ddtvS(+yaQ}@qcl=9`6(TQA&6a;YSF^`^NQ03CH`!^(P3&o??EQ z@K8Wp-$r;iAlBOnp9qNcuV8@Z0TF;$?q`k=K{!U-KNAqwXAzDO*RLl0SwO67gyYWz^AUgXJigx| zqU(f@_-hcp;l4iMH9*{d6X9n7@%qh#cLL)6m4tr>i0g^J6K)XQ>u(Yo$s-X3ucZ)9 zMlN2I9_f_TTsd3+?+I9Jv_=fcyg{>!BFmzr!W0~)^~tF#(&wXP1w~F>br=p^LwSyZ z;!;#9@~e3KbVE&ft#^HsWY8SMK`bR3Hj&c>n{KcwuNsP?$r8;{j9?QaT{1X`i)aJl zBuY0_ol|v+<{_2Ra5p$2U4?~iFpq zN(?Vi8qZ6-p-7BCOBAcqilGV&Lu-t{NHpX17nwPmtV$H6sGP`gG%N5FELB)uGgvTO z5O^Cy!F5zw6Ga=;u?h{=Q<|Vjf@;{jiM00z(Brv>zo@}eUxH@|4nO}_c3gSlq%F9m zzii{_;`1#9F-^s1gUh~f9&B(Ym8D-;IcXOk

G!lr(pbPMF?(+jZot{`Do>4{n_w zt0i6%EqA%Z3~_R0^wHGh=Ge3^^!96uUOmt@ZBk!#)VZ~tfgRseB?a0)PH1TDo4xtX z2cKUsn3owI_TN*>lGC!!C6?l5u>tX&C!wVAIbDrHWW$+{Wi*w7*t#*FUlKE*yI+GI@D&1+e qy6i@+d(^{y_c}b^F7AkF@f@n`$-bR>bFIDp+Sn}zTp4coh58wJz+9gI literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg6-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..84988a1ed3f13b21b6d075e51a0b3c25c9e3b95e GIT binary patch literal 6124 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..d4b95305f61c14657aa733786add8755687efd5e GIT binary patch literal 6123 zcmeI0ZBSI#8OP7Eyy_CbfK~^=XzyEFR??7e>8j*t!6d}gW7TUa2cv*|4Q|Aq~P{P4p1eZ4li7LHJK6P(Y6 z83yOCfJVbxJ4P9f$aV~7B%Fkfp2K}1TMXp^l7NuC7c>~5Ack^3DAWrQK%t)fYZ{+R zYox1tK6oF!vA8H?`d{4R zk(|h#+?Kat#S= zerm1iywqHIZ(Z}vZ{+Unp=G|r7iMid^{ROxWskco?{H02Bc3~_A@*Keu}5Rm4pv@m z+MaX?^H>rE1DhtJ=?u?vx+TeiB5}HiW!bm`7#wst$7#oIQ7&>E`COkOsC@ww{(sg|0@rJ*1c4vvT@QVg` z)_nd@;1F;i;6T8EfCB*s0uBTm2sjXMAmBj2fq(-62mUt){5_G8k&#Nc40;#{eXnnl z0sl9rz|tI;q|ZV6Atc9u2|X4680(8b-vkB0B-{r|cs%86lu3Vu#7W;I0%jCt(qAE* zO!+z}^jQ$;tB`!sS0VKj$~Qns9QrE$_-#-Uf0FVYP*QIZE!GT8^z4<@z9 z^iU?b(3(PC%A^+I63XL1Nj~{6POc~WBz{y-c2I7kO!iIkJ1CQVll&u;iKm3$qZ|iH z@=s8n1WMu`QT`DqiC=&To(E3`CGpFY<44&ROF0D;_GFt1O71s{aysRCpis{?pE6Ox z)X(5-V5o1)p>g6XiRV&YMwuw7zZ{h0|B^CMlE0F29w><$l*#8pc+6k2PVTpq#z{Mb z@R+|A<>yA@4{ik|^(!gA4@&Z@C|?F8^=m0#0VVm=-v|3>-0$zBXsjQJSa{_^b252R z&VppGh6}X<^S>A1Vyk=dJx#JWf!8%nQ86sRux-f7Ubf&dv}ARu*TiniZ5qhqUR_p! zDimpjM4oQQ+1TX2{wOCKEF<%}&Zw-S3(yB*vA`I-XkkHN6+x6u39F_haw5a=CWi%s z6;w+W7>gAJK_S&(B$pHy`;h;D5PYvk{<9kh!iO`C%o1;r$E~M4T3qBUF-uELBg^eE z7ivXjX)2;IvNG3Q0K11Z-o>~CXwC{Q$;J4Um0YZgN8jIcGAna}s7Qj!`R~O4cH}Mn zgJ}3zgLmwnT*MfJu-9FT3f8;5NcHE2m-(!81&OMxijv6+9IuPKW?%&yI+jI+l`H|P zs%l|Vly#Xg85MeMsvzs8%o?I0Sh``b(r7KqVp$zLQWQxM6an+9p=!LQvb>>4vVvuf zS42**c#)G?%z%olEQyvNU|42kQpNuRI5IL!zNpbjTi{uO5oE7>`ROM*ndq*eUpMy5 z=)(tNFTBMCCrJsOw6f}V-RlcGPfweg{^OqVgI~4(p|t1uj90sdN6Nz@wk$jLNXxFe zrBefex#QceH> literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..88bf9f8474736cd684e4b320dbb041f18fbb7441 GIT binary patch literal 6124 zcmeI0c~n&Q6~}+WjAaocxD*8%!5HJl_}6Im5hK)U=*XGn3$*) zIjPX3R%@w%ON>zuNsUBBqnHI1YC?i_!;K@0V$!O$YNq!NKYDVSzuLd&o%4I&_xauX zyYqhE_h!zSdvn*Vb5=qu#NsjXJnqa4F^-LMkpJ(nkRJcNuz2?k3!MuhB&-6i$H54M z>r&7#_~_6shBL7ohtUfze$jOe_eCt>ly71JA=Vq9HbMdz${nCkFMtDude%-Ff1bu~ z(|95wk4;%?Icg)8ATsiov9{601I3-0(f#+&Y;GypHnA*XZE-@60JAPi>lK}CJnJ!X zl?8U)SVTgC!@A=`@Av$1tn0%q*N0b*?Em$hvgDEVBabl!;T@R~qsA2N_*msM;W5PIWmujh8@Q76yO8c@0>>d2y7t4mij z)!gpin40WOe$Y0feDCp{Vqipi^!AIj?>0=HWwo30dP+qF%Lf-7toVK4qK2bZA@;`X zIU)9{v1fkez2L42Tv*g@dwb=~Gy5ucycwE(HtkYvWPJHE{Z>!=WRw2FKOWvLZ|`6e zTk22e%kTc7QEuc*Qo?if`|q3!57}1po#%I!sLijBd2x5y16dw-sI7C(fvn={`PG|; zS*%Ngo!(F7+K8(kByh3M*vv+fZ^_x?jDUYu_(DYvDhMeH9 znsZN@CuGyftE!}{s;1}~D=3^`u)3sboT@9F?%+95Fcp<2ykW31$7!OJHHmOx?*ChN{Yn#5*-j<0Xg8IT)Q|Rhcn(4PG306;s#UefU|@v5V!)s(QY) zqiybCc-K6>kpJX&!0&+H0lx!&2mB8B9q>Egcfjv}-vPe^eh2 zDCVD}907{)2Fe3KF@7Efcy1dAit%fdBfHqrkMb~3*pp=lDBf=ZY>B4t!$ z>ZffIFx0ms(Kz~w@l?ublu@z%uR$??4rNr#pGSEvD8_Zl_*{^?{l$5_-#i*OD0lm7 zQZDF<_bma%`h}EFfa3a9l&^te{ohc&4vP8I-@dIh?(;XEboV0(OB^H>nv*dvCryoU zD_W+KVf=go7MpdE?TTPJIH#&8lHAq4A(o{HlhUS6B-0nKvSzvWp<3(s4X`0TNjDS5RXfSa)YiOFJISm#jL_u>%ESyY5lO<7> zRlzhR9jn0+lbe&{A-)qK@V)l_XEzXphZBM$*PWf^QisLoWV>^XygWlsaAg_Olx!n! zIH56|dES))yN5Zaow0LqEaB{eo$)Cv*jc-i{B+YXtmxo)Nf4c^?@oLlhac%XP=mS~ zyxsR?M`H-l+^!swvBc#jvM)Dip~sAqh@f&Dqv?j=P(+5+RE9St!{9`R$O|m*U>Kg4 z7%oC>%m8K%NJ6@!t~u3C&!m7ujIs}7kJ9D>tyu)1#OGGws4#`6j^^f(Td zn}%qJtY(O+VJIv-21bPkB48EY51`lk2*0RdgVw>j1V?~%{f6Yp$C$9s?=Ab&m8V;^ z{i)|iIBbK2=&TV7*X(gE$vk#u=#aR*hX=d|VACy#Qb;hrm6rTUb zwmw_hw>IBBbZW+W%hl~qM%sljPoyP2cYWH^n`-Ra$?_McrMceU7W>dqm@{hQ&>0=i^n%;Wky0mf1pbYorUYQxI*N$2poG%xahgjd|BVDhastkzvZDz-% zoSRL5d$9N8H%3pM`C4UJQ^gr|UW515z*)O@)yJndeaQ@CBG(t+lUncZbS3Pr92~gf uyNRdkib_wHeSWy+!HUhho@u!~e#Z9~ma*%{*0=M^EQJF;UG9NjsDA?u0Af@C literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg7-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..e6c9df4e47f7945bc4df0721af4d486e29f51b55 GIT binary patch literal 6124 zcmeI0dsGzH9mns&LY9|e1PK-b)JG6ynfIe&rAOUB6b*`r53J74+`%m%8(0hlIn_X{ zv4NOkYEOOD6KWBI(La<}QNc%J)uYDL)I`$=N(v~V#gIk=^mms_PEPw*`}fY-JKy=- z-*0|1_q(%u&is1z-@oCHkOf&hxY*;)%axPaWFGy0n*{~@=ZQ6qofbN0Lnyosj(-f} zDLCE=8V;8Z9cI`g%NZD9a1c0r4EKdBV<`8K1cdxML9Gb+F_iCtLOnkL6zci+()er| ze?a5u2#uQehNabtEH*TCT!J;FCR*N?7Zcg^@~tmx_s;o!)EhO906+7>4{%sa0Z#Ma zB5jS`z-v)(Q20pv_?ICAV-rK)du?*|_OoMNxZdwzcWloLxSYyv-#c*mN$0_RnH!a> z3#;yzPt9t$cIIS%Sliy(a{J(4TVfkF$Zzec?B3JmU;pZfsTJ%;M$x~QM$ILxutM*s5oiG-M<@i*Zt$o4{b%oZ_dfBvaRp@qHl1| z%4Kc4f8H__QhjE8@X=@LKUp$<>EB}N!pA*du{d>iucwFKSbxRn4_ke4 zM~%CGNoq{PvTGGj_r15vabamxcTUbG@#*?MRc0JK^={ic=T17NB@JAu3=4{yzjF*8 zyWq&^9m~hXoG))GD@kjvWIs|Z(+=NW@YU9KoN{B*@#vjt$7js^WJ~Q@et&@9=MQ<~ z{ETtMAKO-i+}irHrt^;*553bCP;ZTVoZUT;ddqWs=K*_&U)-^8F1_{(|H#HoqaRtH z3!ICBnu3cYRu@#x=`3Cp3KfA{D zS;0Jb);!*jZ|8Hs=YY=vp94Mzd=B^=@Hyafz~_L^0iOdt2mUt)ygiYjp`rC~8uTy_ z`d;581>QFkU}`1|(&r%k5RzlSfS!tX8|jNc-vs%=AlwB?ID~RHWzt_Eand&lf-#yh z>8}uur+gn2`Yed_RY*SRtB`sM<%ggo4t*7GydRXr;r-al{{kiT7E&GnCGnq99;8gx z0rjn<78&`JNiMXekef28MYxD^Feu3<@8aZqvQFYhDdkYgM=6tall*4NWZfjcg);G! z@L9@{pd|kym#*e)9P`a27a^dk|Ac$5vz z$@qmYX2!cUJx|NU|2+XGL+9=VO)@!wcWRoV>M#YHrQDIRBy$d0yr$TVb(iVF2FiD> zDJeyzinLN9PdDUjsPmpbS#=sZ!>Wpj6)a&!5*e(T9F}-S6`Vk1YI*^=oyh}u*DY@7J86(hYDwOBQvvIxv+Yem+XvJS;@}YdG!57$Fnjgh>E0elJ`!$mm`<- zZbWS(4c?J^vJ+zv(%r5?lw0Ok&!h`lub=EIYyQ+XNn5OEW@k3 z#PWv3sl28+q4~z?PM$LbCoejkoKuuFa!1}jz@ec5@K=UXN{9$@{>w7z3(c^JAHNX#N;2gzuJ`7v}e&PC%0Yb7#uoQSv6;x zGvV&)+l$YoeA-)e`%wC+JL_)ZtW)zV`+vDP2TMx@_r}@1yP`bRu}^|iYfBbx>#4A@ zQ`!$KTG6s-Ma0b$hd*s#SAF}z?9*pA=2}Ch)Zfg=?c3H7(X!w#K~poY2~}}{52`19 zTvhj*q=43`&8<7OUTxifBq{cTnCEJ{PKRD<)_U$SZ+9?l_NUz0TH0a9gs{e=*=S-> z^}w;l*yZJMM_zh>yOIt>L~PGq78?4vwr(Zgp?mYvA^T~^+{ wbFE*Lyxqr5_yga0=>6WoxIcE+sNcS|c-{1s^YqJoWnsI!UoPC`fq$rf18^Bw&;S4c literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-1.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-1.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..4945cfaf449624aabb5847df04ed1cc6b0ce1219 GIT binary patch literal 6124 zcmeI0eN<^IB@oeI(?r5$Si}UI;l96Y3KfDcNa0IoQ3JbkU)(_krh!RG(o#ar zAWM$8l!lwOVQH?)rU#azyrhY4tgWsmEsC{7gpsy@&9~X#Gd}F;Y=70?^UQhf_kNz= z@BZdK-?=mA%&-4F&&5E5OvqHC7ne9!ESD^_g+{+@m{9QlUs$!T$3)gb5sKIi=P58l z;Jg|%0^U0OF2fO-+F*`>lY8!-!+jxBB;kIXfKXr$Xb?gH6yZKls29M2LcPH2BtDbG z2S|K2LSyG`G93>>rcgBP{{O=B{_q?YFM}N*MAH+9krdG6lEN|^26bf9plr>!j!uXnG0v%%B3KX%~T2mYo1De1-I(SwuAT3@TLEq$`0 z+2Lkr$E4x*^QB%rKJ=5|!Oh7Xi}&Qd8*Iv~N^hJt;IXcX>Wm8rYjDkYXH55wj>6Hs zf%`xA)TbsTKGA(=u;1e7e)amPC&I=xC-iQM-oiJ3@FhLz=B$_EH!j+K*|jnMqpz2i z-bk;mSF^6qlQITkU#g29m7~R(CclbgP`>5V_v8HLTqX4G+B=g>*Vo*SR69ou0E z*;e-2lCR2-O3UmCmFI>sKK{L$cz@BM6mx2A*S#{0(k#|UFjF}D*Q z4~p|o6P^Hy!o3cq9`-2{EhcfD z@QA+#;pgwh?}NUGul@^!KLW+qmlM7WitE2j_-oK0VB+t6S4rIGZyFluMEWt3X&X|*vm5!b)EOzRu-LUH#DzF#2 zSD{ssuuQ;DH{`sy+jo7h!3h*Ai>gheDMryK8*7s}Mo?{%z(|TsW))qa1(}ywRiQLa zP#K#pGqfP+49^(?_5=^JtEi|1`3?xd_uBiv-9QjNoG?6HPDg>=HZ`rt;dJT6#k!VZ zFVG)X9C~pgA~C!&)4m*b4{NNIvU1Rz<*b60@+mD?X)B9*%H7)hoA@KNGcK z{*kvU-`<$J;mW3pw4E7Z+p~+`tf+Z(!}|DZ-%p7he1FOprCP%0-BoG9c_(vr?Hx*4 zS3a4}yjifgCV{=~_)C8H_UXylY_lRCf6BRc=S1w!J#LkWr}4p0$SqD;IdayD(vh37`8)$ofxb{O!3l`L**`#C_b- t<<2{h^kBWKr@X7{cB=K<4%e;N_b#sy-kQAgiaWX)HJYz9l)x|4e*xXeU7-K~ literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..5f7d3b7823f152d0c6024c1dbc5e21ed1c6cb21e GIT binary patch literal 6124 zcmeI0dr(x@9mmfu7-7Y@m{LT*z?7hfz`hkc37P)KU#K#`?e*oDK~!VGP!$Vgwb$=?ssFvi+Uq(8;uawSVuOIs3hz z^ZT9Oz2|%H?#%uMJ{2UJY#5vp-G6fSJzzGQX^?~{$WTpr|0EK#H4ixJ7JtXmE zBtAsq83;X{`IhO={>T)7;(r?LpHvejHWx;OoPOo+-`BpEb~yB{n)E4Vqa$3M9#O2n z;MSc=Nus82L6$)4WL$b_nkVyk!=n!Ot~fn8CN=L^{D-@X@821&Uu~;j=_;!$`+il} zmm_(rZXNaC|GVQ?QvHtfy%HYw*DcoHHM^(LQjo&^0wN1gpb5kSlUW*7g z+IK#raMo`RMZPfBZh6OYJ@C|x&%VeyQBj?}ZPYBd!veAn9jke#fBTUI@$(k%^@LP4 zMCMmsjqAD2gtxW-vV7-8=g%uvn=K;+vCC&&8>(BeGULP_=-BbhnV-eWZ7D-%|8cN( z&gWgzsvKK3oP2w4_TS3ywsx$Iy%hP}j5%i;FYGQf@5*0OV7XDf_Gni4hH>;=XYN?Z zO|y9XNz5g8p|m5o{gTyQRywpPw{6L$8OzVDZ7XQtgR;JBj0-f_oX&zjzP7XXbkpyX zn)1GwHuFe^eqgqd+Wp*PyYtkzD`sEit@?NWax=L3)AiXYi=*ONi}N1|uUB!4&10Qs zyARu=jheo%?#(Nj8Zw%a_As{MfwRz+v1C>Ev(rmxzUA@$lGL@y=RWw^0qYy@dlp;` zh)Yks#nGIia-vPAc!p&pMq_O{C-bbTDzYvyA}_I$NNY4Q1Vv*hM&M{c6IF)iRaO)v zn&AbO7HQTdtGvQ7kSj{Gq6#u=V|5$L^Q>%RIGBMK2VTXTz@(tji!V3iZ5^oeblqP# z2i`TeH{|>9IpA}^=YY=vp94Mzd=B^=@Hyafz~_L^0iOf^n*-jSh{xlpfMw9bKd7yvJl;1o|e(3K0S{a=9M{8tHM#rYcv=Yrz6Mi@UA%#;4&d3?Vv64wb& z`fCv0F%f^J78KX7Alwd$*H;nl1;zFE5WWM7^NGLD^pm*P-=%1>ABkwhpd4sUMrE(b zigGAwp^~rv_XI39I%eNj1cTvNo1#eaMEeGrwx_RHmz9QIDsee<)o$2z4Hel-HkY9? zNyroM+YLFDjo$U0x~v(Zq$>)eXa-FQicR4;MbQPF(QLAf=5?CoB!y9JB4y~%Euv&q zWCe<+IZmcz5m$pF%2`_KM&1vE;Ct=)_ii8v566Os(@|Vxx6NBxTI_J@E|;#Q+l%xU zm15l$he!<1EVJjs?qQBiq!PIV8gYq2BIQ+DNTd^4^y5uO(IUg~k|46Q_fEW*!-yp#8oh>bx=b=XT${_A!JlD)YBo83l&gcw?&I8EePN@7`=(j`vQSY4+zl~QER zkQrU1L=`;ZI0|eqG)jR1KB~}YQ~8Of5Fi?Yz#0mr=-?eMaSUrn26XBKUX>LC8g-&1 zsD{ehXi*ns!A6NPT#XSm&BjT*s^B~F{s4MBPw*Gj`fN44OK_O|e*K$Ut1eR3DXN zRN2n02WzvF%er1}N~ynH_WZVn3w7Uod}v_q$p>?L?x33aK_7fw(0GKew^S_q=)?~# zt!m-J3twB#Ey%rG_ol6OWp(8e&(X+&){hpwy+cX5c=&t)CEdJz?C$&Tg|!~o6Y)4V sR8C^ElYjN}595QLP0fS*Z+q5V9yv7@GyMF=T|-kc7wrsi!!Ojo0Gu{hE&u=k literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg8-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..5fe2ac7a48c7f27fcde8d1635040987e1929b830 GIT binary patch literal 6125 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-2.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-2.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..bf3b7246f93b024410b9d10be3ce2646b7022070 GIT binary patch literal 6124 zcmeI0dr(x@9mmhI3l)5TMvM?`kZOFf%Y8qRlEw!FH7HdOV>Ej9?!9CMVPRJu8Vv?a zgSG3ZWqeFch!~^Nv?eB@Vr@)N&_Uv()i4qTMIvYfY<*xRK!0aFWHRkv?caN6&VKLb z{C@X$@A=)cJG0+Am7PsygiOff(cKuJ5Z<>Ab>(Wa~F-z zr15SVPef?gOQohSEXXtnO&vAP66=kS4`hr9uS#qAcH6%A@+V8Z34sAd{Zrb|F)Q^K zJbEt9vN`lT6cQXZ5Ffi~@DCw}*Z=c$uQxetMO{4^^v1Uh7X_CoQs%C}o1e*VdQdqwpAoRr>$6&399 ztl~!-+^Hj%3UTKjmN(7hU&yxgIcKiFysR|vUti{|4z@He#KZqE@$W0nro|~8(@eXT zbMDRJnInszyK<%Vxm^qDCv}N&K=C6JKrrDgG?`~QXspK@uX}e;27ZpuftZkg#Jc={bRJ63e z)^^u&ET(j4YQt0CT6fxdY{y+W5hn#4e>q`mP*8XG(cS57V>=m^FaPS!p5iq(|0vo| zw6%0ilVqJ!1xb+^krM^XNru4d0#;ehp>U$caRMW#sv;m&69q#v6dnt9Nz*ut8C7Fc z6{`}qYmA|Zx@cg7(-cW!4MpK~Q4?6qvWkdhnUP`Rz*bCIP}Y#8+zt{hyGHzC>dqb( z_L|2R@_+a{;O~IH1O5*9JK*ntzXSdb_&eb5fWHI&4){CpzjeUpiS+mP7r|xVVIcGq z-y|0PZ;pehU%?oKiN8v@k1|;Y)VGjY zWMon%xnNBp7iCh5a4zK#P?Asni<9fgI!QkYC=a20gfdw-$^R>5vTl-poHFSt;ggiZ zK}r4@%1?rl_&Lg>K}q}@7|?S|1SpB$pd9&_O(Q8!0);i1#)FdQO`vS0{30mSGbK_c zN|^T3G7A{$o04gq^p(U@C@-Q+l+=G2l;kg=OqAp=r@R!D#2u8$dm%i~Uouag*G=O( z<$?Yhl-E9vKd}vz)Gwl33rempp?m|B)Za+C4V2{5{yxz`YN5%67L|@;E2l2&h{YR2SV_@?*DN$5QLW#LPoA@Wv0_UX-4)+SFY}M>y89x zral+1)ZLR2jggs|&U9Ek%<(qHCRkY{*d!a{Q&zIEHXi+S(NV0-38Es&Jor?;18zlb z`Q!PZ0fTqonQWvn2x%^7HcDUZbRpH3J7|^1uqsGqHAZ1ohQoH1#SR^d3d?F(0~Zc6 zyeR34s2Z}J(>MuSGXZO?Br&psS9D&m+cmOl;Jr&K>);JR#+bvrs&Nc2JHWexH)W^_ zCm2xNZitK|>ITc|b}UGmL&BWF@CJurMWl%D2e7}tmwZvfp8hTDB{%}izuWrjIWe>NYNLKUZ%!{L$bxZbKv)Ax%ZWx);x%cp+`rMF~4{nr{?OPG~WvIEQ zcB^yx{5fTBwuE0@K6iFUOX@3S!I(yt!M%iD1(cZX}cSvkm*FRs|~)}h8~8YfQs|&1)G<}HH!`V zKTWyO(p7z`aOai_5%(Iu&hOv6U{&3izPc%Y+a0^_qnm}t-kN9LaPpD|exd#i6aHum literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-3.src.rpm b/cli/service/source/yum/yum_repo/testdata/repo/SRPMS/testpkg9-1-3.src.rpm new file mode 100644 index 0000000000000000000000000000000000000000..0d088ed8b5e277344d01abcc985271cc4acf2065 GIT binary patch literal 6125 zcmeHLZB!K38NLgPd`SZu#1EpNXlamjW_ISz%!$<)bWx)QF*Jav%qMPHU}cv`i64Y| zlBkFTwSL6JXi1cshPEe`*jOu;7;=)f#&}8%e&q;)A_TOerwwl3yIgv5+F$MOz3061 z%yZxOzH{%hvwO}yy~q37gAuYIi`VdY-Gv2mDw}FY|KG5nkpEm*^UH1voeM)Kx*qQ5 zK!n2mZop`G^ypy@S7d2{h=Q9@!}qW+WQn1?mlPlr+zn_&D2So_4j}Xk;sK#w@HaF+ zpXU2%ej!5NTe8*CY(SI;&=a*iaZB+w{Wqo4ej!@OIqR8b?Tw`Pn2RD!#~g z+G~_5#Wvk|5k-VYkL2&a8u`!AF2;K;!!dJ)XZuf6u6~-ae(3JJ){gg3%8sdT#Ol^3 zvo?GZ6B63<=}>z^^LBI~G5x97nprc~C$ICiggHCX_Z^L$K4{c-S44=1dis|QZrk!< z{n=O2L;rrUCic-mM{)BJqwGgVoHMTXyk73xKQ#X7>s@Cr{5-KW^LSajJ|pgpp`5S< z>2neX8h?Dh>)FA^KQQ~A46mxref*~RyXxLi84XjXt(I}jR`Gt1t7vmk*P(fRwRcih zVD|-=zHU`i)R=E`GxJaD#j#BplYiUY6PG7=8XGqqs_m;?S||VJ_>6nEXS$~xz5mRy zvfhezciowg$lH;YojG?pUvNHjWz{}ttIONVM+_XB`{9(mj)Ns>uWatXvrnDcGbHm|K`SL*DUy7S-t#f!&2-#_Tgt^Mlb zrowZbk|eQ)u1K0FX`E!T*i;40GzE=Q3`G!C%`S+t$zvo+vLWe=s$yLd1k7+E#-_l^ z8pG)lD{zu1ay%o$3e5AGT{a9wVKk1zl5DEHX2OdDuVU8FI~jkfpXSOe`u5oR`kdG6 z;a&6kQ-MoBfq()51p*2L6bL8~P#~Z{K!Jb)0R;jI1Qht+6!3c@KA*1=mVt+X(06>3 zS@3@|5vJxs5TAqiA*4o!08hm~Mtl+QO;8X7;kN(@kEHxI<-}hhdE%RdLp(+~@mB~> zpu7*z3PF4oQcrvp(odp%0FdOtSMlcu0ZD!d*xADL+X$IX9_4ML9V)sXs$G(UkCyDUSst z^`BE72T1bgDIX6=@|Ph%bL#{^lJB5=;xM;7PI)pQoXL^|NcQWXJeBfvKz0+*_0C`{c`|GeIDfmNqs)$s{lz}r<{B)gpcS;=E;6NG;dHo zqOVE$#^L-vT{@| z;We1N-B9y#y?=eGpAPFB%1c_32k;|zjrc>fu}mp4 zJU>7*M`q?b3*huHXSXpnK9xnh4ciz$ve?Gj?C86PPGG^)5+p2f*uNA131?!l%izX`yio&z7mSuH2m~Aq{ivq*&j9u03 zG6Twk5yxqwZVEidtEMW6q>KLt(B~T>U)1O++u>b;5fr?mZuxU(ndnb`a{9S1ltJmQ z4UEvz68c)w+vb=Xg>6r)Ol!hLaa#4YE5EiZZ)yFev*PzYUtitN&hhWY^sc>;)ndD~ z?#LIf9bI1WR$0!$3tyhO(tNnA;>|UWz2~_4QvUR-wKc0kR-ey4{ENXkRo3ZTdxP!z zN!zpL)ppmV@eA*MkZ@o?_$=mTm3Cs!vVz9#;gyFDcRJR#@mto6>OV2>%9antalwC% zKRG>QaYL18==fJ56Lx-o=L+fG*{=>Tv03}Ll_=YrbS5_@m4AO>$pen->b@! o7w<{ixoPtQpOm$}_0i^;yFR+Kp|1R`w!()&ljNRkFZ@LP3lN1}!~g&Q literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo/repodata/12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053-primary.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..0f7d106cd1bd1d69a7178516678942b598a481a9 GIT binary patch literal 4550 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 literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 b/cli/service/source/yum/yum_repo/testdata/repo/repodata/a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52-filelists.sqlite.bz2 new file mode 100644 index 0000000000000000000000000000000000000000..7e9de65baaec1a05398c4788f5ae67635daafdd0 GIT binary patch literal 5554 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 M7pPaU^6mcr00FUH&;S4c literal 0 HcmV?d00001 diff --git a/cli/service/source/yum/yum_repo/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz b/cli/service/source/yum/yum_repo/testdata/repo/repodata/f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd-filelists.xml.gz new file mode 100644 index 0000000000000000000000000000000000000000..60be9c09edec179da54a9408db634e20acf079b4 GIT binary patch literal 3000 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 + + 1724586932 + + 12fd2c7242e8f946c5a99b40acc94e297144685022f23f08f5d4932a37387053 + 19eaf72d65b6569c7a48db679fe3ad4f1b192feeacffd621aa680ab3eddf7908 + + 1724586932 + 4550 + 59442 + + + f47c809e5e0589800a672ee64fd4f4fd7bc71152596bcf8ebcd6a582d40ca9dd + be118981c8d338cd0d9c438a4d02d738176e9425658a5de27953eab1c2e271ac + + 1724586932 + 3000 + 11865 + + + 3af4f502859773f9b5b5a3b8033f8561f01b270414cabb3b46612703c85d731f + e6cec808ab4fbf19593584f6e6ba864c97444b19a04aea84d8db23bf15bcce53 + + 1724586932 + 2848 + 9818 + + + 3228a79e4328e912dc272ea29a6e627187e4d1ecdb41c39f17e67b0a4f1ea1a5 + 32c96f8cd06748ed11291b6af3b760355b5968cb3b4569f14c5830fa3c1b3e1e + + 1724586932 + 9036 + 131072 + 10 + + + a362c47ae86d8ee5f6e623fcb09e309d5b701316fe356e7642fa24ca47610c52 + 480736c13a3be24e6f9794f88c027bf15439d6b1dc8561c60ceac2c2e63a6cb8 + + 1724586932 + 5554 + 45056 + 10 + + + 27c7a0b93802b0173730c713cf74c0ac80e402880e3a87f12c5dc3efcfa0ec32 + a627da6d535abd2d69d8795e22350f6daf7fa03c5320f7137fa23f9fd2ed58e2 + + 1724586932 + 4351 + 40960 + 10 + + diff --git a/cli/yum/yum.go b/cli/service/source/yum/yum_repo/yum.go similarity index 97% rename from cli/yum/yum.go rename to cli/service/source/yum/yum_repo/yum.go index 74db4e8..abb8fd1 100644 --- a/cli/yum/yum.go +++ b/cli/service/source/yum/yum_repo/yum.go @@ -19,7 +19,7 @@ import ( "github.com/pkg/errors" log "github.com/sirupsen/logrus" - "github.com/teran/archived/cli/yum/models" + "github.com/teran/archived/cli/service/source/yum/yum_repo/models" ) var ( @@ -48,7 +48,7 @@ type yumRepo struct { metadata map[string][]byte } -func New(url string) *yumRepo { +func New(url string) YumRepo { return &yumRepo{ url: strings.TrimSuffix(url, "/"), metadata: make(map[string][]byte), diff --git a/cli/yum/yum_test.go b/cli/service/source/yum/yum_repo/yum_test.go similarity index 99% rename from cli/yum/yum_test.go rename to cli/service/source/yum/yum_repo/yum_test.go index c074848..9fb0703 100644 --- a/cli/yum/yum_test.go +++ b/cli/service/source/yum/yum_repo/yum_test.go @@ -12,7 +12,8 @@ import ( "github.com/labstack/echo/v4/middleware" log "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" - "github.com/teran/archived/cli/yum/models" + + "github.com/teran/archived/cli/service/source/yum/yum_repo/models" ) func init() { diff --git a/cli/service/source/yum/yum_test.go b/cli/service/source/yum/yum_test.go new file mode 100644 index 0000000..7196c48 --- /dev/null +++ b/cli/service/source/yum/yum_test.go @@ -0,0 +1,123 @@ +package yum + +import ( + "context" + "net/http/httptest" + "testing" + + echo "github.com/labstack/echo/v4" + "github.com/labstack/echo/v4/middleware" + "github.com/stretchr/testify/suite" + "github.com/teran/archived/cli/service/source" + ptr "github.com/teran/go-ptr" +) + +func (s *yumTestSuite) TestRepo() { + result := []source.Object{} + + repo := New(s.srv.URL+"/repo/", nil, nil) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + result = append(result, obj) + return nil + }) + s.Require().NoError(err) + s.Require().Len(result, 67) +} + +func (s *yumTestSuite) TestRepoWithGPGKey() { + result := []source.Object{} + + repo := New(s.srv.URL+"/repo-signed/", ptr.String(s.srv.URL+"/gpg/somekey.gpg"), nil) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + result = append(result, obj) + return nil + }) + s.Require().NoError(err) + s.Require().Len(result, 9) +} + +func (s *yumTestSuite) TestRepoWithGPGKeyAndChecksum() { + result := []source.Object{} + + repo := New( + s.srv.URL+"/repo-signed/", + ptr.String(s.srv.URL+"/gpg/somekey.gpg"), + ptr.String("aa392a2005c38f10ce21034d6d1aaace5bbee1c3d98ac1ee06a42336d741473e"), + ) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + result = append(result, obj) + return nil + }) + s.Require().NoError(err) + s.Require().Len(result, 9) +} + +func (s *yumTestSuite) TestRepoWithGPGKeyAndInvalidChecksum() { + result := []source.Object{} + + repo := New( + s.srv.URL+"/repo-signed/", + ptr.String(s.srv.URL+"/gpg/somekey.gpg"), + ptr.String("invalid"), + ) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + result = append(result, obj) + return nil + }) + s.Require().Error(err) + s.Require().Equal( + "GPG Key checksum mismatch", + err.Error(), + ) +} + +func (s *yumTestSuite) TestRepoSHA1() { + result := []source.Object{} + + repo := New(s.srv.URL+"/repo/", nil, nil) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + result = append(result, obj) + return nil + }) + s.Require().NoError(err) + s.Require().Len(result, 67) +} + +func (s *yumTestSuite) TestRepoWithGPGKeyMissedSignature() { + repo := New(s.srv.URL+"/repo/", ptr.String(s.srv.URL+"/gpg/somekey.gpg"), nil) + err := repo.Process(s.ctx, func(ctx context.Context, obj source.Object) error { + return nil + }) + s.Require().Error(err) + s.Require().Equal( + "error verifying package signature: SRPMS/testpkg1-1-1.src.rpm: keyid 93a645a017898e46 not found", + err.Error(), + ) +} + +// Definitions ... +type yumTestSuite struct { + suite.Suite + + ctx context.Context + srv *httptest.Server +} + +func (s *yumTestSuite) SetupTest() { + s.ctx = context.Background() + + e := echo.New() + e.Use(middleware.Logger()) + e.Use(middleware.Recover()) + e.Static("/", "testdata/") + + s.srv = httptest.NewServer(e) +} + +func (s *yumTestSuite) TearDownTest() { + s.srv.Close() +} + +func TestYumTestSuite(t *testing.T) { + suite.Run(t, &yumTestSuite{}) +} diff --git a/cmd/cli/main.go b/cmd/cli/main.go index ec93466..d2379ba 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -17,8 +17,11 @@ import ( "github.com/teran/archived/cli/router" "github.com/teran/archived/cli/service" + "github.com/teran/archived/cli/service/source" + localSource "github.com/teran/archived/cli/service/source/local" + yumSource "github.com/teran/archived/cli/service/source/yum" + "github.com/teran/archived/cli/service/source/yum/yum_repo/mirrorlist" "github.com/teran/archived/cli/service/stat_cache/local" - "github.com/teran/archived/cli/yum/mirrorlist" v1proto "github.com/teran/archived/manager/presenter/grpc/proto/v1" ) @@ -127,11 +130,6 @@ var ( objectListContainer = objectList.Arg("container", "name of the container to list objects from").Required().String() objectListVersion = objectList.Arg("version", "version to list objects from").Required().String() - objectCreate = object.Command("create", "create object(s) from location") - objectCreateContainer = objectCreate.Arg("container", "name of the container to publish object from").Required().String() - objectCreateVersion = objectCreate.Arg("version", "version to publish object from").Required().String() - objectCreatePath = objectCreate.Arg("path", "local path of the object to create").Required().String() - objectURL = object.Command("url", "get URL for the object") objectURLContainer = objectURL.Arg("container", "name of the container to publish object from").Required().String() objectURLVersion = objectURL.Arg("version", "version to publish object from").Required().String() @@ -210,20 +208,26 @@ func main() { panic(err) } - yumRepository := *versionCreateFromYumRepo - if versionCreateFromYumMirrorlist != nil && *versionCreateFromYumMirrorlist != "" { + cliSvc := service.New(cli, cacheRepo) + + r := router.New(ctx) + + var src source.Source + switch { + case *versionCreateFromDir != "": + src = localSource.New(*versionCreateFromDir, cacheRepo) + case *versionCreateFromYumRepo != "": + src = yumSource.New(*versionCreateFromYumRepo, versionCreateFromYumRepoGPGKey, versionCreateFromYumRepoGPGKeyChecksum) + case *versionCreateFromYumMirrorlist != "": ml, err := mirrorlist.New(ctx, *versionCreateFromYumMirrorlist) if err != nil { panic(err) } - yumRepository = ml.URL(mirrorlist.SelectModeRandom) + yumRepository := ml.URL(mirrorlist.SelectModeRandom) + src = yumSource.New(yumRepository, versionCreateFromYumRepoGPGKey, versionCreateFromYumRepoGPGKeyChecksum) } - cliSvc := service.New(cli, cacheRepo) - - r := router.New(ctx) - r.Register(namespaceCreate.FullCommand(), cliSvc.CreateNamespace(*namespaceCreateName)) r.Register(namespaceRename.FullCommand(), cliSvc.RenameNamespace(*namespaceRenameOldName, *namespaceRenameNewName)) r.Register(namespaceList.FullCommand(), cliSvc.ListNamespaces()) @@ -237,13 +241,11 @@ func main() { r.Register(versionList.FullCommand(), cliSvc.ListVersions(*namespaceName, *versionListContainer)) r.Register(versionCreate.FullCommand(), cliSvc.CreateVersion( - *namespaceName, *versionCreateContainer, *versionCreatePublish, versionCreateFromDir, - &yumRepository, versionCreateFromYumRepoGPGKey, versionCreateFromYumRepoGPGKeyChecksum, + *namespaceName, *versionCreateContainer, *versionCreatePublish, src, )) r.Register(versionDelete.FullCommand(), cliSvc.DeleteVersion(*namespaceName, *versionDeleteContainer, *versionDeleteVersion)) r.Register(versionPublish.FullCommand(), cliSvc.PublishVersion(*namespaceName, *versionPublishContainer, *versionPublishVersion)) - r.Register(objectCreate.FullCommand(), cliSvc.CreateObject(*namespaceName, *objectCreateContainer, *objectCreateVersion, *objectCreatePath)) r.Register(objectList.FullCommand(), cliSvc.ListObjects(*namespaceName, *objectListContainer, *objectListVersion)) r.Register(objectURL.FullCommand(), cliSvc.GetObjectURL(*namespaceName, *objectURLContainer, *objectURLVersion, *objectURLKey)) r.Register(deleteObject.FullCommand(), cliSvc.DeleteObject(*namespaceName, *deleteObjectContainer, *deleteObjectVersion, *deleteObjectKey)) @@ -267,8 +269,9 @@ func normalizeHomeDir(in string) (out string) { } log.WithFields(log.Fields{ - "function": "normalizeHomeDir", - }).Tracef("`%s` resolved to `%s`", in, out) + "from": in, + "to": out, + }).Tracef("directory path normalized") return out }