diff --git a/.gitignore b/.gitignore index 87e9389..584a96b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ -SOURCES/deps-pkgs-10.tar.gz +SOURCES/deps-pkgs-11.tar.gz SOURCES/leapp-repository-0.21.0.tar.gz diff --git a/.leapp-repository.metadata b/.leapp-repository.metadata index 0e21a29..c20b327 100644 --- a/.leapp-repository.metadata +++ b/.leapp-repository.metadata @@ -1,2 +1,2 @@ -d520ada12294e4dd8837c81f92d4c184ab403d51 SOURCES/deps-pkgs-10.tar.gz +8b3fe3a7b52d2e144d374623aa5b0b0add7ab0c7 SOURCES/deps-pkgs-11.tar.gz 9327be3720ccb3f7b285d2199463d7df0c38dfae SOURCES/leapp-repository-0.21.0.tar.gz diff --git a/SOURCES/0001-rhui-alibaba-add-ARM-RHEL8-and-RHEL9-setup-entries-1.patch b/SOURCES/0001-rhui-alibaba-add-ARM-RHEL8-and-RHEL9-setup-entries-1.patch index 2f559b9..4da0033 100644 --- a/SOURCES/0001-rhui-alibaba-add-ARM-RHEL8-and-RHEL9-setup-entries-1.patch +++ b/SOURCES/0001-rhui-alibaba-add-ARM-RHEL8-and-RHEL9-setup-entries-1.patch @@ -1,7 +1,8 @@ From fbc38d4ad1d828e0553579e3719c0e4ed4a2a6bd Mon Sep 17 00:00:00 2001 From: jinkangkang <1547182170@qq.com> Date: Mon, 19 Aug 2024 18:46:08 +0800 -Subject: [PATCH] rhui(alibaba): add ARM RHEL8 and RHEL9 setup entries (#1277) +Subject: [PATCH 01/40] rhui(alibaba): add ARM RHEL8 and RHEL9 setup entries + (#1277) Since leapp's RHUI mechanism filters setups based on the architecture of the source system, it was not possible to upgrade of ARM-based RHEL systems on Alibaba cloud as there @@ -37,7 +38,10 @@ index 51694ac2..30de0275 100644 + os_version='9'), ] } - --- -2.45.2 +-- +<<<<<<< HEAD +2.45.2 +======= +2.47.0 +>>>>>>> ef02e9e (Import from CS git) diff --git a/SOURCES/0002-don-t-require-all-versions-to-be-defined-for-obsolet.patch b/SOURCES/0002-don-t-require-all-versions-to-be-defined-for-obsolet.patch new file mode 100644 index 0000000..286cab5 --- /dev/null +++ b/SOURCES/0002-don-t-require-all-versions-to-be-defined-for-obsolet.patch @@ -0,0 +1,41 @@ +From 7e0fb44bb673893d0409903f6a441d0eb2829d22 Mon Sep 17 00:00:00 2001 +From: Evgeni Golov <evgeni@golov.de> +Date: Tue, 20 Aug 2024 15:11:02 +0200 +Subject: [PATCH 02/40] don't require all versions to be defined for obsoleted + keys + +in releases where we do not have any obsoleted keys, we still had to +define an entry (with an empty list), as otherwise the code would fail + +instead, we can catch the KeyError and carry on as nothing happened +--- + .../libraries/removeobsoleterpmgpgkeys.py | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py +index 6e84c2e9..bda7efa3 100644 +--- a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py ++++ b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py +@@ -12,11 +12,14 @@ def _get_obsolete_keys(): + distribution = api.current_actor().configuration.os_release.release_id + obsoleted_keys_map = get_distribution_data(distribution).get('obsoleted-keys', {}) + keys = [] +- for version in range(7, int(get_target_major_version()) + 1): +- for key in obsoleted_keys_map[str(version)]: +- name, version, release = key.rsplit("-", 2) +- if has_package(InstalledRPM, name, version=version, release=release): +- keys.append(key) ++ try: ++ for version in range(7, int(get_target_major_version()) + 1): ++ for key in obsoleted_keys_map[str(version)]: ++ name, version, release = key.rsplit("-", 2) ++ if has_package(InstalledRPM, name, version=version, release=release): ++ keys.append(key) ++ except KeyError: ++ pass + + return keys + +-- +2.47.0 + diff --git a/SOURCES/0003-Add-RHEL-10.0-prod-certs.patch b/SOURCES/0003-Add-RHEL-10.0-prod-certs.patch new file mode 100644 index 0000000..77c31cd --- /dev/null +++ b/SOURCES/0003-Add-RHEL-10.0-prod-certs.patch @@ -0,0 +1,226 @@ +From 9f2f1726d8a5bdd12309a3a3111984f1666b903f Mon Sep 17 00:00:00 2001 +From: Matej Matuska <mmatuska@redhat.com> +Date: Thu, 22 Aug 2024 15:52:19 +0200 +Subject: [PATCH 03/40] Add RHEL 10.0 prod-certs + +Previously we temporarily used the RHEL 9 x86_64 prod cert for others +archs it was missing completely. + +Jira: OAMG-11138 +--- + .../common/files/prod-certs/10.0/279.pem | 37 ++++++++++ + .../common/files/prod-certs/10.0/419.pem | 37 ++++++++++ + .../common/files/prod-certs/10.0/479.pem | 68 ++++++++++--------- + .../common/files/prod-certs/10.0/72.pem | 37 ++++++++++ + 4 files changed, 146 insertions(+), 33 deletions(-) + create mode 100644 repos/system_upgrade/common/files/prod-certs/10.0/279.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/10.0/419.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/10.0/72.pem + +diff --git a/repos/system_upgrade/common/files/prod-certs/10.0/279.pem b/repos/system_upgrade/common/files/prod-certs/10.0/279.pem +new file mode 100644 +index 00000000..f62340fc +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/10.0/279.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGczCCBFugAwIBAgIUfZodBQY+YRSlyRRiFX1dx4vQ5y4wDQYJKoZIhvcNAQEL ++BQAwga4xCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEWMBQG ++A1UECgwNUmVkIEhhdCwgSW5jLjEYMBYGA1UECwwPUmVkIEhhdCBOZXR3b3JrMS4w ++LAYDVQQDDCVSZWQgSGF0IEVudGl0bGVtZW50IFByb2R1Y3QgQXV0aG9yaXR5MSQw ++IgYJKoZIhvcNAQkBFhVjYS1zdXBwb3J0QHJlZGhhdC5jb20wHhcNMjQwODE1MDYx ++NjQ5WhcNNDQwODE1MDYxNjQ5WjBEMUIwQAYDVQQDDDlSZWQgSGF0IFByb2R1Y3Qg ++SUQgWzA0YTU4NDFkLTVlNmUtNDU1Yy1hZWYwLTdhOTQ0NTBiNjg3Nl0wggIiMA0G ++CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGP0nTjP4TN3LHVTfeQV+0u/Se01LU ++FJ66GhksOGzXzKSx6kbuFde0eHYIwV8tmZOMDIv2LVezHKRClVB1dMalQXfcLaoF ++AcHmCViz353vzXHynybzMXFs9xbzZMglduBbcStWHy+TmoJsbVwIAAdv4NYyrQQD ++LLVuX8mACCFg0YFG8ok5tN0Kt2liHTYpSoEuRI9ke+joNQkU3fsxcOlV5Cr1W2pG ++OkosvC4R9dvRjsjnEQ6tHeRhs5oEBZW3eZhnW3Qv8p9jaNU51TlYXLIH0+Fsx0uL ++XETzTWP4YmvBwtrGaq+PhRogJHNw8BM/zrNUzUEFBr6WKWRFB6zkfKNnNkOIZi52 ++deFuqYuj+fRy5ehAFVWOHNFMzHvUSKJqGaLD5TW8aqQeFA3FvXce03WVwCFQIOvH ++F4y+sCNh1aliWkjJbc2yw9a3VhQeJ0wFIAngpy0h/3V3IT3dpK2XHAL9CfIWxk6Z ++wSwHNUKfP0aZYyXX/pfMFLXINSoHKSXHRMsf7P+wr0D47atkDLWYHIJjBXG9s5mG ++eobEC5OghL4DzW/mEKOwKI5JxUH5yKXfRgG7RwfzlFnQgs2Qd0p2sstZbjCOmEra ++cGfaDaLf7O1/6dAQPalCpn+uG5bv2NzIJmX2Rep7XA50XQLBqHg3r/cvMhcQQrIQ ++nE2pDC01zYhUTwIDAQABo4HxMIHuMAkGA1UdEwQCMAAwQwYMKwYBBAGSCAkBghcB ++BDMMMVJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBmb3IgUG93ZXIsIGxpdHRsZSBl ++bmRpYW4wFgYMKwYBBAGSCAkBghcCBAYMBDEwLjAwGQYMKwYBBAGSCAkBghcDBAkM ++B3BwYzY0bGUwKQYMKwYBBAGSCAkBghcEBBkMF3JoZWwtMTAscmhlbC0xMC1wcGM2 ++NGxlMB0GA1UdDgQWBBRh6iC1NXyvZ2Q6/2sI5hB40M0flTAfBgNVHSMEGDAWgBSW ++/bscQED/QIStsh8LJsHDam/WfDANBgkqhkiG9w0BAQsFAAOCAgEAv6ySsgygc2z2 ++kQJeu9sdvBNFKe+gEtXbPu6+rZKPPosW3cggMJCnsZgki3nUogovz0Z3MPkbmRz+ ++GJwVjiVBnfUQLoORSDYwqYZB4WRoqszW/dytd7/64IehvD/JZo3Oa8BNYRSG/Ukh ++7iUIT8ryFIH1DTUIersVObINN2gk3hC2JJXoTfNqIYG+4OAEUE7/F4CptRAGbgH/ ++4/9vfe2KNXvPMoWvILpXpD5w8t9Xh0Wl97N1W7+FLVRwQHAQ2/yBTu/sY27FvVSl ++0o+SBSvjTKIi+9QslRpi0QCVza5WxHTiO8nzYgzFjfMkt6lzK74puf3VJavpqkQ9 ++dVfyp36A3Fh6vDsiNxhsfKrp8z2JnKA3vdslsH7cOHCIFYHXiqeaP654t4oGeESD ++EPfS6PpXSyi47Kd/qjA2srgpXNQl2yMd0ih6NoHaoSYXFfb4LX6cWFGcT/AWZsaC ++xv2pN9J0KhF2loLp8SK19FESc0rJShkAacTcxeYjuDYbvLtJi4Z5aWWVU421rMSs ++X9IdiWa4WL70ZaDK5cP54S4zZNsVDKniUzNXwPltDCpqefy8ka4o5QlWNreBrXXW ++6cy8I6L2om7xZ5hAZ3CB7nUZe9QE/LXnHqK3cQetvd5Q2LMnp6gVtgQ4a+7vD9xz ++ExLtbBZjvGJFudimMmOxvn/J5+GMmm4= ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/10.0/419.pem b/repos/system_upgrade/common/files/prod-certs/10.0/419.pem +new file mode 100644 +index 00000000..08cb5b02 +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/10.0/419.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGZTCCBE2gAwIBAgIUWARL99TkK+hxtTJkE5icdHXLfY0wDQYJKoZIhvcNAQEL ++BQAwga4xCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEWMBQG ++A1UECgwNUmVkIEhhdCwgSW5jLjEYMBYGA1UECwwPUmVkIEhhdCBOZXR3b3JrMS4w ++LAYDVQQDDCVSZWQgSGF0IEVudGl0bGVtZW50IFByb2R1Y3QgQXV0aG9yaXR5MSQw ++IgYJKoZIhvcNAQkBFhVjYS1zdXBwb3J0QHJlZGhhdC5jb20wHhcNMjQwODE1MDYx ++NjQ5WhcNNDQwODE1MDYxNjQ5WjBEMUIwQAYDVQQDDDlSZWQgSGF0IFByb2R1Y3Qg ++SUQgW2Y3ZWFmNGU2LTYwZGYtNDMyNC04N2I0LTdhNGUzZGVkZmViNV0wggIiMA0G ++CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGP0nTjP4TN3LHVTfeQV+0u/Se01LU ++FJ66GhksOGzXzKSx6kbuFde0eHYIwV8tmZOMDIv2LVezHKRClVB1dMalQXfcLaoF ++AcHmCViz353vzXHynybzMXFs9xbzZMglduBbcStWHy+TmoJsbVwIAAdv4NYyrQQD ++LLVuX8mACCFg0YFG8ok5tN0Kt2liHTYpSoEuRI9ke+joNQkU3fsxcOlV5Cr1W2pG ++OkosvC4R9dvRjsjnEQ6tHeRhs5oEBZW3eZhnW3Qv8p9jaNU51TlYXLIH0+Fsx0uL ++XETzTWP4YmvBwtrGaq+PhRogJHNw8BM/zrNUzUEFBr6WKWRFB6zkfKNnNkOIZi52 ++deFuqYuj+fRy5ehAFVWOHNFMzHvUSKJqGaLD5TW8aqQeFA3FvXce03WVwCFQIOvH ++F4y+sCNh1aliWkjJbc2yw9a3VhQeJ0wFIAngpy0h/3V3IT3dpK2XHAL9CfIWxk6Z ++wSwHNUKfP0aZYyXX/pfMFLXINSoHKSXHRMsf7P+wr0D47atkDLWYHIJjBXG9s5mG ++eobEC5OghL4DzW/mEKOwKI5JxUH5yKXfRgG7RwfzlFnQgs2Qd0p2sstZbjCOmEra ++cGfaDaLf7O1/6dAQPalCpn+uG5bv2NzIJmX2Rep7XA50XQLBqHg3r/cvMhcQQrIQ ++nE2pDC01zYhUTwIDAQABo4HjMIHgMAkGA1UdEwQCMAAwNQYMKwYBBAGSCAkBgyMB ++BCUMI1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBmb3IgQVJNIDY0MBYGDCsGAQQB ++kggJAYMjAgQGDAQxMC4wMBkGDCsGAQQBkggJAYMjAwQJDAdhYXJjaDY0MCkGDCsG ++AQQBkggJAYMjBAQZDBdyaGVsLTEwLHJoZWwtMTAtYWFyY2g2NDAdBgNVHQ4EFgQU ++YeogtTV8r2dkOv9rCOYQeNDNH5UwHwYDVR0jBBgwFoAUlv27HEBA/0CErbIfCybB ++w2pv1nwwDQYJKoZIhvcNAQELBQADggIBAIpdcHN7RN18pg5ELfc55Sj58ivL5N25 ++19KprqbM7aVum32abw7/Qksfs6maGQpU6Hh/UqhJlGQ2bN48jZ/kdMKor4agSQ/T ++iwr3b8RBJFPVCuqQJXIe4g3iRbHfnIjGxgoMgv36j58PENoEnpPtR7ZtHMyqQ2SO ++m1WRQhY5tJ4Fk/Zkx/trxlNvmsTAjNRa530kqG4TfiMVvWNaVdxHsjMv0lXLJRXx ++KT6+iHt2QBs2No5O8cjlXr/CzfGrB5TlBNrsHqhO0Llmw28KpcWGYGdexKdIHrDG ++A/K0Pr21yRstUWN39jz/tdEqt1q8T7/it3oM976keQmFAxBa/CpyEG5Y6FKw9+F0 ++LtkAyI3XGHK7LbCOE67s7u0/BfgQvww1FqztVnVZ4sXlagj/IuYPJBhfGDe/6tik ++laqP8FtR6xJdSra2YQMBc0kZb0Sv1uy7pGofNSvLM5L76XqiwKoDVo/eAcl60OWY ++rF86pEDLGDmdJBLJKX2/77pzpQpZ9Yvc4vWwoZrP4gRKBuWF28aLH0OsWzdsfdMG ++9+DrcO/58slMbWng1ZzOQyEjp7x1kto5sa5m2q8LMo06ETYT8ps5A0hyltBz1yAt ++JEBS4Y14YlF6Px67aTak07MNo7AaaphuD47D2Sy3pwHa+vOx4nv/G33+G0iOm3Lr ++zVAjwlfLIUB9 ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/10.0/479.pem b/repos/system_upgrade/common/files/prod-certs/10.0/479.pem +index 1ea1cd3d..d89f6188 100644 +--- a/repos/system_upgrade/common/files/prod-certs/10.0/479.pem ++++ b/repos/system_upgrade/common/files/prod-certs/10.0/479.pem +@@ -1,35 +1,37 @@ + -----BEGIN CERTIFICATE----- +-MIIGFTCCA/2gAwIBAgIJALDxRLt/tVDQMA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD +-VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI +-YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk +-IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ +-ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTIzMDcxOTE2MzQwOFoXDTQzMDcx +-OTE2MzQwOFowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFsxZDg0ZDQ5 +-Ny1jZmNmLTQxNjEtOTM0YS0zNzk2MDU4M2ZmZGZdMIICIjANBgkqhkiG9w0BAQEF +-AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk +-sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x +-8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB +-RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I +-5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa +-xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo +-QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI +-yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl +-1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v +-5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ +-ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C +-AwEAAaOBnjCBmzAJBgNVHRMEAjAAMDUGDCsGAQQBkggJAYNfAQQlDCNSZWQgSGF0 +-IEVudGVycHJpc2UgTGludXggZm9yIHg4Nl82NDAVBgwrBgEEAZIICQGDXwIEBQwD +-OS40MBgGDCsGAQQBkggJAYNfAwQIDAZ4ODZfNjQwJgYMKwYBBAGSCAkBg18EBBYM +-FHJoZWwtOSxyaGVsLTkteDg2XzY0MA0GCSqGSIb3DQEBCwUAA4ICAQCGUDPFBrLs +-sK/RITJothRhKhKNX3zu9TWRG0WKxszCx/y7c4yEfH1TV/yd7BNB2RubaoayWz8E +-TQjcRW8BnVu9JrlbdpWJm4eN+dOOpcESPilLnkz4Tr0WYDsT1/jk/uiorK4h21S0 +-EwMicuSuEmm0OUEX0zj2X/IyveFRtpJpH/JktznCkvexysc1JRzqMCbal8GipRX9 +-Xf7Oko6QiaUpu5GDLN2OXhizYHdR2f3l+Sn2cScsbi3fSVv+DLsnaz6J0kZ4U8q3 +-lYk/ZYifJjG+/7cv3e+usixpmK/qYlpOvunUDnqOkDfUs4/4bZjH8e8CdqJk4YvU +-RRtLr7muXEJsaqF7lxAViXnKxT/z/+1kOgN/+Oyzjs4QDsk2HQpWHFgNYSSG9Mmz +-PUS8tk2T0j5sN55X7QRRl5c0oqrBU5XaWyL26QcfONYcR8dBaKawjxg8CI9KzsYY +-sb2jjS+fBkB1OI2c6z4OZRd+0N6FQ6gq++KiXOLFvi/QSFNi9Veb56c5tR2l6fBk +-0pSH06Gg2s0aQg20NdMIr+HaYsVdJRsE1FgQ2tlfFx9rGkcqhgwV3Za/abgtRb2o +-YVwps28DLm41DXf5DnXK+BXFHrtR/3YAZtga+R7OL/RvcF0kc2kudlxqd/8Y33uL +-nqnoATy31FTW4J4rEfanJTQgTpatZmbaLQ== ++MIIGYzCCBEugAwIBAgIUL5D34AcwqLAbqlUcxntHUCtEVxQwDQYJKoZIhvcNAQEL ++BQAwga4xCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEWMBQG ++A1UECgwNUmVkIEhhdCwgSW5jLjEYMBYGA1UECwwPUmVkIEhhdCBOZXR3b3JrMS4w ++LAYDVQQDDCVSZWQgSGF0IEVudGl0bGVtZW50IFByb2R1Y3QgQXV0aG9yaXR5MSQw ++IgYJKoZIhvcNAQkBFhVjYS1zdXBwb3J0QHJlZGhhdC5jb20wHhcNMjQwODE1MDYx ++NjQ5WhcNNDQwODE1MDYxNjQ5WjBEMUIwQAYDVQQDDDlSZWQgSGF0IFByb2R1Y3Qg ++SUQgWzk5NDZhMmY5LTI4NDMtNDJhOS1iNzhlLTIzM2E5ODIwYjVhZV0wggIiMA0G ++CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGP0nTjP4TN3LHVTfeQV+0u/Se01LU ++FJ66GhksOGzXzKSx6kbuFde0eHYIwV8tmZOMDIv2LVezHKRClVB1dMalQXfcLaoF ++AcHmCViz353vzXHynybzMXFs9xbzZMglduBbcStWHy+TmoJsbVwIAAdv4NYyrQQD ++LLVuX8mACCFg0YFG8ok5tN0Kt2liHTYpSoEuRI9ke+joNQkU3fsxcOlV5Cr1W2pG ++OkosvC4R9dvRjsjnEQ6tHeRhs5oEBZW3eZhnW3Qv8p9jaNU51TlYXLIH0+Fsx0uL ++XETzTWP4YmvBwtrGaq+PhRogJHNw8BM/zrNUzUEFBr6WKWRFB6zkfKNnNkOIZi52 ++deFuqYuj+fRy5ehAFVWOHNFMzHvUSKJqGaLD5TW8aqQeFA3FvXce03WVwCFQIOvH ++F4y+sCNh1aliWkjJbc2yw9a3VhQeJ0wFIAngpy0h/3V3IT3dpK2XHAL9CfIWxk6Z ++wSwHNUKfP0aZYyXX/pfMFLXINSoHKSXHRMsf7P+wr0D47atkDLWYHIJjBXG9s5mG ++eobEC5OghL4DzW/mEKOwKI5JxUH5yKXfRgG7RwfzlFnQgs2Qd0p2sstZbjCOmEra ++cGfaDaLf7O1/6dAQPalCpn+uG5bv2NzIJmX2Rep7XA50XQLBqHg3r/cvMhcQQrIQ ++nE2pDC01zYhUTwIDAQABo4HhMIHeMAkGA1UdEwQCMAAwNQYMKwYBBAGSCAkBg18B ++BCUMI1JlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCBmb3IgeDg2XzY0MBYGDCsGAQQB ++kggJAYNfAgQGDAQxMC4wMBgGDCsGAQQBkggJAYNfAwQIDAZ4ODZfNjQwKAYMKwYB ++BAGSCAkBg18EBBgMFnJoZWwtMTAscmhlbC0xMC14ODZfNjQwHQYDVR0OBBYEFGHq ++ILU1fK9nZDr/awjmEHjQzR+VMB8GA1UdIwQYMBaAFJb9uxxAQP9AhK2yHwsmwcNq ++b9Z8MA0GCSqGSIb3DQEBCwUAA4ICAQAa+c2/Usg6JToULhYTdLhf15Hk6xxdlwT7 ++zZlnZLbuAKtaDqP1NiSiX0Z/lMJzFfW0B/zyWLy8uiXLYmF5V28f8yWK0Nksx2v7 ++I7u6ZZN2dKDQZKsEoP0g3ptvVRWn9h5otS7yPkOK4Dzj04yJqOSGP9bp6OHEhm1S ++x4ErITkN/3MXOf9vT+I6wydVKsw4fdlWgVjmBd90bzVTnv4dWtJio+le+9ad9RSf ++M3aD5ufiELeRKMp6ExnC/cnoWtuH+b4BJ37TQ3Kpn3fDtbrzVvQH/dpqZ7P33yqg ++PnBEXOiLimDnnmDJ9ImQ1pVTrKJMxaj1Mk6onERe36n/iAsj+BwZvBiv7UaLPMnW ++nJGg+LQ4iUZrGWYD4N9Ou++nvsR8dCWRhXSuXensfli3lL/W0P62yzfYCyqOYeL1 ++msDcCmBEWJUtAaeAbASUIVx02JWPPmMSUqWs8xOecQjzoGuCQg4JM/UfsZzxepw0 ++bs9YSUVw8J9R2d4kuze65qDTMRg+cK2LX1xg1KkR/UWZOGxHHJAfwGWdPwSkiOPQ ++MVJ7LJjvozebHWSuiSxk+GWWr+NdxIJrFRGbivXyAkmqMRrPe1VLVxWwCdyud9o8 ++b2WbFgrNS2jOnHwldtM2ZAhrF5W4ckvVL7hLp2JoQnJfCcWson9NK6Y2M4bNwQnC ++ihxphLzOAw== + -----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/10.0/72.pem b/repos/system_upgrade/common/files/prod-certs/10.0/72.pem +new file mode 100644 +index 00000000..e0274f9c +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/10.0/72.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGZDCCBEygAwIBAgIUSTvcD4Wsduixh8PFmwk6aI0KTEcwDQYJKoZIhvcNAQEL ++BQAwga4xCzAJBgNVBAYTAlVTMRcwFQYDVQQIDA5Ob3J0aCBDYXJvbGluYTEWMBQG ++A1UECgwNUmVkIEhhdCwgSW5jLjEYMBYGA1UECwwPUmVkIEhhdCBOZXR3b3JrMS4w ++LAYDVQQDDCVSZWQgSGF0IEVudGl0bGVtZW50IFByb2R1Y3QgQXV0aG9yaXR5MSQw ++IgYJKoZIhvcNAQkBFhVjYS1zdXBwb3J0QHJlZGhhdC5jb20wHhcNMjQwODE1MDYx ++NjQ5WhcNNDQwODE1MDYxNjQ5WjBEMUIwQAYDVQQDDDlSZWQgSGF0IFByb2R1Y3Qg ++SUQgW2VjN2EwZDQyLTgzNjItNDg2YS04ZjcyLTc3YThiOWU2MjM0YV0wggIiMA0G ++CSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQDGP0nTjP4TN3LHVTfeQV+0u/Se01LU ++FJ66GhksOGzXzKSx6kbuFde0eHYIwV8tmZOMDIv2LVezHKRClVB1dMalQXfcLaoF ++AcHmCViz353vzXHynybzMXFs9xbzZMglduBbcStWHy+TmoJsbVwIAAdv4NYyrQQD ++LLVuX8mACCFg0YFG8ok5tN0Kt2liHTYpSoEuRI9ke+joNQkU3fsxcOlV5Cr1W2pG ++OkosvC4R9dvRjsjnEQ6tHeRhs5oEBZW3eZhnW3Qv8p9jaNU51TlYXLIH0+Fsx0uL ++XETzTWP4YmvBwtrGaq+PhRogJHNw8BM/zrNUzUEFBr6WKWRFB6zkfKNnNkOIZi52 ++deFuqYuj+fRy5ehAFVWOHNFMzHvUSKJqGaLD5TW8aqQeFA3FvXce03WVwCFQIOvH ++F4y+sCNh1aliWkjJbc2yw9a3VhQeJ0wFIAngpy0h/3V3IT3dpK2XHAL9CfIWxk6Z ++wSwHNUKfP0aZYyXX/pfMFLXINSoHKSXHRMsf7P+wr0D47atkDLWYHIJjBXG9s5mG ++eobEC5OghL4DzW/mEKOwKI5JxUH5yKXfRgG7RwfzlFnQgs2Qd0p2sstZbjCOmEra ++cGfaDaLf7O1/6dAQPalCpn+uG5bv2NzIJmX2Rep7XA50XQLBqHg3r/cvMhcQQrIQ ++nE2pDC01zYhUTwIDAQABo4HiMIHfMAkGA1UdEwQCMAAwOwYLKwYBBAGSCAkBSAEE ++LAwqUmVkIEhhdCBFbnRlcnByaXNlIExpbnV4IGZvciBJQk0geiBTeXN0ZW1zMBUG ++CysGAQQBkggJAUgCBAYMBDEwLjAwFgYLKwYBBAGSCAkBSAMEBwwFczM5MHgwJgYL ++KwYBBAGSCAkBSAQEFwwVcmhlbC0xMCxyaGVsLTEwLXMzOTB4MB0GA1UdDgQWBBRh ++6iC1NXyvZ2Q6/2sI5hB40M0flTAfBgNVHSMEGDAWgBSW/bscQED/QIStsh8LJsHD ++am/WfDANBgkqhkiG9w0BAQsFAAOCAgEAsj4qPVsDkFrfuVDn8JCJ7tIH5WhaOzL6 ++3GBsQIKGd8a1WscPfSpr/phNSBPWFyvV2b+0HzblYzBZbx6ExykTDLh5L01nPM0s +++hqPxZgF/kcTbLWmAanl32R9+Gs2P2JN1CaCclXgM4USEagBWYeMhJSmQR3bOnSe ++Jjm3tjvhnbIQd6xgPpTjrqZ35z1BW0P0qQFdBbB0k+MfPkhYKEr+Vfn0rU8vk4UP ++F9sY9HkZLqIBxlXeTUerNZvHSuOy2KgoS4l25/QwUutHnnSGZZpARiU1XYNcynVL ++r5COHlb6TYkeRhSAm6RVM4XPYoFgN6cbhY1orwFC2/0i30EnsTMB6ctnLKCf7qgM ++GDG2W7ct0m6koA7s2TGmgp33DPw9adX7qgIV0OjLzBYJ1fyVv3sYlOKRuyDz0l+N ++u6Rnv1ecNUspWn+5ogBbdgwU6yah6oo/fJIWm62U38UGH5ic+/7sBnga8q5sDI90 +++h+nlTIAnD0ICzjEDASiLlYft+hQ9pOt/rgEIrPeKTe+fbefUIXJ5h343E51POnY ++uZRXcirc33QL/PgBRce1taIXjsRD+FSJM0tx/vf8H9j0rzSAxDoXJNsdq4/32scy ++6Zk2fgtm80xxIzju84jXVUrSBRMpWD9I+FZId4IE7tQhwKNi1b7DdNeaQLfaoq8U ++1PEea/tQDSA= ++-----END CERTIFICATE----- +-- +2.47.0 + diff --git a/SOURCES/0004-properly-scope-try-except-when-loading-obsoleted-key.patch b/SOURCES/0004-properly-scope-try-except-when-loading-obsoleted-key.patch new file mode 100644 index 0000000..e8d1cbf --- /dev/null +++ b/SOURCES/0004-properly-scope-try-except-when-loading-obsoleted-key.patch @@ -0,0 +1,100 @@ +From bf302fc794957a88bc4785f4dd2505b8d71012e0 Mon Sep 17 00:00:00 2001 +From: Evgeni Golov <evgeni@golov.de> +Date: Wed, 21 Aug 2024 07:52:02 +0200 +Subject: [PATCH 04/40] properly scope try/except when loading obsoleted keys + +We want to load all possible keys, even *after* a KeyError happenend + +Fixes: 7e0fb44bb673893d0409903f6a441d0eb2829d22 +--- + .../libraries/removeobsoleterpmgpgkeys.py | 8 +-- + .../tests/test_removeobsoleterpmgpgkeys.py | 50 +++++++++++++++++++ + 2 files changed, 54 insertions(+), 4 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py +index bda7efa3..198c4368 100644 +--- a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py ++++ b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/libraries/removeobsoleterpmgpgkeys.py +@@ -12,14 +12,14 @@ def _get_obsolete_keys(): + distribution = api.current_actor().configuration.os_release.release_id + obsoleted_keys_map = get_distribution_data(distribution).get('obsoleted-keys', {}) + keys = [] +- try: +- for version in range(7, int(get_target_major_version()) + 1): ++ for version in range(7, int(get_target_major_version()) + 1): ++ try: + for key in obsoleted_keys_map[str(version)]: + name, version, release = key.rsplit("-", 2) + if has_package(InstalledRPM, name, version=version, release=release): + keys.append(key) +- except KeyError: +- pass ++ except KeyError: ++ pass + + return keys + +diff --git a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/tests/test_removeobsoleterpmgpgkeys.py b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/tests/test_removeobsoleterpmgpgkeys.py +index 4d9a0e84..b78174cc 100644 +--- a/repos/system_upgrade/common/actors/removeobsoletegpgkeys/tests/test_removeobsoleterpmgpgkeys.py ++++ b/repos/system_upgrade/common/actors/removeobsoletegpgkeys/tests/test_removeobsoleterpmgpgkeys.py +@@ -76,6 +76,56 @@ def test_get_obsolete_keys(monkeypatch, version, expected): + assert set(keys) == set(expected) + + ++@pytest.mark.parametrize( ++ "version, obsoleted_keys, expected", ++ [ ++ (10, None, []), ++ (10, {}, []), ++ (10, {"8": ["gpg-pubkey-888-abc"], "10": ["gpg-pubkey-10-10"]}, ["gpg-pubkey-888-abc", "gpg-pubkey-10-10"]), ++ (9, {"8": ["gpg-pubkey-888-abc"], "9": ["gpg-pubkey-999-def"]}, ["gpg-pubkey-999-def", "gpg-pubkey-888-abc"]), ++ (8, {"8": ["gpg-pubkey-888-abc"], "9": ["gpg-pubkey-999-def"]}, ["gpg-pubkey-888-abc"]) ++ ] ++) ++def test_get_obsolete_keys_incomplete_data(monkeypatch, version, obsoleted_keys, expected): ++ def get_target_major_version_mocked(): ++ return version ++ ++ def get_distribution_data_mocked(_distro): ++ if obsoleted_keys is None: ++ return {} ++ return {'obsoleted-keys': obsoleted_keys} ++ ++ def has_package_mocked(*args, **kwargs): ++ return True ++ ++ monkeypatch.setattr( ++ removeobsoleterpmgpgkeys, ++ "get_target_major_version", ++ get_target_major_version_mocked, ++ ) ++ ++ monkeypatch.setattr( ++ removeobsoleterpmgpgkeys, ++ "get_distribution_data", ++ get_distribution_data_mocked, ++ ) ++ ++ monkeypatch.setattr( ++ removeobsoleterpmgpgkeys, ++ "has_package", ++ has_package_mocked, ++ ) ++ ++ monkeypatch.setattr( ++ api, ++ "current_actor", ++ CurrentActorMocked(), ++ ) ++ ++ keys = removeobsoleterpmgpgkeys._get_obsolete_keys() ++ assert set(keys) == set(expected) ++ ++ + @pytest.mark.parametrize( + "keys, should_register", + [ +-- +2.47.0 + diff --git a/SOURCES/0005-Update-references-from-master-branch-to-main.patch b/SOURCES/0005-Update-references-from-master-branch-to-main.patch new file mode 100644 index 0000000..27b3c6b --- /dev/null +++ b/SOURCES/0005-Update-references-from-master-branch-to-main.patch @@ -0,0 +1,283 @@ +From 9d49f4675c2b7b18ba7b344bb0032a5538782560 Mon Sep 17 00:00:00 2001 +From: Vojtech Sokol <vsokol@redhat.com> +Date: Mon, 2 Sep 2024 17:21:36 +0200 +Subject: [PATCH 05/40] Update references from master branch to main + +Focus was on making the CI and GitHub actions work after the default +branch was switched from master to main. + +See: OAMG-4907 +--- + .github/workflows/codespell.yml | 4 ++-- + .github/workflows/differential-shellcheck.yml | 4 ++-- + .github/workflows/pr-welcome-msg.yml | 2 +- + .github/workflows/tmt-tests.yml | 16 ++++++++-------- + .github/workflows/unit-tests.yml | 12 ++++++------ + .packit.yaml | 10 +++++----- + Makefile | 14 +++++++------- + 7 files changed, 31 insertions(+), 31 deletions(-) + +diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml +index 673cef17..1195d8d1 100644 +--- a/.github/workflows/codespell.yml ++++ b/.github/workflows/codespell.yml +@@ -3,10 +3,10 @@ name: Codespell + on: + push: + branches: +- - master ++ - main + pull_request: + branches: +- - master ++ - main + + jobs: + codespell: +diff --git a/.github/workflows/differential-shellcheck.yml b/.github/workflows/differential-shellcheck.yml +index f1ed5f6a..e1bafb93 100644 +--- a/.github/workflows/differential-shellcheck.yml ++++ b/.github/workflows/differential-shellcheck.yml +@@ -4,7 +4,7 @@ + name: Differential ShellCheck + on: + pull_request: +- branches: [master] ++ branches: [main] + + permissions: + contents: read +@@ -17,7 +17,7 @@ jobs: + security-events: write + pull-requests: write + +- steps: ++ steps: + - name: Repository checkout + uses: actions/checkout@v4 + with: +diff --git a/.github/workflows/pr-welcome-msg.yml b/.github/workflows/pr-welcome-msg.yml +index ff9414d2..0102c41f 100644 +--- a/.github/workflows/pr-welcome-msg.yml ++++ b/.github/workflows/pr-welcome-msg.yml +@@ -28,7 +28,7 @@ jobs: + However, here are additional useful commands for packit: + - **`/packit test`** to re-run manually the default tests + - **`/packit retest-failed`** to re-run failed tests manually +- - **`/packit test oamg/leapp#42`** to run tests with leapp builds for the leapp PR#42 (default is latest upstream - master - build) ++ - **`/packit test oamg/leapp#42`** to run tests with leapp builds for the leapp PR#42 (default is latest upstream - main - build) + + Note that first time contributors cannot run tests automatically - they need to be started by a reviewer. + +diff --git a/.github/workflows/tmt-tests.yml b/.github/workflows/tmt-tests.yml +index 7e9fd706..1fa00e60 100644 +--- a/.github/workflows/tmt-tests.yml ++++ b/.github/workflows/tmt-tests.yml +@@ -12,7 +12,7 @@ jobs: + + call_workflow_tests_79to88_integration: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -26,7 +26,7 @@ jobs: + + call_workflow_tests_79to86_integration: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -40,7 +40,7 @@ jobs: + + call_workflow_tests_79to88_sst: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -55,7 +55,7 @@ jobs: + + call_workflow_tests_7to8_aws: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-7to8.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -71,7 +71,7 @@ jobs: + + call_workflow_tests_86to90_integration: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -85,7 +85,7 @@ jobs: + + call_workflow_tests_88to92_integration: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -101,7 +101,7 @@ jobs: + + call_workflow_tests_86to90_sst: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +@@ -116,7 +116,7 @@ jobs: + + call_workflow_tests_86to90_aws: + needs: call_workflow_copr_build +- uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@master ++ uses: oamg/leapp/.github/workflows/reuse-tests-8to9.yml@main + secrets: inherit + with: + copr_artifacts: ${{ needs.call_workflow_copr_build.outputs.artifacts }} +diff --git a/.github/workflows/unit-tests.yml b/.github/workflows/unit-tests.yml +index 2a05106e..42b72b8d 100644 +--- a/.github/workflows/unit-tests.yml ++++ b/.github/workflows/unit-tests.yml +@@ -2,10 +2,10 @@ name: Unit Tests + on: + push: + branches: +- - master ++ - main + pull_request: + branches: +- - master ++ - main + + jobs: + test: +@@ -74,10 +74,10 @@ jobs: + # NOTE(ivasilev) fetch-depth 0 is critical here as leapp deps discovery depends on specific substring in + # commit message and default 1 option will get us just merge commit which has an unrelevant message. + fetch-depth: '0' +- # NOTE(ivasilev) master -> origin/master is used for leapp deps discovery in Makefile via git log master..HEAD +- - name: Set master to origin/master +- if: github.ref != 'refs/heads/master' ++ # NOTE(ivasilev) main -> origin/main is used for leapp deps discovery in Makefile via git log main..HEAD ++ - name: Set main to origin/main ++ if: github.ref != 'refs/heads/main' + run: | +- git branch -f master origin/master ++ git branch -f main origin/main + - name: ${{matrix.scenarios.name}} + run: script -e -c /bin/bash -c 'TERM=xterm podman build --security-opt=seccomp=unconfined -t leapp-tests -f utils/container-tests/Containerfile.${{matrix.scenarios.container}} utils/container-tests && PYTHON_VENV=${{matrix.scenarios.python}} REPOSITORIES=${{matrix.scenarios.repos}} podman run --security-opt=seccomp=unconfined --rm -ti -v ${PWD}:/payload --env=PYTHON_VENV --env=REPOSITORIES leapp-tests' +diff --git a/.packit.yaml b/.packit.yaml +index d91a47e5..fbfd0eea 100644 +--- a/.packit.yaml ++++ b/.packit.yaml +@@ -22,7 +22,7 @@ actions: + fix-spec-file: + - bash -c "sed -i -r \"0,/Release:/ s/Release:(\s*)\S*/Release:\1${PACKIT_RPMSPEC_RELEASE}%{?dist}/\" packaging/leapp-repository.spec" + post-upstream-clone: +- # builds from PRs should have lower NVR than those from master branch ++ # builds from PRs should have lower NVR than those from main branch + - bash -c "sed -i \"s/1%{?dist}/0%{?dist}/g\" packaging/leapp-repository.spec" + + jobs: +@@ -44,12 +44,12 @@ jobs: + fix-spec-file: + - bash -c "sed -i -r \"0,/Release:/ s/Release:(\s*)\S*/Release:\1${PACKIT_RPMSPEC_RELEASE}%{?dist}/\" packaging/leapp-repository.spec" + post-upstream-clone: +- # builds from PRs should have lower NVR than those from master branch ++ # builds from PRs should have lower NVR than those from main branch + - bash -c "sed -i \"s/1%{?dist}/0%{?dist}/g\" packaging/leapp-repository.spec" + - job: copr_build + trigger: commit + metadata: +- branch: master ++ branch: main + owner: "@oamg" + project: leapp + targets: +@@ -65,7 +65,7 @@ jobs: + fix-spec-file: + - bash -c "sed -i -r \"0,/Release:/ s/Release:(\s*)\S*/Release:\1${PACKIT_RPMSPEC_RELEASE}%{?dist}/\" packaging/leapp-repository.spec" + post-upstream-clone: +- # builds from master branch should start with 100 release, to have high priority ++ # builds from main branch should start with 100 release, to have high priority + - bash -c "sed -i \"s/1%{?dist}/100%{?dist}/g\" packaging/leapp-repository.spec" + - job: copr_build + trigger: release +@@ -85,7 +85,7 @@ jobs: + fix-spec-file: + - bash -c "sed -i -r \"0,/Release:/ s/Release:(\s*)\S*/Release:\1${PACKIT_RPMSPEC_RELEASE}%{?dist}/\" packaging/leapp-repository.spec" + post-upstream-clone: +- # builds from master branch should start with 100 release, to have high priority ++ # builds from main branch should start with 100 release, to have high priority + - bash -c "sed -i \"s/1%{?dist}/100%{?dist}/g\" packaging/leapp-repository.spec" + + +diff --git a/Makefile b/Makefile +index 5b2bc4d2..8aeef77d 100644 +--- a/Makefile ++++ b/Makefile +@@ -64,7 +64,7 @@ endif + + # just to reduce number of unwanted builds mark as the upstream one when + # someone will call copr_build without additional parameters +-MASTER_BRANCH=master ++MASTER_BRANCH=main + + # In case the PR or MR is defined or in case build is not coming from the + # MATER_BRANCH branch, N_REL=0; (so build is not update of the approved +@@ -76,10 +76,10 @@ SHORT_SHA=`git rev-parse --short HEAD` + BRANCH=`git rev-parse --abbrev-ref HEAD | tr -- '-/' '_'` + + # The dependent framework PR connection will be taken from the top commit's depends-on message. +-REQ_LEAPP_PR=$(shell git log master..HEAD | grep -m1 -iE '^[[:space:]]*Depends-On:[[:space:]]*.*[[:digit:]]+[[:space:]]*$$' | grep -Eo '*[[:digit:]]*') ++REQ_LEAPP_PR=$(shell git log main..HEAD | grep -m1 -iE '^[[:space:]]*Depends-On:[[:space:]]*.*[[:digit:]]+[[:space:]]*$$' | grep -Eo '*[[:digit:]]*') + # NOTE(ivasilev) In case of travis relying on top commit is a no go as a top commit will be a merge commit. + ifdef CI +- REQ_LEAPP_PR=$(shell git log master..HEAD | grep -m1 -iE '^[[:space:]]*Depends-On:[[:space:]]*.*[[:digit:]]+[[:space:]]*$$' | grep -Eo '[[:digit:]]*') ++ REQ_LEAPP_PR=$(shell git log main..HEAD | grep -m1 -iE '^[[:space:]]*Depends-On:[[:space:]]*.*[[:digit:]]+[[:space:]]*$$' | grep -Eo '[[:digit:]]*') + endif + + # In case anyone would like to add any other suffix, just make it possible +@@ -92,8 +92,8 @@ REQUEST=`if test -n "$$PR"; then echo ".PR$${PR}"; elif test -n "$$MR"; then ech + # Examples: + # 0.201810080027Z.4078402.packaging.PR2 + # 0.201810080027Z.4078402.packaging +-# 0.201810080027Z.4078402.master.MR2 +-# 1.201810080027Z.4078402.master ++# 0.201810080027Z.4078402.main.MR2 ++# 1.201810080027Z.4078402.main + RELEASE="$(N_REL).$(TIMESTAMP).$(SHORT_SHA).$(BRANCH)$(REQUEST)$(_SUFFIX)" + + all: help +@@ -302,7 +302,7 @@ install-deps: + pip install --upgrade setuptools; \ + pip install --upgrade -r requirements.txt; \ + ./utils/install_commands.sh $(_PYTHON_VENV); \ +- # In case the top commit Depends-On some yet unmerged framework patch - override master leapp with the proper version ++ # In case the top commit Depends-On some yet unmerged framework patch - override main leapp with the proper version + if [[ ! -z "$(REQ_LEAPP_PR)" ]] ; then \ + echo "Leapp-repository depends on the yet unmerged pr of the framework #$(REQ_LEAPP_PR), installing it.." && \ + $(VENVNAME)/bin/pip install -I "git+https://github.com/oamg/leapp.git@refs/pull/$(REQ_LEAPP_PR)/head"; \ +@@ -332,7 +332,7 @@ install-deps-fedora: + pip install --upgrade setuptools; \ + pip install --upgrade -r requirements.txt; \ + ./utils/install_commands.sh $(_PYTHON_VENV); \ +- # In case the top commit Depends-On some yet unmerged framework patch - override master leapp with the proper version ++ # In case the top commit Depends-On some yet unmerged framework patch - override main leapp with the proper version + if [[ ! -z "$(REQ_LEAPP_PR)" ]] ; then \ + echo "Leapp-repository depends on the yet unmerged pr of the framework #$(REQ_LEAPP_PR), installing it.." && \ + $(VENVNAME)/bin/pip install -I "git+https://github.com/oamg/leapp.git@refs/pull/$(REQ_LEAPP_PR)/head"; \ +-- +2.47.0 + diff --git a/SOURCES/0006-ReadOfKernelArgsError-fix-the-error.patch b/SOURCES/0006-ReadOfKernelArgsError-fix-the-error.patch new file mode 100644 index 0000000..2042f81 --- /dev/null +++ b/SOURCES/0006-ReadOfKernelArgsError-fix-the-error.patch @@ -0,0 +1,43 @@ +From 41e32e3aa6394b8397bef9b797892d9fa119d608 Mon Sep 17 00:00:00 2001 +From: Yuriy Kohut <yura.kohut@gmail.com> +Date: Thu, 29 Aug 2024 12:36:23 +0300 +Subject: [PATCH 06/40] ReadOfKernelArgsError: fix the error: - AttributeError: + module 'leapp.reporting' has no attribute 'Hints' + +--- + .../kernelcmdlineconfig/libraries/kernelcmdlineconfig.py | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +index 238a8aa6..6b261c3b 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +@@ -175,14 +175,14 @@ def entrypoint(configs=None): + api.current_logger().error(str(e)) + + if use_cmdline_file(): +- report_hint = reporting.Hints( ++ report_hint = ( + 'After the system has been rebooted into the new version of RHEL, you' + ' should take the kernel cmdline arguments from /proc/cmdline (Everything' + ' except the BOOT_IMAGE entry and initrd entries) and copy them into' + ' /etc/kernel/cmdline before installing any new kernels.' + ) + else: +- report_hint = reporting.Hints( ++ report_hint = ( + 'After the system has been rebooted into the new version of RHEL, you' + ' should take the kernel cmdline arguments from /proc/cmdline (Everything' + ' except the BOOT_IMAGE entry and initrd entries) and then use the' +@@ -204,7 +204,7 @@ def entrypoint(configs=None): + ' not able to set the arguments as the default for kernels installed in' + ' the future.' + ), +- report_hint, ++ reporting.Remediation(hint=report_hint), + reporting.Severity(reporting.Severity.HIGH), + reporting.Groups([ + reporting.Groups.BOOT, +-- +2.47.0 + diff --git a/SOURCES/0007-pylint-exclude-rule-too-many-positional-arguments-co.patch b/SOURCES/0007-pylint-exclude-rule-too-many-positional-arguments-co.patch new file mode 100644 index 0000000..2136a1e --- /dev/null +++ b/SOURCES/0007-pylint-exclude-rule-too-many-positional-arguments-co.patch @@ -0,0 +1,44 @@ +From 88e13fb0545e0d42df2777538a0c6921bab91e33 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Fri, 27 Sep 2024 14:53:01 +0200 +Subject: [PATCH 07/40] pylint: exclude rule: too-many-positional-arguments + (code: R0917) + +New version of Pylint have the rule for checking of positional +arguments - complaining when more than 4 positional arguments exists. +We do not want to refactor the code to make it happy and the default +value cannot be set right now - that's planned for future Pylint +versions at this moment. So excluding this rule. + +For more info: + * https://pylint.readthedocs.io/en/latest/user_guide/messages/refactor/too-many-positional-arguments.html +--- + .pylintrc | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/.pylintrc b/.pylintrc +index f78c1c3f..5d75df40 100644 +--- a/.pylintrc ++++ b/.pylintrc +@@ -41,6 +41,8 @@ disable= + consider-using-from-import, + use-list-literal, + use-dict-literal, ++ too-many-lines, # we do not want to take care about that one ++ too-many-positional-arguments, # we cannot set yet max-possitional-arguments unfortunately + # new for python3 version of pylint + useless-object-inheritance, + consider-using-set-comprehension, # pylint3 force to use comprehension in place we don't want (py2 doesnt have these options, for inline skip) +@@ -57,8 +59,7 @@ disable= + redundant-u-string-prefix, # still have py2 to support + logging-format-interpolation, + logging-not-lazy, +- use-yield-from, # yield from cannot be used until we require python 3.3 or greater +- too-many-lines # we do not want to take care about that one ++ use-yield-from # yield from cannot be used until we require python 3.3 or greater + + [FORMAT] + # Maximum number of characters on a single line. +-- +2.47.0 + diff --git a/SOURCES/0008-pam_userdb-migrate-backend-database.patch b/SOURCES/0008-pam_userdb-migrate-backend-database.patch new file mode 100644 index 0000000..0ef43d9 --- /dev/null +++ b/SOURCES/0008-pam_userdb-migrate-backend-database.patch @@ -0,0 +1,534 @@ +From 658700d6424e852917b62c190dd23cbb3026b67d Mon Sep 17 00:00:00 2001 +From: Iker Pedrosa <ipedrosa@redhat.com> +Date: Mon, 5 Aug 2024 15:15:44 +0200 +Subject: [PATCH 08/40] pam_userdb: migrate backend database + +pam_userdb module changed its backend database technology from lidb to +gdbm for RHEL10. This requires a set of leapp actors to perform the +database migration automatically when upgrading to RHEL10: + +* ScanPamUserDB takes care of scanning the PAM service folder to detect + whether pam_userdb is used and the location of the database in use. + This information is stored in a model. + +* CheckPamUserDB checks the databases reported by ScanPamUserDB and + prints a report about them. + +* ConvertPamUserDB checks the databases reported by ScanPamUserDB and + converts them to GDBM format. + +* RemoveOldPamUserDB checks the databases reported by ScanPamUserDB and + removes them. + +All these actors include unit-tests. + +Finally, there's also a spec file change to add `libdb-utils` dependency +as it is required to convert pam_userdb databases from BerkeleyDB to +GDBM. + +Signed-off-by: Iker Pedrosa <ipedrosa@redhat.com> +--- + packaging/leapp-repository.spec | 6 +++ + .../actors/pamuserdb/checkpamuserdb/actor.py | 18 ++++++++ + .../libraries/checkpamuserdb.py | 28 ++++++++++++ + .../tests/test_checkpamuserdb.py | 43 +++++++++++++++++++ + .../pamuserdb/convertpamuserdb/actor.py | 18 ++++++++ + .../libraries/convertpamuserdb.py | 27 ++++++++++++ + .../tests/test_convertpamuserdb.py | 39 +++++++++++++++++ + .../pamuserdb/removeoldpamuserdb/actor.py | 18 ++++++++ + .../libraries/removeoldpamuserdb.py | 25 +++++++++++ + .../tests/test_removeoldpamuserdb.py | 38 ++++++++++++++++ + .../actors/pamuserdb/scanpamuserdb/actor.py | 18 ++++++++ + .../scanpamuserdb/libraries/scanpamuserdb.py | 29 +++++++++++++ + .../tests/files/pam_userdb_basic | 1 + + .../tests/files/pam_userdb_complete | 9 ++++ + .../tests/files/pam_userdb_missing | 1 + + .../scanpamuserdb/tests/test_scanpamuserdb.py | 27 ++++++++++++ + .../el9toel10/models/pamuserdblocation.py | 14 ++++++ + 17 files changed, 359 insertions(+) + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/actor.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/libraries/checkpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/tests/test_checkpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/actor.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/libraries/convertpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/tests/test_convertpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/actor.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/libraries/removeoldpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/tests/test_removeoldpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/actor.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/libraries/scanpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_basic + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_complete + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_missing + create mode 100644 repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/test_scanpamuserdb.py + create mode 100644 repos/system_upgrade/el9toel10/models/pamuserdblocation.py + +diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec +index 146afc45..0d63ba02 100644 +--- a/packaging/leapp-repository.spec ++++ b/packaging/leapp-repository.spec +@@ -211,6 +211,12 @@ Requires: dracut + Requires: NetworkManager-libnm + Requires: python3-gobject-base + ++%endif ++ ++%if 0%{?rhel} && 0%{?rhel} == 9 ++############# RHEL 9 dependencies (when the source system is RHEL 9) ########## ++# Required to convert pam_userdb database from BerkeleyDB to GDBM ++Requires: libdb-utils + %endif + ################################################## + # end requirement +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/actor.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/actor.py +new file mode 100644 +index 00000000..8fada645 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/actor.py +@@ -0,0 +1,18 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import checkpamuserdb ++from leapp.models import PamUserDbLocation, Report ++from leapp.tags import ChecksPhaseTag, IPUWorkflowTag ++ ++ ++class CheckPamUserDb(Actor): ++ """ ++ Create report with the location of pam_userdb databases ++ """ ++ ++ name = 'check_pam_user_db' ++ consumes = (PamUserDbLocation,) ++ produces = (Report,) ++ tags = (ChecksPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ checkpamuserdb.process() +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/libraries/checkpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/libraries/checkpamuserdb.py +new file mode 100644 +index 00000000..05cc71a9 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/libraries/checkpamuserdb.py +@@ -0,0 +1,28 @@ ++from leapp import reporting ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.stdlib import api ++from leapp.models import PamUserDbLocation ++ ++FMT_LIST_SEPARATOR = "\n - " ++ ++ ++def process(): ++ msg = next(api.consume(PamUserDbLocation), None) ++ if not msg: ++ raise StopActorExecutionError('Expected PamUserDbLocation, but got None') ++ ++ if msg.locations: ++ reporting.create_report([ ++ reporting.Title('pam_userdb databases will be converted to GDBM'), ++ reporting.Summary( ++ 'On RHEL 10, GDMB is used by pam_userdb as it\'s backend database,' ++ ' replacing BerkeleyDB. Existing pam_userdb databases will be' ++ ' converted to GDBM. The following databases will be converted:' ++ '{sep}{locations}'.format(sep=FMT_LIST_SEPARATOR, locations=FMT_LIST_SEPARATOR.join(msg.locations))), ++ reporting.Severity(reporting.Severity.INFO), ++ reporting.Groups([reporting.Groups.SECURITY, reporting.Groups.AUTHENTICATION]) ++ ]) ++ else: ++ api.current_logger().debug( ++ 'No pam_userdb databases were located, thus nothing will be converted' ++ ) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/tests/test_checkpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/tests/test_checkpamuserdb.py +new file mode 100644 +index 00000000..2e11106b +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/checkpamuserdb/tests/test_checkpamuserdb.py +@@ -0,0 +1,43 @@ ++import pytest ++ ++from leapp import reporting ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.actor import checkpamuserdb ++from leapp.libraries.common.testutils import create_report_mocked, logger_mocked ++from leapp.libraries.stdlib import api ++from leapp.models import PamUserDbLocation ++ ++ ++def test_process_no_msg(monkeypatch): ++ def consume_mocked(*args, **kwargs): ++ yield None ++ ++ monkeypatch.setattr(api, 'consume', consume_mocked) ++ ++ with pytest.raises(StopActorExecutionError): ++ checkpamuserdb.process() ++ ++ ++def test_process_no_location(monkeypatch): ++ def consume_mocked(*args, **kwargs): ++ yield PamUserDbLocation(locations=[]) ++ ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(api, 'consume', consume_mocked) ++ ++ checkpamuserdb.process() ++ assert ( ++ 'No pam_userdb databases were located, thus nothing will be converted' ++ in api.current_logger.dbgmsg ++ ) ++ ++ ++def test_process_locations(monkeypatch): ++ def consume_mocked(*args, **kwargs): ++ yield PamUserDbLocation(locations=['/tmp/db1', '/tmp/db2']) ++ ++ monkeypatch.setattr(reporting, "create_report", create_report_mocked()) ++ monkeypatch.setattr(api, 'consume', consume_mocked) ++ ++ checkpamuserdb.process() ++ assert reporting.create_report.called == 1 +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/actor.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/actor.py +new file mode 100644 +index 00000000..5f8525b6 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/actor.py +@@ -0,0 +1,18 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import convertpamuserdb ++from leapp.models import PamUserDbLocation ++from leapp.tags import IPUWorkflowTag, PreparationPhaseTag ++ ++ ++class ConvertPamUserDb(Actor): ++ """ ++ Convert the pam_userdb databases to GDBM ++ """ ++ ++ name = 'convert_pam_user_db' ++ consumes = (PamUserDbLocation,) ++ produces = () ++ tags = (PreparationPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ convertpamuserdb.process() +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/libraries/convertpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/libraries/convertpamuserdb.py +new file mode 100644 +index 00000000..e55b4102 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/libraries/convertpamuserdb.py +@@ -0,0 +1,27 @@ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.stdlib import api, CalledProcessError, run ++from leapp.models import PamUserDbLocation ++ ++ ++def _convert_db(db_path): ++ cmd = ['db_converter', '--src', f'{db_path}.db', '--dest', f'{db_path}.gdbm'] ++ try: ++ run(cmd) ++ except (CalledProcessError, OSError) as e: ++ # As the db_converter does not remove the original DB after conversion or upon failure, ++ # interrupt the upgrade, keeping the original DBs. ++ # If all DBs are successfully converted, the leftover DBs are removed in the removeoldpamuserdb actor. ++ raise StopActorExecutionError( ++ 'Cannot convert pam_userdb database.', ++ details={'details': '{}: {}'.format(str(e), e.stderr)} ++ ) ++ ++ ++def process(): ++ msg = next(api.consume(PamUserDbLocation), None) ++ if not msg: ++ raise StopActorExecutionError('Expected PamUserDbLocation, but got None') ++ ++ if msg.locations: ++ for location in msg.locations: ++ _convert_db(location) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/tests/test_convertpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/tests/test_convertpamuserdb.py +new file mode 100644 +index 00000000..46505492 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/convertpamuserdb/tests/test_convertpamuserdb.py +@@ -0,0 +1,39 @@ ++import os ++ ++import pytest ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.actor import convertpamuserdb ++from leapp.libraries.common.testutils import logger_mocked ++from leapp.libraries.stdlib import api, CalledProcessError ++ ++CUR_DIR = os.path.dirname(os.path.abspath(__file__)) ++ ++ ++def test_convert_db_success(monkeypatch): ++ location = os.path.join(CUR_DIR, '/files/db1') ++ ++ def run_mocked(cmd, **kwargs): ++ assert cmd == ['db_converter', '--src', f'{location}.db', '--dest', f'{location}.gdbm'] ++ ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(convertpamuserdb, 'run', run_mocked) ++ convertpamuserdb._convert_db(location) ++ assert len(api.current_logger.errmsg) == 0 ++ ++ ++def test_convert_db_failure(monkeypatch): ++ location = os.path.join(CUR_DIR, '/files/db1') ++ ++ def run_mocked(cmd, **kwargs): ++ raise CalledProcessError( ++ message='A Leapp Command Error occurred.', ++ command=cmd, ++ result={'exit_code': 1} ++ ) ++ ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(convertpamuserdb, 'run', run_mocked) ++ with pytest.raises(StopActorExecutionError) as err: ++ convertpamuserdb._convert_db(location) ++ assert str(err.value) == 'Cannot convert pam_userdb database.' +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/actor.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/actor.py +new file mode 100644 +index 00000000..39a00855 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/actor.py +@@ -0,0 +1,18 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import removeoldpamuserdb ++from leapp.models import PamUserDbLocation ++from leapp.tags import ApplicationsPhaseTag, IPUWorkflowTag ++ ++ ++class RemoveOldPamUserDb(Actor): ++ """ ++ Remove old pam_userdb databases ++ """ ++ ++ name = 'remove_old_pam_user_db' ++ consumes = (PamUserDbLocation,) ++ produces = () ++ tags = (ApplicationsPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ removeoldpamuserdb.process() +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/libraries/removeoldpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/libraries/removeoldpamuserdb.py +new file mode 100644 +index 00000000..5fc4cb4d +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/libraries/removeoldpamuserdb.py +@@ -0,0 +1,25 @@ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.stdlib import api, CalledProcessError, run ++from leapp.models import PamUserDbLocation ++ ++ ++def _remove_db(db_path): ++ cmd = ['rm', '-f', f'{db_path}.db'] ++ try: ++ run(cmd) ++ except (CalledProcessError, OSError) as e: ++ api.current_logger().error( ++ 'Failed to remove {}.db: {}'.format( ++ db_path, e ++ ) ++ ) ++ ++ ++def process(): ++ msg = next(api.consume(PamUserDbLocation), None) ++ if not msg: ++ raise StopActorExecutionError('Expected PamUserDbLocation, but got None') ++ ++ if msg.locations: ++ for location in msg.locations: ++ _remove_db(location) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/tests/test_removeoldpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/tests/test_removeoldpamuserdb.py +new file mode 100644 +index 00000000..2c1d5c75 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/removeoldpamuserdb/tests/test_removeoldpamuserdb.py +@@ -0,0 +1,38 @@ ++import os ++ ++from leapp.libraries.actor import removeoldpamuserdb ++from leapp.libraries.common.testutils import logger_mocked ++from leapp.libraries.stdlib import api, CalledProcessError ++ ++CUR_DIR = os.path.dirname(os.path.abspath(__file__)) ++ ++ ++def test_remove_db_success(monkeypatch): ++ location = os.path.join(CUR_DIR, '/files/db1') ++ ++ def run_mocked(cmd, **kwargs): ++ assert cmd == ['rm', '-f', f'{location}.db'] ++ ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(removeoldpamuserdb, 'run', run_mocked) ++ removeoldpamuserdb._remove_db(location) ++ assert len(api.current_logger.errmsg) == 0 ++ ++ ++def test_remove_db_failure(monkeypatch): ++ location = os.path.join(CUR_DIR, '/files/db1') ++ ++ def run_mocked(cmd, **kwargs): ++ raise CalledProcessError( ++ message='A Leapp Command Error occurred.', ++ command=cmd, ++ result={'exit_code': 1} ++ ) ++ ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(removeoldpamuserdb, 'run', run_mocked) ++ removeoldpamuserdb._remove_db(location) ++ assert ( ++ 'Failed to remove /files/db1.db' ++ not in api.current_logger.errmsg ++ ) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/actor.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/actor.py +new file mode 100644 +index 00000000..b6b35f1a +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/actor.py +@@ -0,0 +1,18 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import scanpamuserdb ++from leapp.models import PamUserDbLocation ++from leapp.tags import FactsPhaseTag, IPUWorkflowTag ++ ++ ++class ScanPamUserDb(Actor): ++ """ ++ Scan the PAM service folder for the location of pam_userdb databases ++ """ ++ ++ name = 'scan_pam_user_db' ++ consumes = () ++ produces = (PamUserDbLocation,) ++ tags = (FactsPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ self.produce(scanpamuserdb.parse_pam_config_folder('/etc/pam.d/')) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/libraries/scanpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/libraries/scanpamuserdb.py +new file mode 100644 +index 00000000..0f668c02 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/libraries/scanpamuserdb.py +@@ -0,0 +1,29 @@ ++import os ++import re ++ ++from leapp.models import PamUserDbLocation ++ ++ ++def _parse_pam_config_file(conf_file): ++ with open(conf_file, 'r') as file: ++ for line in file: ++ if 'pam_userdb' in line: ++ match = re.search(r'db=(\S+)', line) ++ if match: ++ return match.group(1) ++ ++ return None ++ ++ ++def parse_pam_config_folder(conf_folder): ++ locations = set() ++ ++ for file_name in os.listdir(conf_folder): ++ file_path = os.path.join(conf_folder, file_name) ++ ++ if os.path.isfile(file_path): ++ location = _parse_pam_config_file(file_path) ++ if location is not None: ++ locations.add(location) ++ ++ return PamUserDbLocation(locations=list(locations)) +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_basic b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_basic +new file mode 100644 +index 00000000..f115147b +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_basic +@@ -0,0 +1 @@ ++auth required pam_userdb.so db=/tmp/db1 +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_complete b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_complete +new file mode 100644 +index 00000000..84e40b48 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_complete +@@ -0,0 +1,9 @@ ++auth required pam_env.so ++auth required pam_faildelay.so delay=2000000 ++auth sufficient pam_fprintd.so ++auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular ++auth [default=1 ignore=ignore success=ok] pam_localuser.so ++auth required pam_userdb.so db=/tmp/db2 ++auth [default=1 ignore=ignore success=ok] pam_usertype.so isregular ++auth sufficient pam_sss.so forward_pass ++auth required pam_deny.so +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_missing b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_missing +new file mode 100644 +index 00000000..764947fc +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/files/pam_userdb_missing +@@ -0,0 +1 @@ ++auth sufficient pam_unix.so nullok +diff --git a/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/test_scanpamuserdb.py b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/test_scanpamuserdb.py +new file mode 100644 +index 00000000..3b752d87 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/pamuserdb/scanpamuserdb/tests/test_scanpamuserdb.py +@@ -0,0 +1,27 @@ ++import os ++ ++import pytest ++ ++from leapp.libraries.actor import scanpamuserdb ++ ++CUR_DIR = os.path.dirname(os.path.abspath(__file__)) ++ ++ ++@pytest.mark.parametrize( ++ "inp,exp_out", ++ [ ++ ("files/pam_userdb_missing", None), ++ ("files/pam_userdb_basic", "/tmp/db1"), ++ ("files/pam_userdb_complete", "/tmp/db2"), ++ ], ++) ++def test_parse_pam_config_file(inp, exp_out): ++ file = scanpamuserdb._parse_pam_config_file(os.path.join(CUR_DIR, inp)) ++ assert file == exp_out ++ ++ ++def test_parse_pam_config_folder(): ++ msg = scanpamuserdb.parse_pam_config_folder(os.path.join(CUR_DIR, "files/")) ++ assert len(msg.locations) == 2 ++ assert "/tmp/db1" in msg.locations ++ assert "/tmp/db2" in msg.locations +diff --git a/repos/system_upgrade/el9toel10/models/pamuserdblocation.py b/repos/system_upgrade/el9toel10/models/pamuserdblocation.py +new file mode 100644 +index 00000000..d15b2041 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/models/pamuserdblocation.py +@@ -0,0 +1,14 @@ ++from leapp.models import fields, Model ++from leapp.topics import SystemInfoTopic ++ ++ ++class PamUserDbLocation(Model): ++ """ ++ Provides a list of all database files for pam_userdb ++ """ ++ topic = SystemInfoTopic ++ ++ locations = fields.List(fields.String(), default=[]) ++ """ ++ The list with the full path to the database files. ++ """ +-- +2.47.0 + diff --git a/SOURCES/0009-Replace-mirror.centos.org-with-vault.centos.org-Cent.patch b/SOURCES/0009-Replace-mirror.centos.org-with-vault.centos.org-Cent.patch new file mode 100644 index 0000000..4b4012f --- /dev/null +++ b/SOURCES/0009-Replace-mirror.centos.org-with-vault.centos.org-Cent.patch @@ -0,0 +1,31 @@ +From d6e57eec3ded2887008055442ba906a92c572a01 Mon Sep 17 00:00:00 2001 +From: Matej Matuska <mmatuska@redhat.com> +Date: Thu, 10 Oct 2024 14:03:36 +0200 +Subject: [PATCH 09/40] Replace mirror.centos.org with vault.centos.org Centos + 7 Containerfile + +As mirror.centos.org is dead, replace mirrorlist with baseurl pointing +to vault.centos.org in utils/container-builds/Containerfile.centos7. +--- + utils/container-builds/Containerfile.centos7 | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/utils/container-builds/Containerfile.centos7 b/utils/container-builds/Containerfile.centos7 +index 70ac3df1..af00eddb 100644 +--- a/utils/container-builds/Containerfile.centos7 ++++ b/utils/container-builds/Containerfile.centos7 +@@ -2,6 +2,11 @@ FROM centos:7 + + VOLUME /repo + ++# mirror.centos.org is dead, comment out mirrorlist and set baseurl to vault.centos.org ++RUN sed -i s/mirror.centos.org/vault.centos.org/ /etc/yum.repos.d/CentOS-*.repo ++RUN sed -i s/^#\s*baseurl=http/baseurl=http/ /etc/yum.repos.d/CentOS-*.repo ++RUN sed -i s/^mirrorlist=http/#mirrorlist=http/ /etc/yum.repos.d/CentOS-*.repo ++ + RUN yum update -y && \ + yum install -y rpm-build python-devel make git + +-- +2.47.0 + diff --git a/SOURCES/0010-kernelcmdlineconfig-Add-Report-to-produces-tuple.patch b/SOURCES/0010-kernelcmdlineconfig-Add-Report-to-produces-tuple.patch new file mode 100644 index 0000000..94b0260 --- /dev/null +++ b/SOURCES/0010-kernelcmdlineconfig-Add-Report-to-produces-tuple.patch @@ -0,0 +1,35 @@ +From b997e4eeb835809d1fbfd1a0b9a6114c133bf0b4 Mon Sep 17 00:00:00 2001 +From: Matej Matuska <mmatuska@redhat.com> +Date: Thu, 10 Oct 2024 15:28:48 +0200 +Subject: [PATCH 10/40] kernelcmdlineconfig: Add Report to produces tuple + +The missing `leapp.reporting.Report` class is added to +kernelcmdlineconfig actor `produces` tuple. +--- + .../system_upgrade/common/actors/kernelcmdlineconfig/actor.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py +index b44fd835..3585a14e 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py +@@ -4,6 +4,7 @@ from leapp.actors import Actor + from leapp.exceptions import StopActorExecutionError + from leapp.libraries.actor import kernelcmdlineconfig + from leapp.models import FirmwareFacts, InstalledTargetKernelInfo, KernelCmdlineArg, TargetKernelCmdlineArgTasks ++from leapp.reporting import Report + from leapp.tags import FinalizationPhaseTag, IPUWorkflowTag + + +@@ -14,7 +15,7 @@ class KernelCmdlineConfig(Actor): + + name = 'kernelcmdlineconfig' + consumes = (KernelCmdlineArg, InstalledTargetKernelInfo, FirmwareFacts, TargetKernelCmdlineArgTasks) +- produces = () ++ produces = (Report,) + tags = (FinalizationPhaseTag, IPUWorkflowTag) + + def process(self): +-- +2.47.0 + diff --git a/SOURCES/0011-kernelcmdlineconfig-Use-args-from-first-entry-when-m.patch b/SOURCES/0011-kernelcmdlineconfig-Use-args-from-first-entry-when-m.patch new file mode 100644 index 0000000..3c15aa0 --- /dev/null +++ b/SOURCES/0011-kernelcmdlineconfig-Use-args-from-first-entry-when-m.patch @@ -0,0 +1,204 @@ +From c2c96affa7b20c82969419ce49b65cbf646a0c32 Mon Sep 17 00:00:00 2001 +From: Matej Matuska <mmatuska@redhat.com> +Date: Fri, 18 Oct 2024 12:43:19 +0200 +Subject: [PATCH 11/40] kernelcmdlineconfig: Use args from first entry when + multiple entries are listed + +Instead of erroring out when grubby lists multiple entries for the +default kernel, always use the `args=` and `root=` from the first one and create +a post-upgrade report. The report instruct user to ensure those are the +correct ones or to correct them. + +This can happen, for example, if MAKEDEBUG=yes is set in +/etc/sysconfing/kernel. + +Jira: RHEL-46911 +--- + .../libraries/kernelcmdlineconfig.py | 79 ++++++++++++++++--- + .../tests/test_kernelcmdlineconfig.py | 48 ++++++++++- + 2 files changed, 116 insertions(+), 11 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +index 6b261c3b..19c50f3c 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +@@ -109,10 +109,55 @@ def _extract_grubby_value(record): + return matches.group(2) + + ++def report_multple_entries_for_default_kernel(): ++ if use_cmdline_file(): ++ report_hint = ( ++ 'After the system has been rebooted into the new version of RHEL,' ++ ' check that configured default kernel cmdline arguments in /etc/kernel/cmdline ' ++ ' are correct. In case that different arguments are expected, update the file as needed.' ++ ) ++ else: ++ report_hint = ( ++ 'After the system has been rebooted into the new version of RHEL,' ++ ' check that configured default kernel cmdline arguments are set as expected, using' ++ ' the `grub2-editenv list` command. ' ++ ' If different default arguments are expected, update them using grub2-editenv.\n' ++ ' For example, consider that current booted kernel has correct kernel cmdline' ++ ' arguments and /proc/cmdline contains:\n\n' ++ ' BOOT_IMAGE=(hd0,msdos1)/vmlinuz-4.18.0-425.3.1.el8.x86_64' ++ ' root=/dev/mapper/rhel_ibm--root ro console=tty0' ++ ' console=ttyS0,115200 rd_NO_PLYMOUTH\n\n' ++ ' then run the following grub2-editenv command:\n\n' ++ ' # grub2-editenv - set "kernelopts=root=/dev/mapper/rhel_ibm--root' ++ ' ro console=tty0 console=ttyS0,115200 rd_NO_PLYMOUTH"' ++ ) ++ ++ reporting.create_report([ ++ reporting.Title('Ensure that expected default kernel cmdline arguments are set'), ++ reporting.Summary( ++ 'During the upgrade we needed to modify the kernel command line arguments.' ++ ' However, multiple bootloader entries with different arguments were found for the default' ++ ' kernel (perhaps MAKEDEBUG=yes is set in /etc/sysconfig/kernel).' ++ ' Leapp used the arguments from the first found entry of the target kernel' ++ ' and set it as the new default kernel cmdline arguments for kernels installed in the future.' ++ ), ++ reporting.Remediation(hint=report_hint), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Groups([ ++ reporting.Groups.BOOT, ++ reporting.Groups.KERNEL, ++ reporting.Groups.POST, ++ ]), ++ reporting.RelatedResource('file', '/etc/kernel/cmdline'), ++ ]) ++ ++ + def retrieve_args_for_default_kernel(kernel_info): + # Copy the args for the default kernel to all kernels. + kernel_args = None + kernel_root = None ++ detected_multiple_entries = False ++ + cmd = ['grubby', '--info', kernel_info.kernel_img_path] + output = stdlib.run(cmd, split=False) + for record in output['stdout'].splitlines(): +@@ -122,19 +167,30 @@ def retrieve_args_for_default_kernel(kernel_info): + temp_kernel_args = _extract_grubby_value(record) + + if kernel_args: +- api.current_logger().warning('Grubby output is malformed:' +- ' `args=` is listed more than once.') + if kernel_args != temp_kernel_args: +- raise ReadOfKernelArgsError('Grubby listed `args=` multiple' +- ' times with different values.') +- kernel_args = _extract_grubby_value(record) ++ api.current_logger().warning( ++ 'Grubby output listed `args=` multiple times with different values,' ++ ' continuing with the first result' ++ ) ++ detected_multiple_entries = True ++ else: ++ api.current_logger().warning('Grubby output listed `args=` more than once') ++ else: ++ kernel_args = temp_kernel_args + elif record.startswith('root='): +- api.current_logger().warning('Grubby output is malformed:' +- ' `root=` is listed more than once.') ++ temp_kernel_root = _extract_grubby_value(record) ++ + if kernel_root: +- raise ReadOfKernelArgsError('Grubby listed `root=` multiple' +- ' times with different values') +- kernel_root = _extract_grubby_value(record) ++ if kernel_root != temp_kernel_root: ++ api.current_logger().warning( ++ 'Grubby output listed `root=` multiple times with different values,' ++ ' continuing with the first result' ++ ) ++ detected_multiple_entries = True ++ else: ++ api.current_logger().warning('Grubby output listed `root=` more than once') ++ else: ++ kernel_root = temp_kernel_root + + if not kernel_args or not kernel_root: + raise ReadOfKernelArgsError( +@@ -142,6 +198,9 @@ def retrieve_args_for_default_kernel(kernel_info): + ' kernels: root={}, args={}'.format(kernel_root, kernel_args) + ) + ++ if detected_multiple_entries: ++ report_multple_entries_for_default_kernel() ++ + return kernel_root, kernel_args + + +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/tests/test_kernelcmdlineconfig.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/tests/test_kernelcmdlineconfig.py +index ffe4b046..e5759a7b 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/tests/test_kernelcmdlineconfig.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/tests/test_kernelcmdlineconfig.py +@@ -4,11 +4,12 @@ from collections import namedtuple + + import pytest + ++from leapp import reporting + from leapp.exceptions import StopActorExecutionError + from leapp.libraries import stdlib + from leapp.libraries.actor import kernelcmdlineconfig + from leapp.libraries.common.config import architecture +-from leapp.libraries.common.testutils import CurrentActorMocked ++from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked + from leapp.libraries.stdlib import api + from leapp.models import InstalledTargetKernelInfo, KernelCmdlineArg, TargetKernelCmdlineArgTasks + +@@ -183,6 +184,51 @@ def test_kernelcmdline_config_no_version(monkeypatch): + assert not mocked_run.commands + + ++SECOND_KERNEL_ARGS = ( ++ 'ro rootflags=subvol=root' ++ ' resume=/dev/mapper/luks-2c0df999-81ec-4a35-a1f9-b93afee8c6ad' ++ ' rd.luks.uuid=luks-90a6412f-c588-46ca-9118-5aca35943d25' ++ ' rd.luks.uuid=luks-2c0df999-81ec-4a35-a1f9-b93afee8c6ad' ++) ++SECOND_KERNEL_ROOT = 'UUID=1aa15850-2685-418d-95a6-f7266a2de83b' ++ ++ ++@pytest.mark.parametrize( ++ 'second_grubby_output', ++ ( ++ TEMPLATE_GRUBBY_INFO_OUTPUT.format(SECOND_KERNEL_ARGS, SECOND_KERNEL_ROOT), ++ TEMPLATE_GRUBBY_INFO_OUTPUT.format(SAMPLE_KERNEL_ARGS, SECOND_KERNEL_ROOT), ++ TEMPLATE_GRUBBY_INFO_OUTPUT.format(SECOND_KERNEL_ARGS, SAMPLE_KERNEL_ROOT), ++ ) ++) ++def test_kernelcmdline_config_mutiple_args(monkeypatch, second_grubby_output): ++ kernel_img_path = '/boot/vmlinuz-X' ++ kernel_info = InstalledTargetKernelInfo(pkg_nevra=TARGET_KERNEL_NEVRA, ++ uname_r='', ++ kernel_img_path=kernel_img_path, ++ initramfs_path='/boot/initramfs-X') ++ ++ # For this test, we need to check we get the proper report if grubby --info ++ # outputs multiple different `root=` or `args=` ++ # and that the first ones are used ++ grubby_info_output = "\n".join((SAMPLE_GRUBBY_INFO_OUTPUT, second_grubby_output)) ++ ++ mocked_run = MockedRun( ++ outputs={" ".join(("grubby", "--info", kernel_img_path)): grubby_info_output, ++ } ++ ) ++ monkeypatch.setattr(stdlib, 'run', mocked_run) ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked()) ++ monkeypatch.setattr(reporting, "create_report", create_report_mocked()) ++ ++ root, args = kernelcmdlineconfig.retrieve_args_for_default_kernel(kernel_info) ++ assert root == SAMPLE_KERNEL_ROOT ++ assert args == SAMPLE_KERNEL_ARGS ++ assert reporting.create_report.called == 1 ++ expected_title = 'Ensure that expected default kernel cmdline arguments are set' ++ assert expected_title in reporting.create_report.report_fields['title'] ++ ++ + def test_kernelcmdline_config_malformed_args(monkeypatch): + kernel_img_path = '/boot/vmlinuz-X' + kernel_info = InstalledTargetKernelInfo(pkg_nevra=TARGET_KERNEL_NEVRA, +-- +2.47.0 + diff --git a/SOURCES/0012-check_microarch-refactor-to-handle-possible-future-r.patch b/SOURCES/0012-check_microarch-refactor-to-handle-possible-future-r.patch new file mode 100644 index 0000000..dbcfa40 --- /dev/null +++ b/SOURCES/0012-check_microarch-refactor-to-handle-possible-future-r.patch @@ -0,0 +1,216 @@ +From 053137c50d1b060f9e6e6e45d82196b1045391b7 Mon Sep 17 00:00:00 2001 +From: mhecko <mhecko@redhat.com> +Date: Thu, 4 Apr 2024 14:22:48 +0200 +Subject: [PATCH 12/40] check_microarch: refactor to handle possible future + reqs + +--- + .../actors/checkmicroarchitecture/actor.py | 0 + .../libraries/checkmicroarchitecture.py | 73 +++++++++++++++++++ + .../tests/test_checkmicroarchitecture.py | 21 ++++-- + .../libraries/checkmicroarchitecture.py | 46 ------------ + 4 files changed, 87 insertions(+), 53 deletions(-) + rename repos/system_upgrade/{el8toel9 => common}/actors/checkmicroarchitecture/actor.py (100%) + create mode 100644 repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py + rename repos/system_upgrade/{el8toel9 => common}/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py (79%) + delete mode 100644 repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py + +diff --git a/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/actor.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py +similarity index 100% +rename from repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/actor.py +rename to repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py +diff --git a/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py +new file mode 100644 +index 00000000..cc617203 +--- /dev/null ++++ b/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py +@@ -0,0 +1,73 @@ ++from collections import namedtuple ++ ++from leapp import reporting ++from leapp.libraries.common.config.architecture import ARCH_X86_64, matches_architecture ++from leapp.libraries.common.config.version import get_target_major_version ++from leapp.libraries.stdlib import api ++from leapp.models import CPUInfo ++ ++X86_64_BASELINE_FLAGS = ['cmov', 'cx8', 'fpu', 'fxsr', 'mmx', 'syscall', 'sse', 'sse2'] ++X86_64_V2_FLAGS = ['cx16', 'lahf_lm', 'popcnt', 'pni', 'sse4_1', 'sse4_2', 'ssse3'] ++ ++MicroarchInfo = namedtuple('MicroarchInfo', ('required_flags', 'extra_report_fields', 'microarch_ver')) ++ ++ ++def _inhibit_upgrade(missing_flags, target_rhel, microarch_ver, extra_report_fields=None): ++ title = 'Current x86-64 microarchitecture is unsupported in {0}'.format(target_rhel) ++ summary = ('{0} has a higher CPU requirement than older versions, it now requires a CPU ' ++ 'compatible with {1} instruction set or higher.\n\n' ++ 'Missings flags detected are: {2}\n'.format(target_rhel, microarch_ver, ', '.join(missing_flags))) ++ ++ report_fields = [ ++ reporting.Title(title), ++ reporting.Summary(summary), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Groups([reporting.Groups.INHIBITOR]), ++ reporting.Groups([reporting.Groups.SANITY]), ++ reporting.Remediation(hint=('If case of using virtualization, virtualization platforms often allow ' ++ 'configuring a minimum denominator CPU model for compatibility when migrating ' ++ 'between different CPU models. Ensure that minimum requirements are not below ' ++ 'that of {0}\n').format(target_rhel)), ++ ] ++ ++ if extra_report_fields: ++ report_fields += extra_report_fields ++ ++ reporting.create_report(report_fields) ++ ++ ++def process(): ++ """ ++ Check whether the processor matches the required microarchitecture. ++ """ ++ ++ if not matches_architecture(ARCH_X86_64): ++ api.current_logger().info('Architecture not x86-64. Skipping microarchitecture test.') ++ return ++ ++ cpuinfo = next(api.consume(CPUInfo)) ++ ++ rhel9_microarch_article = reporting.ExternalLink( ++ title='Building Red Hat Enterprise Linux 9 for the x86-64-v2 microarchitecture level', ++ url='https://red.ht/rhel-9-intel-microarchitectures' ++ ) ++ ++ rhel_major_to_microarch_reqs = { ++ '9': MicroarchInfo(microarch_ver='x86-64-v2', ++ required_flags=(X86_64_BASELINE_FLAGS + X86_64_V2_FLAGS), ++ extra_report_fields=[rhel9_microarch_article]), ++ } ++ ++ microarch_info = rhel_major_to_microarch_reqs.get(get_target_major_version()) ++ if not microarch_info: ++ api.current_logger().info('No known microarchitecture requirements are known for target RHEL%s.', ++ get_target_major_version()) ++ return ++ ++ missing_flags = [flag for flag in microarch_info.required_flags if flag not in cpuinfo.flags] ++ api.current_logger().debug('Required flags missing: %s', missing_flags) ++ if missing_flags: ++ _inhibit_upgrade(missing_flags, ++ 'RHEL{0}'.format(get_target_major_version()), ++ microarch_info.microarch_ver, ++ extra_report_fields=microarch_info.extra_report_fields) +diff --git a/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +similarity index 79% +rename from repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +rename to repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +index b7c850d9..b0624f2b 100644 +--- a/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py ++++ b/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +@@ -25,7 +25,13 @@ def test_not_x86_64_passes(monkeypatch, arch): + assert not reporting.create_report.called + + +-def test_valid_microarchitecture(monkeypatch): ++@pytest.mark.parametrize( ++ ('target_ver', 'cpu_flags'), ++ [ ++ ('9.0', checkmicroarchitecture.X86_64_BASELINE_FLAGS + checkmicroarchitecture.X86_64_V2_FLAGS) ++ ] ++) ++def test_valid_microarchitecture(monkeypatch, target_ver, cpu_flags): + """ + Test no report is generated on a valid microarchitecture + """ +@@ -33,9 +39,8 @@ def test_valid_microarchitecture(monkeypatch): + monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + +- required_flags = checkmicroarchitecture.X86_64_BASELINE_FLAGS + checkmicroarchitecture.X86_64_V2_FLAGS +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(arch=ARCH_X86_64, +- msgs=[CPUInfo(flags=required_flags)])) ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(arch=ARCH_X86_64, dst_ver=target_ver, ++ msgs=[CPUInfo(flags=cpu_flags)])) + + checkmicroarchitecture.process() + +@@ -43,14 +48,16 @@ def test_valid_microarchitecture(monkeypatch): + assert not reporting.create_report.called + + +-def test_invalid_microarchitecture(monkeypatch): ++@pytest.mark.parametrize('target_ver', ['9.0']) ++def test_invalid_microarchitecture(monkeypatch, target_ver): + """ + Test report is generated on x86-64 architecture with invalid microarchitecture and the upgrade is inhibited + """ + + monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(arch=ARCH_X86_64, msgs=[CPUInfo()])) ++ monkeypatch.setattr(api, 'current_actor', ++ CurrentActorMocked(arch=ARCH_X86_64, msgs=[CPUInfo()], dst_ver=target_ver)) + + checkmicroarchitecture.process() + +@@ -60,6 +67,6 @@ def test_invalid_microarchitecture(monkeypatch): + assert 'Architecture not x86-64. Skipping microarchitecture test.' not in api.current_logger().infomsg + assert reporting.create_report.called == 1 + assert 'microarchitecture is unsupported' in produced_title +- assert 'RHEL9 has a higher CPU requirement' in produced_summary ++ assert 'has a higher CPU requirement' in produced_summary + assert reporting.create_report.report_fields['severity'] == reporting.Severity.HIGH + assert is_inhibitor(reporting.create_report.report_fields) +diff --git a/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py b/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py +deleted file mode 100644 +index 9c083d7e..00000000 +--- a/repos/system_upgrade/el8toel9/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py ++++ /dev/null +@@ -1,46 +0,0 @@ +-from leapp import reporting +-from leapp.libraries.common.config.architecture import ARCH_X86_64, matches_architecture +-from leapp.libraries.stdlib import api +-from leapp.models import CPUInfo +- +-X86_64_BASELINE_FLAGS = ['cmov', 'cx8', 'fpu', 'fxsr', 'mmx', 'syscall', 'sse', 'sse2'] +-X86_64_V2_FLAGS = ['cx16', 'lahf_lm', 'popcnt', 'pni', 'sse4_1', 'sse4_2', 'ssse3'] +- +- +-def _inhibit_upgrade(missing_flags): +- title = 'Current x86-64 microarchitecture is unsupported in RHEL9' +- summary = ('RHEL9 has a higher CPU requirement than older versions, it now requires a CPU ' +- 'compatible with x86-64-v2 instruction set or higher.\n\n' +- 'Missings flags detected are: {}\n'.format(', '.join(missing_flags))) +- +- reporting.create_report([ +- reporting.Title(title), +- reporting.Summary(summary), +- reporting.ExternalLink(title='Building Red Hat Enterprise Linux 9 for the x86-64-v2 microarchitecture level', +- url='https://red.ht/rhel-9-intel-microarchitectures'), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Groups([reporting.Groups.INHIBITOR]), +- reporting.Groups([reporting.Groups.SANITY]), +- reporting.Remediation(hint=('If case of using virtualization, virtualization platforms often allow ' +- 'configuring a minimum denominator CPU model for compatibility when migrating ' +- 'between different CPU models. Ensure that minimum requirements are not below ' +- 'that of RHEL9\n')), +- ]) +- +- +-def process(): +- """ +- Check whether the processor matches the required microarchitecture. +- """ +- +- if not matches_architecture(ARCH_X86_64): +- api.current_logger().info('Architecture not x86-64. Skipping microarchitecture test.') +- return +- +- cpuinfo = next(api.consume(CPUInfo)) +- +- required_flags = X86_64_BASELINE_FLAGS + X86_64_V2_FLAGS +- missing_flags = [flag for flag in required_flags if flag not in cpuinfo.flags] +- api.current_logger().debug('Required flags missing: %s', missing_flags) +- if missing_flags: +- _inhibit_upgrade(missing_flags) +-- +2.47.0 + diff --git a/SOURCES/0013-check_microarch-add-rhel10-requirements.patch b/SOURCES/0013-check_microarch-add-rhel10-requirements.patch new file mode 100644 index 0000000..b2cce6c --- /dev/null +++ b/SOURCES/0013-check_microarch-add-rhel10-requirements.patch @@ -0,0 +1,133 @@ +From d3ebc990ba65801fbed2aaf1dce8329698667d1c Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Wed, 28 Aug 2024 12:18:40 +0200 +Subject: [PATCH 13/40] check_microarch: add rhel10 requirements + +--- + .../actors/checkmicroarchitecture/actor.py | 13 ++++++++++-- + .../libraries/checkmicroarchitecture.py | 8 +++++-- + .../tests/test_checkmicroarchitecture.py | 21 ++++++++++++++----- + 3 files changed, 33 insertions(+), 9 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py +index 98ffea80..bb342f2f 100644 +--- a/repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py ++++ b/repos/system_upgrade/common/actors/checkmicroarchitecture/actor.py +@@ -17,7 +17,8 @@ class CheckMicroarchitecture(Actor): + levels. + + RHEL9 has a higher CPU requirement than older versions, it now requires a +- CPU compatible with ``x86-64-v2`` instruction set or higher. ++ CPU compatible with ``x86-64-v2`` instruction set or higher. Similarly, ++ RHEL10 requires at least ``x86-64-v3`` instruction set. + + .. table:: Required CPU features by microarchitecure level with a + corresponding flag as shown by ``lscpu``. +@@ -43,7 +44,15 @@ class CheckMicroarchitecture(Actor): + | | SSE4_2 | sse4_2 | + | | SSSE3 | ssse3 | + +------------+-------------+--------------------+ +- | ... | | | ++ | x86-64-v3 | AVX | avx | ++ | | AVX2 | avx2 | ++ | | BMI1 | bmi1 | ++ | | BMI2 | bmi2 | ++ | | F16C | f16c | ++ | | FMA | fma | ++ | | LZCNT | abm | ++ | | MOVBE | movbe | ++ | | OSXSAVE | xsave | + +------------+-------------+--------------------+ + + Note: To get the corresponding flag for the CPU feature consult the file +diff --git a/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py +index cc617203..94e85e3e 100644 +--- a/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py ++++ b/repos/system_upgrade/common/actors/checkmicroarchitecture/libraries/checkmicroarchitecture.py +@@ -8,6 +8,7 @@ from leapp.models import CPUInfo + + X86_64_BASELINE_FLAGS = ['cmov', 'cx8', 'fpu', 'fxsr', 'mmx', 'syscall', 'sse', 'sse2'] + X86_64_V2_FLAGS = ['cx16', 'lahf_lm', 'popcnt', 'pni', 'sse4_1', 'sse4_2', 'ssse3'] ++X86_64_V3_FLAGS = ['avx2', 'bmi1', 'bmi2', 'f16c', 'fma', 'abm', 'movbe', 'xsave'] + + MicroarchInfo = namedtuple('MicroarchInfo', ('required_flags', 'extra_report_fields', 'microarch_ver')) + +@@ -16,7 +17,7 @@ def _inhibit_upgrade(missing_flags, target_rhel, microarch_ver, extra_report_fie + title = 'Current x86-64 microarchitecture is unsupported in {0}'.format(target_rhel) + summary = ('{0} has a higher CPU requirement than older versions, it now requires a CPU ' + 'compatible with {1} instruction set or higher.\n\n' +- 'Missings flags detected are: {2}\n'.format(target_rhel, microarch_ver, ', '.join(missing_flags))) ++ 'Missings flags detected are: {2}\n').format(target_rhel, microarch_ver, ', '.join(missing_flags)) + + report_fields = [ + reporting.Title(title), +@@ -24,7 +25,7 @@ def _inhibit_upgrade(missing_flags, target_rhel, microarch_ver, extra_report_fie + reporting.Severity(reporting.Severity.HIGH), + reporting.Groups([reporting.Groups.INHIBITOR]), + reporting.Groups([reporting.Groups.SANITY]), +- reporting.Remediation(hint=('If case of using virtualization, virtualization platforms often allow ' ++ reporting.Remediation(hint=('If a case of using virtualization, virtualization platforms often allow ' + 'configuring a minimum denominator CPU model for compatibility when migrating ' + 'between different CPU models. Ensure that minimum requirements are not below ' + 'that of {0}\n').format(target_rhel)), +@@ -56,6 +57,9 @@ def process(): + '9': MicroarchInfo(microarch_ver='x86-64-v2', + required_flags=(X86_64_BASELINE_FLAGS + X86_64_V2_FLAGS), + extra_report_fields=[rhel9_microarch_article]), ++ '10': MicroarchInfo(microarch_ver='x86-64-v3', ++ required_flags=(X86_64_BASELINE_FLAGS + X86_64_V2_FLAGS + X86_64_V3_FLAGS), ++ extra_report_fields=[]), + } + + microarch_info = rhel_major_to_microarch_reqs.get(get_target_major_version()) +diff --git a/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py b/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +index b0624f2b..eeca8be0 100644 +--- a/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py ++++ b/repos/system_upgrade/common/actors/checkmicroarchitecture/tests/test_checkmicroarchitecture.py +@@ -25,10 +25,15 @@ def test_not_x86_64_passes(monkeypatch, arch): + assert not reporting.create_report.called + + ++ENTIRE_V2_FLAG_SET = checkmicroarchitecture.X86_64_BASELINE_FLAGS + checkmicroarchitecture.X86_64_V2_FLAGS ++ENTIRE_V3_FLAG_SET = ENTIRE_V2_FLAG_SET + checkmicroarchitecture.X86_64_V3_FLAGS ++ ++ + @pytest.mark.parametrize( + ('target_ver', 'cpu_flags'), + [ +- ('9.0', checkmicroarchitecture.X86_64_BASELINE_FLAGS + checkmicroarchitecture.X86_64_V2_FLAGS) ++ ('9.0', ENTIRE_V2_FLAG_SET), ++ ('10.0', ENTIRE_V3_FLAG_SET) + ] + ) + def test_valid_microarchitecture(monkeypatch, target_ver, cpu_flags): +@@ -48,16 +53,22 @@ def test_valid_microarchitecture(monkeypatch, target_ver, cpu_flags): + assert not reporting.create_report.called + + +-@pytest.mark.parametrize('target_ver', ['9.0']) +-def test_invalid_microarchitecture(monkeypatch, target_ver): ++@pytest.mark.parametrize( ++ ('target_ver', 'cpu_flags'), ++ ( ++ ('9.0', checkmicroarchitecture.X86_64_BASELINE_FLAGS), ++ ('10.0', ENTIRE_V2_FLAG_SET), ++ ) ++) ++def test_invalid_microarchitecture(monkeypatch, target_ver, cpu_flags): + """ + Test report is generated on x86-64 architecture with invalid microarchitecture and the upgrade is inhibited + """ +- ++ cpu_info = CPUInfo(flags=cpu_flags) + monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + monkeypatch.setattr(api, 'current_actor', +- CurrentActorMocked(arch=ARCH_X86_64, msgs=[CPUInfo()], dst_ver=target_ver)) ++ CurrentActorMocked(arch=ARCH_X86_64, msgs=[cpu_info], dst_ver=target_ver)) + + checkmicroarchitecture.process() + +-- +2.47.0 + diff --git a/SOURCES/0014-Skip-checking-files-under-.-directory-hash-dir.patch b/SOURCES/0014-Skip-checking-files-under-.-directory-hash-dir.patch new file mode 100644 index 0000000..599c247 --- /dev/null +++ b/SOURCES/0014-Skip-checking-files-under-.-directory-hash-dir.patch @@ -0,0 +1,44 @@ +From a14793892bafaad0802844cbb56be3be3220eb47 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Wed, 25 Sep 2024 17:29:02 +0200 +Subject: [PATCH 14/40] Skip checking files under .../directory-hash/ dir + +* The main reason for this change is to improve performance and +reduce flood of logs for the content that does not seem to be important +to check for the upgrade process. + +The directory has been relatively recently added to ca-certificates +rpm on EL 9+ systems mostly to improve performance of OpenSSL and +the content does not seem to be important for the IPU process. +The high number of files takes too much time to evaluate and causes +flood of logs that are not important. + +This is updated solution that we drop originally: 60f500e59bb92 +--- + .../targetuserspacecreator/libraries/userspacegen.py | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py b/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py +index cd2d7d6e..d7698056 100644 +--- a/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py ++++ b/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py +@@ -311,6 +311,16 @@ def _get_files_owned_by_rpms(context, dirpath, pkgs=None, recursive=False): + searchdir = context.full_path(dirpath) + if recursive: + for root, _, files in os.walk(searchdir): ++ if '/directory-hash/' in root: ++ # tl;dr; for the performance improvement ++ # The directory has been relatively recently added to ca-certificates ++ # rpm on EL 9+ systems and the content does not seem to be important ++ # for the IPU process. Also, it contains high number of files and ++ # their processing floods the output and slows down IPU. ++ # So skipping it entirely. ++ # This is updated solution that we drop originally: 60f500e59bb92 ++ api.current_logger().debug('SKIP files in the {} directory: Not important for the IPU.'.format(root)) ++ continue + for filename in files: + relpath = os.path.relpath(os.path.join(root, filename), searchdir) + file_list.append(relpath) +-- +2.47.0 + diff --git a/SOURCES/0015-lib-overlay-cap-the-max-size-of-disk-images.patch b/SOURCES/0015-lib-overlay-cap-the-max-size-of-disk-images.patch new file mode 100644 index 0000000..738a4bd --- /dev/null +++ b/SOURCES/0015-lib-overlay-cap-the-max-size-of-disk-images.patch @@ -0,0 +1,66 @@ +From cef2825778eb63f95e13cf48b1683bc98c32c21b Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Fri, 25 Oct 2024 16:33:38 +0200 +Subject: [PATCH 15/40] lib(overlay): cap the max size of disk images + +On systems with large disks (e.g. 16TB) with lots of free space, leapp +might attemt to create files larger than the max file size of the +underlying FS. Attempting to create such large files causes leapp +to crash. This patch caps the max image size to 1TB, based on empirical +evidence that more free space is not needed for the upgrade RPM +transaction. + +Jira-ref: RHEL-57064 +--- + .../common/libraries/overlaygen.py | 28 +++++++++++++++++++ + 1 file changed, 28 insertions(+) + +diff --git a/repos/system_upgrade/common/libraries/overlaygen.py b/repos/system_upgrade/common/libraries/overlaygen.py +index c1ac9ad3..867e3559 100644 +--- a/repos/system_upgrade/common/libraries/overlaygen.py ++++ b/repos/system_upgrade/common/libraries/overlaygen.py +@@ -68,6 +68,27 @@ or close to that size, stay always with this minimal protected size defined by + this constant. + """ + ++_MAX_DISK_IMAGE_SIZE_MB = 2**20 # 1*TB ++""" ++Maximum size of the created (sparse) images. ++ ++Defaults to 1TB. If a disk with capacity larger than _MAX_DISK_IMAGE_SIZE_MB ++is mounted on the system, the corresponding image used to store overlay ++modifications will be capped to _MAX_DISK_IMAGE_SIZE_MB. ++ ++Engineering rationale: ++ This constant was introduced to prevent leapp from creating files that are ++ virtually larger than the maximum file size supported by the file system. ++ E.g. if the source system hosts /var/lib/leapp on EXT4, then we cannot ++ create a file larger than 16TB. ++ We create these "disk images" to be able to verify the system has enough ++ disk space to perform the RPM upgrade transaction. From our experience, ++ we are not aware of any system which could have installed so much content ++ by RPMs that we would need 1TB of the free space on a single FS. Therefore, ++ we consider this value as safe while preventing us from exceeding FS ++ limits. ++""" ++ + + MountPoints = namedtuple('MountPoints', ['fs_file', 'fs_vfstype']) + +@@ -287,6 +308,13 @@ def _prepare_required_mounts(scratch_dir, mounts_dir, storage_info, scratch_rese + disk_size = _get_fspace(mountpoint, convert_to_mibs=True, coefficient=0.95) + if mountpoint == scratch_mp: + disk_size = scratch_disk_size ++ ++ if disk_size > _MAX_DISK_IMAGE_SIZE_MB: ++ msg = ('Image for overlayfs corresponding to the disk mounted at %s would ideally have %d MB, ' ++ 'but we truncate it to %d MB to avoid bumping to max file limits.') ++ api.current_logger().info(msg, mountpoint, disk_size, _MAX_DISK_IMAGE_SIZE_MB) ++ disk_size = _MAX_DISK_IMAGE_SIZE_MB ++ + image = _create_mount_disk_image(disk_images_directory, mountpoint, disk_size) + result[mountpoint] = mounting.LoopMount( + source=image, +-- +2.47.0 + diff --git a/SOURCES/0016-Raise-proper-error-when-ModelViolationError-occurs.patch b/SOURCES/0016-Raise-proper-error-when-ModelViolationError-occurs.patch new file mode 100644 index 0000000..8008b54 --- /dev/null +++ b/SOURCES/0016-Raise-proper-error-when-ModelViolationError-occurs.patch @@ -0,0 +1,168 @@ +From ec078243771f8ef43853bd242175a612fe84f95b Mon Sep 17 00:00:00 2001 +From: tomasfratrik <tomasfratrik8@gmail.com> +Date: Wed, 17 Jul 2024 12:12:50 +0200 +Subject: [PATCH 16/40] Raise proper error when ModelViolationError occurs + +This error occurs when repo file has invalid definition, specifically +when the 'name' entry of the config files is invalid. Also add tests. + +Jira: RHEL-19249 +--- + .../systemfacts/libraries/systemfacts.py | 13 ++++++++- + .../systemfacts/tests/test_systemfacts.py | 24 ++++++++++++++++- + .../common/libraries/repofileutils.py | 17 +++++++++++- + .../libraries/tests/test_repofileutils.py | 27 +++++++++++++++++++ + 4 files changed, 78 insertions(+), 3 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/systemfacts/libraries/systemfacts.py b/repos/system_upgrade/common/actors/systemfacts/libraries/systemfacts.py +index d1eeb28c..f16cea1d 100644 +--- a/repos/system_upgrade/common/actors/systemfacts/libraries/systemfacts.py ++++ b/repos/system_upgrade/common/actors/systemfacts/libraries/systemfacts.py +@@ -217,7 +217,18 @@ def get_sysctls_status(): + + def get_repositories_status(): + """ Get a basic information about YUM repositories installed in the system """ +- return RepositoriesFacts(repositories=repofileutils.get_parsed_repofiles()) ++ try: ++ return RepositoriesFacts(repositories=repofileutils.get_parsed_repofiles()) ++ except repofileutils.InvalidRepoDefinition as e: ++ raise StopActorExecutionError( ++ message=str(e), ++ details={ ++ 'hint': 'For more directions on how to resolve the issue, see: {url}.' ++ .format( ++ url='https://access.redhat.com/solutions/6969001' ++ ) ++ } ++ ) + + + def get_selinux_status(): +diff --git a/repos/system_upgrade/common/actors/systemfacts/tests/test_systemfacts.py b/repos/system_upgrade/common/actors/systemfacts/tests/test_systemfacts.py +index badf174c..5831b979 100644 +--- a/repos/system_upgrade/common/actors/systemfacts/tests/test_systemfacts.py ++++ b/repos/system_upgrade/common/actors/systemfacts/tests/test_systemfacts.py +@@ -3,7 +3,16 @@ import pwd + + import pytest + +-from leapp.libraries.actor.systemfacts import _get_system_groups, _get_system_users, anyendswith, anyhasprefix, aslist ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.actor.systemfacts import ( ++ _get_system_groups, ++ _get_system_users, ++ anyendswith, ++ anyhasprefix, ++ aslist, ++ get_repositories_status ++) ++from leapp.libraries.common import repofileutils + from leapp.libraries.common.testutils import logger_mocked + from leapp.libraries.stdlib import api + from leapp.snactor.fixture import current_actor_libraries +@@ -116,3 +125,16 @@ def test_get_system_groups(monkeypatch, etc_group_names, skipped_group_names): + assert group_name not in api.current_logger().dbgmsg[0] + else: + assert not api.current_logger().dbgmsg ++ ++ ++def test_failed_parsed_repofiles(monkeypatch): ++ def _raise_invalidrepo_error(): ++ raise repofileutils.InvalidRepoDefinition(msg='mocked error', ++ repofile='/etc/yum.repos.d/mock.repo', ++ repoid='mocked repoid') ++ ++ monkeypatch.setattr(repofileutils, 'get_parsed_repofiles', _raise_invalidrepo_error) ++ monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ ++ with pytest.raises(StopActorExecutionError): ++ get_repositories_status() +diff --git a/repos/system_upgrade/common/libraries/repofileutils.py b/repos/system_upgrade/common/libraries/repofileutils.py +index a563be52..cab3c42b 100644 +--- a/repos/system_upgrade/common/libraries/repofileutils.py ++++ b/repos/system_upgrade/common/libraries/repofileutils.py +@@ -11,6 +11,16 @@ except ImportError: + api.current_logger().warning('repofileutils.py: failed to import dnf') + + ++class InvalidRepoDefinition(Exception): ++ """Raised when a repository definition is invalid.""" ++ def __init__(self, msg, repofile, repoid): ++ message = 'Invalid repository definition: {repoid} in: {repofile}: {msg}'.format( ++ repoid=repoid, repofile=repofile, msg=msg) ++ super(InvalidRepoDefinition, self).__init__(message) ++ self.repofile = repofile ++ self.repoid = repoid ++ ++ + def _parse_repository(repoid, repo_data): + def asbool(x): + return x == '1' +@@ -33,12 +43,17 @@ def parse_repofile(repofile): + :param repofile: Path to the repo file + :type repofile: str + :rtype: RepositoryFile ++ :raises InvalidRepoDefinition: If the repository definition is invalid, ++ this can for example occur if 'name' field in repository is missing or it is invalid. + """ + data = [] + with open(repofile, mode='r') as fp: + cp = utils.parse_config(fp, strict=False) + for repoid in cp.sections(): +- data.append(_parse_repository(repoid, dict(cp.items(repoid)))) ++ try: ++ data.append(_parse_repository(repoid, dict(cp.items(repoid)))) ++ except fields.ModelViolationError as e: ++ raise InvalidRepoDefinition(e, repofile=repofile, repoid=repoid) + return RepositoryFile(file=repofile, data=data) + + +diff --git a/repos/system_upgrade/common/libraries/tests/test_repofileutils.py b/repos/system_upgrade/common/libraries/tests/test_repofileutils.py +index 51cc1c11..42c7e49e 100644 +--- a/repos/system_upgrade/common/libraries/tests/test_repofileutils.py ++++ b/repos/system_upgrade/common/libraries/tests/test_repofileutils.py +@@ -1,7 +1,10 @@ + import json + import os + ++import pytest ++ + from leapp.libraries.common import repofileutils ++from leapp.models.fields import ModelViolationError + + CUR_DIR = os.path.dirname(os.path.abspath(__file__)) + +@@ -12,6 +15,30 @@ def test_invert_dict(): + assert inv_dict == {'a': [1], 'b': [1, 2]} + + ++@pytest.mark.parametrize( ++ ('repoid', 'data'), ++ ( ++ ('missing-name', {'baseurl': 'http://example.com', 'enabled': '1', 'gpgcheck': '1'}), ++ (None, {'name': 'name', 'baseurl': 'http://example.com', 'enabled': '1', 'gpgcheck': '1'}), ++ ('name-none', {'name': None, 'baseurl': 'http://example.com', 'enabled': '1', 'gpgcheck': '1'}), ++ ('baseurl-true', {'name': 'valid', 'baseurl': True, 'enabled': '1', 'gpgcheck': '1'}), ++ ) ++) ++def test__parse_repository_missing_name(repoid, data): ++ with pytest.raises(ModelViolationError): ++ repofileutils._parse_repository(repoid, data) ++ ++ ++def test_parse_repofile_error(monkeypatch): ++ def _parse_repository_mocked(*args, **kwargs): ++ raise ModelViolationError('') ++ ++ monkeypatch.setattr(repofileutils, '_parse_repository', _parse_repository_mocked) ++ ++ with pytest.raises(repofileutils.InvalidRepoDefinition): ++ repofileutils.parse_repofile(os.path.join(CUR_DIR, 'sample_repos.txt')) ++ ++ + def test_parse_repofile(): + repofile = repofileutils.parse_repofile(os.path.join(CUR_DIR, 'sample_repos.txt')) + +-- +2.47.0 + diff --git a/SOURCES/0017-InhibitWhenLuks-simplify-the-logic.patch b/SOURCES/0017-InhibitWhenLuks-simplify-the-logic.patch new file mode 100644 index 0000000..5a91114 --- /dev/null +++ b/SOURCES/0017-InhibitWhenLuks-simplify-the-logic.patch @@ -0,0 +1,56 @@ +From f84c6f808a821d3ccd09a4a8278cef9c09984a28 Mon Sep 17 00:00:00 2001 +From: Daniel Zatovic <daniel.zatovic@gmail.com> +Date: Wed, 3 Apr 2024 23:25:06 +0200 +Subject: [PATCH 17/40] InhibitWhenLuks: simplify the logic + +--- + .../common/actors/inhibitwhenluks/actor.py | 35 +++++++------------ + 1 file changed, 13 insertions(+), 22 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py b/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py +index d3ff2d2e..40b845b0 100644 +--- a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py ++++ b/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py +@@ -24,26 +24,17 @@ class InhibitWhenLuks(Actor): + ceph_info = next(self.consume(CephInfo)) + if ceph_info: + ceph_vol = ceph_info.encrypted_volumes[:] +- for storage_info in self.consume(StorageInfo): +- for blk in storage_info.lsblk: +- if blk.tp == 'crypt' and blk.name not in ceph_vol: +- create_report([ +- reporting.Title('LUKS encrypted partition detected'), +- reporting.Summary('Upgrading system with encrypted partitions is not supported'), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), +- reporting.Groups([reporting.Groups.INHIBITOR]), +- ]) +- break + except StopIteration: +- for storage_info in self.consume(StorageInfo): +- for blk in storage_info.lsblk: +- if blk.tp == 'crypt': +- create_report([ +- reporting.Title('LUKS encrypted partition detected'), +- reporting.Summary('Upgrading system with encrypted partitions is not supported'), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), +- reporting.Groups([reporting.Groups.INHIBITOR]), +- ]) +- break ++ pass ++ ++ for storage_info in self.consume(StorageInfo): ++ for blk in storage_info.lsblk: ++ if blk.tp == 'crypt' and blk.name not in ceph_vol: ++ create_report([ ++ reporting.Title('LUKS encrypted partition detected'), ++ reporting.Summary('Upgrading system with encrypted partitions is not supported'), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), ++ reporting.Groups([reporting.Groups.INHIBITOR]), ++ ]) ++ break +-- +2.47.0 + diff --git a/SOURCES/0018-StorageScanner-Add-parent-device-name-to-lsblk.patch b/SOURCES/0018-StorageScanner-Add-parent-device-name-to-lsblk.patch new file mode 100644 index 0000000..ff85cb8 --- /dev/null +++ b/SOURCES/0018-StorageScanner-Add-parent-device-name-to-lsblk.patch @@ -0,0 +1,271 @@ +From 03fc6743b8916f23f6a213e3f0fc3020ee141b96 Mon Sep 17 00:00:00 2001 +From: Daniel Zatovic <daniel.zatovic@gmail.com> +Date: Wed, 3 Apr 2024 23:42:45 +0200 +Subject: [PATCH 18/40] StorageScanner: Add parent device name to lsblk + +Modify the StorageInfo model to include path and name of the parent +device. Use StorageScanner to collect this information. + +Morover fix lsblk test, there should be a full device path in "lsblk +-pbnr" output (just names were used in the original test). +--- + .../tests/test_inhibitwhenluks.py | 12 +-- + .../libraries/storagescanner.py | 29 +++++-- + .../tests/unit_test_storagescanner.py | 78 +++++++++++++++---- + .../common/models/storageinfo.py | 2 + + .../tests/unit_test_vdoconversionscanner.py | 4 +- + 5 files changed, 95 insertions(+), 30 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py b/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py +index fee50f9d..405a3429 100644 +--- a/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py ++++ b/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py +@@ -5,8 +5,8 @@ from leapp.utils.report import is_inhibitor + + + def test_actor_with_luks(current_actor_context): +- with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', +- size='10G', bsize=10*(1 << 39), ro='0', tp='crypt', mountpoint='')] ++ with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', size='10G', bsize=10*(1 << 39), ++ ro='0', tp='crypt', mountpoint='', parent_name='', parent_path='')] + + current_actor_context.feed(StorageInfo(lsblk=with_luks)) + current_actor_context.run() +@@ -16,8 +16,8 @@ def test_actor_with_luks(current_actor_context): + + + def test_actor_with_luks_ceph_only(current_actor_context): +- with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', +- size='10G', bsize=10*(1 << 39), ro='0', tp='crypt', mountpoint='')] ++ with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', size='10G', bsize=10*(1 << 39), ++ ro='0', tp='crypt', mountpoint='', parent_name='', parent_path='')] + ceph_volume = ['luks-132'] + current_actor_context.feed(StorageInfo(lsblk=with_luks)) + current_actor_context.feed(CephInfo(encrypted_volumes=ceph_volume)) +@@ -26,8 +26,8 @@ def test_actor_with_luks_ceph_only(current_actor_context): + + + def test_actor_without_luks(current_actor_context): +- without_luks = [LsblkEntry(name='sda1', kname='sda1', maj_min='8:0', rm='0', +- size='10G', bsize=10*(1 << 39), ro='0', tp='part', mountpoint='/boot')] ++ without_luks = [LsblkEntry(name='sda1', kname='sda1', maj_min='8:0', rm='0', size='10G', bsize=10*(1 << 39), ++ ro='0', tp='part', mountpoint='/boot', parent_name='', parent_path='')] + + current_actor_context.feed(StorageInfo(lsblk=without_luks)) + current_actor_context.run() +diff --git a/repos/system_upgrade/common/actors/storagescanner/libraries/storagescanner.py b/repos/system_upgrade/common/actors/storagescanner/libraries/storagescanner.py +index f15f0d87..cad6bd32 100644 +--- a/repos/system_upgrade/common/actors/storagescanner/libraries/storagescanner.py ++++ b/repos/system_upgrade/common/actors/storagescanner/libraries/storagescanner.py +@@ -164,18 +164,31 @@ def _get_mount_info(path): + ) + + ++def _get_lsblk_info_for_devpath(dev_path): ++ lsblk_cmd = ['lsblk', '-nr', '--output', 'NAME,KNAME,SIZE', dev_path] ++ lsblk_info_for_devpath = next(_get_cmd_output(lsblk_cmd, ' ', 3), None) ++ ++ return lsblk_info_for_devpath ++ ++ + @aslist + def _get_lsblk_info(): + """ Collect storage info from lsblk command """ +- cmd = ['lsblk', '-pbnr', '--output', 'NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINT'] +- for entry in _get_cmd_output(cmd, ' ', 7): +- dev_path, maj_min, rm, bsize, ro, tp, mountpoint = entry +- lsblk_cmd = ['lsblk', '-nr', '--output', 'NAME,KNAME,SIZE', dev_path] +- lsblk_info_for_devpath = next(_get_cmd_output(lsblk_cmd, ' ', 3), None) ++ cmd = ['lsblk', '-pbnr', '--output', 'NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINT,PKNAME'] ++ for entry in _get_cmd_output(cmd, ' ', 8): ++ dev_path, maj_min, rm, bsize, ro, tp, mountpoint, parent_path = entry ++ ++ lsblk_info_for_devpath = _get_lsblk_info_for_devpath(dev_path) + if not lsblk_info_for_devpath: + return +- + name, kname, size = lsblk_info_for_devpath ++ ++ parent_name = "" ++ if parent_path: ++ parent_info = _get_lsblk_info_for_devpath(parent_path) ++ if parent_info: ++ parent_name, _, _ = parent_info ++ + yield LsblkEntry( + name=name, + kname=kname, +@@ -185,7 +198,9 @@ def _get_lsblk_info(): + bsize=int(bsize), + ro=ro, + tp=tp, +- mountpoint=mountpoint) ++ mountpoint=mountpoint, ++ parent_name=parent_name, ++ parent_path=parent_path) + + + @aslist +diff --git a/repos/system_upgrade/common/actors/storagescanner/tests/unit_test_storagescanner.py b/repos/system_upgrade/common/actors/storagescanner/tests/unit_test_storagescanner.py +index 4dc11ea4..456e40ec 100644 +--- a/repos/system_upgrade/common/actors/storagescanner/tests/unit_test_storagescanner.py ++++ b/repos/system_upgrade/common/actors/storagescanner/tests/unit_test_storagescanner.py +@@ -255,13 +255,18 @@ def test_get_lsblk_info(monkeypatch): + bytes_per_gb = 1 << 30 + + def get_cmd_output_mocked(cmd, delim, expected_len): +- if cmd == ['lsblk', '-pbnr', '--output', 'NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINT']: ++ if cmd == ['lsblk', '-pbnr', '--output', 'NAME,MAJ:MIN,RM,SIZE,RO,TYPE,MOUNTPOINT,PKNAME']: + output_lines_split_on_whitespace = [ +- ['vda', '252:0', '0', str(40 * bytes_per_gb), '0', 'disk', ''], +- ['vda1', '252:1', '0', str(1 * bytes_per_gb), '0', 'part', '/boot'], +- ['vda2', '252:2', '0', str(39 * bytes_per_gb), '0', 'part', ''], +- ['rhel_ibm--p8--kvm--03--guest--02-root', '253:0', '0', str(38 * bytes_per_gb), '0', 'lvm', '/'], +- ['rhel_ibm--p8--kvm--03--guest--02-swap', '253:1', '0', str(1 * bytes_per_gb), '0', 'lvm', '[SWAP]'] ++ ['/dev/vda', '252:0', '0', str(40 * bytes_per_gb), '0', 'disk', '', ''], ++ ['/dev/vda1', '252:1', '0', str(1 * bytes_per_gb), '0', 'part', '/boot', ''], ++ ['/dev/vda2', '252:2', '0', str(39 * bytes_per_gb), '0', 'part', '', ''], ++ ['/dev/mapper/rhel_ibm--p8--kvm--03--guest--02-root', '253:0', '0', str(38 * bytes_per_gb), '0', 'lvm', ++ '/', ''], ++ ['/dev/mapper/rhel_ibm--p8--kvm--03--guest--02-swap', '253:1', '0', str(1 * bytes_per_gb), '0', 'lvm', ++ '[SWAP]', ''], ++ ['/dev/mapper/luks-01b60fff-a2a8-4c03-893f-056bfc3f06f6', '254:0', '0', str(38 * bytes_per_gb), '0', ++ 'crypt', '', '/dev/nvme0n1p1'], ++ ['/dev/nvme0n1p1', '259:1', '0', str(39 * bytes_per_gb), '0', 'part', '', '/dev/nvme0n1'], + ] + for output_line_parts in output_lines_split_on_whitespace: + yield output_line_parts +@@ -269,11 +274,17 @@ def test_get_lsblk_info(monkeypatch): + # We cannot have the output in a list, since the command is called per device. Therefore, we have to map + # each device path to its output. + output_lines_split_on_whitespace_per_device = { +- 'vda': ['vda', 'vda', '40G'], +- 'vda1': ['vda1', 'vda1', '1G'], +- 'vda2': ['vda2', 'vda2', '39G'], +- 'rhel_ibm--p8--kvm--03--guest--02-root': ['rhel_ibm--p8--kvm--03--guest--02-root', 'kname1', '38G'], +- 'rhel_ibm--p8--kvm--03--guest--02-swap': ['rhel_ibm--p8--kvm--03--guest--02-swap', 'kname2', '1G'] ++ '/dev/vda': ['vda', 'vda', '40G'], ++ '/dev/vda1': ['vda1', 'vda1', '1G'], ++ '/dev/vda2': ['vda2', 'vda2', '39G'], ++ '/dev/mapper/rhel_ibm--p8--kvm--03--guest--02-root': ++ ['rhel_ibm--p8--kvm--03--guest--02-root', 'kname1', '38G'], ++ '/dev/mapper/rhel_ibm--p8--kvm--03--guest--02-swap': ++ ['rhel_ibm--p8--kvm--03--guest--02-swap', 'kname2', '1G'], ++ '/dev/mapper/luks-01b60fff-a2a8-4c03-893f-056bfc3f06f6': ++ ['luks-01b60fff-a2a8-4c03-893f-056bfc3f06f6', 'dm-0', '38G'], ++ '/dev/nvme0n1p1': ['nvme0n1p1', 'nvme0n1p1', '39G'], ++ '/dev/nvme0n1': ['nvme0n1', 'nvme0n1', '40G'], + } + dev_path = cmd[4] + if dev_path not in output_lines_split_on_whitespace_per_device: +@@ -294,7 +305,9 @@ def test_get_lsblk_info(monkeypatch): + bsize=40 * bytes_per_gb, + ro='0', + tp='disk', +- mountpoint=''), ++ mountpoint='', ++ parent_name='', ++ parent_path=''), + LsblkEntry( + name='vda1', + kname='vda1', +@@ -304,7 +317,9 @@ def test_get_lsblk_info(monkeypatch): + bsize=1 * bytes_per_gb, + ro='0', + tp='part', +- mountpoint='/boot'), ++ mountpoint='/boot', ++ parent_name='', ++ parent_path=''), + LsblkEntry( + name='vda2', + kname='vda2', +@@ -314,7 +329,9 @@ def test_get_lsblk_info(monkeypatch): + bsize=39 * bytes_per_gb, + ro='0', + tp='part', +- mountpoint=''), ++ mountpoint='', ++ parent_name='', ++ parent_path=''), + LsblkEntry( + name='rhel_ibm--p8--kvm--03--guest--02-root', + kname='kname1', +@@ -324,7 +341,9 @@ def test_get_lsblk_info(monkeypatch): + bsize=38 * bytes_per_gb, + ro='0', + tp='lvm', +- mountpoint='/'), ++ mountpoint='/', ++ parent_name='', ++ parent_path=''), + LsblkEntry( + name='rhel_ibm--p8--kvm--03--guest--02-swap', + kname='kname2', +@@ -334,7 +353,34 @@ def test_get_lsblk_info(monkeypatch): + bsize=1 * bytes_per_gb, + ro='0', + tp='lvm', +- mountpoint='[SWAP]')] ++ mountpoint='[SWAP]', ++ parent_name='', ++ parent_path=''), ++ LsblkEntry( ++ name='luks-01b60fff-a2a8-4c03-893f-056bfc3f06f6', ++ kname='dm-0', ++ maj_min='254:0', ++ rm='0', ++ size='38G', ++ bsize=38 * bytes_per_gb, ++ ro='0', ++ tp='crypt', ++ mountpoint='', ++ parent_name='nvme0n1p1', ++ parent_path='/dev/nvme0n1p1'), ++ LsblkEntry( ++ name='nvme0n1p1', ++ kname='nvme0n1p1', ++ maj_min='259:1', ++ rm='0', ++ size='39G', ++ bsize=39 * bytes_per_gb, ++ ro='0', ++ tp='part', ++ mountpoint='', ++ parent_name='nvme0n1', ++ parent_path='/dev/nvme0n1'), ++ ] + + actual = storagescanner._get_lsblk_info() + assert expected == actual +diff --git a/repos/system_upgrade/common/models/storageinfo.py b/repos/system_upgrade/common/models/storageinfo.py +index 5bb9caac..71e7459d 100644 +--- a/repos/system_upgrade/common/models/storageinfo.py ++++ b/repos/system_upgrade/common/models/storageinfo.py +@@ -43,6 +43,8 @@ class LsblkEntry(Model): + ro = fields.String() + tp = fields.String() + mountpoint = fields.String() ++ parent_name = fields.String() ++ parent_path = fields.String() + + + class PvsEntry(Model): +diff --git a/repos/system_upgrade/el8toel9/actors/vdoconversionscanner/tests/unit_test_vdoconversionscanner.py b/repos/system_upgrade/el8toel9/actors/vdoconversionscanner/tests/unit_test_vdoconversionscanner.py +index 0745c91d..4d6ef0dc 100644 +--- a/repos/system_upgrade/el8toel9/actors/vdoconversionscanner/tests/unit_test_vdoconversionscanner.py ++++ b/repos/system_upgrade/el8toel9/actors/vdoconversionscanner/tests/unit_test_vdoconversionscanner.py +@@ -26,7 +26,9 @@ def _lsblk_entry(prefix, number, types, size='128G', bsize=2 ** 37): + bsize=bsize, + ro='0', + tp=types[random.randint(0, len(types) - 1)], +- mountpoint='') ++ mountpoint='', ++ parent_name='', ++ parent_path='') + + + @aslist +-- +2.47.0 + diff --git a/SOURCES/0019-LuksScanner-Add-LUKS-dump-scanner-and-models.patch b/SOURCES/0019-LuksScanner-Add-LUKS-dump-scanner-and-models.patch new file mode 100644 index 0000000..3eaa137 --- /dev/null +++ b/SOURCES/0019-LuksScanner-Add-LUKS-dump-scanner-and-models.patch @@ -0,0 +1,1030 @@ +From 266c2495b144aa13d96f72c276d7b94638e3a6b7 Mon Sep 17 00:00:00 2001 +From: Daniel Zatovic <daniel.zatovic@gmail.com> +Date: Tue, 16 Apr 2024 17:04:41 +0200 +Subject: [PATCH 19/40] LuksScanner: Add LUKS dump scanner and models + +Add LuksScanner actor that runs 'cryptsetup luksDump' for all 'crypt' +from lsblk output. The output is then parsed and filled into LuksDump +and LuksToken models. + +The LuksDump model contains information about LUKS version, device UUID, +corresponding device path, name of the backing device (which contains +the LUKS header) and a list of LuksToken models. + +LuksToken model represents a token associated with the given LUKS +device. It contains token ID, IDs of associated keyslot and token type. +If the token type is "clevis", we use "clevis luks list" command to +determine the clevis-specific subtype and append it to the token name. +E.g. if there is a "clevis" token and "clevis luks list" returns "tpm2", +the token type will be "clevis-tpm2". +--- + .../common/actors/luksscanner/actor.py | 23 ++ + .../luksscanner/libraries/luksdump_parser.py | 199 ++++++++++++++++++ + .../luksscanner/libraries/luksscanner.py | 125 +++++++++++ + .../tests/files/luksDump_luks1.txt | 27 +++ + .../tests/files/luksDump_nvme0n1p3_luks1.txt | 27 +++ + .../tests/files/luksDump_nvme0n1p3_luks2.txt | 43 ++++ + .../files/luksDump_nvme0n1p3_luks2_tokens.txt | 119 +++++++++++ + .../luksscanner/tests/test_luksdump_parser.py | 147 +++++++++++++ + .../luksscanner/tests/test_luksscaner.py | 142 +++++++++++++ + .../system_upgrade/common/models/luksdump.py | 73 +++++++ + 10 files changed, 925 insertions(+) + create mode 100644 repos/system_upgrade/common/actors/luksscanner/actor.py + create mode 100755 repos/system_upgrade/common/actors/luksscanner/libraries/luksdump_parser.py + create mode 100644 repos/system_upgrade/common/actors/luksscanner/libraries/luksscanner.py + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_luks1.txt + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks1.txt + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2.txt + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2_tokens.txt + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py + create mode 100644 repos/system_upgrade/common/actors/luksscanner/tests/test_luksscaner.py + create mode 100644 repos/system_upgrade/common/models/luksdump.py + +diff --git a/repos/system_upgrade/common/actors/luksscanner/actor.py b/repos/system_upgrade/common/actors/luksscanner/actor.py +new file mode 100644 +index 00000000..a163374b +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/actor.py +@@ -0,0 +1,23 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import luksscanner ++from leapp.models import LuksDumps, StorageInfo ++from leapp.reporting import Report ++from leapp.tags import FactsPhaseTag, IPUWorkflowTag ++ ++ ++class LuksScanner(Actor): ++ """ ++ Provides data about active LUKS devices. ++ ++ Scans all block devices of 'crypt' type and attempts to run 'cryptsetup luksDump' on them. ++ For every 'crypt' device a LuksDump model is produced. Furthermore, if there is any LUKS token ++ of type clevis, the concrete subtype is determined using 'clevis luks list'. ++ """ ++ ++ name = 'luks_scanner' ++ consumes = (StorageInfo,) ++ produces = (Report, LuksDumps) ++ tags = (IPUWorkflowTag, FactsPhaseTag) ++ ++ def process(self): ++ self.produce(luksscanner.get_luks_dumps_model()) +diff --git a/repos/system_upgrade/common/actors/luksscanner/libraries/luksdump_parser.py b/repos/system_upgrade/common/actors/luksscanner/libraries/luksdump_parser.py +new file mode 100755 +index 00000000..44113d0e +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/libraries/luksdump_parser.py +@@ -0,0 +1,199 @@ ++class LuksDumpParser(object): ++ """ ++ Class for parsing "cryptsetup luksDump" output. Given a list of lines, it ++ generates a dictionary representing the dump. ++ """ ++ ++ class Node(object): ++ """ ++ Helper class, every line is represented as a node. The node depth is ++ based on the indentation of the line. A dictionary is produced after ++ all lines are inserted. ++ """ ++ ++ def __init__(self, indented_line): ++ self.children = [] ++ self.level = len(indented_line) - len(indented_line.lstrip()) ++ self.text = indented_line.strip() ++ ++ def add_children(self, nodes): ++ # NOTE(pstodulk): it's expected that nodes are non-empty list and ++ # having it empty is an error if it happens. So keeping a hard crash ++ # for now as having an empty list it's hypothetical now and I would ++ # probably end with en error anyway if discovered. ++ childlevel = nodes[0].level ++ while nodes: ++ node = nodes.pop(0) ++ if node.level == childlevel: # add node as a child ++ self.children.append(node) ++ elif node.level > childlevel: # add nodes as grandchildren of the last child ++ nodes.insert(0, node) ++ self.children[-1].add_children(nodes) ++ elif node.level <= self.level: # this node is a sibling, no more children ++ nodes.insert(0, node) ++ return ++ ++ def as_dict(self): ++ if len(self.children) > 1: ++ children = [node.as_dict() for node in self.children] ++ ++ return {self.text: LuksDumpParser._merge_list(children)} ++ if len(self.children) == 1: ++ return {self.text: self.children[0].as_dict()} ++ return self.text ++ ++ @staticmethod ++ def _count_type(elem_list, elem_type): ++ """ Count the number of items of elem_type inside the elem_list """ ++ return sum(isinstance(x, elem_type) for x in elem_list) ++ ++ @staticmethod ++ def _merge_list(elem_list): ++ """ ++ Given a list of elements merge them into a single element. If all ++ elements are strings, concatenate them into a single string. When all ++ the elements are dictionaries merge them into a single dictionary ++ containing the keys/values from all of the dictionaries. ++ """ ++ ++ dict_count = LuksDumpParser._count_type(elem_list, dict) ++ str_count = LuksDumpParser._count_type(elem_list, str) ++ ++ result = elem_list ++ if dict_count == len(elem_list): ++ result = {} ++ for element in elem_list: ++ result.update(element) ++ elif str_count == len(elem_list): ++ result = "".join(elem_list) ++ ++ return result ++ ++ @staticmethod ++ def _find_single_str(elem_list): ++ """ If the list contains exactly one string return it or return None otherwise. """ ++ ++ result = None ++ ++ for elem in elem_list: ++ if isinstance(elem, str): ++ if result is not None: ++ # more than one strings in the list ++ return None ++ result = elem ++ ++ return result ++ ++ @staticmethod ++ def _fixup_type(elem_list, type_string): ++ single_string = LuksDumpParser._find_single_str(elem_list) ++ ++ if single_string is not None: ++ elem_list.remove(single_string) ++ elem_list.append({type_string: single_string}) ++ ++ @staticmethod ++ def _fixup_section(section, type_string): ++ for key, value in section.items(): ++ LuksDumpParser._fixup_type(value, type_string) ++ section[key] = LuksDumpParser._merge_list(section[key]) ++ ++ @staticmethod ++ def _fixup_dict(parsed_dict): ++ """ Various fixups of the parsed dictionary """ ++ ++ if "Version" not in parsed_dict: ++ return ++ if parsed_dict["Version"] == "1": ++ for i in range(8): ++ keyslot = "Key Slot {}".format(i) ++ ++ if keyslot not in parsed_dict: ++ continue ++ ++ if parsed_dict[keyslot] in ["ENABLED", "DISABLED"]: ++ parsed_dict[keyslot] = {"enabled": parsed_dict[keyslot] == "ENABLED"} ++ ++ if not isinstance(parsed_dict[keyslot], list): ++ continue ++ ++ enabled = None ++ if "ENABLED" in parsed_dict[keyslot]: ++ enabled = True ++ parsed_dict[keyslot].remove("ENABLED") ++ if "DISABLED" in parsed_dict[keyslot]: ++ enabled = False ++ parsed_dict[keyslot].remove("DISABLED") ++ parsed_dict[keyslot] = LuksDumpParser._merge_list(parsed_dict[keyslot]) ++ if enabled is not None: ++ parsed_dict[keyslot]["enabled"] = enabled ++ elif parsed_dict["Version"] == "2": ++ for section in ["Keyslots", "Digests", "Data segments", "Tokens"]: ++ if section in parsed_dict: ++ LuksDumpParser._fixup_section(parsed_dict[section], "type") ++ ++ @staticmethod ++ def _fixup_dump(dump): ++ """ ++ Replace tabs with spaces, for lines with colon a move the text ++ after column on new line with the indent of the following line. ++ """ ++ ++ dump = [line.replace("\t", " "*8).replace("\n", "") for line in dump] ++ newdump = [] ++ ++ for i, line in enumerate(dump): ++ if not line.strip(): ++ continue ++ ++ if ':' in line: ++ first_half = line.split(":")[0] ++ second_half = ":".join(line.split(":")[1:]).lstrip() ++ ++ current_level = len(line) - len(line.lstrip()) ++ if i+1 < len(dump): ++ next_level = len(dump[i+1]) - len(dump[i+1].lstrip()) ++ else: ++ next_level = current_level ++ ++ if next_level > current_level: ++ second_half = " " * next_level + second_half ++ else: ++ second_half = " " * (current_level + 8) + second_half ++ ++ newdump.append(first_half) ++ if second_half.strip(): ++ newdump.append(second_half) ++ else: ++ newdump.append(line) ++ ++ return newdump ++ ++ @staticmethod ++ def parse(dump): ++ """ ++ Parse the output of "cryptsetup luksDump" command into a dictionary. ++ ++ :param dump: List of output lines of luksDump ++ :returns: Parsed dictionary ++ """ ++ ++ root = LuksDumpParser.Node('root') ++ ++ nodes = [] ++ for line in LuksDumpParser._fixup_dump(dump): ++ nodes.append(LuksDumpParser.Node(line)) ++ ++ root.add_children(nodes) ++ root = root.as_dict()['root'] ++ ++ if isinstance(root, list): ++ result = {} ++ for child in root: ++ if isinstance(child, str): ++ child = {child: {}} ++ result.update(child) ++ root = result ++ ++ LuksDumpParser._fixup_dict(root) ++ return root +diff --git a/repos/system_upgrade/common/actors/luksscanner/libraries/luksscanner.py b/repos/system_upgrade/common/actors/luksscanner/libraries/luksscanner.py +new file mode 100644 +index 00000000..1c7822a5 +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/libraries/luksscanner.py +@@ -0,0 +1,125 @@ ++import functools ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries import stdlib ++from leapp.libraries.actor.luksdump_parser import LuksDumpParser ++from leapp.libraries.stdlib import api ++from leapp.models import LuksDump, LuksDumps, LuksToken, StorageInfo ++ ++ ++def aslist(f): ++ """ Decorator used to convert generator to list """ ++ @functools.wraps(f) ++ def inner(*args, **kwargs): ++ return list(f(*args, **kwargs)) ++ return inner ++ ++ ++def _get_clevis_type(device_path, keyslot): ++ """ ++ Assuming the device is initialized using clevis, determine the type of ++ clevis token associated to the specified keyslot. ++ """ ++ try: ++ result = stdlib.run(["clevis", "luks", "list", "-d", device_path, "-s", str(keyslot)]) ++ except OSError: ++ message = ('A LUKS drive with clevis token was discovered, but there is ' ++ 'no clevis package installed. The clevis command is required ' ++ 'to determine clevis token type.') ++ details = {'hint': 'Use dnf to install the "clevis-luks" package.'} ++ raise StopActorExecutionError(message=message, details=details) ++ except stdlib.CalledProcessError as e: ++ api.current_logger().debug("clevis list command failed with an error code: {}".format(e.exit_code)) ++ ++ message = ('The "clevis luks list" command failed. This' ++ 'might be because the clevis-luks package is' ++ 'missing on your system.') ++ details = {'hint': 'Use dnf to install the "clevis-luks" package.'} ++ raise StopActorExecutionError(message=message, details=details) ++ ++ line = result["stdout"].split() ++ if len(line) != 3: ++ raise StopActorExecutionError( ++ 'Invalid "clevis list" output detected' ++ ) ++ ++ return "clevis-{}".format(line[1]) ++ ++ ++@aslist ++def _get_tokens(device_path, luksdump_dict): ++ """ Given a parsed LUKS dump, produce a list of tokens """ ++ if "Version" not in luksdump_dict or luksdump_dict["Version"] != '2': ++ return ++ if "Tokens" not in luksdump_dict: ++ raise StopActorExecutionError( ++ 'No tokens in cryptsetup luksDump output' ++ ) ++ ++ for token_id in luksdump_dict["Tokens"]: ++ token = luksdump_dict["Tokens"][token_id] ++ ++ if "Keyslot" not in token or "type" not in token: ++ raise StopActorExecutionError( ++ 'Token specification does not contain keyslot or type', ++ ) ++ keyslot = int(token["Keyslot"]) ++ token_type = token["type"] ++ ++ if token_type == "clevis": ++ token_type = _get_clevis_type(device_path, keyslot) ++ ++ yield LuksToken( ++ token_id=int(token_id), ++ keyslot=keyslot, ++ token_type=token_type ++ ) ++ ++ ++def get_luks_dump_by_device(device_path, device_name): ++ """ Determine info about LUKS device using cryptsetup and clevis commands """ ++ ++ try: ++ result = stdlib.run(['cryptsetup', 'luksDump', device_path]) ++ luksdump_dict = LuksDumpParser.parse(result["stdout"].splitlines()) ++ ++ version = int(luksdump_dict["Version"]) if "Version" in luksdump_dict else None ++ uuid = luksdump_dict["UUID"] if "UUID" in luksdump_dict else None ++ if version is None or uuid is None: ++ api.current_logger().error( ++ 'Failed to detect UUID or version from the output "cryptsetup luksDump {}" command'.format(device_path) ++ ) ++ raise StopActorExecutionError( ++ 'Failed to detect UUID or version from the output "cryptsetup luksDump {}" command'.format(device_path) ++ ) ++ ++ return LuksDump( ++ version=version, ++ uuid=uuid, ++ device_path=device_path, ++ device_name=device_name, ++ tokens=_get_tokens(device_path, luksdump_dict) ++ ) ++ ++ except (OSError, stdlib.CalledProcessError) as ex: ++ api.current_logger().error( ++ 'Failed to execute "cryptsetup luksDump" command: {}'.format(ex) ++ ) ++ raise StopActorExecutionError( ++ 'Failed to execute "cryptsetup luksDump {}" command'.format(device_path), ++ details={'details': str(ex)} ++ ) ++ ++ ++@aslist ++def get_luks_dumps(): ++ """ Collect info abaout every active LUKS device """ ++ ++ for storage_info in api.consume(StorageInfo): ++ for blk in storage_info.lsblk: ++ if blk.tp == 'crypt' and blk.parent_path: ++ yield get_luks_dump_by_device(blk.parent_path, blk.parent_name) ++ ++ ++def get_luks_dumps_model(): ++ return LuksDumps(dumps=get_luks_dumps()) +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_luks1.txt b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_luks1.txt +new file mode 100644 +index 00000000..e22cc8ce +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_luks1.txt +@@ -0,0 +1,27 @@ ++LUKS header information for /dev/loop10 ++ ++Version: 1 ++Cipher name: aes ++Cipher mode: xts-plain64 ++Hash spec: sha256 ++Payload offset: 4096 ++MK bits: 512 ++MK digest: fb ec 6b 31 ae e4 49 03 3e ad 43 22 02 cf a8 78 ad 3c d2 a8 ++MK salt: 17 57 4e 2f ed 0b 5c 62 d5 de 54 f5 7f ab 60 68 ++ 71 d8 72 06 64 6c 81 05 39 55 3f 55 32 56 d9 da ++MK iterations: 114573 ++UUID: 90242257-d00a-4019-aba6-03083f89404b ++ ++Key Slot 0: ENABLED ++ Iterations: 1879168 ++ Salt: fc 77 48 72 bd 31 ca 83 23 80 5a 5e b9 5b de bb ++ 55 ac d5 a9 3b 96 ad a5 82 bc 11 68 ba f8 87 56 ++ Key material offset: 8 ++ AF stripes: 4000 ++Key Slot 1: DISABLED ++Key Slot 2: DISABLED ++Key Slot 3: DISABLED ++Key Slot 4: DISABLED ++Key Slot 5: DISABLED ++Key Slot 6: DISABLED ++Key Slot 7: DISABLED +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks1.txt b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks1.txt +new file mode 100644 +index 00000000..e22cc8ce +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks1.txt +@@ -0,0 +1,27 @@ ++LUKS header information for /dev/loop10 ++ ++Version: 1 ++Cipher name: aes ++Cipher mode: xts-plain64 ++Hash spec: sha256 ++Payload offset: 4096 ++MK bits: 512 ++MK digest: fb ec 6b 31 ae e4 49 03 3e ad 43 22 02 cf a8 78 ad 3c d2 a8 ++MK salt: 17 57 4e 2f ed 0b 5c 62 d5 de 54 f5 7f ab 60 68 ++ 71 d8 72 06 64 6c 81 05 39 55 3f 55 32 56 d9 da ++MK iterations: 114573 ++UUID: 90242257-d00a-4019-aba6-03083f89404b ++ ++Key Slot 0: ENABLED ++ Iterations: 1879168 ++ Salt: fc 77 48 72 bd 31 ca 83 23 80 5a 5e b9 5b de bb ++ 55 ac d5 a9 3b 96 ad a5 82 bc 11 68 ba f8 87 56 ++ Key material offset: 8 ++ AF stripes: 4000 ++Key Slot 1: DISABLED ++Key Slot 2: DISABLED ++Key Slot 3: DISABLED ++Key Slot 4: DISABLED ++Key Slot 5: DISABLED ++Key Slot 6: DISABLED ++Key Slot 7: DISABLED +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2.txt b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2.txt +new file mode 100644 +index 00000000..407261f4 +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2.txt +@@ -0,0 +1,43 @@ ++LUKS header information ++Version: 2 ++Epoch: 3 ++Metadata area: 16384 [bytes] ++Keyslots area: 16744448 [bytes] ++UUID: dfd8db30-2b65-4be9-8cae-65f5fac4a06f ++Label: (no label) ++Subsystem: (no subsystem) ++Flags: (no flags) ++ ++Data segments: ++ 0: crypt ++ offset: 16777216 [bytes] ++ length: (whole device) ++ cipher: aes-xts-plain64 ++ sector: 512 [bytes] ++ ++Keyslots: ++ 0: luks2 ++ Key: 512 bits ++ Priority: normal ++ Cipher: aes-xts-plain64 ++ Cipher key: 512 bits ++ PBKDF: argon2id ++ Time cost: 7 ++ Memory: 1048576 ++ Threads: 4 ++ Salt: 1d d5 97 97 dd 45 e2 d7 2b a7 0b fa c4 7f b3 f4 ++ ef 4e 5f 95 e0 ba fd 7a 7e 36 02 69 f8 44 96 d8 ++ AF stripes: 4000 ++ AF hash: sha256 ++ Area offset:32768 [bytes] ++ Area length:258048 [bytes] ++ Digest ID: 0 ++Tokens: ++Digests: ++ 0: pbkdf2 ++ Hash: sha256 ++ Iterations: 99750 ++ Salt: 10 1d a1 21 8b 93 dc bb f1 ab 2b 1b 89 8e 3d c4 ++ 18 07 51 08 ef f5 95 da 9f 85 fa d7 de c9 c4 96 ++ Digest: 4f 27 4c 19 ae 72 b1 75 ef 53 c0 6d ff db 7f fe ++ f1 67 d0 c3 67 03 0c 14 3a 6f 6a 1a 87 a8 6f 32 +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2_tokens.txt b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2_tokens.txt +new file mode 100644 +index 00000000..c2a7464c +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/files/luksDump_nvme0n1p3_luks2_tokens.txt +@@ -0,0 +1,119 @@ ++LUKS header information ++Version: 2 ++Epoch: 9 ++Metadata area: 16384 [bytes] ++Keyslots area: 16744448 [bytes] ++UUID: 6b929b85-b01e-4aa3-8ad2-a05decae6e3d ++Label: (no label) ++Subsystem: (no subsystem) ++Flags: (no flags) ++ ++Data segments: ++ 0: crypt ++ offset: 16777216 [bytes] ++ length: (whole device) ++ cipher: aes-xts-plain64 ++ sector: 512 [bytes] ++ ++Keyslots: ++ 0: luks2 ++ Key: 512 bits ++ Priority: normal ++ Cipher: aes-xts-plain64 ++ Cipher key: 512 bits ++ PBKDF: argon2id ++ Time cost: 7 ++ Memory: 1048576 ++ Threads: 4 ++ Salt: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ AF stripes: 4000 ++ AF hash: sha256 ++ Area offset:32768 [bytes] ++ Area length:258048 [bytes] ++ Digest ID: 0 ++ 1: luks2 ++ Key: 512 bits ++ Priority: normal ++ Cipher: aes-xts-plain64 ++ Cipher key: 512 bits ++ PBKDF: pbkdf2 ++ Hash: sha256 ++ Iterations: 1000 ++ Salt: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ AF stripes: 4000 ++ AF hash: sha256 ++ Area offset:290816 [bytes] ++ Area length:258048 [bytes] ++ Digest ID: 0 ++ 2: luks2 ++ Key: 512 bits ++ Priority: normal ++ Cipher: aes-xts-plain64 ++ Cipher key: 512 bits ++ PBKDF: pbkdf2 ++ Hash: sha256 ++ Iterations: 1000 ++ Salt: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ AF stripes: 4000 ++ AF hash: sha256 ++ Area offset:548864 [bytes] ++ Area length:258048 [bytes] ++ Digest ID: 0 ++ 3: luks2 ++ Key: 512 bits ++ Priority: normal ++ Cipher: aes-xts-plain64 ++ Cipher key: 512 bits ++ PBKDF: pbkdf2 ++ Hash: sha512 ++ Iterations: 1000 ++ Salt: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ AF stripes: 4000 ++ AF hash: sha512 ++ Area offset:806912 [bytes] ++ Area length:258048 [bytes] ++ Digest ID: 0 ++Tokens: ++ 0: clevis ++ Keyslot: 1 ++ 1: clevis ++ Keyslot: 2 ++ 2: systemd-tpm2 ++ tpm2-hash-pcrs: 7 ++ tpm2-pcr-bank: sha256 ++ tpm2-pubkey: ++ (null) ++ tpm2-pubkey-pcrs: n/a ++ tpm2-primary-alg: ecc ++ tpm2-blob: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ tpm2-policy-hash: ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ tpm2-pin: false ++ tpm2-salt: false ++ Keyslot: 3 ++Digests: ++ 0: pbkdf2 ++ Hash: sha256 ++ Iterations: 117448 ++ Salt: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ Digest: de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd ++ de a1 b9 7f 03 cb b4 89 e2 52 20 fc e4 24 65 cd +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py +new file mode 100644 +index 00000000..4b190149 +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksdump_parser.py +@@ -0,0 +1,147 @@ ++import os ++ ++from leapp.libraries.actor.luksdump_parser import LuksDumpParser ++from leapp.snactor.fixture import current_actor_context ++ ++CUR_DIR = os.path.dirname(os.path.abspath(__file__)) ++ ++ ++def test_luksdump_parser_luks1(current_actor_context): ++ f = open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks1.txt')) ++ parsed_dict = LuksDumpParser.parse(f.readlines()) ++ ++ assert parsed_dict["Version"] == "1" ++ assert parsed_dict["Cipher name"] == "aes" ++ assert parsed_dict["Cipher mode"] == "xts-plain64" ++ assert parsed_dict["Hash spec"] == "sha256" ++ assert parsed_dict["Payload offset"] == "4096" ++ assert parsed_dict["MK bits"] == "512" ++ assert parsed_dict["MK digest"].replace(" ", "") == "fbec6b31aee449033ead432202cfa878ad3cd2a8" ++ assert parsed_dict["MK salt"].replace(" ", "") == "17574e2fed0b5c62d5de54f57fab6068"\ ++ "71d87206646c810539553f553256d9da" ++ assert parsed_dict["MK iterations"] == "114573" ++ assert parsed_dict["UUID"] == "90242257-d00a-4019-aba6-03083f89404b" ++ ++ assert parsed_dict["Key Slot 0"]["enabled"] ++ assert parsed_dict["Key Slot 0"]["Iterations"] == "1879168" ++ assert parsed_dict["Key Slot 0"]["Salt"].replace(" ", "") == "fc774872bd31ca8323805a5eb95bdebb" \ ++ "55acd5a93b96ada582bc1168baf88756" ++ assert parsed_dict["Key Slot 0"]["Key material offset"] == "8" ++ assert parsed_dict["Key Slot 0"]["AF stripes"] == "4000" ++ ++ assert not parsed_dict["Key Slot 1"]["enabled"] ++ assert not parsed_dict["Key Slot 2"]["enabled"] ++ assert not parsed_dict["Key Slot 3"]["enabled"] ++ assert not parsed_dict["Key Slot 4"]["enabled"] ++ assert not parsed_dict["Key Slot 5"]["enabled"] ++ assert not parsed_dict["Key Slot 6"]["enabled"] ++ assert not parsed_dict["Key Slot 7"]["enabled"] ++ ++ ++def test_luksdump_parser_luks2_tokens(current_actor_context): ++ f = open(os.path.join(CUR_DIR, 'files/luksDump_nvme0n1p3_luks2_tokens.txt')) ++ parsed_dict = LuksDumpParser.parse(f.readlines()) ++ ++ assert parsed_dict["Version"] == "2" ++ assert parsed_dict["Epoch"] == "9" ++ assert parsed_dict["Metadata area"] == "16384 [bytes]" ++ assert parsed_dict["Keyslots area"] == "16744448 [bytes]" ++ assert parsed_dict["UUID"] == "6b929b85-b01e-4aa3-8ad2-a05decae6e3d" ++ assert parsed_dict["Label"] == "(no label)" ++ assert parsed_dict["Subsystem"] == "(no subsystem)" ++ assert parsed_dict["Flags"] == "(no flags)" ++ ++ assert len(parsed_dict["Data segments"]) == 1 ++ assert parsed_dict["Data segments"]["0"]["type"] == "crypt" ++ assert parsed_dict["Data segments"]["0"]["offset"] == "16777216 [bytes]" ++ assert parsed_dict["Data segments"]["0"]["length"] == "(whole device)" ++ assert parsed_dict["Data segments"]["0"]["cipher"] == "aes-xts-plain64" ++ assert parsed_dict["Data segments"]["0"]["sector"] == "512 [bytes]" ++ ++ assert len(parsed_dict["Keyslots"]) == 4 ++ assert parsed_dict["Keyslots"]["0"]["type"] == "luks2" ++ assert parsed_dict["Keyslots"]["0"]["Key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["0"]["Priority"] == "normal" ++ assert parsed_dict["Keyslots"]["0"]["Cipher"] == "aes-xts-plain64" ++ assert parsed_dict["Keyslots"]["0"]["Cipher key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["0"]["PBKDF"] == "argon2id" ++ assert parsed_dict["Keyslots"]["0"]["Time cost"] == "7" ++ assert parsed_dict["Keyslots"]["0"]["Memory"] == "1048576" ++ assert parsed_dict["Keyslots"]["0"]["Threads"] == "4" ++ assert parsed_dict["Keyslots"]["0"]["Salt"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Keyslots"]["0"]["AF stripes"] == "4000" ++ assert parsed_dict["Keyslots"]["0"]["AF hash"] == "sha256" ++ assert parsed_dict["Keyslots"]["0"]["Area offset"] == "32768 [bytes]" ++ assert parsed_dict["Keyslots"]["0"]["Area length"] == "258048 [bytes]" ++ assert parsed_dict["Keyslots"]["0"]["Digest ID"] == "0" ++ ++ assert parsed_dict["Keyslots"]["1"]["type"] == "luks2" ++ assert parsed_dict["Keyslots"]["1"]["Key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["1"]["Priority"] == "normal" ++ assert parsed_dict["Keyslots"]["1"]["Cipher"] == "aes-xts-plain64" ++ assert parsed_dict["Keyslots"]["1"]["Cipher key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["1"]["PBKDF"] == "pbkdf2" ++ assert parsed_dict["Keyslots"]["1"]["Hash"] == "sha256" ++ assert parsed_dict["Keyslots"]["1"]["Iterations"] == "1000" ++ assert parsed_dict["Keyslots"]["1"]["Salt"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Keyslots"]["1"]["AF stripes"] == "4000" ++ assert parsed_dict["Keyslots"]["1"]["AF hash"] == "sha256" ++ assert parsed_dict["Keyslots"]["1"]["Area offset"] == "290816 [bytes]" ++ assert parsed_dict["Keyslots"]["1"]["Area length"] == "258048 [bytes]" ++ assert parsed_dict["Keyslots"]["1"]["Digest ID"] == "0" ++ ++ assert parsed_dict["Keyslots"]["2"]["type"] == "luks2" ++ assert parsed_dict["Keyslots"]["2"]["Key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["2"]["Priority"] == "normal" ++ assert parsed_dict["Keyslots"]["2"]["Cipher"] == "aes-xts-plain64" ++ assert parsed_dict["Keyslots"]["2"]["Cipher key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["2"]["PBKDF"] == "pbkdf2" ++ assert parsed_dict["Keyslots"]["2"]["Hash"] == "sha256" ++ assert parsed_dict["Keyslots"]["2"]["Iterations"] == "1000" ++ assert parsed_dict["Keyslots"]["2"]["Salt"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Keyslots"]["2"]["AF stripes"] == "4000" ++ assert parsed_dict["Keyslots"]["2"]["AF hash"] == "sha256" ++ assert parsed_dict["Keyslots"]["2"]["Area offset"] == "548864 [bytes]" ++ assert parsed_dict["Keyslots"]["2"]["Area length"] == "258048 [bytes]" ++ assert parsed_dict["Keyslots"]["2"]["Digest ID"] == "0" ++ ++ assert parsed_dict["Keyslots"]["3"]["type"] == "luks2" ++ assert parsed_dict["Keyslots"]["3"]["Key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["3"]["Priority"] == "normal" ++ assert parsed_dict["Keyslots"]["3"]["Cipher"] == "aes-xts-plain64" ++ assert parsed_dict["Keyslots"]["3"]["Cipher key"] == "512 bits" ++ assert parsed_dict["Keyslots"]["3"]["PBKDF"] == "pbkdf2" ++ assert parsed_dict["Keyslots"]["3"]["Hash"] == "sha512" ++ assert parsed_dict["Keyslots"]["3"]["Iterations"] == "1000" ++ assert parsed_dict["Keyslots"]["3"]["Salt"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Keyslots"]["3"]["AF stripes"] == "4000" ++ assert parsed_dict["Keyslots"]["3"]["AF hash"] == "sha512" ++ assert parsed_dict["Keyslots"]["3"]["Area offset"] == "806912 [bytes]" ++ assert parsed_dict["Keyslots"]["3"]["Area length"] == "258048 [bytes]" ++ assert parsed_dict["Keyslots"]["3"]["Digest ID"] == "0" ++ ++ assert len(parsed_dict["Tokens"]) == 3 ++ assert parsed_dict["Tokens"]["0"]["type"] == "clevis" ++ assert parsed_dict["Tokens"]["0"]["Keyslot"] == "1" ++ ++ assert parsed_dict["Tokens"]["1"]["type"] == "clevis" ++ assert parsed_dict["Tokens"]["1"]["Keyslot"] == "2" ++ ++ assert parsed_dict["Tokens"]["2"]["type"] == "systemd-tpm2" ++ assert parsed_dict["Tokens"]["2"]["Keyslot"] == "3" ++ assert parsed_dict["Tokens"]["2"]["tpm2-hash-pcrs"] == "7" ++ assert parsed_dict["Tokens"]["2"]["tpm2-pcr-bank"] == "sha256" ++ assert parsed_dict["Tokens"]["2"]["tpm2-pubkey"] == "(null)" ++ assert parsed_dict["Tokens"]["2"]["tpm2-pubkey-pcrs"] == "n/a" ++ assert parsed_dict["Tokens"]["2"]["tpm2-primary-alg"] == "ecc" ++ assert parsed_dict["Tokens"]["2"]["tpm2-blob"].replace(" ", "") == 14*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Tokens"]["2"]["tpm2-policy-hash"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Tokens"]["2"]["tpm2-pin"] == "false" ++ assert parsed_dict["Tokens"]["2"]["tpm2-salt"] == "false" ++ ++ assert len(parsed_dict["Digests"]) == 1 ++ assert parsed_dict["Digests"]["0"]["type"] == "pbkdf2" ++ assert parsed_dict["Digests"]["0"]["Hash"] == "sha256" ++ assert parsed_dict["Digests"]["0"]["Iterations"] == "117448" ++ assert parsed_dict["Digests"]["0"]["Salt"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" ++ assert parsed_dict["Digests"]["0"]["Digest"].replace(" ", "") == 2*"dea1b97f03cbb489e25220fce42465cd" +diff --git a/repos/system_upgrade/common/actors/luksscanner/tests/test_luksscaner.py b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksscaner.py +new file mode 100644 +index 00000000..22eb0946 +--- /dev/null ++++ b/repos/system_upgrade/common/actors/luksscanner/tests/test_luksscaner.py +@@ -0,0 +1,142 @@ ++import os ++ ++import pytest ++ ++from leapp.libraries.stdlib import api ++from leapp.models import LsblkEntry, LuksDumps, StorageInfo ++from leapp.snactor.fixture import current_actor_context ++ ++CUR_DIR = os.path.dirname(os.path.abspath(__file__)) ++ ++TOKENS_ASSERT = { ++ 0: { ++ "keyslot": 1, ++ "token_type": "clevis-tpm2" ++ }, ++ 1: { ++ "keyslot": 2, ++ "token_type": "clevis-tang" ++ }, ++ 2: { ++ "keyslot": 3, ++ "token_type": "systemd-tpm2" ++ }, ++} ++ ++CLEVIS_KEYSLOTS = { ++ 1: 'tpm2 \'{"hash":"sha256","key":"rsa","pcr_bank":"sha256","pcr_ids":"0,1,7"}\'', ++ 2: 'tang \'{"url":"http://localhost"}\'' ++} ++ ++ ++class MockedRun(object): ++ """Simple mock class for leapp.libraries.stdlib.run.""" ++ ++ def __init__(self, variant, clevis_keyslots): ++ """if exc_type provided, then it will be raised on ++ instance call. ++ ++ :type exc_type: None or BaseException ++ """ ++ self.logger = api.current_logger() ++ ++ self.commands = [] ++ self.variant = variant ++ self.clevis_keyslots = clevis_keyslots ++ ++ def __call__(self, cmd, *args, **kwargs): ++ self.commands.append(cmd) ++ ++ if len(cmd) == 3 and cmd[:2] == ['cryptsetup', 'luksDump']: ++ dev_path = cmd[2] ++ ++ # We cannot have the output in a list, since the command is called per device. Therefore, we have to map ++ # each device path to its output. ++ output_files_per_device = { ++ '/dev/nvme0n1p3': 'luksDump_nvme0n1p3{}.txt'.format(("_" + self.variant) if self.variant else "") ++ } ++ ++ if dev_path not in output_files_per_device: ++ raise ValueError( ++ 'Attempting to call "cryptsetup luksDump" on an unexpected device: {}'.format(dev_path) ++ ) ++ with open(os.path.join(CUR_DIR, 'files/{}'.format(output_files_per_device[dev_path]))) as f: ++ return {"stdout": f.read()} ++ elif len(cmd) >= 3 and cmd[:3] == ['clevis', 'luks', 'list']: ++ dev_path = None ++ keyslot = None ++ ++ device_flag = False ++ keyslot_flag = False ++ for element in cmd: ++ if device_flag: ++ dev_path = element ++ elif keyslot_flag: ++ keyslot = element ++ ++ device_flag = element == "-d" ++ keyslot_flag = element == "-s" ++ ++ if dev_path is None or keyslot is None: ++ raise ValueError('Attempting to call "clevis luks list" without specifying keyslot or device') ++ if dev_path is None or keyslot is None or dev_path != "/dev/nvme0n1p3": ++ raise ValueError('Attempting to call "clevis luks list" on invalid device') ++ ++ keyslot = int(keyslot) ++ ++ if keyslot in self.clevis_keyslots: ++ return {"stdout": "{}: {}".format(keyslot, self.clevis_keyslots[keyslot])} ++ ++ return {} ++ ++ ++@pytest.mark.parametrize( ++ ("variant", "luks_version", "uuid", "tokens_assert"), ++ [ ++ ('luks1', 1, '90242257-d00a-4019-aba6-03083f89404b', {}), ++ ('luks2', 2, 'dfd8db30-2b65-4be9-8cae-65f5fac4a06f', {}), ++ ('luks2_tokens', 2, '6b929b85-b01e-4aa3-8ad2-a05decae6e3d', TOKENS_ASSERT), ++ ] ++) ++def test_actor_with_luks(monkeypatch, current_actor_context, variant, luks_version, uuid, tokens_assert): ++ mocked_run = MockedRun(variant, CLEVIS_KEYSLOTS) ++ monkeypatch.setattr('leapp.libraries.stdlib.run', mocked_run) ++ ++ with_luks = [ ++ LsblkEntry( ++ name='/dev/nvme0n1', kname='/dev/nvme0n1', maj_min='259:0', rm='0', size='10G', bsize=10*(1 << 39), ++ ro='0', tp='disk', parent_name='', parent_path='', mountpoint='' ++ ), ++ LsblkEntry( ++ name='/dev/nvme0n1p3', kname='/dev/nvme0n1p3', maj_min='259:3', rm='0', size='10G', bsize=10*(1 << 39), ++ ro='0', tp='part', parent_name='nvme0n1', parent_path='/dev/nvme0n1', mountpoint='' ++ ), ++ LsblkEntry( ++ name='/dev/mapper/tst1', kname='/dev/dm-0', maj_min='253:0', rm='0', size='9G', bsize=9*(1 << 39), ro='0', ++ tp='crypt', parent_name='nvme0n1p3', parent_path='/dev/nvme0n1p3', mountpoint='' ++ ), ++ # PKNAME is not set, so this crypt device will be ignored ++ LsblkEntry( ++ name='/dev/mapper/tst2', kname='/dev/dm-1', maj_min='253:0', rm='0', size='9G', bsize=9*(1 << 39), ro='0', ++ tp='crypt', parent_name='', parent_path='', mountpoint='' ++ ) ++ ] ++ ++ current_actor_context.feed(StorageInfo(lsblk=with_luks)) ++ current_actor_context.run() ++ ++ luks_dumps = current_actor_context.consume(LuksDumps) ++ assert len(luks_dumps) == 1 ++ assert len(luks_dumps[0].dumps) == 1 ++ luks_dump = luks_dumps[0].dumps[0] ++ ++ assert luks_dump.version == luks_version ++ assert luks_dump.uuid == uuid ++ assert luks_dump.device_name == "nvme0n1p3" ++ assert luks_dump.device_path == "/dev/nvme0n1p3" ++ assert len(luks_dump.tokens) == len(tokens_assert) ++ ++ for token in luks_dump.tokens: ++ assert token.token_id in tokens_assert ++ assert token.keyslot == tokens_assert[token.token_id]["keyslot"] ++ assert token.token_type == tokens_assert[token.token_id]["token_type"] +diff --git a/repos/system_upgrade/common/models/luksdump.py b/repos/system_upgrade/common/models/luksdump.py +new file mode 100644 +index 00000000..83b56ef8 +--- /dev/null ++++ b/repos/system_upgrade/common/models/luksdump.py +@@ -0,0 +1,73 @@ ++from leapp.models import fields, Model ++from leapp.topics import SystemInfoTopic ++ ++ ++class LuksToken(Model): ++ """ ++ Represents a single token associated with the LUKS device. ++ ++ Note this model is supposed to be used just as part of the LuksDump msg. ++ """ ++ topic = SystemInfoTopic ++ ++ token_id = fields.Integer() ++ """ ++ Token ID (as seen in the luksDump) ++ """ ++ ++ keyslot = fields.Integer() ++ """ ++ ID of the associated keyslot ++ """ ++ ++ token_type = fields.String() ++ """ ++ Type of the token. For "clevis" type the concrete subtype (determined using ++ clevis luks list) is appended e.g. clevis-tpm2. clevis-tang, ... ++ """ ++ ++ ++class LuksDump(Model): ++ """ ++ Information about a single LUKS-encrypted device. ++ ++ Note this model is supposed to be used as a part of LuksDumps msg. ++ """ ++ topic = SystemInfoTopic ++ ++ version = fields.Integer() ++ """ ++ LUKS version ++ """ ++ ++ uuid = fields.String() ++ """ ++ UUID of the LUKS device ++ """ ++ ++ device_path = fields.String() ++ """ ++ Full path to the backing device ++ """ ++ ++ device_name = fields.String() ++ """ ++ Device name of the backing device ++ """ ++ ++ tokens = fields.List(fields.Model(LuksToken), default=[]) ++ """ ++ List of LUKS2 tokens ++ """ ++ ++ ++class LuksDumps(Model): ++ """ ++ Information about all LUKS-encrypted devices on the system. ++ """ ++ topic = SystemInfoTopic ++ ++ dumps = fields.List(fields.Model(LuksDump)) ++ """ ++ List of LuksDump representing all the encrypted devices on the system. ++ """ +-- +2.47.0 + diff --git a/SOURCES/0020-InhibitWhenLuks-allow-upgrades-for-LUKS2-bound-to-Cl.patch b/SOURCES/0020-InhibitWhenLuks-allow-upgrades-for-LUKS2-bound-to-Cl.patch new file mode 100644 index 0000000..ea860ca --- /dev/null +++ b/SOURCES/0020-InhibitWhenLuks-allow-upgrades-for-LUKS2-bound-to-Cl.patch @@ -0,0 +1,455 @@ +From ad241f701b39a81d132105f1a301f2f5546f498a Mon Sep 17 00:00:00 2001 +From: Daniel Zatovic <daniel.zatovic@gmail.com> +Date: Tue, 6 Aug 2024 17:26:58 +0200 +Subject: [PATCH 20/40] InhibitWhenLuks: allow upgrades for LUKS2 bound to + Clevis TPM2 token +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +So far, upgrades with encrypted drives were not supported. Encrypted +drives require interactively typing unlock passphrases, which is not +suitable for automatic upgrades using Leapp. We add a feature, where +systems with all drives configured with automatic unlock method can be +upgraded. + +Currently, we only support drives configured with Clevis/TPM2 token, +because networking is not configured during Leapp upgrade (excluding +NBDE). + +We consume LuksDumps message to decide whether the upgrade process +should be inhibited. If there is at least one LUKS2 device without +Clevis TPM2 binding, we inhibit the upgrade because we cannot tell if +the device is not a part of a more complex storage stack and the failure +to unlock the device migt cause boot problem. + +Co-authored-by: Petr Stodůlka <pstodulk@redhat.com> +--- + .../common/actors/inhibitwhenluks/actor.py | 38 ++-- + .../libraries/inhibitwhenluks.py | 164 +++++++++++++++++ + .../tests/test_inhibitwhenluks.py | 169 ++++++++++++++++-- + 3 files changed, 329 insertions(+), 42 deletions(-) + create mode 100644 repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py + +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py b/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py +index 40b845b0..65607167 100644 +--- a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py ++++ b/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py +@@ -1,40 +1,24 @@ +-from leapp import reporting + from leapp.actors import Actor +-from leapp.models import CephInfo, StorageInfo +-from leapp.reporting import create_report, Report ++from leapp.libraries.actor.inhibitwhenluks import check_invalid_luks_devices ++from leapp.models import CephInfo, LuksDumps, StorageInfo, TargetUserSpaceUpgradeTasks, UpgradeInitramfsTasks ++from leapp.reporting import Report + from leapp.tags import ChecksPhaseTag, IPUWorkflowTag + + + class InhibitWhenLuks(Actor): + """ +- Check if any encrypted partitions is in use. If yes, inhibit the upgrade process. ++ Check if any encrypted partitions are in use and whether they are supported for the upgrade. + +- Upgrading system with encrypted partition is not supported. ++ Upgrading EL7 system with encrypted partition is not supported (but ceph OSDs). ++ For EL8+ it's ok if the discovered used encrypted storage has LUKS2 format ++ and it's bounded to clevis-tpm2 token (so it can be automatically unlocked ++ during the process). + """ + + name = 'check_luks_and_inhibit' +- consumes = (StorageInfo, CephInfo) +- produces = (Report,) ++ consumes = (CephInfo, LuksDumps, StorageInfo) ++ produces = (Report, TargetUserSpaceUpgradeTasks, UpgradeInitramfsTasks) + tags = (ChecksPhaseTag, IPUWorkflowTag) + + def process(self): +- # If encrypted Ceph volumes present, check if there are more encrypted disk in lsblk than Ceph vol +- ceph_vol = [] +- try: +- ceph_info = next(self.consume(CephInfo)) +- if ceph_info: +- ceph_vol = ceph_info.encrypted_volumes[:] +- except StopIteration: +- pass +- +- for storage_info in self.consume(StorageInfo): +- for blk in storage_info.lsblk: +- if blk.tp == 'crypt' and blk.name not in ceph_vol: +- create_report([ +- reporting.Title('LUKS encrypted partition detected'), +- reporting.Summary('Upgrading system with encrypted partitions is not supported'), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), +- reporting.Groups([reporting.Groups.INHIBITOR]), +- ]) +- break ++ check_invalid_luks_devices() +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py b/repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py +new file mode 100644 +index 00000000..57a94e9d +--- /dev/null ++++ b/repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py +@@ -0,0 +1,164 @@ ++from leapp import reporting ++from leapp.libraries.common.config.version import get_source_major_version ++from leapp.libraries.stdlib import api ++from leapp.models import ( ++ CephInfo, ++ DracutModule, ++ LuksDumps, ++ StorageInfo, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeInitramfsTasks ++) ++from leapp.reporting import create_report ++ ++# https://red.ht/clevis-tpm2-luks-auto-unlock-rhel8 ++# https://red.ht/clevis-tpm2-luks-auto-unlock-rhel9 ++# https://red.ht/convert-to-luks2-rhel8 ++# https://red.ht/convert-to-luks2-rhel9 ++CLEVIS_DOC_URL_FMT = 'https://red.ht/clevis-tpm2-luks-auto-unlock-rhel{}' ++LUKS2_CONVERT_DOC_URL_FMT = 'https://red.ht/convert-to-luks2-rhel{}' ++ ++FMT_LIST_SEPARATOR = '\n - ' ++ ++ ++def _formatted_list_output(input_list, sep=FMT_LIST_SEPARATOR): ++ return ['{}{}'.format(sep, item) for item in input_list] ++ ++ ++def _at_least_one_tpm_token(luks_dump): ++ return any([token.token_type == "clevis-tpm2" for token in luks_dump.tokens]) ++ ++ ++def _get_ceph_volumes(): ++ ceph_info = next(api.consume(CephInfo), None) ++ return ceph_info.encrypted_volumes[:] if ceph_info else [] ++ ++ ++def apply_obsoleted_check_ipu_7_8(): ++ ceph_vol = _get_ceph_volumes() ++ for storage_info in api.consume(StorageInfo): ++ for blk in storage_info.lsblk: ++ if blk.tp == 'crypt' and blk.name not in ceph_vol: ++ create_report([ ++ reporting.Title('LUKS encrypted partition detected'), ++ reporting.Summary('Upgrading system with encrypted partitions is not supported'), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), ++ reporting.Groups([reporting.Groups.INHIBITOR]), ++ ]) ++ break ++ ++ ++def report_inhibitor(luks1_partitions, no_tpm2_partitions): ++ source_major_version = get_source_major_version() ++ clevis_doc_url = CLEVIS_DOC_URL_FMT.format(source_major_version) ++ luks2_convert_doc_url = LUKS2_CONVERT_DOC_URL_FMT.format(source_major_version) ++ summary = ( ++ 'We have detected LUKS encrypted volumes that do not meet current' ++ ' criteria to be able to proceed the in-place upgrade process.' ++ ' Right now the upgrade process requires for encrypted storage to be' ++ ' in LUKS2 format configured with Clevis TPM 2.0.' ++ ) ++ ++ report_hints = [] ++ ++ if luks1_partitions: ++ ++ summary += ( ++ '\n\nSince RHEL 8 the default format for LUKS encryption is LUKS2.' ++ ' Despite the old LUKS1 format is still supported on RHEL systems' ++ ' it has some limitations in comparison to LUKS2.' ++ ' Only the LUKS2 format is supported for upgrades.' ++ ' The following LUKS1 partitions have been discovered on your system:{}' ++ .format(''.join(_formatted_list_output(luks1_partitions))) ++ ) ++ report_hints.append(reporting.Remediation( ++ hint=( ++ 'Convert your LUKS1 encrypted devices to LUKS2 and bind it to TPM2 using clevis.' ++ ' If this is not possible in your case consider clean installation' ++ ' of the target RHEL system instead.' ++ ) ++ )) ++ report_hints.append(reporting.ExternalLink( ++ url=luks2_convert_doc_url, ++ title='LUKS versions in RHEL: Conversion' ++ )) ++ ++ if no_tpm2_partitions: ++ summary += ( ++ '\n\nCurrently we require the process to be non-interactive and' ++ ' offline. For this reason we require automatic unlock of' ++ ' encrypted devices during the upgrade process.' ++ ' Currently we support automatic unlocking during the upgrade only' ++ ' for volumes bound to Clevis TPM2 token.' ++ ' The following LUKS2 devices without Clevis TPM2 token ' ++ ' have been discovered on your system: {}' ++ .format(''.join(_formatted_list_output(no_tpm2_partitions))) ++ ) ++ ++ report_hints.append(reporting.Remediation( ++ hint=( ++ 'Add Clevis TPM2 binding to LUKS devices.' ++ ' If some LUKS devices use still the old LUKS1 format, convert' ++ ' them to LUKS2 prior to binding.' ++ ) ++ )) ++ report_hints.append(reporting.ExternalLink( ++ url=clevis_doc_url, ++ title='Configuring manual enrollment of LUKS-encrypted volumes by using a TPM 2.0 policy' ++ ) ++ ) ++ create_report([ ++ reporting.Title('Detected LUKS devices unsuitable for in-place upgrade.'), ++ reporting.Summary(summary), ++ reporting.Severity(reporting.Severity.HIGH), ++ reporting.Groups([reporting.Groups.BOOT, reporting.Groups.ENCRYPTION]), ++ reporting.Groups([reporting.Groups.INHIBITOR]), ++ ] + report_hints) ++ ++ ++def check_invalid_luks_devices(): ++ if get_source_major_version() == '7': ++ # NOTE: keeping unchanged behaviour for IPU 7 -> 8 ++ apply_obsoleted_check_ipu_7_8() ++ return ++ ++ luks_dumps = next(api.consume(LuksDumps), None) ++ if not luks_dumps: ++ api.current_logger().debug('No LUKS volumes detected. Skipping.') ++ return ++ ++ luks1_partitions = [] ++ no_tpm2_partitions = [] ++ ceph_vol = _get_ceph_volumes() ++ for luks_dump in luks_dumps.dumps: ++ # if the device is managed by ceph, don't inhibit ++ if luks_dump.device_name in ceph_vol: ++ api.current_logger().debug('Skipping LUKS CEPH volume: {}'.format(luks_dump.device_name)) ++ continue ++ ++ if luks_dump.version == 1: ++ luks1_partitions.append(luks_dump.device_name) ++ elif luks_dump.version == 2 and not _at_least_one_tpm_token(luks_dump): ++ no_tpm2_partitions.append(luks_dump.device_name) ++ ++ if luks1_partitions or no_tpm2_partitions: ++ report_inhibitor(luks1_partitions, no_tpm2_partitions) ++ else: ++ required_crypt_rpms = [ ++ 'clevis', ++ 'clevis-dracut', ++ 'clevis-systemd', ++ 'clevis-udisks2', ++ 'clevis-luks', ++ 'cryptsetup', ++ 'tpm2-tss', ++ 'tpm2-tools', ++ 'tpm2-abrmd' ++ ] ++ api.produce(TargetUserSpaceUpgradeTasks(install_rpms=required_crypt_rpms)) ++ api.produce(UpgradeInitramfsTasks(include_dracut_modules=[ ++ DracutModule(name='clevis'), ++ DracutModule(name='clevis-pin-tpm2') ++ ]) ++ ) +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py b/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py +index 405a3429..d559b54c 100644 +--- a/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py ++++ b/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py +@@ -1,34 +1,173 @@ +-from leapp.models import CephInfo, LsblkEntry, StorageInfo ++""" ++Unit tests for inhibitwhenluks actor ++ ++Skip isort as it's kind of broken when mixing grid import and one line imports ++ ++isort:skip_file ++""" ++ ++from leapp.libraries.common.config import version ++from leapp.models import ( ++ CephInfo, ++ LsblkEntry, ++ LuksDump, ++ LuksDumps, ++ LuksToken, ++ StorageInfo, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeInitramfsTasks ++) + from leapp.reporting import Report + from leapp.snactor.fixture import current_actor_context + from leapp.utils.report import is_inhibitor + ++_REPORT_TITLE_UNSUITABLE = 'Detected LUKS devices unsuitable for in-place upgrade.' + +-def test_actor_with_luks(current_actor_context): +- with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', size='10G', bsize=10*(1 << 39), +- ro='0', tp='crypt', mountpoint='', parent_name='', parent_path='')] + +- current_actor_context.feed(StorageInfo(lsblk=with_luks)) ++def test_actor_with_luks1_notpm(monkeypatch, current_actor_context): ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '8') ++ luks_dump = LuksDump( ++ version=1, ++ uuid='dd09e6d4-b595-4f1c-80b8-fd47540e6464', ++ device_path='/dev/sda', ++ device_name='sda') ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) ++ current_actor_context.feed(CephInfo(encrypted_volumes=[])) + current_actor_context.run() + assert current_actor_context.consume(Report) + report_fields = current_actor_context.consume(Report)[0].report + assert is_inhibitor(report_fields) ++ assert not current_actor_context.consume(TargetUserSpaceUpgradeTasks) ++ assert not current_actor_context.consume(UpgradeInitramfsTasks) + ++ assert report_fields['title'] == _REPORT_TITLE_UNSUITABLE ++ assert 'LUKS1 partitions have been discovered' in report_fields['summary'] ++ assert luks_dump.device_name in report_fields['summary'] + +-def test_actor_with_luks_ceph_only(current_actor_context): +- with_luks = [LsblkEntry(name='luks-132', kname='kname1', maj_min='253:0', rm='0', size='10G', bsize=10*(1 << 39), +- ro='0', tp='crypt', mountpoint='', parent_name='', parent_path='')] +- ceph_volume = ['luks-132'] +- current_actor_context.feed(StorageInfo(lsblk=with_luks)) +- current_actor_context.feed(CephInfo(encrypted_volumes=ceph_volume)) ++ ++def test_actor_with_luks2_notpm(monkeypatch, current_actor_context): ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '8') ++ luks_dump = LuksDump( ++ version=2, ++ uuid='27b57c75-9adf-4744-ab04-9eb99726a301', ++ device_path='/dev/sda', ++ device_name='sda') ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) ++ current_actor_context.feed(CephInfo(encrypted_volumes=[])) ++ current_actor_context.run() ++ assert current_actor_context.consume(Report) ++ report_fields = current_actor_context.consume(Report)[0].report ++ assert is_inhibitor(report_fields) ++ assert not current_actor_context.consume(TargetUserSpaceUpgradeTasks) ++ assert not current_actor_context.consume(UpgradeInitramfsTasks) ++ ++ assert report_fields['title'] == _REPORT_TITLE_UNSUITABLE ++ assert 'LUKS2 devices without Clevis TPM2 token' in report_fields['summary'] ++ assert luks_dump.device_name in report_fields['summary'] ++ ++ ++def test_actor_with_luks2_invalid_token(monkeypatch, current_actor_context): ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '8') ++ luks_dump = LuksDump( ++ version=2, ++ uuid='dc1dbe37-6644-4094-9839-8fc5dcbec0c6', ++ device_path='/dev/sda', ++ device_name='sda', ++ tokens=[LuksToken(token_id=0, keyslot=1, token_type='clevis')]) ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) ++ current_actor_context.feed(CephInfo(encrypted_volumes=[])) ++ current_actor_context.run() ++ assert current_actor_context.consume(Report) ++ report_fields = current_actor_context.consume(Report)[0].report ++ assert is_inhibitor(report_fields) ++ ++ assert report_fields['title'] == _REPORT_TITLE_UNSUITABLE ++ assert 'LUKS2 devices without Clevis TPM2 token' in report_fields['summary'] ++ assert luks_dump.device_name in report_fields['summary'] ++ assert not current_actor_context.consume(TargetUserSpaceUpgradeTasks) ++ assert not current_actor_context.consume(UpgradeInitramfsTasks) ++ ++ ++def test_actor_with_luks2_clevis_tpm_token(monkeypatch, current_actor_context): ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '8') ++ luks_dump = LuksDump( ++ version=2, ++ uuid='83050bd9-61c6-4ff0-846f-bfd3ac9bfc67', ++ device_path='/dev/sda', ++ device_name='sda', ++ tokens=[LuksToken(token_id=0, keyslot=1, token_type='clevis-tpm2')]) ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) ++ current_actor_context.feed(CephInfo(encrypted_volumes=[])) + current_actor_context.run() + assert not current_actor_context.consume(Report) + ++ upgrade_tasks = current_actor_context.consume(TargetUserSpaceUpgradeTasks) ++ assert len(upgrade_tasks) == 1 ++ assert set(upgrade_tasks[0].install_rpms) == set([ ++ 'clevis', ++ 'clevis-dracut', ++ 'clevis-systemd', ++ 'clevis-udisks2', ++ 'clevis-luks', ++ 'cryptsetup', ++ 'tpm2-tss', ++ 'tpm2-tools', ++ 'tpm2-abrmd' ++ ]) ++ assert current_actor_context.consume(UpgradeInitramfsTasks) + +-def test_actor_without_luks(current_actor_context): +- without_luks = [LsblkEntry(name='sda1', kname='sda1', maj_min='8:0', rm='0', size='10G', bsize=10*(1 << 39), +- ro='0', tp='part', mountpoint='/boot', parent_name='', parent_path='')] + +- current_actor_context.feed(StorageInfo(lsblk=without_luks)) ++def test_actor_with_luks2_ceph(monkeypatch, current_actor_context): ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '8') ++ ceph_volume = ['sda'] ++ current_actor_context.feed(CephInfo(encrypted_volumes=ceph_volume)) ++ luks_dump = LuksDump( ++ version=2, ++ uuid='0edb8c11-1a04-4abd-a12d-93433ee7b8d8', ++ device_path='/dev/sda', ++ device_name='sda', ++ tokens=[LuksToken(token_id=0, keyslot=1, token_type='clevis')]) ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) + current_actor_context.run() + assert not current_actor_context.consume(Report) ++ ++ # make sure we don't needlessly include clevis packages, when there is no clevis token ++ assert not current_actor_context.consume(TargetUserSpaceUpgradeTasks) ++ ++ ++LSBLK_ENTRY = LsblkEntry( ++ name="luks-whatever", ++ kname="dm-0", ++ maj_min="252:1", ++ rm="0", ++ size="1G", ++ bsize=1073741824, ++ ro="0", ++ tp="crypt", ++ mountpoint="/", ++ parent_name="", ++ parent_path="" ++) ++ ++ ++def test_inhibitor_on_el7(monkeypatch, current_actor_context): ++ # NOTE(pstodulk): consider it good enough as el7 stuff is going to be removed ++ # soon. ++ monkeypatch.setattr(version, 'get_source_major_version', lambda: '7') ++ ++ luks_dump = LuksDump( ++ version=2, ++ uuid='83050bd9-61c6-4ff0-846f-bfd3ac9bfc67', ++ device_path='/dev/sda', ++ device_name='sda', ++ tokens=[LuksToken(token_id=0, keyslot=1, token_type='clevis-tpm2')]) ++ current_actor_context.feed(LuksDumps(dumps=[luks_dump])) ++ current_actor_context.feed(CephInfo(encrypted_volumes=[])) ++ ++ current_actor_context.feed(StorageInfo(lsblk=[LSBLK_ENTRY])) ++ current_actor_context.run() ++ assert current_actor_context.consume(Report) ++ ++ report_fields = current_actor_context.consume(Report)[0].report ++ assert is_inhibitor(report_fields) ++ assert report_fields['title'] == 'LUKS encrypted partition detected' +-- +2.47.0 + diff --git a/SOURCES/0021-Rename-inhibitwhenluks-actor-to-checkluks.patch b/SOURCES/0021-Rename-inhibitwhenluks-actor-to-checkluks.patch new file mode 100644 index 0000000..6d5e039 --- /dev/null +++ b/SOURCES/0021-Rename-inhibitwhenluks-actor-to-checkluks.patch @@ -0,0 +1,57 @@ +From 8e5fe75e4ee76eb62eb51001c28f1f1443f0a563 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Fri, 18 Oct 2024 07:13:42 +0200 +Subject: [PATCH 21/40] Rename inhibitwhenluks actor to checkluks + +The actor nowadays does more then just inhibiting the upgrade when +LUKS is detected. Let's rename it to respect current behaviour. +--- + .../common/actors/{inhibitwhenluks => checkluks}/actor.py | 6 +++--- + .../inhibitwhenluks.py => checkluks/libraries/checkluks.py} | 0 + .../tests/test_checkluks.py} | 0 + 3 files changed, 3 insertions(+), 3 deletions(-) + rename repos/system_upgrade/common/actors/{inhibitwhenluks => checkluks}/actor.py (85%) + rename repos/system_upgrade/common/actors/{inhibitwhenluks/libraries/inhibitwhenluks.py => checkluks/libraries/checkluks.py} (100%) + rename repos/system_upgrade/common/actors/{inhibitwhenluks/tests/test_inhibitwhenluks.py => checkluks/tests/test_checkluks.py} (100%) + +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py b/repos/system_upgrade/common/actors/checkluks/actor.py +similarity index 85% +rename from repos/system_upgrade/common/actors/inhibitwhenluks/actor.py +rename to repos/system_upgrade/common/actors/checkluks/actor.py +index 65607167..607fd040 100644 +--- a/repos/system_upgrade/common/actors/inhibitwhenluks/actor.py ++++ b/repos/system_upgrade/common/actors/checkluks/actor.py +@@ -1,11 +1,11 @@ + from leapp.actors import Actor +-from leapp.libraries.actor.inhibitwhenluks import check_invalid_luks_devices ++from leapp.libraries.actor.checkluks import check_invalid_luks_devices + from leapp.models import CephInfo, LuksDumps, StorageInfo, TargetUserSpaceUpgradeTasks, UpgradeInitramfsTasks + from leapp.reporting import Report + from leapp.tags import ChecksPhaseTag, IPUWorkflowTag + + +-class InhibitWhenLuks(Actor): ++class CheckLuks(Actor): + """ + Check if any encrypted partitions are in use and whether they are supported for the upgrade. + +@@ -15,7 +15,7 @@ class InhibitWhenLuks(Actor): + during the process). + """ + +- name = 'check_luks_and_inhibit' ++ name = 'check_luks' + consumes = (CephInfo, LuksDumps, StorageInfo) + produces = (Report, TargetUserSpaceUpgradeTasks, UpgradeInitramfsTasks) + tags = (ChecksPhaseTag, IPUWorkflowTag) +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py b/repos/system_upgrade/common/actors/checkluks/libraries/checkluks.py +similarity index 100% +rename from repos/system_upgrade/common/actors/inhibitwhenluks/libraries/inhibitwhenluks.py +rename to repos/system_upgrade/common/actors/checkluks/libraries/checkluks.py +diff --git a/repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py b/repos/system_upgrade/common/actors/checkluks/tests/test_checkluks.py +similarity index 100% +rename from repos/system_upgrade/common/actors/inhibitwhenluks/tests/test_inhibitwhenluks.py +rename to repos/system_upgrade/common/actors/checkluks/tests/test_checkluks.py +-- +2.47.0 + diff --git a/SOURCES/0022-Fix-IPU-being-blocked-by-resource-limitations.patch b/SOURCES/0022-Fix-IPU-being-blocked-by-resource-limitations.patch new file mode 100644 index 0000000..eba154d --- /dev/null +++ b/SOURCES/0022-Fix-IPU-being-blocked-by-resource-limitations.patch @@ -0,0 +1,172 @@ +From 5e6d176ab685f2e85ac1aea9533b04d46f25e9b7 Mon Sep 17 00:00:00 2001 +From: tomasfratrik <tomasfratrik8@gmail.com> +Date: Tue, 18 Jun 2024 10:22:35 +0200 +Subject: [PATCH 22/40] Fix IPU being blocked by resource limitations + +First resource limit is maximum number of open file descriptors limit, +second one being limit for maximum writable file size. Plus add unit +tests. + +Resolves: RHEL-26459 and RHEL-16881 +--- + commands/command_utils.py | 38 ++++++++++++++++++ + commands/preupgrade/__init__.py | 2 + + commands/tests/test_upgrade_paths.py | 60 ++++++++++++++++++++++++++++ + commands/upgrade/__init__.py | 3 ++ + 4 files changed, 103 insertions(+) + +diff --git a/commands/command_utils.py b/commands/command_utils.py +index 4f6f99eb..2810a542 100644 +--- a/commands/command_utils.py ++++ b/commands/command_utils.py +@@ -1,6 +1,7 @@ + import json + import os + import re ++import resource + + from leapp.exceptions import CommandError + from leapp.utils import path +@@ -140,3 +141,40 @@ def vet_upgrade_path(args): + flavor=flavor, + choices=','.join(supported_target_versions))) + return (target_release, flavor) ++ ++ ++def set_resource_limits(): ++ """ ++ Set resource limits for the maximum number of open file descriptors and the maximum writable file size. ++ ++ :raises: `CommandError` if the resource limits cannot be set ++ """ ++ ++ def set_resource_limit(resource_type, soft, hard): ++ rtype_string = ( ++ 'open file descriptors' if resource_type == resource.RLIMIT_NOFILE ++ else 'writable file size' if resource_type == resource.RLIMIT_FSIZE ++ else 'unknown resource' ++ ) ++ try: ++ resource.setrlimit(resource_type, (soft, hard)) ++ except ValueError as err: ++ raise CommandError( ++ 'Failure occurred while attempting to set soft limit higher than the hard limit. ' ++ 'Resource type: {}, error: {}'.format(rtype_string, err) ++ ) ++ except OSError as err: ++ raise CommandError( ++ 'Failed to set resource limit. Resource type: {}, error: {}'.format(rtype_string, err) ++ ) ++ ++ soft_nofile, _ = resource.getrlimit(resource.RLIMIT_NOFILE) ++ soft_fsize, _ = resource.getrlimit(resource.RLIMIT_FSIZE) ++ nofile_limit = 1024*16 ++ fsize_limit = resource.RLIM_INFINITY ++ ++ if soft_nofile < nofile_limit: ++ set_resource_limit(resource.RLIMIT_NOFILE, nofile_limit, nofile_limit) ++ ++ if soft_fsize != fsize_limit: ++ set_resource_limit(resource.RLIMIT_FSIZE, fsize_limit, fsize_limit) +diff --git a/commands/preupgrade/__init__.py b/commands/preupgrade/__init__.py +index 5a89069f..a9fa40e0 100644 +--- a/commands/preupgrade/__init__.py ++++ b/commands/preupgrade/__init__.py +@@ -59,6 +59,8 @@ def preupgrade(args, breadcrumbs): + except LeappError as exc: + raise CommandError(exc.message) + ++ command_utils.set_resource_limits() ++ + workflow = repositories.lookup_workflow('IPUWorkflow')() + util.warn_if_unsupported(configuration) + util.process_whitelist_experimental(repositories, workflow, configuration, logger) +diff --git a/commands/tests/test_upgrade_paths.py b/commands/tests/test_upgrade_paths.py +index 53f081a5..f1312f66 100644 +--- a/commands/tests/test_upgrade_paths.py ++++ b/commands/tests/test_upgrade_paths.py +@@ -1,3 +1,5 @@ ++import resource ++ + import mock + import pytest + +@@ -50,3 +52,61 @@ def test_vet_upgrade_path(mock_open, monkeypatch): + monkeypatch.setenv('LEAPP_DEVEL_TARGET_RELEASE', '9.0') + args = mock.Mock(target='1.2') + assert command_utils.vet_upgrade_path(args) == ('9.0', 'default') ++ ++ ++def _mock_getrlimit_factory(nofile_limits=(1024, 4096), fsize_limits=(1024, 4096)): ++ """ ++ Factory function to create a mock `getrlimit` function with configurable return values. ++ The default param values are lower than the expected values. ++ ++ :param nofile_limits: Tuple representing (soft, hard) limits for `RLIMIT_NOFILE` ++ :param fsize_limits: Tuple representing (soft, hard) limits for `RLIMIT_FSIZE` ++ :return: A mock `getrlimit` function ++ """ ++ def mock_getrlimit(resource_type): ++ if resource_type == resource.RLIMIT_NOFILE: ++ return nofile_limits ++ if resource_type == resource.RLIMIT_FSIZE: ++ return fsize_limits ++ return (0, 0) ++ ++ return mock_getrlimit ++ ++ ++@pytest.mark.parametrize("nofile_limits, fsize_limits, expected_calls", [ ++ # Case where both limits need to be increased ++ ((1024, 4096), (1024, 4096), [ ++ (resource.RLIMIT_NOFILE, (1024*16, 1024*16)), ++ (resource.RLIMIT_FSIZE, (resource.RLIM_INFINITY, resource.RLIM_INFINITY)) ++ ]), ++ # Case where neither limit needs to be changed ++ ((1024*16, 1024*16), (resource.RLIM_INFINITY, resource.RLIM_INFINITY), []) ++]) ++def test_set_resource_limits_increase(monkeypatch, nofile_limits, fsize_limits, expected_calls): ++ setrlimit_called = [] ++ ++ def mock_setrlimit(resource_type, limits): ++ setrlimit_called.append((resource_type, limits)) ++ ++ monkeypatch.setattr(resource, "getrlimit", _mock_getrlimit_factory(nofile_limits, fsize_limits)) ++ monkeypatch.setattr(resource, "setrlimit", mock_setrlimit) ++ ++ command_utils.set_resource_limits() ++ ++ assert setrlimit_called == expected_calls ++ ++ ++@pytest.mark.parametrize("errortype, expected_message", [ ++ (OSError, "Failed to set resource limit"), ++ (ValueError, "Failure occurred while attempting to set soft limit higher than the hard limit") ++]) ++def test_set_resource_limits_exceptions(monkeypatch, errortype, expected_message): ++ monkeypatch.setattr(resource, "getrlimit", _mock_getrlimit_factory()) ++ ++ def mock_setrlimit(*args, **kwargs): ++ raise errortype("mocked error") ++ ++ monkeypatch.setattr(resource, "setrlimit", mock_setrlimit) ++ ++ with pytest.raises(CommandError, match=expected_message): ++ command_utils.set_resource_limits() +diff --git a/commands/upgrade/__init__.py b/commands/upgrade/__init__.py +index 1e15b59c..c7487fde 100644 +--- a/commands/upgrade/__init__.py ++++ b/commands/upgrade/__init__.py +@@ -89,6 +89,9 @@ def upgrade(args, breadcrumbs): + repositories = util.load_repositories() + except LeappError as exc: + raise CommandError(exc.message) ++ ++ command_utils.set_resource_limits() ++ + workflow = repositories.lookup_workflow('IPUWorkflow')(auto_reboot=args.reboot) + util.process_whitelist_experimental(repositories, workflow, configuration, logger) + util.warn_if_unsupported(configuration) +-- +2.47.0 + diff --git a/SOURCES/0023-feature-add-possibility-to-use-net.naming-scheme.patch b/SOURCES/0023-feature-add-possibility-to-use-net.naming-scheme.patch new file mode 100644 index 0000000..e68f22b --- /dev/null +++ b/SOURCES/0023-feature-add-possibility-to-use-net.naming-scheme.patch @@ -0,0 +1,675 @@ +From e1bdf2c02dd193cdd7a2da95e2a3cfa5e6e1e8b3 Mon Sep 17 00:00:00 2001 +From: mhecko <mhecko@redhat.com> +Date: Mon, 29 Apr 2024 11:16:46 +0200 +Subject: [PATCH 23/40] feature: add possibility to use net.naming-scheme + +Leapp writes .link files to prevent interfaces being renamed +after booting to post-upgrade system. This patch adds a less +error-prone approach that uses net.naming-scheme kernel param. +The naming-scheme tells udev what hardware properties to use +when composing a device name. Moreover, possible values of this +parameter are coarse-grained "profiles", that tell udev to +behave as if it did on RHEL8.0. + +The functionality is enabled by setting LEAPP_USE_NET_NAMING_SCHEME +environmental variable to 1. If the feature is enabled, the .link +file generation is disabled. A kernel parameter `net.naming-scheme=` +is added to the upgrade boot entry and the post-upgrade entry. +The value of the parameter will be `rhel-<source_major>.0`. Note +that the minor source version is *not used*. Using also source major +version instead of 0 causes the device names to change slightly, +so we use 0. Moreover, an extra RPM named `rhel-net-naming-sysattrs` +is installed to the target system and target userspace container. +The RPM provides definitions of the "profiles" for net.naming-scheme. + +The feature is available only for 8>9 and higher. Attempting to +upgrade 7>8 with LEAPP_USE_NET_NAMING_SCHEME=1 will ignore +the value of LEAPP_USE_NET_NAMING_SCHEME. + +Add a possibility to use the net.naming-scheme cmdline argument +to make immutable network interface names during the upgrade. +The feature can be used only for 8>9 upgrades and higher. +To enable the feature, use LEAPP_USE_NET_NAMING_SCHEME=1. + +Jira-ref: RHEL-23473 +--- + .../actors/addupgradebootentry/actor.py | 10 +- + .../libraries/addupgradebootentry.py | 78 ++++++++++----- + .../tests/unit_test_addupgradebootentry.py | 47 ++++----- + .../actors/kernelcmdlineconfig/actor.py | 16 +++- + .../libraries/kernelcmdlineconfig.py | 12 ++- + .../libraries/persistentnetnamesconfig.py | 5 +- + .../common/models/kernelcmdlineargs.py | 21 ++++ + .../actors/emit_net_naming_scheme/actor.py | 28 ++++++ + .../libraries/emit_net_naming.py | 63 ++++++++++++ + .../tests/test_emit_net_naming_scheme.py | 95 +++++++++++++++++++ + 10 files changed, 318 insertions(+), 57 deletions(-) + create mode 100644 repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/actor.py + create mode 100644 repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py + create mode 100644 repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py + +diff --git a/repos/system_upgrade/common/actors/addupgradebootentry/actor.py b/repos/system_upgrade/common/actors/addupgradebootentry/actor.py +index f400ebf8..e4ecf39e 100644 +--- a/repos/system_upgrade/common/actors/addupgradebootentry/actor.py ++++ b/repos/system_upgrade/common/actors/addupgradebootentry/actor.py +@@ -8,11 +8,13 @@ from leapp.models import ( + FirmwareFacts, + GrubConfigError, + KernelCmdline, ++ LateTargetKernelCmdlineArgTasks, + LiveImagePreparationInfo, + LiveModeArtifacts, + LiveModeConfig, + TargetKernelCmdlineArgTasks, +- TransactionDryRun ++ TransactionDryRun, ++ UpgradeKernelCmdlineArgTasks + ) + from leapp.tags import InterimPreparationPhaseTag, IPUWorkflowTag + +@@ -33,9 +35,11 @@ class AddUpgradeBootEntry(Actor): + LiveModeArtifacts, + LiveModeConfig, + KernelCmdline, +- TransactionDryRun ++ TransactionDryRun, ++ TargetKernelCmdlineArgTasks, ++ UpgradeKernelCmdlineArgTasks + ) +- produces = (TargetKernelCmdlineArgTasks,) ++ produces = (LateTargetKernelCmdlineArgTasks,) + tags = (IPUWorkflowTag, InterimPreparationPhaseTag) + + def process(self): +diff --git a/repos/system_upgrade/common/actors/addupgradebootentry/libraries/addupgradebootentry.py b/repos/system_upgrade/common/actors/addupgradebootentry/libraries/addupgradebootentry.py +index 553ffc35..b236e39b 100644 +--- a/repos/system_upgrade/common/actors/addupgradebootentry/libraries/addupgradebootentry.py ++++ b/repos/system_upgrade/common/actors/addupgradebootentry/libraries/addupgradebootentry.py +@@ -9,14 +9,16 @@ from leapp.models import ( + BootContent, + KernelCmdline, + KernelCmdlineArg, ++ LateTargetKernelCmdlineArgTasks, + LiveImagePreparationInfo, + LiveModeArtifacts, + LiveModeConfig, +- TargetKernelCmdlineArgTasks ++ TargetKernelCmdlineArgTasks, ++ UpgradeKernelCmdlineArgTasks + ) + + +-def collect_boot_args(livemode_enabled): ++def collect_upgrade_kernel_args(livemode_enabled): + args = { + 'enforcing': '0', + 'rd.plymouth': '0', +@@ -34,7 +36,10 @@ def collect_boot_args(livemode_enabled): + livemode_args = construct_cmdline_args_for_livemode() + args.update(livemode_args) + +- return args ++ upgrade_kernel_args = collect_set_of_kernel_args_from_msgs(UpgradeKernelCmdlineArgTasks, 'to_add') ++ args.update(upgrade_kernel_args) ++ ++ return set(args.items()) + + + def collect_undesired_args(livemode_enabled): +@@ -43,11 +48,11 @@ def collect_undesired_args(livemode_enabled): + args = dict(zip(('ro', 'rhgb', 'quiet'), itertools.repeat(None))) + args['rd.lvm.lv'] = _get_rdlvm_arg_values() + +- return args ++ return set(args.items()) + + +-def format_grubby_args_from_args_dict(args_dict): +- """ Format the given args dictionary in a form required by grubby's --args. """ ++def format_grubby_args_from_args_set(args_dict): ++ """ Format the given args set in a form required by grubby's --args. """ + + def fmt_single_arg(arg_pair): + key, value = arg_pair +@@ -65,7 +70,7 @@ def format_grubby_args_from_args_dict(args_dict): + else: + yield (key, value) # Just a single (key, value) pair + +- arg_sequence = itertools.chain(*(flatten_arguments(arg_pair) for arg_pair in args_dict.items())) ++ arg_sequence = itertools.chain(*(flatten_arguments(arg_pair) for arg_pair in args_dict)) + + # Sorting should be fine as only values can be None, but we cannot have a (key, None) and (key, value) in + # the dictionary at the same time. +@@ -78,7 +83,7 @@ def format_grubby_args_from_args_dict(args_dict): + def figure_out_commands_needed_to_add_entry(kernel_path, initramfs_path, args_to_add, args_to_remove): + boot_entry_modification_commands = [] + +- args_to_add_str = format_grubby_args_from_args_dict(args_to_add) ++ args_to_add_str = format_grubby_args_from_args_set(args_to_add) + + create_entry_cmd = [ + '/usr/sbin/grubby', +@@ -93,7 +98,7 @@ def figure_out_commands_needed_to_add_entry(kernel_path, initramfs_path, args_to + + # We need to update root= param separately, since we cannot do it during --add-kernel with --copy-default. + # This is likely a bug in grubby. +- root_param_value = args_to_add.get('root', None) ++ root_param_value = dict(args_to_add).get('root', None) + if root_param_value: + enforce_root_param_for_the_entry_cmd = [ + '/usr/sbin/grubby', +@@ -103,7 +108,7 @@ def figure_out_commands_needed_to_add_entry(kernel_path, initramfs_path, args_to + boot_entry_modification_commands.append(enforce_root_param_for_the_entry_cmd) + + if args_to_remove: +- args_to_remove_str = format_grubby_args_from_args_dict(args_to_remove) ++ args_to_remove_str = format_grubby_args_from_args_set(args_to_remove) + remove_undesired_args_cmd = [ + '/usr/sbin/grubby', + '--update-kernel', kernel_path, +@@ -113,18 +118,55 @@ def figure_out_commands_needed_to_add_entry(kernel_path, initramfs_path, args_to + return boot_entry_modification_commands + + ++def collect_set_of_kernel_args_from_msgs(msg_type, arg_list_field_name): ++ cmdline_modification_msgs = api.consume(msg_type) ++ lists_of_args_to_add = (getattr(msg, arg_list_field_name, []) for msg in cmdline_modification_msgs) ++ args = itertools.chain(*lists_of_args_to_add) ++ return set((arg.key, arg.value) for arg in args) ++ ++ ++def emit_removal_of_args_meant_only_for_upgrade_kernel(added_upgrade_kernel_args): ++ """ ++ Emit message requesting removal of upgrade kernel args that should not be on the target kernel. ++ ++ Target kernel args are created by copying the args of the booted (upgrade) kernel. Therefore, ++ we need to explicitly modify the target kernel cmdline, removing what should not have been copied. ++ """ ++ target_args_to_add = collect_set_of_kernel_args_from_msgs(TargetKernelCmdlineArgTasks, 'to_add') ++ actual_kernel_args = collect_set_of_kernel_args_from_msgs(KernelCmdline, 'parameters') ++ ++ # actual_kernel_args should not be changed during upgrade, unless explicitly removed by ++ # TargetKernelCmdlineArgTasks.to_remove, but that is handled by some other upgrade component. We just want ++ # to make sure we remove what was not on the source system and that we don't overwrite args to be added to target. ++ args_not_present_on_target_kernel = added_upgrade_kernel_args - actual_kernel_args - target_args_to_add ++ ++ # We remove only what we've added and what will not be already removed by someone else. ++ args_to_remove = [KernelCmdlineArg(key=arg[0], value=arg[1]) for arg in args_not_present_on_target_kernel] ++ ++ if args_to_remove: ++ msg = ('Following upgrade kernel args were added, but they should not be present ' ++ 'on target cmdline: `%s`, requesting removal.') ++ api.current_logger().info(msg, args_not_present_on_target_kernel) ++ args_sorted = sorted(args_to_remove, key=lambda arg: arg.key) ++ api.produce(LateTargetKernelCmdlineArgTasks(to_remove=args_sorted)) ++ ++ + def add_boot_entry(configs=None): + kernel_dst_path, initram_dst_path = get_boot_file_paths() ++ + _remove_old_upgrade_boot_entry(kernel_dst_path, configs=configs) + + livemode_enabled = next(api.consume(LiveImagePreparationInfo), None) is not None + +- cmdline_args = collect_boot_args(livemode_enabled) ++ # We have to keep the desired and unwanted args separate and modify cmline in two separate grubby calls. Merging ++ # these sets and trying to execute only a single command would leave the unwanted cmdline args present if they ++ # are present on the original system. ++ added_cmdline_args = collect_upgrade_kernel_args(livemode_enabled) + undesired_cmdline_args = collect_undesired_args(livemode_enabled) + + commands_to_run = figure_out_commands_needed_to_add_entry(kernel_dst_path, + initram_dst_path, +- args_to_add=cmdline_args, ++ args_to_add=added_cmdline_args, + args_to_remove=undesired_cmdline_args) + + def run_commands_adding_entry(extra_command_suffix=None): +@@ -146,16 +188,8 @@ def add_boot_entry(configs=None): + # See https://bugzilla.redhat.com/show_bug.cgi?id=1764306 + run(['/usr/sbin/zipl']) + +- if 'debug' in cmdline_args: +- # The kernelopts for target kernel are generated based on the cmdline used in the upgrade initramfs, +- # therefore, if we enabled debug above, and the original system did not have the debug kernelopt, we +- # need to explicitly remove it from the target os boot entry. +- # NOTE(mhecko): This will also unconditionally remove debug kernelopt if the source system used it. +- api.produce(TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug')])) +- +- # NOTE(mmatuska): This will remove the option even if the source system had it set. +- # However enforcing=0 shouldn't be set persistently anyway. +- api.produce(TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='enforcing', value='0')])) ++ effective_upgrade_kernel_args = added_cmdline_args - undesired_cmdline_args ++ emit_removal_of_args_meant_only_for_upgrade_kernel(effective_upgrade_kernel_args) + + except CalledProcessError as e: + raise StopActorExecutionError( +diff --git a/repos/system_upgrade/common/actors/addupgradebootentry/tests/unit_test_addupgradebootentry.py b/repos/system_upgrade/common/actors/addupgradebootentry/tests/unit_test_addupgradebootentry.py +index c4f5232b..2f58ba9e 100644 +--- a/repos/system_upgrade/common/actors/addupgradebootentry/tests/unit_test_addupgradebootentry.py ++++ b/repos/system_upgrade/common/actors/addupgradebootentry/tests/unit_test_addupgradebootentry.py +@@ -12,6 +12,7 @@ from leapp.models import ( + BootContent, + KernelCmdline, + KernelCmdlineArg, ++ LateTargetKernelCmdlineArgTasks, + LiveModeArtifacts, + LiveModeConfig, + TargetKernelCmdlineArgTasks +@@ -82,8 +83,10 @@ def test_add_boot_entry(monkeypatch, run_args, arch): + assert addupgradebootentry.run.args[0] == run_args.args_remove + assert addupgradebootentry.run.args[1] == run_args.args_add + assert api.produce.model_instances == [ +- TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug')]), +- TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='enforcing', value='0')]) ++ LateTargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug'), ++ KernelCmdlineArg(key='enforcing', value='0'), ++ KernelCmdlineArg(key='plymouth.enable', value='0'), ++ KernelCmdlineArg(key='rd.plymouth', value='0')]) + ] + + if run_args.args_zipl: +@@ -103,16 +106,16 @@ def test_debug_kernelopt_removal_task_production(monkeypatch, is_leapp_invoked_w + CurrentActorMocked(envars={'LEAPP_DEBUG': str(int(is_leapp_invoked_with_debug))})) + + addupgradebootentry.add_boot_entry() ++ assert len(api.produce.model_instances) == 1 + +- expected_produced_messages = [] +- if is_leapp_invoked_with_debug: +- expected_produced_messages = [TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug')])] +- +- expected_produced_messages.append( +- TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='enforcing', value='0')]) +- ) ++ produced_msg = api.produce.model_instances[0] ++ assert isinstance(produced_msg, LateTargetKernelCmdlineArgTasks) + +- assert api.produce.model_instances == expected_produced_messages ++ debug_kernel_cmline_arg = KernelCmdlineArg(key='debug') ++ if is_leapp_invoked_with_debug: ++ assert debug_kernel_cmline_arg in produced_msg.to_remove ++ else: ++ assert debug_kernel_cmline_arg not in produced_msg.to_remove + + + def test_add_boot_entry_configs(monkeypatch): +@@ -132,8 +135,10 @@ def test_add_boot_entry_configs(monkeypatch): + assert addupgradebootentry.run.args[2] == run_args_add + ['-c', CONFIGS[0]] + assert addupgradebootentry.run.args[3] == run_args_add + ['-c', CONFIGS[1]] + assert api.produce.model_instances == [ +- TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug')]), +- TargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='enforcing', value='0')]), ++ LateTargetKernelCmdlineArgTasks(to_remove=[KernelCmdlineArg(key='debug'), ++ KernelCmdlineArg(key='enforcing', value='0'), ++ KernelCmdlineArg(key='plymouth.enable', value='0'), ++ KernelCmdlineArg(key='rd.plymouth', value='0')]) + ] + + +@@ -183,7 +188,7 @@ def test_fix_grub_config_error(monkeypatch, error_type, test_file_name): + (False, False), + ) + ) +-def test_collect_boot_args(monkeypatch, is_debug_enabled, network_enablement_type): ++def test_collect_upgrade_kernel_args(monkeypatch, is_debug_enabled, network_enablement_type): + env_vars = {'LEAPP_DEBUG': str(int(is_debug_enabled))} + if network_enablement_type: + env_vars['LEAPP_DEVEL_INITRAM_NETWORK'] = network_enablement_type +@@ -192,7 +197,8 @@ def test_collect_boot_args(monkeypatch, is_debug_enabled, network_enablement_typ + monkeypatch.setattr(addupgradebootentry, 'construct_cmdline_args_for_livemode', + lambda *args: {'livemodearg': 'value'}) + +- args = addupgradebootentry.collect_boot_args(livemode_enabled=True) ++ arg_set = addupgradebootentry.collect_upgrade_kernel_args(livemode_enabled=True) ++ args = dict(arg_set) + + assert args['enforcing'] == '0' + assert args['rd.plymouth'] == '0' +@@ -320,16 +326,3 @@ def test_get_device_uuid(monkeypatch): + uuid = addupgradebootentry._get_device_uuid(path) + + assert uuid == 'MY_UUID1' +- +- +-@pytest.mark.parametrize( +- ('args', 'expected_result'), +- ( +- ([('argA', 'val'), ('argB', 'valB'), ('argC', None), ], 'argA=val argB=valB argC'), +- ([('argA', ('val1', 'val2'))], 'argA=val1 argA=val2') +- ) +-) +-def test_format_grubby_args_from_args_dict(args, expected_result): +- actual_result = addupgradebootentry.format_grubby_args_from_args_dict(dict(args)) +- +- assert actual_result == expected_result +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py +index 3585a14e..6d5f39dd 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/actor.py +@@ -3,7 +3,13 @@ import os + from leapp.actors import Actor + from leapp.exceptions import StopActorExecutionError + from leapp.libraries.actor import kernelcmdlineconfig +-from leapp.models import FirmwareFacts, InstalledTargetKernelInfo, KernelCmdlineArg, TargetKernelCmdlineArgTasks ++from leapp.models import ( ++ FirmwareFacts, ++ InstalledTargetKernelInfo, ++ KernelCmdlineArg, ++ LateTargetKernelCmdlineArgTasks, ++ TargetKernelCmdlineArgTasks ++) + from leapp.reporting import Report + from leapp.tags import FinalizationPhaseTag, IPUWorkflowTag + +@@ -14,7 +20,13 @@ class KernelCmdlineConfig(Actor): + """ + + name = 'kernelcmdlineconfig' +- consumes = (KernelCmdlineArg, InstalledTargetKernelInfo, FirmwareFacts, TargetKernelCmdlineArgTasks) ++ consumes = ( ++ KernelCmdlineArg, ++ InstalledTargetKernelInfo, ++ FirmwareFacts, ++ LateTargetKernelCmdlineArgTasks, ++ TargetKernelCmdlineArgTasks ++ ) + produces = (Report,) + tags = (FinalizationPhaseTag, IPUWorkflowTag) + +diff --git a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +index 19c50f3c..98b8b95b 100644 +--- a/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py ++++ b/repos/system_upgrade/common/actors/kernelcmdlineconfig/libraries/kernelcmdlineconfig.py +@@ -1,3 +1,4 @@ ++import itertools + import re + + from leapp import reporting +@@ -5,7 +6,12 @@ from leapp.exceptions import StopActorExecutionError + from leapp.libraries import stdlib + from leapp.libraries.common.config import architecture, version + from leapp.libraries.stdlib import api +-from leapp.models import InstalledTargetKernelInfo, KernelCmdlineArg, TargetKernelCmdlineArgTasks ++from leapp.models import ( ++ InstalledTargetKernelInfo, ++ KernelCmdlineArg, ++ LateTargetKernelCmdlineArgTasks, ++ TargetKernelCmdlineArgTasks ++) + + KERNEL_CMDLINE_FILE = "/etc/kernel/cmdline" + +@@ -71,7 +77,9 @@ def retrieve_arguments_to_modify(): + kernelargs_msgs_to_add = list(api.consume(KernelCmdlineArg)) + kernelargs_msgs_to_remove = [] + +- for target_kernel_arg_task in api.consume(TargetKernelCmdlineArgTasks): ++ modification_msgs = itertools.chain(api.consume(TargetKernelCmdlineArgTasks), ++ api.consume(LateTargetKernelCmdlineArgTasks)) ++ for target_kernel_arg_task in modification_msgs: + kernelargs_msgs_to_add.extend(target_kernel_arg_task.to_add) + kernelargs_msgs_to_remove.extend(target_kernel_arg_task.to_remove) + +diff --git a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +index dc5196ea..2f12742a 100644 +--- a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py ++++ b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +@@ -2,7 +2,7 @@ import errno + import os + import re + +-from leapp.libraries.common.config import get_env ++from leapp.libraries.common.config import get_env, version + from leapp.libraries.stdlib import api + from leapp.models import ( + InitrdIncludes, +@@ -39,6 +39,9 @@ def generate_link_file(interface): + + @suppress_deprecation(InitrdIncludes) + def process(): ++ if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' and version.get_target_major_version() != '8': ++ api.current_logger().info('Skipping generation of .link files renaming NICs as LEAPP_USE_NET_NAMING_SCHEMES=1') ++ return + + if get_env('LEAPP_NO_NETWORK_RENAMING', '0') == '1': + api.current_logger().info( +diff --git a/repos/system_upgrade/common/models/kernelcmdlineargs.py b/repos/system_upgrade/common/models/kernelcmdlineargs.py +index e3568a0a..fafd2853 100644 +--- a/repos/system_upgrade/common/models/kernelcmdlineargs.py ++++ b/repos/system_upgrade/common/models/kernelcmdlineargs.py +@@ -24,6 +24,27 @@ class TargetKernelCmdlineArgTasks(Model): + to_remove = fields.List(fields.Model(KernelCmdlineArg), default=[]) + + ++class LateTargetKernelCmdlineArgTasks(Model): ++ """ ++ Desired modifications of the target kernel args produced later in the upgrade process. ++ ++ Defined to prevent loops in the actor dependency graph. ++ """ ++ topic = SystemInfoTopic ++ ++ to_add = fields.List(fields.Model(KernelCmdlineArg), default=[]) ++ to_remove = fields.List(fields.Model(KernelCmdlineArg), default=[]) ++ ++ ++class UpgradeKernelCmdlineArgTasks(Model): ++ """ ++ Modifications of the upgrade kernel cmdline. ++ """ ++ topic = SystemInfoTopic ++ ++ to_add = fields.List(fields.Model(KernelCmdlineArg), default=[]) ++ ++ + class KernelCmdline(Model): + """ + Kernel command line parameters the system was booted with +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/actor.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/actor.py +new file mode 100644 +index 00000000..769fe20b +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/actor.py +@@ -0,0 +1,28 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import emit_net_naming as emit_net_naming_lib ++from leapp.models import ( ++ KernelCmdline, ++ RpmTransactionTasks, ++ TargetKernelCmdlineArgTasks, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeKernelCmdlineArgTasks ++) ++from leapp.tags import ChecksPhaseTag, IPUWorkflowTag ++ ++ ++class EmitNetNamingScheme(Actor): ++ """ ++ Emit necessary modifications of the upgrade environment and target command line to use net.naming-scheme. ++ """ ++ name = 'emit_net_naming_scheme' ++ consumes = (KernelCmdline,) ++ produces = ( ++ RpmTransactionTasks, ++ TargetKernelCmdlineArgTasks, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeKernelCmdlineArgTasks, ++ ) ++ tags = (ChecksPhaseTag, IPUWorkflowTag) ++ ++ def process(self): ++ emit_net_naming_lib.emit_msgs_to_use_net_naming_schemes() +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +new file mode 100644 +index 00000000..65abdd4d +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +@@ -0,0 +1,63 @@ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.common.config import get_env, version ++from leapp.libraries.stdlib import api ++from leapp.models import ( ++ KernelCmdline, ++ KernelCmdlineArg, ++ RpmTransactionTasks, ++ TargetKernelCmdlineArgTasks, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeKernelCmdlineArgTasks ++) ++ ++NET_NAMING_SYSATTRS_RPM_NAME = 'rhel-net-naming-sysattrs' ++ ++ ++def is_net_scheme_compatible_with_current_cmdline(): ++ kernel_cmdline = next(api.consume(KernelCmdline), None) ++ if not kernel_cmdline: ++ # Super unlikely ++ raise StopActorExecutionError('Did not receive any KernelCmdline messages.') ++ ++ allows_predictable_names = True ++ already_has_a_net_naming_scheme = False ++ for param in kernel_cmdline.parameters: ++ if param.key == 'net.ifnames': ++ if param.value == '0': ++ allows_predictable_names = False ++ elif param.value == '1': ++ allows_predictable_names = True ++ if param.key == 'net.naming-scheme': ++ # We assume that the kernel cmdline does not contain invalid entries, namely, ++ # that the net.naming-scheme refers to a valid scheme. ++ already_has_a_net_naming_scheme = True ++ ++ is_compatible = allows_predictable_names and not already_has_a_net_naming_scheme ++ ++ msg = ('Should net.naming-scheme be added to kernel cmdline: %s. ' ++ 'Reason: allows_predictable_names=%s, already_has_a_net_naming_scheme=%s') ++ api.current_logger().info(msg, 'yes' if is_compatible else 'no', ++ allows_predictable_names, ++ already_has_a_net_naming_scheme) ++ ++ return is_compatible ++ ++ ++def emit_msgs_to_use_net_naming_schemes(): ++ if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') != '1' and version.get_target_major_version() != '8': ++ return ++ ++ # The package should be installed regardless of whether we will modify the cmdline - ++ # if the cmdline already contains net.naming-scheme, then the package will be useful ++ # in both, the upgrade environment and on the target system. ++ pkgs_to_install = [NET_NAMING_SYSATTRS_RPM_NAME] ++ api.produce(TargetUserSpaceUpgradeTasks(install_rpms=pkgs_to_install)) ++ api.produce(RpmTransactionTasks(to_install=pkgs_to_install)) ++ ++ if not is_net_scheme_compatible_with_current_cmdline(): ++ return ++ ++ naming_scheme = 'rhel-{0}.0'.format(version.get_source_major_version()) ++ cmdline_args = [KernelCmdlineArg(key='net.naming-scheme', value=naming_scheme)] ++ api.produce(UpgradeKernelCmdlineArgTasks(to_add=cmdline_args)) ++ api.produce(TargetKernelCmdlineArgTasks(to_add=cmdline_args)) +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py +new file mode 100644 +index 00000000..7a5eeba5 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py +@@ -0,0 +1,95 @@ ++import pytest ++ ++from leapp.libraries.actor import emit_net_naming as emit_net_naming_lib ++from leapp.libraries.common.testutils import CurrentActorMocked, produce_mocked ++from leapp.libraries.stdlib import api ++from leapp.models import ( ++ KernelCmdline, ++ KernelCmdlineArg, ++ RpmTransactionTasks, ++ TargetKernelCmdlineArgTasks, ++ TargetUserSpaceUpgradeTasks, ++ UpgradeKernelCmdlineArgTasks ++) ++ ++ ++@pytest.mark.parametrize( ++ ('kernel_args', 'should_be_compatible'), ++ [ ++ ([KernelCmdlineArg(key='net.naming-scheme', value='rhel-8.10')], False), ++ ([KernelCmdlineArg(key='net.ifnames', value='1')], True), ++ ([KernelCmdlineArg(key='net.ifnames', value='0')], False), ++ ( ++ [ ++ KernelCmdlineArg(key='net.naming-scheme', value='rhel-8.10'), ++ KernelCmdlineArg(key='net.ifname', value='0'), ++ KernelCmdlineArg(key='root', value='/dev/vda1') ++ ], ++ False ++ ), ++ ([KernelCmdlineArg(key='root', value='/dev/vda1')], True), ++ ] ++) ++def test_is_net_scheme_compatible_with_current_cmdline(monkeypatch, kernel_args, should_be_compatible): ++ kernel_cmdline = KernelCmdline(parameters=kernel_args) ++ ++ def mocked_consume(msg_type): ++ yield {KernelCmdline: kernel_cmdline}[msg_type] ++ ++ monkeypatch.setattr(api, 'consume', mocked_consume) ++ ++ assert emit_net_naming_lib.is_net_scheme_compatible_with_current_cmdline() == should_be_compatible, \ ++ [(arg.key, arg.value) for arg in kernel_cmdline.parameters] ++ ++ ++@pytest.mark.parametrize( ++ ('is_net_scheme_enabled', 'is_current_cmdline_compatible'), ++ [ ++ (True, True), ++ (True, False), ++ (False, True) ++ ] ++) ++def test_emit_msgs_to_use_net_naming_schemes(monkeypatch, is_net_scheme_enabled, is_current_cmdline_compatible): ++ envvar_value = '1' if is_net_scheme_enabled else '0' ++ ++ mocked_actor = CurrentActorMocked(src_ver='8.10', ++ dst_ver='9.5', ++ envars={'LEAPP_USE_NET_NAMING_SCHEMES': envvar_value}) ++ monkeypatch.setattr(api, 'current_actor', mocked_actor) ++ ++ monkeypatch.setattr(api, 'produce', produce_mocked()) ++ monkeypatch.setattr(emit_net_naming_lib, ++ 'is_net_scheme_compatible_with_current_cmdline', ++ lambda: is_current_cmdline_compatible) ++ ++ emit_net_naming_lib.emit_msgs_to_use_net_naming_schemes() ++ ++ def ensure_one_msg_of_type_produced(produced_messages, msg_type): ++ msgs = (msg for msg in produced_messages if isinstance(msg, msg_type)) ++ msg = next(msgs) ++ assert not next(msgs, None), 'More than one message of type {type} produced'.format(type=type) ++ return msg ++ ++ produced_messages = api.produce.model_instances ++ if is_net_scheme_enabled: ++ userspace_tasks = ensure_one_msg_of_type_produced(produced_messages, TargetUserSpaceUpgradeTasks) ++ assert userspace_tasks.install_rpms == [emit_net_naming_lib.NET_NAMING_SYSATTRS_RPM_NAME] ++ ++ rpm_tasks = ensure_one_msg_of_type_produced(produced_messages, RpmTransactionTasks) ++ assert rpm_tasks.to_install == [emit_net_naming_lib.NET_NAMING_SYSATTRS_RPM_NAME] ++ else: ++ assert not api.produce.called ++ return ++ ++ upgrade_cmdline_mods = (msg for msg in produced_messages if isinstance(msg, UpgradeKernelCmdlineArgTasks)) ++ target_cmdline_mods = (msg for msg in produced_messages if isinstance(msg, TargetKernelCmdlineArgTasks)) ++ ++ if is_current_cmdline_compatible: ++ # We should emit cmdline modifications - both UpgradeKernelCmdlineArgTasks and TargetKernelCmdlineArgTasks ++ # should be produced ++ assert next(upgrade_cmdline_mods, None) ++ assert next(target_cmdline_mods, None) ++ else: ++ assert not next(upgrade_cmdline_mods, None) ++ assert not next(target_cmdline_mods, None) +-- +2.47.0 + diff --git a/SOURCES/0024-prevent-the-feature-for-being-used-outside-8-9.patch b/SOURCES/0024-prevent-the-feature-for-being-used-outside-8-9.patch new file mode 100644 index 0000000..02eb5fe --- /dev/null +++ b/SOURCES/0024-prevent-the-feature-for-being-used-outside-8-9.patch @@ -0,0 +1,26 @@ +From b4b535454b74c05682ecf0d3059decbd2c9530e0 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Wed, 6 Nov 2024 22:23:37 +0100 +Subject: [PATCH 24/40] prevent the feature for being used outside 8>9 + +--- + .../libraries/persistentnetnamesconfig.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +index 2f12742a..b2c7f5ff 100644 +--- a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py ++++ b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +@@ -39,7 +39,8 @@ def generate_link_file(interface): + + @suppress_deprecation(InitrdIncludes) + def process(): +- if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' and version.get_target_major_version() != '8': ++ if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' and version.get_target_major_version() == '9': ++ # We can use this only for 8>9, for now + api.current_logger().info('Skipping generation of .link files renaming NICs as LEAPP_USE_NET_NAMING_SCHEMES=1') + return + +-- +2.47.0 + diff --git a/SOURCES/0025-fix-condition-on-when-net-naming-is-emitted.patch b/SOURCES/0025-fix-condition-on-when-net-naming-is-emitted.patch new file mode 100644 index 0000000..d5d92a0 --- /dev/null +++ b/SOURCES/0025-fix-condition-on-when-net-naming-is-emitted.patch @@ -0,0 +1,28 @@ +From e43a8922e06d72212e8e2a8b51747c668147182c Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Wed, 6 Nov 2024 22:26:01 +0100 +Subject: [PATCH 25/40] fix condition on when net naming is emitted + +--- + .../emit_net_naming_scheme/libraries/emit_net_naming.py | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +index 65abdd4d..726bb459 100644 +--- a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +@@ -44,7 +44,10 @@ def is_net_scheme_compatible_with_current_cmdline(): + + + def emit_msgs_to_use_net_naming_schemes(): +- if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') != '1' and version.get_target_major_version() != '8': ++ is_env_var_set = get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' ++ is_upgrade_8to9 = version.get_target_major_version() == '9' ++ is_net_naming_enabled_and_permitted = is_env_var_set and is_upgrade_8to9 ++ if not is_net_naming_enabled_and_permitted: + return + + # The package should be installed regardless of whether we will modify the cmdline - +-- +2.47.0 + diff --git a/SOURCES/0026-scangrubdevpartitionlayout-Skip-warning-msgs.patch b/SOURCES/0026-scangrubdevpartitionlayout-Skip-warning-msgs.patch new file mode 100644 index 0000000..cc0a99c --- /dev/null +++ b/SOURCES/0026-scangrubdevpartitionlayout-Skip-warning-msgs.patch @@ -0,0 +1,56 @@ +From 0bf07d1546ccdc6d4a9e6f4936a98b4d6ca27789 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Tue, 12 Nov 2024 09:10:50 +0100 +Subject: [PATCH 26/40] scangrubdevpartitionlayout: Skip warning msgs + +The fdisk output can contain warning msgs when a partition is not +aligned on physical sector boundary, like: + Partition 4 does not start on physical sector boundary. +We know that in case of MBR the line we expect to parse always +starts with canonical path. So let's skip all lines which does +not start with '/'. + +jira: https://issues.redhat.com/browse/RHEL-50947 +--- + .../libraries/scan_layout.py | 10 ++++++++++ + .../tests/test_scan_partition_layout.py | 3 +++ + 2 files changed, 13 insertions(+) + +diff --git a/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/libraries/scan_layout.py b/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/libraries/scan_layout.py +index 83d02656..7f4a2a59 100644 +--- a/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/libraries/scan_layout.py ++++ b/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/libraries/scan_layout.py +@@ -68,6 +68,16 @@ def get_partition_layout(device): + + partitions = [] + for partition_line in table_iter: ++ if not partition_line.startswith('/'): ++ # the output can contain warning msg when a partition is not aligned ++ # on physical sector boundary, like: ++ # ~~~ ++ # Partition 4 does not start on physical sector boundary. ++ # ~~~ ++ # We know that in case of MBR the line we expect to parse always ++ # starts with canonical path. So let's use this condition. ++ # See https://issues.redhat.com/browse/RHEL-50947 ++ continue + # Fields: Device Boot Start End Sectors Size Id Type + # The line looks like: `/dev/vda1 * 2048 2099199 2097152 1G 83 Linux` + part_info = split_on_space_segments(partition_line) +diff --git a/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/tests/test_scan_partition_layout.py b/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/tests/test_scan_partition_layout.py +index 743ca71f..9c32e16f 100644 +--- a/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/tests/test_scan_partition_layout.py ++++ b/repos/system_upgrade/el7toel8/actors/scangrubdevpartitionlayout/tests/test_scan_partition_layout.py +@@ -49,6 +49,9 @@ def test_get_partition_layout(monkeypatch, devices, fs): + part_line = '{0} * {1} 2099199 1048576 83 {2}'.format(part.name, part.start_offset, fs) + fdisk_output.append(part_line) + ++ # add a problematic warning msg to test: ++ # https://issues.redhat.com/browse/RHEL-50947 ++ fdisk_output.append('Partition 3 does not start on physical sector boundary.') + device_to_fdisk_output[device.name] = fdisk_output + + def mocked_run(cmd, *args, **kwargs): +-- +2.47.0 + diff --git a/SOURCES/0027-Workaround-for-ARM-Upgrades-from-RHEL8-to-RHEL9.5.patch b/SOURCES/0027-Workaround-for-ARM-Upgrades-from-RHEL8-to-RHEL9.5.patch new file mode 100644 index 0000000..91dde99 --- /dev/null +++ b/SOURCES/0027-Workaround-for-ARM-Upgrades-from-RHEL8-to-RHEL9.5.patch @@ -0,0 +1,1756 @@ +From abcf7a5d209d4f9fc054d39cf6866b2809fe382b Mon Sep 17 00:00:00 2001 +From: David Kubek <dkubek@redhat.com> +Date: Wed, 24 Jul 2024 21:59:53 +0200 +Subject: [PATCH 27/40] Workaround for ARM Upgrades from RHEL8 to RHEL9.5+ + +Address issue with ARM system upgrades from RHEL 8 to RHEL 9.5+ caused +by GRUB bootloader incompatibility with newer kernels. When attempting +to load the RHEL 9.5+ kernel using the RHEL 8 bootloader, the upgrade +process halts due to a boot crash. + +JIRA: 41193 +--- + repos/system_upgrade/common/libraries/grub.py | 323 ++++++++++++++++-- + .../common/libraries/tests/test_grub.py | 244 ++++++++++++- + repos/system_upgrade/common/models/efiinfo.py | 27 ++ + .../addarmbootloaderworkaround/actor.py | 59 ++++ + .../libraries/addupgradebootloader.py | 185 ++++++++++ + .../tests/test_addarmbootloaderworkaround.py | 312 +++++++++++++++++ + .../actors/checkarmbootloader/actor.py | 16 +- + .../libraries/checkarmbootloader.py | 44 +-- + .../tests/test_checkarmbootloader.py | 36 +- + .../actors/removeupgradeefientry/actor.py | 26 ++ + .../libraries/removeupgradeefientry.py | 100 ++++++ + .../tests/test_removeupgradeefientry.py | 105 ++++++ + .../el8toel9/models/upgradeefientry.py | 14 + + 13 files changed, 1399 insertions(+), 92 deletions(-) + create mode 100644 repos/system_upgrade/common/models/efiinfo.py + create mode 100644 repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/actor.py + create mode 100644 repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/libraries/addupgradebootloader.py + create mode 100644 repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/tests/test_addarmbootloaderworkaround.py + create mode 100644 repos/system_upgrade/el8toel9/actors/removeupgradeefientry/actor.py + create mode 100644 repos/system_upgrade/el8toel9/actors/removeupgradeefientry/libraries/removeupgradeefientry.py + create mode 100644 repos/system_upgrade/el8toel9/actors/removeupgradeefientry/tests/test_removeupgradeefientry.py + create mode 100644 repos/system_upgrade/el8toel9/models/upgradeefientry.py + +diff --git a/repos/system_upgrade/common/libraries/grub.py b/repos/system_upgrade/common/libraries/grub.py +index 3c80556e..cd960ea4 100644 +--- a/repos/system_upgrade/common/libraries/grub.py ++++ b/repos/system_upgrade/common/libraries/grub.py +@@ -1,10 +1,204 @@ + import os ++import re + + from leapp.exceptions import StopActorExecution + from leapp.libraries.common import mdraid + from leapp.libraries.stdlib import api, CalledProcessError, run + from leapp.utils.deprecation import deprecated + ++EFI_MOUNTPOINT = '/boot/efi/' ++"""The path to the required mountpoint for ESP.""" ++ ++GRUB2_BIOS_ENTRYPOINT = '/boot/grub2' ++"""The entrypoint path of the BIOS GRUB2""" ++ ++GRUB2_BIOS_ENV_FILE = os.path.join(GRUB2_BIOS_ENTRYPOINT, 'grubenv') ++"""The path to the env file for GRUB2 in BIOS""" ++ ++ ++def canonical_path_to_efi_format(canonical_path): ++ r"""Transform the canonical path to the UEFI format. ++ ++ e.g. /boot/efi/EFI/redhat/shimx64.efi -> \EFI\redhat\shimx64.efi ++ (just single backslash; so the string needs to be put into apostrophes ++ when used for /usr/sbin/efibootmgr cmd) ++ ++ The path has to start with /boot/efi otherwise the path is invalid for UEFI. ++ """ ++ ++ # We want to keep the last "/" of the EFI_MOUNTPOINT ++ return canonical_path.replace(EFI_MOUNTPOINT[:-1], "").replace("/", "\\") ++ ++ ++class EFIBootLoaderEntry(object): ++ """ ++ Representation of an UEFI boot loader entry. ++ """ ++ # pylint: disable=eq-without-hash ++ ++ def __init__(self, boot_number, label, active, efi_bin_source): ++ self.boot_number = boot_number ++ """Expected string, e.g. '0001'. """ ++ ++ self.label = label ++ """Label of the UEFI entry. E.g. 'Redhat'""" ++ ++ self.active = active ++ """True when the UEFI entry is active (asterisk is present next to the boot number)""" ++ ++ self.efi_bin_source = efi_bin_source ++ """Source of the UEFI binary. ++ ++ It could contain various values, e.g.: ++ FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331) ++ HD(1,GPT,28c77f6b-3cd0-4b22-985f-c99903835d79,0x800,0x12c000)/File(\\EFI\\redhat\\shimx64.efi) ++ PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)N.....YM....R,Y. ++ """ ++ ++ def __eq__(self, other): ++ return all( ++ [ ++ self.boot_number == other.boot_number, ++ self.label == other.label, ++ self.active == other.active, ++ self.efi_bin_source == other.efi_bin_source, ++ ] ++ ) ++ ++ def __ne__(self, other): ++ return not self.__eq__(other) ++ ++ def __repr__(self): ++ return 'EFIBootLoaderEntry({boot_number}, {label}, {active}, {efi_bin_source})'.format( ++ boot_number=repr(self.boot_number), ++ label=repr(self.label), ++ active=repr(self.active), ++ efi_bin_source=repr(self.efi_bin_source) ++ ) ++ ++ def is_referring_to_file(self): ++ """Return True when the boot source is a file. ++ ++ Some sources could refer e.g. to PXE boot. Return true if the source ++ refers to a file ("ends with /File(...path...)") ++ ++ Does not matter whether the file exists or not. ++ """ ++ return '/File(\\' in self.efi_bin_source ++ ++ @staticmethod ++ def _efi_path_to_canonical(efi_path): ++ return os.path.join(EFI_MOUNTPOINT, efi_path.replace("\\", "/").lstrip("/")) ++ ++ def get_canonical_path(self): ++ """Return expected canonical path for the referred UEFI bin or None. ++ ++ Return None in case the entry is not referring to any UEFI bin ++ (e.g. when it refers to a PXE boot). ++ """ ++ if not self.is_referring_to_file(): ++ return None ++ match = re.search(r'/File\((?P<path>\\.*)\)$', self.efi_bin_source) ++ return EFIBootLoaderEntry._efi_path_to_canonical(match.groups('path')[0]) ++ ++ ++class EFIBootInfo(object): ++ """ ++ Data about the current UEFI boot configuration. ++ ++ Raise StopActorExecution when: ++ - unable to obtain info about the UEFI configuration. ++ - BIOS is detected. ++ - ESP is not mounted where expected. ++ """ ++ ++ def __init__(self): ++ if not is_efi(): ++ raise StopActorExecution('Unable to collect data about UEFI on a BIOS system.') ++ try: ++ result = run(['/usr/sbin/efibootmgr', '-v']) ++ except CalledProcessError: ++ raise StopActorExecution('Unable to get information about UEFI boot entries.') ++ ++ bootmgr_output = result['stdout'] ++ ++ self.current_bootnum = None ++ """The boot number (str) of the current boot.""" ++ self.next_bootnum = None ++ """The boot number (str) of the next boot.""" ++ self.boot_order = tuple() ++ """The tuple of the UEFI boot loader entries in the boot order.""" ++ self.entries = {} ++ """The UEFI boot loader entries {'boot_number': EFIBootLoader}""" ++ ++ self._parse_efi_boot_entries(bootmgr_output) ++ self._parse_current_bootnum(bootmgr_output) ++ self._parse_next_bootnum(bootmgr_output) ++ self._parse_boot_order(bootmgr_output) ++ self._print_loaded_info() ++ ++ def _parse_efi_boot_entries(self, bootmgr_output): ++ """ ++ Return dict of UEFI boot loader entries: {"<boot_number>": EFIBootLoader} ++ """ ++ ++ self.entries = {} ++ regexp_entry = re.compile( ++ r"^Boot(?P<bootnum>[a-zA-Z0-9]+)(?P<active>\*?)\s*(?P<label>.*?)\t(?P<bin_source>.*)$" ++ ) ++ ++ for line in bootmgr_output.splitlines(): ++ match = regexp_entry.match(line) ++ if not match: ++ continue ++ ++ self.entries[match.group('bootnum')] = EFIBootLoaderEntry( ++ boot_number=match.group('bootnum'), ++ label=match.group('label'), ++ active='*' in match.group('active'), ++ efi_bin_source=match.group('bin_source'), ++ ) ++ ++ if not self.entries: ++ # it's not expected that no entry exists ++ raise StopActorExecution('UEFI: Unable to detect any UEFI bootloader entry.') ++ ++ def _parse_key_value(self, bootmgr_output, key): ++ # e.g.: <key>: <value> ++ for line in bootmgr_output.splitlines(): ++ if line.startswith(key + ':'): ++ return line.split(':')[1].strip() ++ ++ return None ++ ++ def _parse_current_bootnum(self, bootmgr_output): ++ # e.g.: BootCurrent: 0002 ++ self.current_bootnum = self._parse_key_value(bootmgr_output, 'BootCurrent') ++ ++ if self.current_bootnum is None: ++ raise StopActorExecution('UEFI: Unable to detect current boot number.') ++ ++ def _parse_next_bootnum(self, bootmgr_output): ++ # e.g.: BootNext: 0002 ++ self.next_bootnum = self._parse_key_value(bootmgr_output, 'BootNext') ++ ++ def _parse_boot_order(self, bootmgr_output): ++ # e.g.: BootOrder: 0001,0002,0000,0003 ++ read_boot_order = self._parse_key_value(bootmgr_output, 'BootOrder') ++ self.boot_order = tuple(read_boot_order.split(',')) ++ ++ if self.boot_order is None: ++ raise StopActorExecution('UEFI: Unable to detect current boot order.') ++ ++ def _print_loaded_info(self): ++ msg = 'Bootloader setup:' ++ msg += '\nCurrent boot: %s' % self.current_bootnum ++ msg += '\nBoot order: %s\nBoot entries:' % ', '.join(self.boot_order) ++ for bootnum, entry in self.entries.items(): ++ msg += '\n- %s: %s' % (bootnum, entry.label.rstrip()) ++ ++ api.current_logger().debug(msg) ++ + + def has_grub(blk_dev): + """ +@@ -26,17 +220,88 @@ def has_grub(blk_dev): + return test in mbr + + ++def _get_partition(directory): ++ """ ++ Get partition name of `directory`. ++ """ ++ ++ try: ++ result = run(['grub2-probe', '--target=device', directory]) ++ except CalledProcessError: ++ msg = 'Could not get name of underlying {} partition'.format(directory) ++ api.current_logger().warning(msg) ++ raise StopActorExecution(msg) ++ except OSError: ++ msg = ('Could not get name of underlying {} partition:' ++ ' grub2-probe is missing.' ++ ' Possibly called on system that does not use GRUB2?').format(directory) ++ api.current_logger().warning(msg) ++ raise StopActorExecution(msg) ++ ++ partition = result['stdout'].strip() ++ api.current_logger().info('{} is on {}'.format(directory, partition)) ++ ++ return partition ++ ++ ++def get_boot_partition(): ++ """ ++ Get /boot partition name. ++ """ ++ ++ return _get_partition('/boot') ++ ++ ++def is_efi(): ++ """ ++ Return True if UEFI is used. ++ ++ NOTE(pstodulk): the check doesn't have to be valid for hybrid boot (e.g. AWS, Azure, ..) ++ """ ++ ++ return os.path.exists("/sys/firmware/efi") ++ ++ ++def get_efi_partition(): ++ """ ++ Return the EFI System Partition (ESP). ++ ++ Raise StopActorExecution when: ++ - UEFI is not detected, ++ - ESP is not mounted where expected, ++ - the partition can't be obtained from GRUB. ++ """ ++ ++ if not is_efi(): ++ raise StopActorExecution('Unable to get ESP when BIOS is used.') ++ ++ if not os.path.exists(EFI_MOUNTPOINT) or not os.path.ismount(EFI_MOUNTPOINT): ++ raise StopActorExecution( ++ 'The UEFI has been detected but the ESP is not mounted in /boot/efi as required.' ++ ) ++ ++ return _get_partition('/boot/efi/') ++ ++ + def blk_dev_from_partition(partition): + """ +- Find parent device of /boot partition ++ Get the block device. ++ ++ In case of the block device itself (e.g. /dev/sda), return just the block ++ device. In case of a partition, return its block device: ++ /dev/sda -> /dev/sda ++ /dev/sda1 -> /dev/sda ++ ++ Raise CalledProcessError when unable to get the block device. + """ ++ + try: + result = run(['lsblk', '-spnlo', 'name', partition]) + except CalledProcessError: +- api.current_logger().warning( +- 'Could not get parent device of {} partition'.format(partition) +- ) +- raise StopActorExecution() # TODO: return some meaningful value/error ++ msg = 'Could not get parent device of {} partition'.format(partition) ++ api.current_logger().warning(msg) ++ raise StopActorExecution(msg) ++ + # lsblk "-s" option prints dependencies in inverse order, so the parent device will always + # be the last or the only device. + # Command result example: +@@ -44,28 +309,32 @@ def blk_dev_from_partition(partition): + return result['stdout'].strip().split()[-1] + + +-def get_boot_partition(): +- """ +- Get /boot partition name. ++def get_device_number(device): ++ """Get the partition number of a particular device. ++ ++ This method will use `blkid` to determinate what is the partition number ++ related to a particular device. ++ ++ :param device: The device to be analyzed. ++ :type device: str ++ :return: The device partition number. ++ :rtype: int + """ ++ + try: +- # call grub2-probe to identify /boot partition +- result = run(['grub2-probe', '--target=device', '/boot']) +- except CalledProcessError: +- api.current_logger().warning( +- 'Could not get name of underlying /boot partition' ++ result = run( ++ ['/usr/sbin/blkid', '-p', '-s', 'PART_ENTRY_NUMBER', device], + ) +- raise StopActorExecution() # TODO: return some meaningful value/error +- except OSError: +- api.current_logger().warning( +- 'Could not get name of underlying /boot partition:' +- ' grub2-probe is missing.' +- ' Possibly called on system that does not use GRUB2?' +- ) +- raise StopActorExecution() # TODO: return some meaningful value/error +- boot_partition = result['stdout'].strip() +- api.current_logger().info('/boot is on {}'.format(boot_partition)) +- return boot_partition ++ output = result['stdout'].strip() ++ except CalledProcessError: ++ raise StopActorExecution('Unable to get information about the {} device'.format(device)) ++ ++ if not output: ++ raise StopActorExecution('The {} device has no PART_ENTRY_NUMBER'.format(device)) ++ ++ partition_number = output.split('PART_ENTRY_NUMBER=')[-1].replace('"', '') ++ ++ return int(partition_number) + + + def get_grub_devices(): +@@ -94,6 +363,12 @@ def get_grub_devices(): + return have_grub + + ++def get_efi_device(): ++ """Get the block device on which GRUB is installed.""" ++ ++ return blk_dev_from_partition(get_efi_partition()) ++ ++ + @deprecated(since='2023-06-23', message='This function has been replaced by get_grub_devices') + def get_grub_device(): + """ +diff --git a/repos/system_upgrade/common/libraries/tests/test_grub.py b/repos/system_upgrade/common/libraries/tests/test_grub.py +index 6f13538c..9bc9f682 100644 +--- a/repos/system_upgrade/common/libraries/tests/test_grub.py ++++ b/repos/system_upgrade/common/libraries/tests/test_grub.py +@@ -9,7 +9,10 @@ from leapp.libraries.stdlib import api, CalledProcessError + from leapp.models import DefaultGrub, DefaultGrubInfo + from leapp.utils.deprecation import suppress_deprecation + +-BOOT_PARTITION = '/dev/vda1' ++EFI_PARTITION = '/dev/vda1' ++EFI_DEVICE = '/dev/vda' ++ ++BOOT_PARTITION = '/dev/vda2' + BOOT_DEVICE = '/dev/vda' + + MD_BOOT_DEVICE = '/dev/md0' +@@ -20,6 +23,72 @@ INVALID_DD = b'Nothing to see here!' + + CUR_DIR = os.path.dirname(os.path.abspath(__file__)) + ++# pylint: disable=E501 ++# flake8: noqa: E501 ++EFIBOOTMGR_OUTPUT = r""" ++BootCurrent: 0006 ++Timeout: 5 seconds ++BootOrder: 0003,0004,0001,0006,0000,0002,0007,0005 ++Boot0000 redhat VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb) ++Boot0001* UEFI: Built-in EFI Shell VenMedia(5023b95c-db26-429b-a648-bd47664c8012)..BO ++Boot0002 Fedora VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb) ++Boot0003* UEFI: PXE IPv4 Intel(R) Network D8:5E:D3:8F:A4:E8 PcieRoot(0x40000)/Pci(0x1,0x0)/Pci(0x0,0x0)/MAC(d85ed38fa4e8,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO ++Boot0004* UEFI: PXE IPv4 Intel(R) Network D8:5E:D3:8F:A4:E9 PcieRoot(0x40000)/Pci(0x1,0x0)/Pci(0x0,0x1)/MAC(d85ed38fa4e9,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO ++Boot0005 centos VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb) ++Boot0006* Red Hat Enterprise Linux HD(1,GPT,050609f2-0ad0-43cf-8cdf-e53132b898c9,0x800,0x12c000)/File(\EFI\REDHAT\SHIMAA64.EFI) ++Boot0007 CentOS Stream VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb) ++""" ++EFIBOOTMGR_OUTPUT_ENTRIES = { ++ '0000': grub.EFIBootLoaderEntry( ++ '0000', ++ 'redhat', ++ False, ++ 'VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)' ++ ), ++ '0001': grub.EFIBootLoaderEntry( ++ '0001', ++ 'UEFI: Built-in EFI Shell', ++ True, ++ 'VenMedia(5023b95c-db26-429b-a648-bd47664c8012)..BO' ++ ), ++ '0002': grub.EFIBootLoaderEntry( ++ '0002', ++ 'Fedora', ++ False, ++ 'VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)' ++ ), ++ '0003': grub.EFIBootLoaderEntry( ++ '0003', ++ 'UEFI: PXE IPv4 Intel(R) Network D8:5E:D3:8F:A4:E8', ++ True, ++ 'PcieRoot(0x40000)/Pci(0x1,0x0)/Pci(0x0,0x0)/MAC(d85ed38fa4e8,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO' ++ ), ++ '0004': grub.EFIBootLoaderEntry( ++ '0004', ++ 'UEFI: PXE IPv4 Intel(R) Network D8:5E:D3:8F:A4:E9', ++ True, ++ 'PcieRoot(0x40000)/Pci(0x1,0x0)/Pci(0x0,0x1)/MAC(d85ed38fa4e9,1)/IPv4(0.0.0.00.0.0.0,0,0)..BO' ++ ), ++ '0005': grub.EFIBootLoaderEntry( ++ '0005', ++ 'centos', ++ False, ++ 'VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)' ++ ), ++ '0006': grub.EFIBootLoaderEntry( ++ '0006', ++ 'Red Hat Enterprise Linux', ++ True, ++ 'HD(1,GPT,050609f2-0ad0-43cf-8cdf-e53132b898c9,0x800,0x12c000)/File(\\EFI\\REDHAT\\SHIMAA64.EFI)' ++ ), ++ '0007': grub.EFIBootLoaderEntry( ++ '0007', ++ 'CentOS Stream', ++ False, ++ 'VenHw(99e275e7-75a0-4b37-a2e6-c5385e6c00cb)' ++ ), ++} ++ + + def raise_call_error(args=None): + raise CalledProcessError( +@@ -37,24 +106,37 @@ class RunMocked(object): + self.raise_err = raise_err + self.boot_on_raid = boot_on_raid + +- def __call__(self, args, encoding=None): ++ def __call__(self, args, encoding=None, checked=True): + self.called += 1 + self.args = args + stdout = '' + if self.raise_err: +- raise_call_error(args) ++ if checked is True: ++ raise_call_error(args) + +- if self.args == ['grub2-probe', '--target=device', '/boot']: +- stdout = MD_BOOT_DEVICE if self.boot_on_raid else BOOT_PARTITION ++ return {'signal': None, 'exit_code': 1, 'pid': 0, 'stdout': 'fake', 'stderr': 'fake'} ++ ++ if self.args[:-1] == ['grub2-probe', '--target=device']: ++ directory = self.args[-1] ++ if directory == '/boot': ++ stdout = MD_BOOT_DEVICE if self.boot_on_raid else BOOT_PARTITION ++ elif directory == '/boot/efi/': ++ stdout = EFI_PARTITION ++ else: ++ raise ValueError('Invalid argument {}'.format(directory)) + + elif self.args == ['lsblk', '-spnlo', 'name', BOOT_PARTITION]: + stdout = BOOT_DEVICE ++ elif self.args == ['lsblk', '-spnlo', 'name', EFI_PARTITION]: ++ stdout = EFI_DEVICE + elif self.args[:-1] == ['lsblk', '-spnlo', 'name']: + stdout = self.args[-1][:-1] ++ elif self.args == ['/usr/sbin/efibootmgr', '-v']: ++ stdout = EFIBOOTMGR_OUTPUT + else: + assert False, 'RunMockedError: Called unexpected cmd not covered by test: {}'.format(self.args) + +- return {'stdout': stdout} ++ return {'stdout': stdout, 'exit_code': 0} + + + def open_mocked(fn, flags): +@@ -190,3 +272,153 @@ def test_get_grub_devices_raid_device(monkeypatch, component_devs, expected): + assert sorted(expected) == result + assert not api.current_logger.warnmsg + assert 'GRUB is installed on {}'.format(",".join(result)) in api.current_logger.infomsg ++ ++ ++def test_canonical_path_to_efi_format(): ++ assert grub.canonical_path_to_efi_format('/boot/efi/EFI/redhat/shimx64.efi') == r'\EFI\redhat\shimx64.efi' ++ ++ ++def test_EFIBootLoaderEntry__efi_path_to_canonical(): ++ real = grub.EFIBootLoaderEntry._efi_path_to_canonical(r'\EFI\redhat\shimx64.efi') ++ expected = '/boot/efi/EFI/redhat/shimx64.efi' ++ assert real == expected ++ ++ ++def test_canonical_to_efi_to_canonical(): ++ canonical = '/boot/efi/EFI/redhat/shimx64.efi' ++ efi = grub.canonical_path_to_efi_format(canonical) ++ ++ assert grub.EFIBootLoaderEntry._efi_path_to_canonical(efi) == canonical ++ ++ ++def test_efi_path_to_canonical_to_efi(): ++ efi = r'\EFI\redhat\shimx64.efi' ++ canonical = grub.EFIBootLoaderEntry._efi_path_to_canonical(efi) ++ ++ assert grub.canonical_path_to_efi_format(canonical) == efi ++ ++ ++@pytest.mark.parametrize( ++ 'efi_bin_source, expected', ++ [ ++ ('FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331) ', False), ++ ('PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)N.....YM....R,Y.', False), ++ ('HD(1,GPT,28c77f6b-3cd0-4b22-985f-c99903835d79,0x800,0x12c000)/File(\\EFI\\redhat\\shimx64.efi)', True), ++ ] ++) ++def test_EFIBootLoaderEntry_is_referring_to_file(efi_bin_source, expected): ++ bootloader_entry = grub.EFIBootLoaderEntry('0001', 'Redhat', False, efi_bin_source) ++ assert bootloader_entry.is_referring_to_file() is expected ++ ++ ++@pytest.mark.parametrize( ++ 'efi_bin_source, expected', ++ [ ++ ('FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331) ', None), ++ ('PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)N.....YM....R,Y.', None), ++ ('HD(1,GPT,28c77f6b-3cd0-4b22-985f-c99903835d79,0x800,0x12c000)/File(\\EFI\\redhat\\shimx64.efi)', ++ '/boot/efi/EFI/redhat/shimx64.efi'), ++ ] ++) ++def test_EFIBootLoaderEntry_get_canonical_path(efi_bin_source, expected): ++ bootloader_entry = grub.EFIBootLoaderEntry('0001', 'Redhat', False, efi_bin_source) ++ assert bootloader_entry.get_canonical_path() == expected ++ ++ ++def test_is_efi_success(monkeypatch): ++ def exists_mocked(path): ++ if path == '/sys/firmware/efi': ++ return True ++ raise ValueError('Unexpected path checked: {}'.format(path)) ++ ++ monkeypatch.setattr(os.path, 'exists', exists_mocked) ++ ++ assert grub.is_efi() is True ++ ++ ++def test_is_efi_fail(monkeypatch): ++ def exists_mocked(path): ++ if path == '/sys/firmware/efi': ++ return False ++ raise ValueError('Unexpected path checked: {}'.format(path)) ++ ++ monkeypatch.setattr(os.path, 'exists', exists_mocked) ++ ++ assert grub.is_efi() is False ++ ++ ++def test_get_efi_partition_success(monkeypatch): ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ monkeypatch.setattr(grub, 'is_efi', lambda: True) ++ monkeypatch.setattr(os.path, 'exists', lambda path: path == '/boot/efi/') ++ monkeypatch.setattr(os.path, 'ismount', lambda path: path == '/boot/efi/') ++ ++ assert grub.get_efi_partition() == EFI_PARTITION ++ ++ ++def test_get_efi_partition_success_fail_not_efi(monkeypatch): ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ monkeypatch.setattr(grub, 'is_efi', lambda: False) ++ monkeypatch.setattr(os.path, 'exists', lambda path: path == '/boot/efi/') ++ monkeypatch.setattr(os.path, 'ismount', lambda path: path == '/boot/efi/') ++ ++ with pytest.raises(StopActorExecution) as err: ++ grub.get_efi_partition() ++ assert 'Unable to get ESP when BIOS is used.' in err ++ ++ ++def test_get_efi_partition_success_fail_not_exists(monkeypatch): ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ monkeypatch.setattr(grub, 'is_efi', lambda: True) ++ monkeypatch.setattr(os.path, 'exists', lambda path: False) ++ monkeypatch.setattr(os.path, 'ismount', lambda path: path == '/boot/efi/') ++ ++ with pytest.raises(StopActorExecution) as err: ++ grub.get_efi_partition() ++ assert 'The UEFI has been detected but' in err ++ ++ ++def test_get_efi_partition_success_fail_not_mounted(monkeypatch): ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ monkeypatch.setattr(grub, 'is_efi', lambda: True) ++ monkeypatch.setattr(os.path, 'exists', lambda path: path == '/boot/efi/') ++ monkeypatch.setattr(os.path, 'ismount', lambda path: False) ++ ++ with pytest.raises(StopActorExecution) as err: ++ grub.get_efi_partition() ++ assert 'The UEFI has been detected but' in err ++ ++ ++def test_get_efi_device(monkeypatch): ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ monkeypatch.setattr(grub, 'get_efi_partition', lambda: EFI_PARTITION) ++ ++ assert grub.get_efi_device() == EFI_DEVICE ++ ++ ++def test_EFIBootInfo_fail_not_efi(monkeypatch): ++ monkeypatch.setattr(grub, 'is_efi', lambda: False) ++ ++ with pytest.raises(StopActorExecution) as err: ++ grub.EFIBootInfo() ++ assert 'Unable to collect data about UEFI on a BIOS system.' in err ++ ++ ++def test_EFIBootInfo_fail_efibootmgr_error(monkeypatch): ++ monkeypatch.setattr(grub, 'is_efi', lambda: True) ++ monkeypatch.setattr(grub, 'run', RunMocked(raise_err=True)) ++ ++ with pytest.raises(StopActorExecution) as err: ++ grub.EFIBootInfo() ++ assert 'Unable to get information about UEFI boot entries.' in err ++ ++ ++def test_EFIBootInfo_success(monkeypatch): ++ monkeypatch.setattr(grub, 'is_efi', lambda: True) ++ monkeypatch.setattr(grub, 'run', RunMocked()) ++ ++ efibootinfo = grub.EFIBootInfo() ++ assert efibootinfo.current_bootnum == '0006' ++ assert efibootinfo.next_bootnum is None ++ assert efibootinfo.boot_order == ('0003', '0004', '0001', '0006', '0000', '0002', '0007', '0005') ++ assert efibootinfo.entries == EFIBOOTMGR_OUTPUT_ENTRIES +diff --git a/repos/system_upgrade/common/models/efiinfo.py b/repos/system_upgrade/common/models/efiinfo.py +new file mode 100644 +index 00000000..b989c389 +--- /dev/null ++++ b/repos/system_upgrade/common/models/efiinfo.py +@@ -0,0 +1,27 @@ ++from leapp.models import fields, Model ++from leapp.topics import SystemInfoTopic ++ ++ ++class EFIBootEntry(Model): ++ """ ++ Information about an UEFI boot loader entry. ++ """ ++ topic = SystemInfoTopic ++ ++ boot_number = fields.String() ++ """Expected string, e.g. '0001'. """ ++ ++ label = fields.String() ++ """Label of the UEFI entry. E.g. 'Redhat'""" ++ ++ active = fields.Boolean() ++ """True when the UEFI entry is active (asterisk is present next to the boot number)""" ++ ++ efi_bin_source = fields.String() ++ """Source of the UEFI binary. ++ ++ It could contain various values, e.g.: ++ FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331) ++ HD(1,GPT,28c77f6b-3cd0-4b22-985f-c99903835d79,0x800,0x12c000)/File(\\EFI\\redhat\\shimx64.efi) ++ PciRoot(0x0)/Pci(0x2,0x3)/Pci(0x0,0x0)N.....YM....R,Y. ++ """ +diff --git a/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/actor.py b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/actor.py +new file mode 100644 +index 00000000..54e8aca8 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/actor.py +@@ -0,0 +1,59 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor import addupgradebootloader ++from leapp.libraries.common.config import architecture ++from leapp.libraries.common.config.version import matches_target_version ++from leapp.models import ArmWorkaroundEFIBootloaderInfo, TargetUserSpaceInfo ++from leapp.tags import InterimPreparationPhaseTag, IPUWorkflowTag ++ ++ ++class AddArmBootloaderWorkaround(Actor): ++ """ ++ Workaround for ARM Upgrades from RHEL8 to RHEL9.5 onwards ++ ++ This actor addresses an issue encountered during the upgrade process on ARM ++ systems. Specifically, the problem arises due to an incompatibility between ++ the GRUB bootloader used in RHEL 8 and the newer kernels from RHEL 9.5 ++ onwards. When the kernel of the target system is loaded using the ++ bootloader from the source system, this incompatibility causes the ++ bootloader to crash, halting the upgrade. ++ ++ To mitigate this issue, the following steps are implemented: ++ ++ Before the Upgrade (handled by CheckArmBootloader): ++ ++ * Install required RPM packages: ++ - Specific packages, including an updated GRUB bootloader and shim for ++ ARM (grub2-efi-aa64 and shim-aa64), are installed to ensure ++ compatibility with the newer kernel. ++ ++ Before the Upgrade (this actor): ++ ++ * Create a new Upgrade EFI entry: ++ - A new EFI boot entry is created and populated with the updated RHEL 9 ++ bootloader that is compatible with the new kernel. ++ ++ * Preserve the original EFI boot entry and GRUB configuration: ++ - The original EFI boot entry and GRUB configuration remain unchanged to ++ ensure system stability. ++ ++ After the Upgrade (handled by RemoveUpgradeEFIEntry): ++ ++ * Remove the upgrade EFI boot entry: ++ - The temporary EFI boot entry created for the upgrade is removed to ++ restore the system to its pre-upgrade state. ++ ++ """ ++ ++ name = 'add_arm_bootloader_workaround' ++ consumes = (TargetUserSpaceInfo,) ++ produces = (ArmWorkaroundEFIBootloaderInfo,) ++ tags = (IPUWorkflowTag, InterimPreparationPhaseTag) ++ ++ def process(self): ++ if not architecture.matches_architecture(architecture.ARCH_ARM64): ++ return ++ ++ if matches_target_version('< 9.5'): ++ return ++ ++ addupgradebootloader.process() +diff --git a/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/libraries/addupgradebootloader.py b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/libraries/addupgradebootloader.py +new file mode 100644 +index 00000000..5e9bf5c6 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/libraries/addupgradebootloader.py +@@ -0,0 +1,185 @@ ++import os ++import shutil ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.common import mounting ++from leapp.libraries.common.grub import ( ++ canonical_path_to_efi_format, ++ EFIBootInfo, ++ get_device_number, ++ get_efi_device, ++ get_efi_partition, ++ GRUB2_BIOS_ENTRYPOINT, ++ GRUB2_BIOS_ENV_FILE ++) ++from leapp.libraries.stdlib import api, CalledProcessError, run ++from leapp.models import ArmWorkaroundEFIBootloaderInfo, EFIBootEntry, TargetUserSpaceInfo ++ ++UPGRADE_EFI_ENTRY_LABEL = 'Leapp Upgrade' ++ ++ARM_SHIM_PACKAGE_NAME = 'shim-aa64' ++ARM_GRUB_PACKAGE_NAME = 'grub2-efi-aa64' ++ ++EFI_MOUNTPOINT = '/boot/efi/' ++LEAPP_EFIDIR_CANONICAL_PATH = os.path.join(EFI_MOUNTPOINT, 'EFI/leapp/') ++RHEL_EFIDIR_CANONICAL_PATH = os.path.join(EFI_MOUNTPOINT, 'EFI/redhat/') ++ ++CONTAINER_DOWNLOAD_DIR = '/tmp_pkg_download_dir' ++ ++ ++def _copy_file(src_path, dst_path): ++ if os.path.exists(dst_path): ++ api.current_logger().debug("The {} file already exists and its content will be overwritten.".format(dst_path)) ++ ++ api.current_logger().info("Copying {} to {}".format(src_path, dst_path)) ++ try: ++ shutil.copy2(src_path, dst_path) ++ except (OSError, IOError) as err: ++ raise StopActorExecutionError('I/O error({}): {}'.format(err.errno, err.strerror)) ++ ++ ++def process(): ++ userspace = _get_userspace_info() ++ ++ with mounting.NspawnActions(base_dir=userspace.path) as context: ++ _ensure_clean_environment() ++ ++ # NOTE(dkubek): Assumes required shim-aa64 and grub2-efi-aa64 packages ++ # have been installed ++ context.copytree_from(RHEL_EFIDIR_CANONICAL_PATH, LEAPP_EFIDIR_CANONICAL_PATH) ++ ++ _copy_grub_files(['grubenv', 'grub.cfg'], ['user.cfg']) ++ _link_grubenv_to_upgrade_entry() ++ ++ efibootinfo = EFIBootInfo() ++ current_boot_entry = efibootinfo.entries[efibootinfo.current_bootnum] ++ upgrade_boot_entry = _add_upgrade_boot_entry(efibootinfo) ++ _set_bootnext(upgrade_boot_entry.boot_number) ++ ++ efibootentry_fields = ['boot_number', 'label', 'active', 'efi_bin_source'] ++ api.produce( ++ ArmWorkaroundEFIBootloaderInfo( ++ original_entry=EFIBootEntry(**{f: getattr(current_boot_entry, f) for f in efibootentry_fields}), ++ upgrade_entry=EFIBootEntry(**{f: getattr(upgrade_boot_entry, f) for f in efibootentry_fields}), ++ ) ++ ) ++ ++ ++def _get_userspace_info(): ++ msgs = api.consume(TargetUserSpaceInfo) ++ ++ userspace = next(msgs, None) ++ if userspace is None: ++ raise StopActorExecutionError('Could not retrieve TargetUserSpaceInfo!') ++ ++ if next(msgs, None): ++ api.current_logger().warning('Unexpectedly received more than one TargetUserSpaceInfo message.') ++ ++ return userspace ++ ++ ++def _ensure_clean_environment(): ++ if os.path.exists(LEAPP_EFIDIR_CANONICAL_PATH): ++ shutil.rmtree(LEAPP_EFIDIR_CANONICAL_PATH) ++ ++ ++def _copy_grub_files(required, optional): ++ """ ++ Copy grub files from redhat/ dir to the /boot/efi/EFI/leapp/ dir. ++ """ ++ ++ all_files = required + optional ++ for filename in all_files: ++ src_path = os.path.join(RHEL_EFIDIR_CANONICAL_PATH, filename) ++ dst_path = os.path.join(LEAPP_EFIDIR_CANONICAL_PATH, filename) ++ ++ if not os.path.exists(src_path): ++ if filename in required: ++ msg = 'Required file {} does not exists. Aborting.'.format(filename) ++ raise StopActorExecutionError(msg) ++ ++ continue ++ ++ _copy_file(src_path, dst_path) ++ ++ ++def _link_grubenv_to_upgrade_entry(): ++ upgrade_env_file = os.path.join(LEAPP_EFIDIR_CANONICAL_PATH, 'grubenv') ++ upgrade_env_file_relpath = os.path.relpath(upgrade_env_file, GRUB2_BIOS_ENTRYPOINT) ++ run(['ln', '--symbolic', '--force', upgrade_env_file_relpath, GRUB2_BIOS_ENV_FILE]) ++ ++ ++def _add_upgrade_boot_entry(efibootinfo): ++ """ ++ Create a new UEFI bootloader entry with a upgrade label and bin file. ++ ++ If an entry for the label and bin file already exists no new entry ++ will be created. ++ ++ Return the upgrade efi entry (EFIEntry). ++ """ ++ ++ dev_number = get_device_number(get_efi_partition()) ++ blk_dev = get_efi_device() ++ ++ tmp_efi_path = os.path.join(LEAPP_EFIDIR_CANONICAL_PATH, 'shimaa64.efi') ++ if os.path.exists(tmp_efi_path): ++ efi_path = canonical_path_to_efi_format(tmp_efi_path) ++ else: ++ raise StopActorExecutionError('Unable to detect upgrade UEFI binary file.') ++ ++ upgrade_boot_entry = _get_upgrade_boot_entry(efibootinfo, efi_path, UPGRADE_EFI_ENTRY_LABEL) ++ if upgrade_boot_entry is not None: ++ return upgrade_boot_entry ++ ++ cmd = [ ++ "/usr/sbin/efibootmgr", ++ "--create", ++ "--disk", ++ blk_dev, ++ "--part", ++ str(dev_number), ++ "--loader", ++ efi_path, ++ "--label", ++ UPGRADE_EFI_ENTRY_LABEL, ++ ] ++ ++ try: ++ run(cmd) ++ except CalledProcessError: ++ raise StopActorExecutionError('Unable to add a new UEFI bootloader entry for upgrade.') ++ ++ # Sanity check new boot entry has been added ++ efibootinfo_new = EFIBootInfo() ++ upgrade_boot_entry = _get_upgrade_boot_entry(efibootinfo_new, efi_path, UPGRADE_EFI_ENTRY_LABEL) ++ if upgrade_boot_entry is None: ++ raise StopActorExecutionError('Unable to find the new UEFI bootloader entry after adding it.') ++ ++ return upgrade_boot_entry ++ ++ ++def _get_upgrade_boot_entry(efibootinfo, efi_path, label): ++ """ ++ Get the UEFI boot entry with label `label` and EFI binary path `efi_path` ++ ++ Return EFIBootEntry or None if not found. ++ """ ++ ++ for entry in efibootinfo.entries.values(): ++ if entry.label == label and efi_path in entry.efi_bin_source: ++ return entry ++ ++ return None ++ ++ ++def _set_bootnext(boot_number): ++ """ ++ Set the BootNext UEFI entry to `boot_number`. ++ """ ++ ++ api.current_logger().debug('Setting {} as BootNext'.format(boot_number)) ++ try: ++ run(['/usr/sbin/efibootmgr', '--bootnext', boot_number]) ++ except CalledProcessError: ++ raise StopActorExecutionError('Could not set boot entry {} as BootNext.'.format(boot_number)) +diff --git a/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/tests/test_addarmbootloaderworkaround.py b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/tests/test_addarmbootloaderworkaround.py +new file mode 100644 +index 00000000..d2015272 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/addarmbootloaderworkaround/tests/test_addarmbootloaderworkaround.py +@@ -0,0 +1,312 @@ ++import os ++ ++import pytest ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.actor import addupgradebootloader ++from leapp.libraries.common.grub import EFIBootLoaderEntry ++from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked, make_OSError, produce_mocked ++from leapp.libraries.stdlib import api, CalledProcessError ++from leapp.models import ArmWorkaroundEFIBootloaderInfo, EFIBootEntry, TargetUserSpaceInfo ++ ++TEST_RHEL_EFI_ENTRY = EFIBootLoaderEntry( ++ '0000', ++ 'Red Hat Enterprise Linux', ++ True, ++ 'File(\\EFI\\redhat\\shimaa64.efi)' ++ ) ++TEST_UPGRADE_EFI_ENTRY = EFIBootLoaderEntry( ++ '0001', ++ addupgradebootloader.UPGRADE_EFI_ENTRY_LABEL, ++ True, ++ 'File(\\EFI\\leapp\\shimaa64.efi)' ++ ) ++ ++ ++class MockEFIBootInfo: ++ def __init__(self, entries): ++ assert len(entries) > 0 ++ ++ self.boot_order = tuple(entry.boot_number for entry in entries) ++ self.current_bootnum = self.boot_order[0] ++ self.next_bootnum = None ++ self.entries = { ++ entry.boot_number: entry for entry in entries ++ } ++ ++ ++class IsolatedActionsMocked(object): ++ def __init__(self): ++ self.copytree_from_calls = [] ++ ++ def __enter__(self): ++ return self ++ ++ def __exit__(self, *args): ++ pass ++ ++ def copytree_from(self, src, dst): ++ self.copytree_from_calls.append((src, dst)) ++ ++ ++@pytest.mark.parametrize('dst_exists', [True, False]) ++def test_copy_file(monkeypatch, dst_exists): ++ src_path = '/src/file.txt' ++ dst_path = '/dst/file.txt' ++ logger = logger_mocked() ++ ++ copy2_calls = [] ++ ++ def mock_copy2(src, dst): ++ copy2_calls.append((src, dst)) ++ ++ monkeypatch.setattr(os.path, 'exists', lambda path: dst_exists) ++ monkeypatch.setattr('shutil.copy2', mock_copy2) ++ monkeypatch.setattr(api, 'current_logger', logger) ++ ++ addupgradebootloader._copy_file(src_path, dst_path) ++ ++ assert copy2_calls == [(src_path, dst_path)] ++ if dst_exists: ++ assert 'The {} file already exists and its content will be overwritten.'.format(dst_path) in logger.dbgmsg ++ ++ assert 'Copying {} to {}'.format(src_path, dst_path) in logger.infomsg ++ ++ ++def test_copy_file_error(monkeypatch): ++ src_path = '/src/file.txt' ++ dst_path = '/dst/file.txt' ++ logger = logger_mocked() ++ ++ def mock_copy2_fail(src, dst): ++ raise make_OSError(5) ++ ++ monkeypatch.setattr(os.path, 'exists', lambda path: False) ++ monkeypatch.setattr('shutil.copy2', mock_copy2_fail) ++ monkeypatch.setattr(api, 'current_logger', logger) ++ ++ with pytest.raises(StopActorExecutionError, match=r'I/O error\(5\)'): ++ addupgradebootloader._copy_file(src_path, dst_path) ++ ++ ++def test_get_userspace_info(monkeypatch): ++ target_info_mock = TargetUserSpaceInfo(path='/USERSPACE', scratch='/SCRATCH', mounts='/MOUNTS') ++ ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[target_info_mock])) ++ ++ result = addupgradebootloader._get_userspace_info() ++ assert result == target_info_mock ++ ++ ++def test_get_userspace_info_none(monkeypatch): ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[])) ++ ++ with pytest.raises(StopActorExecutionError, match='Could not retrieve TargetUserSpaceInfo'): ++ addupgradebootloader._get_userspace_info() ++ ++ ++def test_get_userspace_info_multiple(monkeypatch): ++ logger = logger_mocked() ++ monkeypatch.setattr(api, 'current_logger', logger) ++ ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[ ++ TargetUserSpaceInfo(path='/USERSPACE1', scratch='/SCRATCH1', mounts='/MOUNTS1'), ++ TargetUserSpaceInfo(path='/USERSPACE2', scratch='/SCRATCH2', mounts='/MOUNTS2'), ++ ])) ++ ++ addupgradebootloader._get_userspace_info() ++ ++ assert 'Unexpectedly received more than one TargetUserSpaceInfo message.' in logger.warnmsg ++ ++ ++@pytest.mark.parametrize('exists', [True, False]) ++def test_ensure_clean_environment(monkeypatch, exists): ++ rmtree_calls = [] ++ ++ monkeypatch.setattr('os.path.exists', lambda path: exists) ++ monkeypatch.setattr('shutil.rmtree', rmtree_calls.append) ++ ++ addupgradebootloader._ensure_clean_environment() ++ ++ assert rmtree_calls == ([addupgradebootloader.LEAPP_EFIDIR_CANONICAL_PATH] if exists else []) ++ ++ ++def test_copy_grub_files(monkeypatch): ++ copy_file_calls = [] ++ ++ def mock_copy_file(src, dst): ++ copy_file_calls.append((src, dst)) ++ ++ monkeypatch.setattr(addupgradebootloader, '_copy_file', mock_copy_file) ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ addupgradebootloader._copy_grub_files(['required'], ['optional']) ++ ++ assert ( ++ os.path.join(addupgradebootloader.RHEL_EFIDIR_CANONICAL_PATH, 'required'), ++ os.path.join(addupgradebootloader.LEAPP_EFIDIR_CANONICAL_PATH, 'required') ++ ) in copy_file_calls ++ assert ( ++ os.path.join(addupgradebootloader.RHEL_EFIDIR_CANONICAL_PATH, 'optional'), ++ os.path.join(addupgradebootloader.LEAPP_EFIDIR_CANONICAL_PATH, 'optional') ++ ) in copy_file_calls ++ ++ ++def test_set_bootnext(monkeypatch): ++ run_calls = [] ++ logger = logger_mocked() ++ ++ def mock_run(command): ++ run_calls.append(command) ++ ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ monkeypatch.setattr(api, 'current_logger', logger) ++ ++ addupgradebootloader._set_bootnext('0000') ++ ++ assert run_calls == [['/usr/sbin/efibootmgr', '--bootnext', '0000']] ++ assert logger.dbgmsg == ['Setting {} as BootNext'.format('0000')] ++ ++ ++def test_add_upgrade_boot_entry_no_efi_binary(monkeypatch): ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_partition', lambda: '/dev/sda1') ++ monkeypatch.setattr(addupgradebootloader, 'get_device_number', lambda device: '1') ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_device', lambda: '/dev/sda') ++ monkeypatch.setattr(os.path, 'exists', lambda path: False) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY]) ++ with pytest.raises(StopActorExecutionError, match="Unable to detect upgrade UEFI binary file"): ++ addupgradebootloader._add_upgrade_boot_entry(efibootinfo_mock) ++ ++ ++def test_add_upgrade_already_exists(monkeypatch): ++ run_calls = [] ++ ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_partition', lambda: '/dev/sda1') ++ monkeypatch.setattr(addupgradebootloader, 'get_device_number', lambda device: '1') ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_device', lambda: '/dev/sda') ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ def mock_run(cmd): ++ run_calls.append(cmd) ++ ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY, TEST_UPGRADE_EFI_ENTRY]) ++ result = addupgradebootloader._add_upgrade_boot_entry(efibootinfo_mock) ++ ++ assert result == TEST_UPGRADE_EFI_ENTRY ++ assert len(run_calls) == 0 ++ ++ ++def test_add_upgrade_boot_entry_command_failure(monkeypatch): ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_partition', lambda: '/dev/sda1') ++ monkeypatch.setattr(addupgradebootloader, 'get_device_number', lambda device: '1') ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_device', lambda: '/dev/sda') ++ monkeypatch.setattr(addupgradebootloader, '_get_upgrade_boot_entry', lambda efi, path, label: None) ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ def mock_run(cmd): ++ raise CalledProcessError( ++ message='A Leapp Command Error occurred.', ++ command=cmd, ++ result={'signal': None, 'exit_code': 1, 'pid': 0, 'stdout': 'fake', 'stderr': 'fake'} ++ ) ++ ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY]) ++ with pytest.raises(StopActorExecutionError, match="Unable to add a new UEFI bootloader entry"): ++ addupgradebootloader._add_upgrade_boot_entry(efibootinfo_mock) ++ ++ ++def test_add_upgrade_boot_entry_verification_failure(monkeypatch): ++ run_calls = [] ++ ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_partition', lambda: '/dev/sda1') ++ monkeypatch.setattr(addupgradebootloader, 'get_device_number', lambda device: '1') ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_device', lambda: '/dev/sda') ++ monkeypatch.setattr(addupgradebootloader, '_get_upgrade_boot_entry', lambda efi, path, label: None) ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ def mock_run(cmd): ++ run_calls.append(cmd) ++ ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ monkeypatch.setattr(addupgradebootloader, 'EFIBootInfo', lambda: MockEFIBootInfo([TEST_RHEL_EFI_ENTRY])) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY]) ++ with pytest.raises(StopActorExecutionError, match="Unable to find the new UEFI bootloader entry after adding it"): ++ addupgradebootloader._add_upgrade_boot_entry(efibootinfo_mock) ++ ++ ++def test_add_upgrade_boot_entry_success(monkeypatch): ++ run_calls = [] ++ ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_partition', lambda: '/dev/sda1') ++ monkeypatch.setattr(addupgradebootloader, 'get_device_number', lambda device: '1') ++ monkeypatch.setattr(addupgradebootloader, 'get_efi_device', lambda: '/dev/sda') ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ def mock_run(cmd): ++ run_calls.append(cmd) ++ ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ monkeypatch.setattr( ++ addupgradebootloader, ++ 'EFIBootInfo', ++ lambda: MockEFIBootInfo([TEST_RHEL_EFI_ENTRY, TEST_UPGRADE_EFI_ENTRY]) ++ ) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY]) ++ result = addupgradebootloader._add_upgrade_boot_entry(efibootinfo_mock) ++ ++ assert [ ++ '/usr/sbin/efibootmgr', ++ '--create', ++ '--disk', '/dev/sda', ++ '--part', '1', ++ '--loader', '\\EFI\\leapp\\shimaa64.efi', ++ '--label', 'Leapp Upgrade', ++ ] in run_calls ++ assert result.label == addupgradebootloader.UPGRADE_EFI_ENTRY_LABEL ++ ++ ++def test_process(monkeypatch): ++ run_calls = [] ++ ++ def mock_run(cmd): ++ run_calls.append(cmd) ++ ++ target_info_mock = TargetUserSpaceInfo(path='/USERSPACE', scratch='/SCRATCH', mounts='/MOUNTS') ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[target_info_mock])) ++ monkeypatch.setattr(api, 'produce', produce_mocked()) ++ monkeypatch.setattr(addupgradebootloader, 'run', mock_run) ++ ++ context_mock = IsolatedActionsMocked() ++ monkeypatch.setattr(addupgradebootloader.mounting, 'NspawnActions', lambda *args, **kwargs: context_mock) ++ ++ monkeypatch.setattr(addupgradebootloader, '_copy_grub_files', lambda optional, required: None) ++ monkeypatch.setattr(addupgradebootloader, '_link_grubenv_to_upgrade_entry', lambda: None) ++ ++ efibootinfo_mock = MockEFIBootInfo([TEST_RHEL_EFI_ENTRY]) ++ monkeypatch.setattr(addupgradebootloader, 'EFIBootInfo', lambda: efibootinfo_mock) ++ ++ def mock_add_upgrade_boot_entry(efibootinfo): ++ return TEST_UPGRADE_EFI_ENTRY ++ ++ monkeypatch.setattr(addupgradebootloader, '_add_upgrade_boot_entry', mock_add_upgrade_boot_entry) ++ monkeypatch.setattr(addupgradebootloader, '_set_bootnext', lambda _: None) ++ ++ addupgradebootloader.process() ++ ++ assert api.produce.called == 1 ++ assert len(api.produce.model_instances) == 1 ++ ++ efibootentry_fields = ['boot_number', 'label', 'active', 'efi_bin_source'] ++ expected = ArmWorkaroundEFIBootloaderInfo( ++ original_entry=EFIBootEntry(**{f: getattr(TEST_RHEL_EFI_ENTRY, f) for f in efibootentry_fields}), ++ upgrade_entry=EFIBootEntry(**{f: getattr(TEST_UPGRADE_EFI_ENTRY, f) for f in efibootentry_fields}), ++ ) ++ actual = api.produce.model_instances[0] ++ assert actual == expected +diff --git a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/actor.py b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/actor.py +index b4938ced..d47ca8ca 100644 +--- a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/actor.py ++++ b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/actor.py +@@ -1,24 +1,24 @@ + import leapp.libraries.actor.checkarmbootloader as checkarmbootloader + from leapp.actors import Actor +-from leapp.reporting import Report ++from leapp.models import TargetUserSpacePreupgradeTasks + from leapp.tags import ChecksPhaseTag, IPUWorkflowTag + + + class CheckArmBootloader(Actor): + """ +- Inhibit ARM system upgrades on path with incompatible kernel/bootloader ++ Install required RPM packages for ARM system upgrades on paths with ++ incompatible kernel/bootloader. + +- Due to an incompatibility of RHEL8 bootloader with newer versions of kernel +- on RHEL9 since version 9.5, the upgrade cannot be performed as the old +- bootloader cannot load the new kernel when entering the interim phase. +- +- This is temporary workaround until the issue is resolved. ++ Due to an incompatibility of the RHEL8 bootloader with newer versions of ++ the kernel on RHEL9 (from version 9.5 onward), the upgrade requires the ++ installation of specific packages to support the new kernel during the ++ interim phase. + + """ + + name = 'check_arm_bootloader' + consumes = () +- produces = (Report,) ++ produces = (TargetUserSpacePreupgradeTasks,) + tags = (ChecksPhaseTag, IPUWorkflowTag,) + + def process(self): +diff --git a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/libraries/checkarmbootloader.py b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/libraries/checkarmbootloader.py +index a5fdffe9..91950be2 100644 +--- a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/libraries/checkarmbootloader.py ++++ b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/libraries/checkarmbootloader.py +@@ -1,44 +1,16 @@ +-from leapp import reporting + from leapp.libraries.common.config.architecture import ARCH_ARM64, matches_architecture + from leapp.libraries.common.config.version import get_source_version, get_target_version, matches_target_version + from leapp.libraries.stdlib import api ++from leapp.models import TargetUserSpacePreupgradeTasks + +- +-def _inhibit_upgrade(): +- title = 'Upgrade RHEL {} to RHEL {} not possible for ARM machines.'.format( +- get_source_version(), get_target_version()) +- summary = ( +- 'Due to the incompatibility of the RHEL 8 bootloader with a newer version of kernel on RHEL {}' +- ' for ARM machines, the direct upgrade cannot be performed to this RHEL' +- ' system version now. The fix is not expected to be delivered during the RHEL 9.5 lifetime.' +- .format(get_target_version()) +- ) +- +- reporting.create_report([ +- reporting.Title(title), +- reporting.Summary(summary), +- reporting.ExternalLink( +- title='Known issues for the RHEL 8.10 to RHEL 9.5 upgrade', +- url='https://red.ht/upgrading-rhel8-to-rhel9-known-issues'), +- reporting.Severity(reporting.Severity.HIGH), +- reporting.Groups([reporting.Groups.INHIBITOR]), +- reporting.Groups([reporting.Groups.SANITY]), +- reporting.Remediation(hint=( +- 'To upgrade to the RHEL {} version, first in-place upgrade to RHEL 9.4 instead' +- ' using the leapp `--target=9.4` option. After you finish the upgrade - including' +- ' all required manual post-upgrade steps as well -' +- ' update to the newer minor version using the dnf tool. In case of using Red Hat' +- ' subscription-manager, do not forget to change the lock version to the newer one' +- ' or unset the version lock before using DNF to be able to perform the minor version update.' +- ' You can use e.g. `subscription-manager release --unset` command for that.' +- .format(get_target_version()) +- )), +- ]) ++ARM_SHIM_PACKAGE_NAME = 'shim-aa64' ++ARM_GRUB_PACKAGE_NAME = 'grub2-efi-aa64' + + + def process(): + """ +- Check whether the upgrade path will use a target kernel compatible with the source bootloader on ARM systems ++ Check whether the upgrade path will use a target kernel compatible with the ++ source bootloader on ARM systems. Prepare for a workaround otherwise. + """ + + if not matches_architecture(ARCH_ARM64): +@@ -51,4 +23,8 @@ def process(): + 'Skipping bootloader check.').format(get_source_version(), get_target_version())) + return + +- _inhibit_upgrade() ++ api.produce( ++ TargetUserSpacePreupgradeTasks( ++ install_rpms=[ARM_GRUB_PACKAGE_NAME, ARM_SHIM_PACKAGE_NAME] ++ ) ++ ) +diff --git a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/tests/test_checkarmbootloader.py b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/tests/test_checkarmbootloader.py +index 97c01e77..f38e4afb 100644 +--- a/repos/system_upgrade/el8toel9/actors/checkarmbootloader/tests/test_checkarmbootloader.py ++++ b/repos/system_upgrade/el8toel9/actors/checkarmbootloader/tests/test_checkarmbootloader.py +@@ -1,37 +1,35 @@ + import pytest + +-from leapp import reporting + from leapp.libraries.actor import checkarmbootloader + from leapp.libraries.common.config.architecture import ARCH_ARM64, ARCH_SUPPORTED +-from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked, logger_mocked ++from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked, produce_mocked + from leapp.libraries.stdlib import api +-from leapp.utils.report import is_inhibitor + + +-@pytest.mark.parametrize("arch", [arch for arch in ARCH_SUPPORTED if not arch == ARCH_ARM64]) ++@pytest.mark.parametrize('arch', [arch for arch in ARCH_SUPPORTED if not arch == ARCH_ARM64]) + def test_not_x86_64_passes(monkeypatch, arch): + """ +- Test no report is generated on an architecture different from ARM ++ Test no message is generated on an architecture different from ARM + """ + +- monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) + monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(arch=arch)) ++ monkeypatch.setattr(api, 'produce', produce_mocked()) + + checkarmbootloader.process() + + assert 'Architecture not ARM.' in api.current_logger.infomsg[0] +- assert not reporting.create_report.called ++ assert not api.produce.called + + +-@pytest.mark.parametrize("target_version", ["9.2", "9.4"]) ++@pytest.mark.parametrize('target_version', ['9.2', '9.4']) + def test_valid_path(monkeypatch, target_version): + """ +- Test no report is generated on a supported path ++ Test no message is generated on a supported path + """ + +- monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(api, 'produce', produce_mocked()) + monkeypatch.setattr( + api, 'current_actor', + CurrentActorMocked(arch=ARCH_ARM64, src_ver='8.10', dst_ver=target_version) +@@ -40,16 +38,16 @@ def test_valid_path(monkeypatch, target_version): + checkarmbootloader.process() + + assert 'Upgrade on ARM architecture on a compatible path' in api.current_logger.infomsg[0] +- assert not reporting.create_report.called ++ assert not api.produce.called + + + def test_invalid_path(monkeypatch): + """ +- Test report is generated on a invalid upgrade path ++ Test message is generated on an invalid upgrade path + """ + +- monkeypatch.setattr(reporting, "create_report", create_report_mocked()) + monkeypatch.setattr(api, 'current_logger', logger_mocked()) ++ monkeypatch.setattr(api, 'produce', produce_mocked()) + monkeypatch.setattr( + api, 'current_actor', + CurrentActorMocked(arch=ARCH_ARM64, src_ver='8.10', dst_ver='9.5') +@@ -57,11 +55,9 @@ def test_invalid_path(monkeypatch): + + checkarmbootloader.process() + +- produced_title = reporting.create_report.report_fields.get('title') +- produced_summary = reporting.create_report.report_fields.get('summary') ++ assert api.produce.called == 1 ++ assert len(api.produce.model_instances) == 1 + +- assert reporting.create_report.called == 1 +- assert 'not possible for ARM machines' in produced_title +- assert 'Due to the incompatibility' in produced_summary +- assert reporting.create_report.report_fields['severity'] == reporting.Severity.HIGH +- assert is_inhibitor(reporting.create_report.report_fields) ++ msg = api.produce.model_instances[0] ++ assert checkarmbootloader.ARM_GRUB_PACKAGE_NAME in msg.install_rpms ++ assert checkarmbootloader.ARM_SHIM_PACKAGE_NAME in msg.install_rpms +diff --git a/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/actor.py b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/actor.py +new file mode 100644 +index 00000000..cccfd515 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/actor.py +@@ -0,0 +1,26 @@ ++from leapp.actors import Actor ++from leapp.libraries.actor.removeupgradeefientry import remove_upgrade_efi_entry ++from leapp.libraries.common.config import architecture ++from leapp.libraries.common.config.version import matches_target_version ++from leapp.models import ArmWorkaroundEFIBootloaderInfo ++from leapp.tags import InitRamStartPhaseTag, IPUWorkflowTag ++ ++ ++class RemoveUpgradeEFIEntry(Actor): ++ """ ++ Remove UEFI entry for LEAPP upgrade (see AddArmBootloaderWorkaround). ++ """ ++ ++ name = 'remove_upgrade_efi_entry' ++ consumes = (ArmWorkaroundEFIBootloaderInfo,) ++ produces = () ++ tags = (IPUWorkflowTag, InitRamStartPhaseTag) ++ ++ def process(self): ++ if not architecture.matches_architecture(architecture.ARCH_ARM64): ++ return ++ ++ if matches_target_version('< 9.5'): ++ return ++ ++ remove_upgrade_efi_entry() +diff --git a/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/libraries/removeupgradeefientry.py b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/libraries/removeupgradeefientry.py +new file mode 100644 +index 00000000..3ff3ead9 +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/libraries/removeupgradeefientry.py +@@ -0,0 +1,100 @@ ++import os ++import shutil ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.common.grub import GRUB2_BIOS_ENTRYPOINT, GRUB2_BIOS_ENV_FILE ++from leapp.libraries.stdlib import api, CalledProcessError, run ++from leapp.models import ArmWorkaroundEFIBootloaderInfo ++ ++EFI_MOUNTPOINT = '/boot/efi/' ++LEAPP_EFIDIR_CANONICAL_PATH = os.path.join(EFI_MOUNTPOINT, 'EFI/leapp/') ++RHEL_EFIDIR_CANONICAL_PATH = os.path.join(EFI_MOUNTPOINT, 'EFI/redhat/') ++ ++ ++def get_workaround_efi_info(): ++ bootloader_info_msgs = api.consume(ArmWorkaroundEFIBootloaderInfo) ++ bootloader_info = next(bootloader_info_msgs, None) ++ if list(bootloader_info_msgs): ++ api.current_logger().warning('Unexpectedly received more than one UpgradeEFIBootEntry message.') ++ if not bootloader_info: ++ raise StopActorExecutionError('Could not remove UEFI boot entry for the upgrade initramfs.', ++ details={'details': 'Did not receive a message about the leapp-provided' ++ ' kernel and initramfs.'}) ++ return bootloader_info ++ ++ ++def remove_upgrade_efi_entry(): ++ # we need to make sure /boot/efi/ is mounted before trying to remove the boot entry ++ mount_points = ['/boot', '/boot/efi'] ++ for mp in mount_points: ++ try: ++ run(['/bin/mount', mp]) ++ except CalledProcessError: ++ # partitions have been most likely already mounted ++ pass ++ ++ bootloader_info = get_workaround_efi_info() ++ ++ _copy_grub_files(['grubenv', 'grub.cfg'], ['user.cfg']) ++ _link_grubenv_to_rhel_entry() ++ ++ upgrade_boot_number = bootloader_info.upgrade_entry.boot_number ++ try: ++ run([ ++ '/usr/sbin/efibootmgr', ++ '--delete-bootnum', ++ '--bootnum', ++ upgrade_boot_number ++ ]) ++ except CalledProcessError: ++ api.current_logger().warning('Unable to remove Leapp upgrade efi entry.') ++ ++ try: ++ run(['rm', '-rf', LEAPP_EFIDIR_CANONICAL_PATH]) ++ except CalledProcessError: ++ api.current_logger().warning('Unable to remove Leapp upgrade efi files.') ++ ++ original_boot_number = bootloader_info.original_entry.boot_number ++ run(['/usr/sbin/efibootmgr', '--bootnext', original_boot_number]) ++ ++ # TODO: Move calling `mount -a` to a separate actor as it is not really ++ # related to removing the upgrade boot entry. It's worth to call it after ++ # removing the boot entry to avoid boot loop in case mounting fails. ++ run(['/bin/mount', '-a']) ++ ++ ++def _link_grubenv_to_rhel_entry(): ++ rhel_env_file = os.path.join(RHEL_EFIDIR_CANONICAL_PATH, 'grubenv') ++ rhel_env_file_relpath = os.path.relpath(rhel_env_file, GRUB2_BIOS_ENTRYPOINT) ++ run(['ln', '--symbolic', '--force', rhel_env_file_relpath, GRUB2_BIOS_ENV_FILE]) ++ ++ ++def _copy_file(src_path, dst_path): ++ if os.path.exists(dst_path): ++ api.current_logger().debug("The {} file already exists and its content will be overwritten.".format(dst_path)) ++ ++ api.current_logger().info("Copying {} to {}".format(src_path, dst_path)) ++ try: ++ shutil.copy2(src_path, dst_path) ++ except (OSError, IOError) as err: ++ raise StopActorExecutionError('I/O error({}): {}'.format(err.errno, err.strerror)) ++ ++ ++def _copy_grub_files(required, optional): ++ """ ++ Copy grub files from redhat/ dir to the /boot/efi/EFI/leapp/ dir. ++ """ ++ ++ all_files = required + optional ++ for filename in all_files: ++ src_path = os.path.join(LEAPP_EFIDIR_CANONICAL_PATH, filename) ++ dst_path = os.path.join(RHEL_EFIDIR_CANONICAL_PATH, filename) ++ ++ if not os.path.exists(src_path): ++ if filename in required: ++ msg = 'Required file {} does not exists. Aborting.'.format(filename) ++ raise StopActorExecutionError(msg) ++ ++ continue ++ ++ _copy_file(src_path, dst_path) +diff --git a/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/tests/test_removeupgradeefientry.py b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/tests/test_removeupgradeefientry.py +new file mode 100644 +index 00000000..1af3cd1e +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/actors/removeupgradeefientry/tests/test_removeupgradeefientry.py +@@ -0,0 +1,105 @@ ++import os ++ ++import pytest ++ ++from leapp.exceptions import StopActorExecutionError ++from leapp.libraries.actor import removeupgradeefientry ++from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked ++from leapp.libraries.stdlib import api ++from leapp.models import ArmWorkaroundEFIBootloaderInfo, EFIBootEntry ++ ++TEST_EFI_INFO = ArmWorkaroundEFIBootloaderInfo( ++ original_entry=EFIBootEntry( ++ boot_number='0001', ++ label='Redhat', ++ active=True, ++ efi_bin_source="HD(.*)/File(\\EFI\\redhat\\shimx64.efi)", ++ ), ++ upgrade_entry=EFIBootEntry( ++ boot_number='0002', ++ label='Leapp', ++ active=True, ++ efi_bin_source="HD(.*)/File(\\EFI\\leapp\\shimx64.efi)", ++ ) ++) ++ ++ ++def test_get_workaround_efi_info_single_entry(monkeypatch): ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[TEST_EFI_INFO])) ++ ++ result = removeupgradeefientry.get_workaround_efi_info() ++ assert result == TEST_EFI_INFO ++ ++ ++def test_get_workaround_efi_info_multiple_entries(monkeypatch): ++ logger = logger_mocked() ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked( ++ msgs=[TEST_EFI_INFO, TEST_EFI_INFO])) ++ monkeypatch.setattr(api, 'current_logger', logger) ++ ++ result = removeupgradeefientry.get_workaround_efi_info() ++ assert result == TEST_EFI_INFO ++ assert 'Unexpectedly received more than one UpgradeEFIBootEntry message.' in logger.warnmsg ++ ++ ++def test_get_workaround_efi_info_no_entry(monkeypatch): ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[])) ++ ++ with pytest.raises(StopActorExecutionError, match='Could not remove UEFI boot entry for the upgrade initramfs'): ++ removeupgradeefientry.get_workaround_efi_info() ++ ++ ++def test_copy_grub_files(monkeypatch): ++ copy_file_calls = [] ++ ++ def mock_copy_file(src, dst): ++ copy_file_calls.append((src, dst)) ++ ++ monkeypatch.setattr(removeupgradeefientry, '_copy_file', mock_copy_file) ++ monkeypatch.setattr(os.path, 'exists', lambda path: True) ++ ++ removeupgradeefientry._copy_grub_files(['required'], ['optional']) ++ ++ assert ( ++ os.path.join(removeupgradeefientry.LEAPP_EFIDIR_CANONICAL_PATH, 'required'), ++ os.path.join(removeupgradeefientry.RHEL_EFIDIR_CANONICAL_PATH, 'required'), ++ ) in copy_file_calls ++ assert ( ++ os.path.join(removeupgradeefientry.LEAPP_EFIDIR_CANONICAL_PATH, 'optional'), ++ os.path.join(removeupgradeefientry.RHEL_EFIDIR_CANONICAL_PATH, 'optional'), ++ ) in copy_file_calls ++ ++ ++def test_copy_grub_files_missing_required(monkeypatch): ++ monkeypatch.setattr(os.path, 'exists', lambda path: False) ++ ++ with pytest.raises(StopActorExecutionError, match='Required file required does not exists'): ++ removeupgradeefientry._copy_grub_files(['required'], []) ++ ++ ++def test_remove_upgrade_efi_entry(monkeypatch): ++ run_calls = [] ++ copy_grub_files_calls = [] ++ monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(msgs=[TEST_EFI_INFO])) ++ ++ def mock_run(command, checked=False): ++ run_calls.append(command) ++ return {'exit_code': 0} ++ ++ def mock_copy_grub_files(required, optional): ++ copy_grub_files_calls.append((required, optional)) ++ ++ monkeypatch.setattr(removeupgradeefientry, '_copy_grub_files', mock_copy_grub_files) ++ monkeypatch.setattr(removeupgradeefientry, '_link_grubenv_to_rhel_entry', lambda: None) ++ monkeypatch.setattr(removeupgradeefientry, 'run', mock_run) ++ ++ removeupgradeefientry.remove_upgrade_efi_entry() ++ ++ assert run_calls == [ ++ ['/bin/mount', '/boot'], ++ ['/bin/mount', '/boot/efi'], ++ ['/usr/sbin/efibootmgr', '--delete-bootnum', '--bootnum', '0002'], ++ ['rm', '-rf', removeupgradeefientry.LEAPP_EFIDIR_CANONICAL_PATH], ++ ['/usr/sbin/efibootmgr', '--bootnext', '0001'], ++ ['/bin/mount', '-a'], ++ ] +diff --git a/repos/system_upgrade/el8toel9/models/upgradeefientry.py b/repos/system_upgrade/el8toel9/models/upgradeefientry.py +new file mode 100644 +index 00000000..877cdc8f +--- /dev/null ++++ b/repos/system_upgrade/el8toel9/models/upgradeefientry.py +@@ -0,0 +1,14 @@ ++from leapp.models import EFIBootEntry, fields, Model ++from leapp.topics import SystemInfoTopic ++ ++ ++class ArmWorkaroundEFIBootloaderInfo(Model): ++ """ ++ Information about an Upgrade UEFI boot loader entry. ++ """ ++ ++ topic = SystemInfoTopic ++ ++ original_entry = fields.Model(EFIBootEntry) ++ ++ upgrade_entry = fields.Model(EFIBootEntry) +-- +2.47.0 + diff --git a/SOURCES/0028-Add-el9toel10-actor-to-handle-symlink-directory-with.patch b/SOURCES/0028-Add-el9toel10-actor-to-handle-symlink-directory-with.patch new file mode 100644 index 0000000..ed24f57 --- /dev/null +++ b/SOURCES/0028-Add-el9toel10-actor-to-handle-symlink-directory-with.patch @@ -0,0 +1,115 @@ +From 866a4b9f163c3aec31736ac0ce25f564fe016cb4 Mon Sep 17 00:00:00 2001 +From: Jarek Prokop <jprokop@redhat.com> +Date: Tue, 5 Nov 2024 10:15:28 +0100 +Subject: [PATCH 28/40] Add el9toel10 actor to handle symlink -> directory with + ruby IRB. + +The `/usr/share/ruby/irb` path is a symlink in RHEL 9, +but a regular directory in RHEL 10. +This puts us back in line with RHEL 8 and Fedora in terms of the +path's file type regarding the rubygem-irb package. + +Since this was not handled on RPM level, handle it as actor again. +This was copied and adjusted from same-named el8->el9 actor. + +We do not care about the validity or target of the symlink, we just +remove it to allow DNF create the correct directory on upgrade. + +Without this workaround, the upgrade will fail in transaction test with +reports of file conflicts on the directory path. + +Users should not expect to ever retain anything in this directory. +--- + .../actors/registerrubyirbadjustment/actor.py | 31 +++++++++++++++++++ + .../test_register_ruby_irb_adjustments.py | 11 +++++++ + .../el9toel10/tools/handlerubyirbsymlink | 22 +++++++++++++ + 3 files changed, 64 insertions(+) + create mode 100644 repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/actor.py + create mode 100644 repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/tests/test_register_ruby_irb_adjustments.py + create mode 100755 repos/system_upgrade/el9toel10/tools/handlerubyirbsymlink + +diff --git a/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/actor.py b/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/actor.py +new file mode 100644 +index 00000000..4fbec7ff +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/actor.py +@@ -0,0 +1,31 @@ ++from leapp.actors import Actor ++from leapp.models import DNFWorkaround ++from leapp.tags import FactsPhaseTag, IPUWorkflowTag ++ ++ ++class RegisterRubyIRBAdjustment(Actor): ++ """ ++ Register a workaround to allow rubygem-irb's symlink -> directory conversion. ++ ++ The /usr/share/ruby/irb has been moved from a symlink to a directory ++ in RHEL 10 and this conversion was not handled on the RPM level. ++ This leads to DNF reporting package file conflicts when a major upgrade ++ is attempted and rubygem-irb is installed. ++ ++ Register "handlerubyirbsymlink" script that removes the symlink prior ++ to DNF upgrade and allows it to create the expected directory in place of ++ the removed symlink. ++ """ ++ ++ name = 'register_ruby_irb_adjustment' ++ consumes = () ++ produces = (DNFWorkaround,) ++ tags = (IPUWorkflowTag, FactsPhaseTag) ++ ++ def process(self): ++ self.produce( ++ DNFWorkaround( ++ display_name='IRB directory fix', ++ script_path=self.get_tool_path('handlerubyirbsymlink'), ++ ) ++ ) +diff --git a/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/tests/test_register_ruby_irb_adjustments.py b/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/tests/test_register_ruby_irb_adjustments.py +new file mode 100644 +index 00000000..fc341646 +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/actors/registerrubyirbadjustment/tests/test_register_ruby_irb_adjustments.py +@@ -0,0 +1,11 @@ ++import os.path ++ ++from leapp.models import DNFWorkaround ++ ++ ++def test_register_ruby_irb_adjustments(current_actor_context): ++ current_actor_context.run() ++ assert len(current_actor_context.consume(DNFWorkaround)) == 1 ++ assert current_actor_context.consume(DNFWorkaround)[0].display_name == 'IRB directory fix' ++ assert os.path.basename(current_actor_context.consume(DNFWorkaround)[0].script_path) == 'handlerubyirbsymlink' ++ assert os.path.exists(current_actor_context.consume(DNFWorkaround)[0].script_path) +diff --git a/repos/system_upgrade/el9toel10/tools/handlerubyirbsymlink b/repos/system_upgrade/el9toel10/tools/handlerubyirbsymlink +new file mode 100755 +index 00000000..e9ac40fe +--- /dev/null ++++ b/repos/system_upgrade/el9toel10/tools/handlerubyirbsymlink +@@ -0,0 +1,22 @@ ++#!/usr/bin/bash -e ++ ++# just in case of hidden files.. not sure why would someone do that, it's more ++# like forgotten cache file possibility, but rather do that.. ++shopt -s dotglob ++ ++handle_dir() { ++ # Check that $1 is a symlink then unlink it so that RPM ++ # can freely create the directory. ++ if [ ! -L "$1" ]; then ++ return ++ fi ++ ++ # There is no configuration or anything that the user should ever customize ++ # and expect to retain. ++ unlink "$1" ++ ++ return 0 ++} ++ ++ ++handle_dir /usr/share/ruby/irb +-- +2.47.0 + diff --git a/SOURCES/0029-Expand-on-the-actor-docstring-for-the-el8-el9-rubyge.patch b/SOURCES/0029-Expand-on-the-actor-docstring-for-the-el8-el9-rubyge.patch new file mode 100644 index 0000000..1368894 --- /dev/null +++ b/SOURCES/0029-Expand-on-the-actor-docstring-for-the-el8-el9-rubyge.patch @@ -0,0 +1,40 @@ +From 81a3297516fbbd120b0fb870de36f1a1b290dd21 Mon Sep 17 00:00:00 2001 +From: Jarek Prokop <jprokop@redhat.com> +Date: Wed, 6 Nov 2024 15:21:14 +0100 +Subject: [PATCH 29/40] Expand on the actor docstring for the el8->el9 + rubygem-irb symlink fix. + +In RHEL 10, the directory is a regular directory again. + +The 2 actors are separate over creating a common solution for both. +Expand in the docstring on the reason for the el8->el9 actor to +differentiate them apart. +--- + .../actors/registerrubyirbadjustment/actor.py | 11 ++++++++++- + 1 file changed, 10 insertions(+), 1 deletion(-) + +diff --git a/repos/system_upgrade/el8toel9/actors/registerrubyirbadjustment/actor.py b/repos/system_upgrade/el8toel9/actors/registerrubyirbadjustment/actor.py +index ac4d1e6f..a33d8831 100644 +--- a/repos/system_upgrade/el8toel9/actors/registerrubyirbadjustment/actor.py ++++ b/repos/system_upgrade/el8toel9/actors/registerrubyirbadjustment/actor.py +@@ -5,7 +5,16 @@ from leapp.tags import FactsPhaseTag, IPUWorkflowTag + + class RegisterRubyIRBAdjustment(Actor): + """ +- Registers a workaround which will adjust the Ruby IRB directories during the upgrade. ++ Register a workaround to allow rubygem-irb's directory -> symlink conversion. ++ ++ The /usr/share/ruby/irb has been moved from a directory to a symlink ++ in RHEL 9 and this conversion was not handled on RPM level. ++ This leads to DNF reporting package file conflicts when a major upgrade ++ is attempted and rubygem-irb (or ruby-irb) is installed. ++ ++ Register "handlerubyirbsymlink" script that removes the directory prior ++ to DNF upgrade and allows it to create the expected symlink in place of ++ the removed directory. + """ + + name = 'register_ruby_irb_adjustment' +-- +2.47.0 + diff --git a/SOURCES/0030-data-update-data-files.patch b/SOURCES/0030-data-update-data-files.patch new file mode 100644 index 0000000..5762ab6 --- /dev/null +++ b/SOURCES/0030-data-update-data-files.patch @@ -0,0 +1,37814 @@ +From 2dc7efa41ccf7206e0e33d687d7931846f3e4390 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Wed, 13 Nov 2024 12:52:11 +0100 +Subject: [PATCH 30/40] data: update data files + +Update data files to a newer version. +--- + .../files/device_driver_deprecation_data.json | 15 +- + etc/leapp/files/pes-events.json | 30145 ++++++++++++++-- + etc/leapp/files/repomap.json | 8 +- + 3 files changed, 27519 insertions(+), 2649 deletions(-) + +diff --git a/etc/leapp/files/device_driver_deprecation_data.json b/etc/leapp/files/device_driver_deprecation_data.json +index 353531cc..fcb3a931 100644 +--- a/etc/leapp/files/device_driver_deprecation_data.json ++++ b/etc/leapp/files/device_driver_deprecation_data.json +@@ -1,6 +1,8 @@ + { + "provided_data_streams": [ +- "3.1" ++ "3.0", ++ "3.1", ++ "3.2" + ], + "data": [ + { +@@ -4270,13 +4272,22 @@ + ], + "deprecation_announced": "", + "device_id": "0x15B3:0xA2DC", +- "device_name": "", ++ "device_name": "BlueField-3 integrated ConnectX-7 network controller", + "device_type": "pci", + "driver_name": "mlx5", + "maintained_in_rhel": [ + 7 + ] + }, ++ { ++ "available_in_rhel": [], ++ "deprecation_announced": "", ++ "device_id": "0x15B3:0xA2DF", ++ "device_name": "BlueField-4 integrated ConnectX-8 network controller", ++ "device_type": "pci", ++ "driver_name": "mlx5", ++ "maintained_in_rhel": [] ++ }, + { + "available_in_rhel": [ + 7 +diff --git a/etc/leapp/files/pes-events.json b/etc/leapp/files/pes-events.json +index 06c3de4d..a1ce39c6 100644 +--- a/etc/leapp/files/pes-events.json ++++ b/etc/leapp/files/pes-events.json +@@ -1,7 +1,9 @@ + { +-"timestamp": "202408141104Z", ++"timestamp": "202411121506Z", + "provided_data_streams": [ +-"3.1" ++"3.0", ++"3.1", ++"3.2" + ], + "packageinfo": [ + { +@@ -6241,7 +6243,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -6277,7 +6278,7 @@ null + null + ], + "name": "sblim-cmpi-devel", +-"repository": "rhel8-AppStream" ++"repository": "rhel8-CRB" + } + ], + "set_id": 6137 +@@ -85316,7 +85317,7 @@ null + null + ], + "name": "sblim-sfcc-devel", +-"repository": "rhel8-AppStream" ++"repository": "rhel8-CRB" + } + ], + "set_id": 4075 +@@ -85416,7 +85417,7 @@ null + null + ], + "name": "texinfo-tex", +-"repository": "rhel8-BaseOS" ++"repository": "rhel8-CRB" + } + ], + "set_id": 4079 +@@ -85550,7 +85551,7 @@ null + null + ], + "name": "tog-pegasus-devel", +-"repository": "rhel8-AppStream" ++"repository": "rhel8-CRB" + } + ], + "set_id": 4085 +@@ -257174,7 +257175,7 @@ null + null + ], + "name": "libvoikko-devel", +-"repository": "rhel8-BaseOS" ++"repository": "rhel8-CRB" + } + ], + "set_id": 10641 +@@ -278240,7 +278241,7 @@ null + null + ], + "name": "sblim-gather-provider", +-"repository": "rhel8-AppStream" ++"repository": "rhel8-CRB" + } + ], + "set_id": 11398 +@@ -362920,40 +362921,6 @@ null + "s390x", + "x86_64" + ], +-"id": 10241, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "ibus-typing-booster-tests", +-"repository": "rhel8-BaseOS" +-} +-], +-"set_id": 14146 +-}, +-"initial_release": { +-"major_version": 8, +-"minor_version": 3, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 8, +-"minor_version": 4, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], + "id": 10242, + "in_packageset": { + "package": [ +@@ -376281,7 +376248,7 @@ null + } + }, + { +-"action": 1, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -376309,8 +376276,27 @@ null + "minor_version": 6, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": { ++"name": "javapackages-tools", ++"stream": "201801" ++}, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "javapackages-local", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23965 ++}, + "release": { + "major_version": 9, + "minor_version": 0, +@@ -376318,7 +376304,7 @@ null + } + }, + { +-"action": 1, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -376346,8 +376332,27 @@ null + "minor_version": 6, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": { ++"name": "javapackages-tools", ++"stream": "201801" ++}, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "maven-local", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23966 ++}, + "release": { + "major_version": 9, + "minor_version": 0, +@@ -376355,7 +376360,7 @@ null + } + }, + { +-"action": 1, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -376383,8 +376388,27 @@ null + "minor_version": 6, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": { ++"name": "javapackages-tools", ++"stream": "201801" ++}, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-javapackages", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23962 ++}, + "release": { + "major_version": 9, + "minor_version": 0, +@@ -402743,7 +402767,7 @@ null + } + }, + { +-"action": 1, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -402779,8 +402803,41 @@ null + "minor_version": 6, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": { ++"name": "container-tools", ++"stream": "3.0" ++}, ++"out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "container-tools", ++"stream": "rhel8" ++}, ++"out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "container-tools", ++"stream": "4.0" ++}, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libslirp-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23585 ++}, + "release": { + "major_version": 9, + "minor_version": 0, +@@ -441193,7 +441250,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -441249,7 +441305,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -441466,7 +441521,7 @@ null + } + ], + "name": "perl-DBD-SQLite", +-"repository": "rhel8-BaseOS" ++"repository": "rhel8-AppStream" + } + ], + "set_id": 16807 +@@ -441580,7 +441635,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -441766,7 +441820,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -441934,7 +441987,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442040,7 +442092,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442146,7 +442197,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442388,7 +442438,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442494,7 +442543,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442600,7 +442648,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442706,7 +442753,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442812,7 +442858,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -442918,7 +442963,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443024,7 +443068,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443130,7 +443173,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443236,7 +443278,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443398,7 +443439,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443504,7 +443544,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443610,7 +443649,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443716,7 +443754,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -443822,7 +443859,6 @@ null + { + "action": 6, + "architectures": [ +-"aarch64", + "ppc64le", + "s390x", + "x86_64" +@@ -445924,7 +445960,7 @@ null + null + ], + "name": "fwupd-devel", +-"repository": "rhel8-BaseOS" ++"repository": "rhel8-CRB" + } + ], + "set_id": 16997 +@@ -446023,7 +446059,7 @@ null + null + ], + "name": "mod_auth_mellon", +-"repository": "rhel9-BaseOS" ++"repository": "rhel9-AppStream" + } + ], + "set_id": 17001 +@@ -447996,6 +448032,7 @@ null + "architectures": [ + "aarch64", + "ppc64le", ++"s390x", + "x86_64" + ], + "id": 12290, +@@ -448006,7 +448043,7 @@ null + null + ], + "name": "alsa-plugins-pulseaudio", +-"repository": "rhel9-BaseOS" ++"repository": "rhel9-AppStream" + } + ], + "set_id": 17079 +@@ -510615,56 +510652,6 @@ null + } + }, + { +-"action": 6, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 14168, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "python3-audit", +-"repository": "rhel9-AppStream" +-} +-], +-"set_id": 19989 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "python3-audit", +-"repository": "rhel10-BaseOS" +-} +-], +-"set_id": 19990 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ + "action": 0, + "architectures": [ + "aarch64", +@@ -516758,6 +516745,10 @@ null + { + "name": "nodejs", + "stream": "20" ++}, ++{ ++"name": "nodejs", ++"stream": "22" + } + ], + "name": "nodejs", +@@ -516778,6 +516769,13 @@ null + "stream": "20" + }, + "out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "nodejs", ++"stream": "22" ++}, ++"out_modulestream": null + } + ], + "out_packageset": { +@@ -529147,14 +529145,14 @@ null + }, + "initial_release": { + "major_version": 9, +-"minor_version": 4, ++"minor_version": 5, + "os_name": "RHEL" + }, + "modulestream_maps": [], + "out_packageset": null, + "release": { + "major_version": 9, +-"minor_version": 5, ++"minor_version": 6, + "os_name": "RHEL" + } + }, +@@ -538928,7 +538926,8 @@ null + { + "name": "redis", + "stream": "7" +-} ++}, ++null + ], + "name": "redis-doc", + "repository": "rhel9-AppStream" +@@ -541158,106 +541157,7 @@ null + } + }, + { +-"action": 6, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15007, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "appstream-devel", +-"repository": "rhel9-CRB" +-} +-], +-"set_id": 21040 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "appstream-devel", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21041 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 6, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"x86_64" +-], +-"id": 15008, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "fontconfig", +-"repository": "rhel9-AppStream" +-} +-], +-"set_id": 21042 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "fontconfig", +-"repository": "rhel10-BaseOS" +-} +-], +-"set_id": 21043 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 6, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -541294,7 +541194,7 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-symbols2-fonts", ++"name": "google-noto-sans-symbols-2-fonts", + "repository": "rhel10-AppStream" + } + ], +@@ -541314,56 +541214,6 @@ null + "s390x", + "x86_64" + ], +-"id": 15010, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "uchardet", +-"repository": "rhel9-CRB" +-} +-], +-"set_id": 21046 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "uchardet", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21047 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 6, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], + "id": 15011, + "in_packageset": { + "package": [ +@@ -541413,7 +541263,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -541432,8 +541282,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "pgaudit", + "repository": "rhel9-AppStream" +@@ -541460,10 +541309,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -541472,7 +541317,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-pgaudit", ++"name": "pgaudit", + "repository": "rhel10-AppStream" + } + ], +@@ -541485,7 +541330,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -541504,8 +541349,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "pg_repack", + "repository": "rhel9-AppStream" +@@ -541532,10 +541376,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -541544,7 +541384,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-pg_repack", ++"name": "pg_repack", + "repository": "rhel10-AppStream" + } + ], +@@ -541557,7 +541397,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -541576,8 +541416,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgres-decoderbufs", + "repository": "rhel9-AppStream" +@@ -541604,10 +541443,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -541616,7 +541451,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-decoderbufs", ++"name": "postgres-decoderbufs", + "repository": "rhel10-AppStream" + } + ], +@@ -541629,7 +541464,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -541648,8 +541483,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql", + "repository": "rhel9-AppStream" +@@ -541676,10 +541510,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -541688,7 +541518,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16", ++"name": "postgresql", + "repository": "rhel10-AppStream" + } + ], +@@ -542441,7 +542271,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -542460,8 +542290,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-contrib", + "repository": "rhel9-AppStream" +@@ -542488,10 +542317,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -542500,7 +542325,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-contrib", ++"name": "postgresql-contrib", + "repository": "rhel10-AppStream" + } + ], +@@ -542513,7 +542338,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -542532,8 +542357,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-docs", + "repository": "rhel9-AppStream" +@@ -542560,10 +542384,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -542572,7 +542392,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-docs", ++"name": "postgresql-docs", + "repository": "rhel10-AppStream" + } + ], +@@ -543499,7 +543319,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543518,8 +543338,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-plperl", + "repository": "rhel9-AppStream" +@@ -543546,10 +543365,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543558,7 +543373,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-plperl", ++"name": "postgresql-plperl", + "repository": "rhel10-AppStream" + } + ], +@@ -543571,7 +543386,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543590,8 +543405,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-plpython3", + "repository": "rhel9-AppStream" +@@ -543618,10 +543432,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543630,7 +543440,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-plpython3", ++"name": "postgresql-plpython3", + "repository": "rhel10-AppStream" + } + ], +@@ -543643,79 +543453,7 @@ null + } + }, + { +-"action": 7, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15071, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-{ +-"name": "postgresql", +-"stream": "15" +-}, +-{ +-"name": "postgresql", +-"stream": "16" +-}, +-null +-], +-"name": "postgresql-plctl", +-"repository": "rhel9-AppStream" +-} +-], +-"set_id": 21154 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": { +-"name": "postgresql", +-"stream": "15" +-}, +-"out_modulestream": null +-}, +-{ +-"in_modulestream": { +-"name": "postgresql", +-"stream": "16" +-}, +-"out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "postgresql16-plctl", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21155 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543734,8 +543472,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-private-libs", + "repository": "rhel9-AppStream" +@@ -543762,10 +543499,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543774,7 +543507,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-private-libs", ++"name": "postgresql-private-libs", + "repository": "rhel10-AppStream" + } + ], +@@ -543787,7 +543520,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543806,8 +543539,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-server", + "repository": "rhel9-AppStream" +@@ -543834,10 +543566,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543846,7 +543574,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-server", ++"name": "postgresql-server", + "repository": "rhel10-AppStream" + } + ], +@@ -543859,7 +543587,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543878,8 +543606,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-server-devel", + "repository": "rhel9-AppStream" +@@ -543906,10 +543633,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543918,7 +543641,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-server-devel", ++"name": "postgresql-server-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -543931,7 +543654,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -543950,8 +543673,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-static", + "repository": "rhel9-AppStream" +@@ -543978,10 +543700,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -543990,7 +543708,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-static", ++"name": "postgresql-static", + "repository": "rhel10-AppStream" + } + ], +@@ -544003,7 +543721,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544022,8 +543740,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-test", + "repository": "rhel9-AppStream" +@@ -544050,10 +543767,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -544062,7 +543775,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-test", ++"name": "postgresql-test", + "repository": "rhel10-AppStream" + } + ], +@@ -544075,7 +543788,7 @@ null + } + }, + { +-"action": 7, ++"action": 1, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544094,8 +543807,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-test-rpm-macros", + "repository": "rhel9-AppStream" +@@ -544108,38 +543820,8 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [ +-{ +-"in_modulestream": { +-"name": "postgresql", +-"stream": "15" +-}, +-"out_modulestream": null +-}, +-{ +-"in_modulestream": { +-"name": "postgresql", +-"stream": "16" +-}, +-"out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "postgresql16-test-rpm-macros", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21167 +-}, ++"modulestream_maps": [], ++"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -544147,7 +543829,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544166,8 +543848,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-upgrade", + "repository": "rhel9-AppStream" +@@ -544194,10 +543875,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -544206,7 +543883,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-upgrade", ++"name": "postgresql-upgrade", + "repository": "rhel10-AppStream" + } + ], +@@ -544219,7 +543896,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544238,8 +543915,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-upgrade-devel", + "repository": "rhel9-AppStream" +@@ -544266,10 +543942,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -544278,7 +543950,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-upgrade-devel", ++"name": "postgresql-upgrade-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -544291,7 +543963,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544310,8 +543982,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-pltcl", + "repository": "rhel9-AppStream" +@@ -544338,10 +544009,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -544350,7 +544017,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-pltcl", ++"name": "postgresql-pltcl", + "repository": "rhel10-AppStream" + } + ], +@@ -544363,7 +544030,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544382,8 +544049,7 @@ null + { + "name": "postgresql", + "stream": "16" +-}, +-null ++} + ], + "name": "postgresql-private-devel", + "repository": "rhel9-AppStream" +@@ -544410,10 +544076,6 @@ null + "stream": "16" + }, + "out_modulestream": null +-}, +-{ +-"in_modulestream": null, +-"out_modulestream": null + } + ], + "out_packageset": { +@@ -544422,7 +544084,7 @@ null + "modulestreams": [ + null + ], +-"name": "postgresql16-private-devel", ++"name": "postgresql-private-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -544435,7 +544097,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544450,8 +544112,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-backup", + "repository": "rhel9-AppStream" +@@ -544466,10 +544127,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544483,7 +544140,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-backup", ++"name": "mariadb-backup", + "repository": "rhel10-AppStream" + } + ], +@@ -544496,7 +544153,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544511,8 +544168,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-common", + "repository": "rhel9-AppStream" +@@ -544527,10 +544183,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544544,7 +544196,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-common", ++"name": "mariadb-common", + "repository": "rhel10-AppStream" + } + ], +@@ -544557,7 +544209,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544572,8 +544224,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-devel", + "repository": "rhel9-AppStream" +@@ -544588,10 +544239,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544605,7 +544252,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-devel", ++"name": "mariadb-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -544618,7 +544265,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544633,8 +544280,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-embedded", + "repository": "rhel9-AppStream" +@@ -544649,10 +544295,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544666,7 +544308,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-embedded", ++"name": "mariadb-embedded", + "repository": "rhel10-AppStream" + } + ], +@@ -544679,7 +544321,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544694,8 +544336,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-embedded-devel", + "repository": "rhel9-AppStream" +@@ -544710,10 +544351,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544727,7 +544364,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-embedded-devel", ++"name": "mariadb-embedded-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -544740,68 +544377,7 @@ null + } + }, + { +-"action": 7, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15087, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-{ +-"name": "mariadb", +-"stream": "10.11" +-}, +-null +-], +-"name": "mariadb-errmsq", +-"repository": "rhel9-AppStream" +-} +-], +-"set_id": 21214 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ +-"in_modulestream": { +-"name": "mariadb", +-"stream": "10.11" +-}, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "mariadb10.11-errmsq", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21215 +-}, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544816,8 +544392,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-gssapi-server", + "repository": "rhel9-AppStream" +@@ -544832,10 +544407,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544849,7 +544420,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-gssapi-server", ++"name": "mariadb-gssapi-server", + "repository": "rhel10-AppStream" + } + ], +@@ -544862,7 +544433,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544877,8 +544448,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-oqgraph-engine", + "repository": "rhel9-AppStream" +@@ -544893,10 +544463,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544910,7 +544476,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-oqgraph-engine", ++"name": "mariadb-oqgraph-engine", + "repository": "rhel10-AppStream" + } + ], +@@ -544923,7 +544489,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544938,8 +544504,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-pam", + "repository": "rhel9-AppStream" +@@ -544954,10 +544519,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -544971,7 +544532,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-pam", ++"name": "mariadb-pam", + "repository": "rhel10-AppStream" + } + ], +@@ -544984,7 +544545,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -544999,8 +544560,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-server", + "repository": "rhel9-AppStream" +@@ -545015,10 +544575,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -545032,7 +544588,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-server", ++"name": "mariadb-server", + "repository": "rhel10-AppStream" + } + ], +@@ -545045,7 +544601,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -545060,8 +544616,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-server-galera", + "repository": "rhel9-AppStream" +@@ -545076,10 +544631,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -545093,7 +544644,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-server-galera", ++"name": "mariadb-server-galera", + "repository": "rhel10-AppStream" + } + ], +@@ -545106,7 +544657,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -545121,8 +544672,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-server-utils", + "repository": "rhel9-AppStream" +@@ -545137,10 +544687,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -545154,7 +544700,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-server-utils", ++"name": "mariadb-server-utils", + "repository": "rhel10-AppStream" + } + ], +@@ -545167,7 +544713,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -545182,8 +544728,7 @@ null + { + "name": "mariadb", + "stream": "10.11" +-}, +-null ++} + ], + "name": "mariadb-test", + "repository": "rhel9-AppStream" +@@ -545198,10 +544743,6 @@ null + }, + "modulestream_maps": [ + { +-"in_modulestream": null, +-"out_modulestream": null +-}, +-{ + "in_modulestream": { + "name": "mariadb", + "stream": "10.11" +@@ -545215,7 +544756,7 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-test", ++"name": "mariadb-test", + "repository": "rhel10-AppStream" + } + ], +@@ -545296,7 +544837,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -545339,8 +544880,8 @@ null + "modulestreams": [ + null + ], +-"name": "mariadb10.11-errmsg", +-"repository": "rhel10-BaseOS" ++"name": "mariadb-errmsg", ++"repository": "rhel10-AppStream" + } + ], + "set_id": 21231 +@@ -548064,6 +547605,10 @@ null + { + "name": "nodejs", + "stream": "20" ++}, ++{ ++"name": "nodejs", ++"stream": "22" + } + ], + "name": "nodejs-nodemon", +@@ -548091,6 +547636,13 @@ null + "stream": "20" + }, + "out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "nodejs", ++"stream": "22" ++}, ++"out_modulestream": null + } + ], + "out_packageset": { +@@ -548131,6 +547683,10 @@ null + { + "name": "nodejs", + "stream": "20" ++}, ++{ ++"name": "nodejs", ++"stream": "22" + } + ], + "name": "nodejs-packaging", +@@ -548158,6 +547714,13 @@ null + "stream": "20" + }, + "out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "nodejs", ++"stream": "22" ++}, ++"out_modulestream": null + } + ], + "out_packageset": { +@@ -548198,6 +547761,10 @@ null + { + "name": "nodejs", + "stream": "20" ++}, ++{ ++"name": "nodejs", ++"stream": "22" + } + ], + "name": "nodejs-packaging-bundler", +@@ -548225,6 +547792,13 @@ null + "stream": "20" + }, + "out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "nodejs", ++"stream": "22" ++}, ++"out_modulestream": null + } + ], + "out_packageset": { +@@ -548246,7 +547820,7 @@ null + } + }, + { +-"action": 7, ++"action": 6, + "architectures": [ + "aarch64", + "ppc64le", +@@ -548265,7 +547839,12 @@ null + { + "name": "nodejs", + "stream": "20" +-} ++}, ++{ ++"name": "nodejs", ++"stream": "22" ++}, ++null + ], + "name": "nodejs-devel", + "repository": "rhel9-AppStream" +@@ -548292,6 +547871,17 @@ null + "stream": "20" + }, + "out_modulestream": null ++}, ++{ ++"in_modulestream": null, ++"out_modulestream": null ++}, ++{ ++"in_modulestream": { ++"name": "nodejs", ++"stream": "22" ++}, ++"out_modulestream": null + } + ], + "out_packageset": { +@@ -548300,7 +547890,7 @@ null + "modulestreams": [ + null + ], +-"name": "nodejs20-devel", ++"name": "nodejs-devel", + "repository": "rhel10-AppStream" + } + ], +@@ -549451,7 +549041,7 @@ null + } + }, + { +-"action": 1, ++"action": 3, + "architectures": [ + "aarch64", + "ppc64le", +@@ -549476,8 +549066,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-text-editor", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23167 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -550131,7 +549737,7 @@ null + } + }, + { +-"action": 1, ++"action": 3, + "architectures": [ + "ppc64le", + "x86_64" +@@ -550154,8 +549760,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "loupe", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23161 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -550163,7 +549785,7 @@ null + } + }, + { +-"action": 1, ++"action": 3, + "architectures": [ + "ppc64le", + "x86_64" +@@ -550186,8 +549808,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "snapshot", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23165 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -560740,7 +560378,7 @@ null + } + }, + { +-"action": 7, ++"action": 1, + "architectures": [ + "aarch64", + "ppc64le", +@@ -560758,31 +560396,15 @@ null + "repository": "rhel9-AppStream" + } + ], +-"set_id": 21706 ++"set_id": 23212 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "gcr3-base", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21707 +-}, ++"modulestream_maps": [], ++"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -565891,40 +565513,6 @@ null + "s390x", + "x86_64" + ], +-"id": 15710, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "poppler-qt6", +-"repository": "rhel10-CRB" +-} +-], +-"set_id": 21859 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], + "id": 15711, + "in_packageset": { + "package": [ +@@ -567226,7 +566814,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -567240,8 +566828,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-anatolian-hieroglyphs-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-anatolian-hieroglyphs-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21899 +@@ -567251,8 +566839,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-anatolian-hieroglyphs-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23652 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -567260,7 +566864,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -567274,8 +566878,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-arabic-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-arabic-ui-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21900 +@@ -567285,8 +566889,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-arabic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23663 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -567294,7 +566914,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -567308,8 +566928,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-arabic-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-arabic-ui-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21901 +@@ -567319,8 +566939,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-arabic-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23664 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -567838,7 +567474,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -567852,8 +567488,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-elymaic-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-elymaic-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21917 +@@ -567863,8 +567499,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-elymaic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23721 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568110,7 +567762,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -568124,8 +567776,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-hatran-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-hatran-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21925 +@@ -568135,42 +567787,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15776, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-hebrew-vf-fonts", ++"name": "google-noto-sans-hatran-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21926 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23724 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568185,18 +567819,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15777, ++"id": 15776, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-indic-siyaq-numbers-fonts", ++"name": "google-noto-sans-hebrew-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21927 ++"set_id": 21926 + }, + "initial_release": { + "major_version": 9, +@@ -568219,18 +567853,52 @@ null + "s390x", + "x86_64" + ], +-"id": 15778, ++"id": 15777, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-javanese-vf-fonts", ++"name": "google-noto-sans-indic-siyaq-numbers-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21928 ++"set_id": 21927 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 15778, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-javanese-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 21928 + }, + "initial_release": { + "major_version": 9, +@@ -568484,7 +568152,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -568498,8 +568166,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-lao-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-lao-ui-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21936 +@@ -568509,8 +568177,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lao-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23725 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568518,7 +568202,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -568532,8 +568216,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-linear-a-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-linear-a-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21937 +@@ -568543,8 +568227,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-linear-a-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23726 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568722,7 +568422,7 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", +@@ -568736,8 +568436,8 @@ null + "modulestreams": [ + null + ], +-"name": "google-noto-sans-marchen-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-marchen-vf-fonts", ++"repository": "rhel9-CRB" + } + ], + "set_id": 21943 +@@ -568747,42 +568447,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15794, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-masaram-gondi-fonts", ++"name": "google-noto-sans-marchen-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21944 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23729 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568797,18 +568479,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15795, ++"id": 15794, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-math-fonts", ++"name": "google-noto-sans-masaram-gondi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21945 ++"set_id": 21944 + }, + "initial_release": { + "major_version": 9, +@@ -568824,67 +568506,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15796, ++"id": 15795, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-mayan-numerals-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-math-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21946 ++"set_id": 21945 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15797, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-medefaidrin-fonts", ++"name": "google-noto-sans-math-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21947 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23730 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568892,67 +568556,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15798, ++"id": 15796, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-medefaidrin-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-mayan-numerals-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21948 ++"set_id": 21946 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15799, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-meeteimayek-vf-fonts", ++"name": "google-noto-sans-mayan-numerals-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21949 ++"set_id": 23731 + }, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -568967,18 +568613,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15800, ++"id": 15797, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-mende-kikakui-fonts", ++"name": "google-noto-sans-medefaidrin-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21950 ++"set_id": 21947 + }, + "initial_release": { + "major_version": 9, +@@ -569001,18 +568647,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15801, ++"id": 15798, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-meroitic-fonts", ++"name": "google-noto-sans-medefaidrin-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21951 ++"set_id": 21948 + }, + "initial_release": { + "major_version": 9, +@@ -569028,67 +568674,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15802, ++"id": 15799, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-miao-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-meeteimayek-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21952 ++"set_id": 21949 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15803, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-modi-fonts", ++"name": "google-noto-sans-meetei-mayek-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21953 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23732 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -569103,18 +568731,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15804, ++"id": 15800, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-mro-fonts", ++"name": "google-noto-sans-mende-kikakui-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21954 ++"set_id": 21950 + }, + "initial_release": { + "major_version": 9, +@@ -569137,18 +568765,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15805, ++"id": 15801, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-multani-fonts", ++"name": "google-noto-sans-meroitic-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21955 ++"set_id": 21951 + }, + "initial_release": { + "major_version": 9, +@@ -569171,18 +568799,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15806, ++"id": 15802, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-myanmar-vf-fonts", ++"name": "google-noto-sans-miao-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21956 ++"set_id": 21952 + }, + "initial_release": { + "major_version": 9, +@@ -569205,18 +568833,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15807, ++"id": 15803, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nabataean-fonts", ++"name": "google-noto-sans-modi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21957 ++"set_id": 21953 + }, + "initial_release": { + "major_version": 9, +@@ -569232,101 +568860,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15808, ++"id": 15804, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nag-mundari-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-mro-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21958 ++"set_id": 21954 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15809, +-"in_packageset": { +-"package": [ ++"modulestream_maps": [ + { +-"modulestreams": [ +-null +-], +-"name": "google-noto-sans-nag-mundari-vf-fonts", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 21959 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" ++"in_modulestream": null, ++"out_modulestream": null + } +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" + ], +-"id": 15810, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nandinagari-fonts", ++"name": "google-noto-sans-mro-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21960 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23733 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -569334,67 +568910,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15811, ++"id": 15805, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-newa-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-multani-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21961 ++"set_id": 21955 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15812, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-new-tai-lue-vf-fonts", ++"name": "google-noto-sans-multani-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21962 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23755 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -569402,67 +568960,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15813, ++"id": 15806, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nko-unjoined-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-myanmar-ui-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21963 ++"set_id": 21956 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15814, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nko-unjoined-vf-fonts", ++"name": "google-noto-sans-myanmar-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21964 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23757 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -569470,67 +569010,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15815, ++"id": 15807, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-nushu-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-nabataean-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21965 ++"set_id": 21957 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15816, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-ol-chiki-vf-fonts", ++"name": "google-noto-sans-nabataean-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21966 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23758 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -569545,18 +569067,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15817, ++"id": 15808, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-old-hungarian-fonts", ++"name": "google-noto-sans-nag-mundari-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21967 ++"set_id": 21958 + }, + "initial_release": { + "major_version": 9, +@@ -569579,18 +569101,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15818, ++"id": 15809, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-old-north-arabian-fonts", ++"name": "google-noto-sans-nag-mundari-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21968 ++"set_id": 21959 + }, + "initial_release": { + "major_version": 9, +@@ -569613,18 +569135,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15819, ++"id": 15810, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-old-permic-fonts", ++"name": "google-noto-sans-nandinagari-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21969 ++"set_id": 21960 + }, + "initial_release": { + "major_version": 9, +@@ -569647,18 +569169,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15820, ++"id": 15811, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-old-sogdian-fonts", ++"name": "google-noto-sans-newa-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21970 ++"set_id": 21961 + }, + "initial_release": { + "major_version": 9, +@@ -569681,18 +569203,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15821, ++"id": 15812, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-osage-fonts", ++"name": "google-noto-sans-new-tai-lue-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21971 ++"set_id": 21962 + }, + "initial_release": { + "major_version": 9, +@@ -569715,18 +569237,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15822, ++"id": 15813, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-pahawh-hmong-fonts", ++"name": "google-noto-sans-nko-unjoined-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21972 ++"set_id": 21963 + }, + "initial_release": { + "major_version": 9, +@@ -569749,18 +569271,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15823, ++"id": 15814, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-palmyrene-fonts", ++"name": "google-noto-sans-nko-unjoined-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21973 ++"set_id": 21964 + }, + "initial_release": { + "major_version": 9, +@@ -569783,18 +569305,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15824, ++"id": 15815, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-pau-cin-hau-fonts", ++"name": "google-noto-sans-nushu-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21974 ++"set_id": 21965 + }, + "initial_release": { + "major_version": 9, +@@ -569817,18 +569339,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15825, ++"id": 15816, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-phagspa-fonts", ++"name": "google-noto-sans-ol-chiki-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21975 ++"set_id": 21966 + }, + "initial_release": { + "major_version": 9, +@@ -569851,18 +569373,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15826, ++"id": 15817, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-psalter-pahlavi-fonts", ++"name": "google-noto-sans-old-hungarian-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21976 ++"set_id": 21967 + }, + "initial_release": { + "major_version": 9, +@@ -569885,18 +569407,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15827, ++"id": 15818, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sharada-fonts", ++"name": "google-noto-sans-old-north-arabian-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21977 ++"set_id": 21968 + }, + "initial_release": { + "major_version": 9, +@@ -569919,18 +569441,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15828, ++"id": 15819, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-siddham-fonts", ++"name": "google-noto-sans-old-permic-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21978 ++"set_id": 21969 + }, + "initial_release": { + "major_version": 9, +@@ -569953,18 +569475,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15829, ++"id": 15820, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-signwriting-fonts", ++"name": "google-noto-sans-old-sogdian-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21979 ++"set_id": 21970 + }, + "initial_release": { + "major_version": 9, +@@ -569987,18 +569509,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15830, ++"id": 15821, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sinhala-ui-fonts", ++"name": "google-noto-sans-osage-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21980 ++"set_id": 21971 + }, + "initial_release": { + "major_version": 9, +@@ -570021,18 +569543,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15831, ++"id": 15822, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sogdian-fonts", ++"name": "google-noto-sans-pahawh-hmong-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21981 ++"set_id": 21972 + }, + "initial_release": { + "major_version": 9, +@@ -570055,18 +569577,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15832, ++"id": 15823, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sora-sompeng-fonts", ++"name": "google-noto-sans-palmyrene-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21982 ++"set_id": 21973 + }, + "initial_release": { + "major_version": 9, +@@ -570089,18 +569611,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15833, ++"id": 15824, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sora-sompeng-vf-fonts", ++"name": "google-noto-sans-pau-cin-hau-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21983 ++"set_id": 21974 + }, + "initial_release": { + "major_version": 9, +@@ -570116,33 +569638,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15834, ++"id": 15825, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-soyombo-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-phags-pa-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21984 ++"set_id": 21975 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-phagspa-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23761 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -570157,18 +569695,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15835, ++"id": 15826, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-sundanese-vf-fonts", ++"name": "google-noto-sans-psalter-pahlavi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21985 ++"set_id": 21976 + }, + "initial_release": { + "major_version": 9, +@@ -570191,18 +569729,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15836, ++"id": 15827, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-symbols-vf-fonts", ++"name": "google-noto-sans-sharada-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21986 ++"set_id": 21977 + }, + "initial_release": { + "major_version": 9, +@@ -570225,18 +569763,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15837, ++"id": 15828, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-syriac-eastern-vf-fonts", ++"name": "google-noto-sans-siddham-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21987 ++"set_id": 21978 + }, + "initial_release": { + "major_version": 9, +@@ -570259,18 +569797,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15838, ++"id": 15829, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-syriac-fonts", ++"name": "google-noto-sans-signwriting-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21988 ++"set_id": 21979 + }, + "initial_release": { + "major_version": 9, +@@ -570286,33 +569824,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15839, ++"id": 15830, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-syriac-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-sinhala-ui-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21989 ++"set_id": 21980 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-sinhala-ui-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23785 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -570327,18 +569881,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15840, ++"id": 15831, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-syriac-western-vf-fonts", ++"name": "google-noto-sans-sogdian-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21990 ++"set_id": 21981 + }, + "initial_release": { + "major_version": 9, +@@ -570361,18 +569915,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15841, ++"id": 15832, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tai-tham-vf-fonts", ++"name": "google-noto-sans-sora-sompeng-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21991 ++"set_id": 21982 + }, + "initial_release": { + "major_version": 9, +@@ -570395,18 +569949,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15842, ++"id": 15833, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-takri-fonts", ++"name": "google-noto-sans-sora-sompeng-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21992 ++"set_id": 21983 + }, + "initial_release": { + "major_version": 9, +@@ -570422,33 +569976,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15843, ++"id": 15834, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tamil-supplement-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-soyombo-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 21993 ++"set_id": 21984 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-soyombo-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23786 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -570463,18 +570033,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15844, ++"id": 15835, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tamil-ui-vf-fonts", ++"name": "google-noto-sans-sundanese-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21994 ++"set_id": 21985 + }, + "initial_release": { + "major_version": 9, +@@ -570497,18 +570067,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15845, ++"id": 15836, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tangsa-fonts", ++"name": "google-noto-sans-symbols-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21995 ++"set_id": 21986 + }, + "initial_release": { + "major_version": 9, +@@ -570531,18 +570101,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15846, ++"id": 15837, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tangsa-vf-fonts", ++"name": "google-noto-sans-syriac-eastern-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21996 ++"set_id": 21987 + }, + "initial_release": { + "major_version": 9, +@@ -570565,18 +570135,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15847, ++"id": 15838, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-telugu-ui-vf-fonts", ++"name": "google-noto-sans-syriac-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21997 ++"set_id": 21988 + }, + "initial_release": { + "major_version": 9, +@@ -570599,18 +570169,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15848, ++"id": 15839, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-thaana-vf-fonts", ++"name": "google-noto-sans-syriac-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21998 ++"set_id": 21989 + }, + "initial_release": { + "major_version": 9, +@@ -570633,18 +570203,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15849, ++"id": 15840, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-thai-looped-fonts", ++"name": "google-noto-sans-syriac-western-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 21999 ++"set_id": 21990 + }, + "initial_release": { + "major_version": 9, +@@ -570667,18 +570237,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15850, ++"id": 15841, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-adrar-fonts", ++"name": "google-noto-sans-tai-tham-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22001 ++"set_id": 21991 + }, + "initial_release": { + "major_version": 9, +@@ -570694,33 +570264,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15851, ++"id": 15842, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-agraw-imazighen-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-takri-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22002 ++"set_id": 21992 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-takri-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23788 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -570735,18 +570321,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15852, ++"id": 15843, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-ahaggar-fonts", ++"name": "google-noto-sans-tamil-supplement-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22003 ++"set_id": 21993 + }, + "initial_release": { + "major_version": 9, +@@ -570769,18 +570355,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15853, ++"id": 15844, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-air-fonts", ++"name": "google-noto-sans-tamil-ui-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22004 ++"set_id": 21994 + }, + "initial_release": { + "major_version": 9, +@@ -570803,18 +570389,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15854, ++"id": 15845, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-apt-fonts", ++"name": "google-noto-sans-tangsa-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22005 ++"set_id": 21995 + }, + "initial_release": { + "major_version": 9, +@@ -570837,18 +570423,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15855, ++"id": 15846, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-azawagh-fonts", ++"name": "google-noto-sans-tangsa-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22006 ++"set_id": 21996 + }, + "initial_release": { + "major_version": 9, +@@ -570871,18 +570457,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15856, ++"id": 15847, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-ghat-fonts", ++"name": "google-noto-sans-telugu-ui-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22007 ++"set_id": 21997 + }, + "initial_release": { + "major_version": 9, +@@ -570905,18 +570491,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15857, ++"id": 15848, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-hawad-fonts", ++"name": "google-noto-sans-thaana-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22008 ++"set_id": 21998 + }, + "initial_release": { + "major_version": 9, +@@ -570932,33 +570518,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15858, ++"id": 15849, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-rhissa-ixa-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sansthai-looped-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22009 ++"set_id": 21999 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-thai-looped-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23789 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -570973,18 +570575,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15859, ++"id": 15850, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-sil-fonts", ++"name": "google-noto-sans-tifinagh-adrar-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22010 ++"set_id": 22001 + }, + "initial_release": { + "major_version": 9, +@@ -571007,18 +570609,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15860, ++"id": 15851, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tifinagh-tawellemmet-fonts", ++"name": "google-noto-sans-tifinagh-agraw-imazighen-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22011 ++"set_id": 22002 + }, + "initial_release": { + "major_version": 9, +@@ -571041,18 +570643,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15861, ++"id": 15852, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-tirhuta-fonts", ++"name": "google-noto-sans-tifinagh-ahaggar-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22012 ++"set_id": 22003 + }, + "initial_release": { + "major_version": 9, +@@ -571075,18 +570677,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15862, ++"id": 15853, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-vithkuqi-fonts", ++"name": "google-noto-sans-tifinagh-air-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22013 ++"set_id": 22004 + }, + "initial_release": { + "major_version": 9, +@@ -571109,18 +570711,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15863, ++"id": 15854, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-vithkuqi-vf-fonts", ++"name": "google-noto-sans-tifinagh-apt-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22014 ++"set_id": 22005 + }, + "initial_release": { + "major_version": 9, +@@ -571143,18 +570745,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15864, ++"id": 15855, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-wancho-fonts", ++"name": "google-noto-sans-tifinagh-azawagh-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22015 ++"set_id": 22006 + }, + "initial_release": { + "major_version": 9, +@@ -571177,18 +570779,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15865, ++"id": 15856, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-warang-citi-fonts", ++"name": "google-noto-sans-tifinagh-ghat-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22016 ++"set_id": 22007 + }, + "initial_release": { + "major_version": 9, +@@ -571211,18 +570813,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15866, ++"id": 15857, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-zanabazar-square-fonts", ++"name": "google-noto-sans-tifinagh-hawad-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22017 ++"set_id": 22008 + }, + "initial_release": { + "major_version": 9, +@@ -571245,18 +570847,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15867, ++"id": 15858, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-ahom-fonts", ++"name": "google-noto-sans-tifinagh-rhissa-ixa-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22018 ++"set_id": 22009 + }, + "initial_release": { + "major_version": 9, +@@ -571279,18 +570881,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15868, ++"id": 15859, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-armenian-vf-fonts", ++"name": "google-noto-sans-tifinagh-sil-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22019 ++"set_id": 22010 + }, + "initial_release": { + "major_version": 9, +@@ -571313,18 +570915,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15869, ++"id": 15860, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-balinese-fonts", ++"name": "google-noto-sans-tifinagh-tawellemmet-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22020 ++"set_id": 22011 + }, + "initial_release": { + "major_version": 9, +@@ -571347,18 +570949,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15870, ++"id": 15861, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-bengali-vf-fonts", ++"name": "google-noto-sans-tirhuta-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22021 ++"set_id": 22012 + }, + "initial_release": { + "major_version": 9, +@@ -571381,18 +570983,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15871, ++"id": 15862, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-devanagari-vf-fonts", ++"name": "google-noto-sans-vithkuqi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22022 ++"set_id": 22013 + }, + "initial_release": { + "major_version": 9, +@@ -571415,18 +571017,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15872, ++"id": 15863, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-dives-akuru-fonts", ++"name": "google-noto-sans-vithkuqi-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22023 ++"set_id": 22014 + }, + "initial_release": { + "major_version": 9, +@@ -571442,33 +571044,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15873, ++"id": 15864, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-dogra-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-wancho-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22024 ++"set_id": 22015 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-wancho-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23790 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -571476,33 +571094,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15874, ++"id": 15865, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-ethiopic-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-warang-citi-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22025 ++"set_id": 22016 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-warang-citi-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23817 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -571510,33 +571144,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15875, ++"id": 15866, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-ethiopic-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-zanabazar-square-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22026 ++"set_id": 22017 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-zanabazar-square-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23819 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -571551,18 +571201,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15876, ++"id": 15867, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-georgian-vf-fonts", ++"name": "google-noto-serif-ahom-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22027 ++"set_id": 22018 + }, + "initial_release": { + "major_version": 9, +@@ -571585,18 +571235,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15877, ++"id": 15868, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-grantha-fonts", ++"name": "google-noto-serif-armenian-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22028 ++"set_id": 22019 + }, + "initial_release": { + "major_version": 9, +@@ -571619,18 +571269,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15878, ++"id": 15869, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-gujarati-vf-fonts", ++"name": "google-noto-serif-balinese-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22029 ++"set_id": 22020 + }, + "initial_release": { + "major_version": 9, +@@ -571653,18 +571303,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15879, ++"id": 15870, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-gurmukhi-fonts", ++"name": "google-noto-serif-bengali-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22030 ++"set_id": 22021 + }, + "initial_release": { + "major_version": 9, +@@ -571687,18 +571337,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15880, ++"id": 15871, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-hebrew-fonts", ++"name": "google-noto-serif-devanagari-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22031 ++"set_id": 22022 + }, + "initial_release": { + "major_version": 9, +@@ -571721,18 +571371,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15881, ++"id": 15872, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-hebrew-vf-fonts", ++"name": "google-noto-serif-dives-akuru-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22032 ++"set_id": 22023 + }, + "initial_release": { + "major_version": 9, +@@ -571755,18 +571405,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15882, ++"id": 15873, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-kannada-vf-fonts", ++"name": "google-noto-serif-dogra-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22033 ++"set_id": 22024 + }, + "initial_release": { + "major_version": 9, +@@ -571789,18 +571439,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15883, ++"id": 15874, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-khitan-small-script-fonts", ++"name": "google-noto-serif-ethiopic-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22034 ++"set_id": 22025 + }, + "initial_release": { + "major_version": 9, +@@ -571823,18 +571473,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15884, ++"id": 15875, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-khmer-vf-fonts", ++"name": "google-noto-serif-ethiopic-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22035 ++"set_id": 22026 + }, + "initial_release": { + "major_version": 9, +@@ -571857,18 +571507,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15885, ++"id": 15876, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-khojki-fonts", ++"name": "google-noto-serif-georgian-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22036 ++"set_id": 22027 + }, + "initial_release": { + "major_version": 9, +@@ -571891,18 +571541,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15886, ++"id": 15877, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-khojki-vf-fonts", ++"name": "google-noto-serif-grantha-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22037 ++"set_id": 22028 + }, + "initial_release": { + "major_version": 9, +@@ -571925,18 +571575,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15887, ++"id": 15878, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-lao-vf-fonts", ++"name": "google-noto-serif-gujarati-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22038 ++"set_id": 22029 + }, + "initial_release": { + "major_version": 9, +@@ -571959,18 +571609,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15888, ++"id": 15879, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-makasar-fonts", ++"name": "google-noto-serif-gurmukhi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22039 ++"set_id": 22030 + }, + "initial_release": { + "major_version": 9, +@@ -571993,18 +571643,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15889, ++"id": 15880, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-malayalam-vf-fonts", ++"name": "google-noto-serif-hebrew-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22040 ++"set_id": 22031 + }, + "initial_release": { + "major_version": 9, +@@ -572027,18 +571677,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15890, ++"id": 15881, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-myanmar-fonts", ++"name": "google-noto-serif-hebrew-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22041 ++"set_id": 22032 + }, + "initial_release": { + "major_version": 9, +@@ -572061,18 +571711,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15891, ++"id": 15882, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-np-hmong-fonts", ++"name": "google-noto-serif-kannada-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22042 ++"set_id": 22033 + }, + "initial_release": { + "major_version": 9, +@@ -572095,18 +571745,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15892, ++"id": 15883, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-np-hmong-vf-fonts", ++"name": "google-noto-serif-khitan-small-script-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22043 ++"set_id": 22034 + }, + "initial_release": { + "major_version": 9, +@@ -572129,18 +571779,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15893, ++"id": 15884, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-old-uyghur-fonts", ++"name": "google-noto-serif-khmer-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22044 ++"set_id": 22035 + }, + "initial_release": { + "major_version": 9, +@@ -572163,18 +571813,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15894, ++"id": 15885, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-oriya-fonts", ++"name": "google-noto-serif-khojki-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22045 ++"set_id": 22036 + }, + "initial_release": { + "major_version": 9, +@@ -572197,18 +571847,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15895, ++"id": 15886, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-oriya-vf-fonts", ++"name": "google-noto-serif-khojki-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22046 ++"set_id": 22037 + }, + "initial_release": { + "major_version": 9, +@@ -572231,18 +571881,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15896, ++"id": 15887, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-ottoman-siyaq-fonts", ++"name": "google-noto-serif-lao-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22047 ++"set_id": 22038 + }, + "initial_release": { + "major_version": 9, +@@ -572265,18 +571915,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15897, ++"id": 15888, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-sinhala-fonts", ++"name": "google-noto-serif-makasar-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22048 ++"set_id": 22039 + }, + "initial_release": { + "major_version": 9, +@@ -572299,18 +571949,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15898, ++"id": 15889, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-tamil-vf-fonts", ++"name": "google-noto-serif-malayalam-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22049 ++"set_id": 22040 + }, + "initial_release": { + "major_version": 9, +@@ -572333,18 +571983,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15899, ++"id": 15890, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-tangut-fonts", ++"name": "google-noto-serif-myanmar-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22050 ++"set_id": 22041 + }, + "initial_release": { + "major_version": 9, +@@ -572360,101 +572010,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15900, ++"id": 15891, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-telugu-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-serif-nyiakeng-puachue-hmong-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22051 ++"set_id": 22042 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15901, +-"in_packageset": { +-"package": [ ++"modulestream_maps": [ + { +-"modulestreams": [ +-null +-], +-"name": "google-noto-serif-thai-vf-fonts", +-"repository": "rhel10-AppStream" ++"in_modulestream": null, ++"out_modulestream": null + } + ], +-"set_id": 22052 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15902, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-tibetan-fonts", ++"name": "google-noto-serif-np-hmong-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22053 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23821 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -572462,101 +572060,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15903, ++"id": 15892, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-tibetan-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-serif-nyiakeng-puachue-hmong-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22054 ++"set_id": 22043 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15904, +-"in_packageset": { +-"package": [ ++"modulestream_maps": [ + { +-"modulestreams": [ +-null +-], +-"name": "google-noto-serif-toto-fonts", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 22055 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" ++"in_modulestream": null, ++"out_modulestream": null + } +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" + ], +-"id": 15905, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-toto-vf-fonts", ++"name": "google-noto-serif-np-hmong-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22056 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23822 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -572571,18 +572117,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15906, ++"id": 15893, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-vithkuqi-fonts", ++"name": "google-noto-serif-old-uyghur-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22057 ++"set_id": 22044 + }, + "initial_release": { + "major_version": 9, +@@ -572605,18 +572151,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15907, ++"id": 15894, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-vithkuqi-vf-fonts", ++"name": "google-noto-serif-oriya-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22058 ++"set_id": 22045 + }, + "initial_release": { + "major_version": 9, +@@ -572639,18 +572185,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15908, ++"id": 15895, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-yezidi-fonts", ++"name": "google-noto-serif-oriya-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22059 ++"set_id": 22046 + }, + "initial_release": { + "major_version": 9, +@@ -572673,18 +572219,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15909, ++"id": 15896, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-yezidi-vf-fonts", ++"name": "google-noto-serif-ottoman-siyaq-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22060 ++"set_id": 22047 + }, + "initial_release": { + "major_version": 9, +@@ -572707,18 +572253,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15910, ++"id": 15897, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-traditional-nushu-fonts", ++"name": "google-noto-serif-sinhala-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22061 ++"set_id": 22048 + }, + "initial_release": { + "major_version": 9, +@@ -572734,101 +572280,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15911, ++"id": 15898, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-traditional-nushu-vf-fonts", +-"repository": "rhel10-AppStream" ++"name": "google-noto-serif-tamil-slanted-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22062 ++"set_id": 22049 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15912, +-"in_packageset": { +-"package": [ ++"modulestream_maps": [ + { +-"modulestreams": [ +-null +-], +-"name": "google-noto-sans-kawi-fonts", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 22063 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" ++"in_modulestream": null, ++"out_modulestream": null + } +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" + ], +-"id": 15913, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-fonts-all", ++"name": "google-noto-serif-tamil-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22064 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23825 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -572836,67 +572330,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15914, ++"id": 15899, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-mono-vf-fonts", +-"repository": "rhel10-BaseOS" ++"name": "google-noto-serif-tangut-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22065 ++"set_id": 22050 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15915, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-sans-vf-fonts", +-"repository": "rhel10-BaseOS" ++"name": "google-noto-serif-tangut-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22066 ++"set_id": 23824 + }, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -572911,18 +572387,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15916, ++"id": 15900, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "google-noto-serif-vf-fonts", +-"repository": "rhel10-BaseOS" ++"name": "google-noto-serif-telugu-vf-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22067 ++"set_id": 22051 + }, + "initial_release": { + "major_version": 9, +@@ -572945,18 +572421,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15917, ++"id": 15901, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "ibus-panel", ++"name": "google-noto-serif-thai-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22068 ++"set_id": 22052 + }, + "initial_release": { + "major_version": 9, +@@ -572979,18 +572455,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15918, ++"id": 15902, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libdbusmenu-gtk3", ++"name": "google-noto-serif-tibetan-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22069 ++"set_id": 22053 + }, + "initial_release": { + "major_version": 9, +@@ -573013,18 +572489,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15919, ++"id": 15903, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libdbusmenu", ++"name": "google-noto-serif-tibetan-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22070 ++"set_id": 22054 + }, + "initial_release": { + "major_version": 9, +@@ -573047,18 +572523,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15920, ++"id": 15904, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "ibus-gtk4", +-"repository": "rhel10-CRB" ++"name": "google-noto-serif-toto-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22071 ++"set_id": 22055 + }, + "initial_release": { + "major_version": 9, +@@ -573074,25 +572550,25 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15921, ++"id": 15905, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "NetworkManager-team", +-"repository": "rhel9-BaseOS" ++"name": "google-noto-serif-toto-vf-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22072 ++"set_id": 22056 + }, + "initial_release": { + "major_version": 9, +@@ -573108,25 +572584,25 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15922, ++"id": 15906, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "NetworkManager-initscripts-updown", +-"repository": "rhel9-BaseOS" ++"name": "google-noto-serif-vithkuqi-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22073 ++"set_id": 22057 + }, + "initial_release": { + "major_version": 9, +@@ -573142,59 +572618,25 @@ null + } + }, + { +-"action": 2, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15923, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "NetworkManager-initscripts-updown", +-"repository": "rhel9-BaseOS" +-} +-], +-"set_id": 22074 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 4, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15924, ++"id": 15907, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "NetworkManager-dispatcher-routing-rules", +-"repository": "rhel9-AppStream" ++"name": "google-noto-serif-vithkuqi-vf-fonts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22075 ++"set_id": 22058 + }, + "initial_release": { + "major_version": 9, +@@ -573217,18 +572659,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15925, ++"id": 15908, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libnma-gtk4", ++"name": "google-noto-serif-yezidi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22076 ++"set_id": 22059 + }, + "initial_release": { + "major_version": 9, +@@ -573251,18 +572693,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15926, ++"id": 15909, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts", ++"name": "google-noto-serif-yezidi-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22077 ++"set_id": 22060 + }, + "initial_release": { + "major_version": 9, +@@ -573285,18 +572727,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15927, ++"id": 15910, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-chr", ++"name": "google-noto-traditional-nushu-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22078 ++"set_id": 22061 + }, + "initial_release": { + "major_version": 9, +@@ -573319,18 +572761,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15928, ++"id": 15911, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-cjk", ++"name": "google-noto-traditional-nushu-vf-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22079 ++"set_id": 22062 + }, + "initial_release": { + "major_version": 9, +@@ -573353,18 +572795,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15929, ++"id": 15912, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-cjk-mono", ++"name": "google-noto-sans-kawi-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22080 ++"set_id": 22063 + }, + "initial_release": { + "major_version": 9, +@@ -573387,18 +572829,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15930, ++"id": 15913, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-cjk-serif", ++"name": "google-noto-fonts-all", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22081 ++"set_id": 22064 + }, + "initial_release": { + "major_version": 9, +@@ -573421,18 +572863,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15931, ++"id": 15914, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-core", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-mono-vf-fonts", ++"repository": "rhel10-BaseOS" + } + ], +-"set_id": 22082 ++"set_id": 22065 + }, + "initial_release": { + "major_version": 9, +@@ -573448,101 +572890,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15932, ++"id": 15915, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-core-emoji", +-"repository": "rhel10-AppStream" ++"name": "google-noto-sans-display-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22083 ++"set_id": 22066 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15933, +-"in_packageset": { +-"package": [ ++"modulestream_maps": [ + { +-"modulestreams": [ +-null +-], +-"name": "default-fonts-core-math", +-"repository": "rhel10-AppStream" ++"in_modulestream": null, ++"out_modulestream": null + } + ], +-"set_id": 22084 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15934, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-core-mono", ++"name": "google-noto-sans-vf-fonts", + "repository": "rhel10-BaseOS" + } + ], +-"set_id": 22085 +-}, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" ++"set_id": 23754 + }, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -573550,67 +572940,49 @@ null + } + }, + { +-"action": 0, ++"action": 7, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15935, ++"id": 15916, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-core-serif", +-"repository": "rhel10-BaseOS" ++"name": "google-noto-serif-display-vf-fonts", ++"repository": "rhel9-CRB" + } + ], +-"set_id": 22086 ++"set_id": 22067 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, ++"modulestream_maps": [ + { +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" ++"in_modulestream": null, ++"out_modulestream": null ++} + ], +-"id": 15936, +-"in_packageset": { ++"out_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-dv", +-"repository": "rhel10-AppStream" ++"name": "google-noto-serif-vf-fonts", ++"repository": "rhel10-BaseOS" + } + ], +-"set_id": 22087 ++"set_id": 23820 + }, +-"initial_release": { +-"major_version": 9, +-"minor_version": 5, +-"os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -573625,18 +572997,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15937, ++"id": 15920, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-hy", ++"name": "ibus-gtk4", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22088 ++"set_id": 22071 + }, + "initial_release": { + "major_version": 9, +@@ -573652,25 +573024,25 @@ null + } + }, + { +-"action": 0, ++"action": 1, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15938, ++"id": 15921, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-iu", +-"repository": "rhel10-AppStream" ++"name": "NetworkManager-team", ++"repository": "rhel9-BaseOS" + } + ], +-"set_id": 22089 ++"set_id": 22072 + }, + "initial_release": { + "major_version": 9, +@@ -573686,25 +573058,25 @@ null + } + }, + { +-"action": 0, ++"action": 1, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15939, ++"id": 15922, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-lo", +-"repository": "rhel10-AppStream" ++"name": "NetworkManager-initscripts-updown", ++"repository": "rhel9-BaseOS" + } + ], +-"set_id": 22090 ++"set_id": 22073 + }, + "initial_release": { + "major_version": 9, +@@ -573720,93 +573092,59 @@ null + } + }, + { +-"action": 0, ++"action": 2, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15940, ++"id": 15923, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-mni", +-"repository": "rhel10-AppStream" ++"name": "NetworkManager-initscripts-updown", ++"repository": "rhel9-BaseOS" + } + ], +-"set_id": 22091 ++"set_id": 22074 + }, + "initial_release": { + "major_version": 9, +-"minor_version": 5, ++"minor_version": 4, + "os_name": "RHEL" + }, + "modulestream_maps": [], + "out_packageset": null, + "release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" +-} +-}, +-{ +-"action": 0, +-"architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", +-"x86_64" +-], +-"id": 15941, +-"in_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "default-fonts-sat", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 22092 +-}, +-"initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" +-}, +-"modulestream_maps": [], +-"out_packageset": null, +-"release": { +-"major_version": 10, +-"minor_version": 0, +-"os_name": "RHEL" + } + }, + { +-"action": 0, ++"action": 1, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 15942, ++"id": 15924, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-other", +-"repository": "rhel10-AppStream" ++"name": "NetworkManager-dispatcher-routing-rules", ++"repository": "rhel9-AppStream" + } + ], +-"set_id": 22093 ++"set_id": 22075 + }, + "initial_release": { + "major_version": 9, +@@ -573829,18 +573167,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15943, ++"id": 15925, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-other-mono", ++"name": "libnma-gtk4", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22094 ++"set_id": 22076 + }, + "initial_release": { + "major_version": 9, +@@ -573863,18 +573201,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15944, ++"id": 15926, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-other-sans", ++"name": "default-fonts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22095 ++"set_id": 22077 + }, + "initial_release": { + "major_version": 9, +@@ -573897,18 +573235,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15945, ++"id": 15927, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "default-fonts-other-serif", ++"name": "default-fonts-chr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22096 ++"set_id": 22078 + }, + "initial_release": { + "major_version": 9, +@@ -573931,18 +573269,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15946, ++"id": 15928, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-af", ++"name": "default-fonts-cjk", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22097 ++"set_id": 22079 + }, + "initial_release": { + "major_version": 9, +@@ -573965,18 +573303,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15947, ++"id": 15929, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-am", ++"name": "default-fonts-cjk-mono", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22098 ++"set_id": 22080 + }, + "initial_release": { + "major_version": 9, +@@ -573999,18 +573337,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15948, ++"id": 15930, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ar", ++"name": "default-fonts-cjk-serif", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22099 ++"set_id": 22081 + }, + "initial_release": { + "major_version": 9, +@@ -574033,18 +573371,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15949, ++"id": 15931, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-as", ++"name": "default-fonts-core", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22100 ++"set_id": 22082 + }, + "initial_release": { + "major_version": 9, +@@ -574067,18 +573405,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15950, ++"id": 15932, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ast", ++"name": "default-fonts-core-emoji", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22101 ++"set_id": 22083 + }, + "initial_release": { + "major_version": 9, +@@ -574101,18 +573439,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15951, ++"id": 15933, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-be", ++"name": "default-fonts-core-math", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22102 ++"set_id": 22084 + }, + "initial_release": { + "major_version": 9, +@@ -574135,18 +573473,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15952, ++"id": 15934, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-bg", +-"repository": "rhel10-AppStream" ++"name": "default-fonts-core-mono", ++"repository": "rhel10-BaseOS" + } + ], +-"set_id": 22103 ++"set_id": 22085 + }, + "initial_release": { + "major_version": 9, +@@ -574169,18 +573507,52 @@ null + "s390x", + "x86_64" + ], +-"id": 15953, ++"id": 15935, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-bn", ++"name": "default-fonts-core-serif", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22086 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 15936, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "default-fonts-dv", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22104 ++"set_id": 22087 + }, + "initial_release": { + "major_version": 9, +@@ -574203,18 +573575,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15954, ++"id": 15937, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-bo", ++"name": "default-fonts-hy", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22105 ++"set_id": 22088 + }, + "initial_release": { + "major_version": 9, +@@ -574237,18 +573609,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15955, ++"id": 15938, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-br", ++"name": "default-fonts-iu", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22106 ++"set_id": 22089 + }, + "initial_release": { + "major_version": 9, +@@ -574271,18 +573643,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15956, ++"id": 15939, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-bs", ++"name": "default-fonts-lo", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22107 ++"set_id": 22090 + }, + "initial_release": { + "major_version": 9, +@@ -574305,18 +573677,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15957, ++"id": 15940, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ca", ++"name": "default-fonts-mni", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22108 ++"set_id": 22091 + }, + "initial_release": { + "major_version": 9, +@@ -574339,18 +573711,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15958, ++"id": 15941, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-cs", ++"name": "default-fonts-sat", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22109 ++"set_id": 22092 + }, + "initial_release": { + "major_version": 9, +@@ -574373,18 +573745,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15959, ++"id": 15942, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-cy", ++"name": "default-fonts-other", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22110 ++"set_id": 22093 + }, + "initial_release": { + "major_version": 9, +@@ -574407,18 +573779,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15960, ++"id": 15943, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-da", ++"name": "default-fonts-other-mono", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22111 ++"set_id": 22094 + }, + "initial_release": { + "major_version": 9, +@@ -574441,18 +573813,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15961, ++"id": 15944, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-de", ++"name": "default-fonts-other-sans", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22112 ++"set_id": 22095 + }, + "initial_release": { + "major_version": 9, +@@ -574475,18 +573847,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15962, ++"id": 15945, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-dz", ++"name": "default-fonts-other-serif", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22113 ++"set_id": 22096 + }, + "initial_release": { + "major_version": 9, +@@ -574509,18 +573881,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15963, ++"id": 15946, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-el", ++"name": "langpacks-fonts-af", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22114 ++"set_id": 22097 + }, + "initial_release": { + "major_version": 9, +@@ -574543,18 +573915,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15964, ++"id": 15947, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-en", ++"name": "langpacks-fonts-am", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22115 ++"set_id": 22098 + }, + "initial_release": { + "major_version": 9, +@@ -574577,18 +573949,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15965, ++"id": 15948, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-eo", ++"name": "langpacks-fonts-ar", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22116 ++"set_id": 22099 + }, + "initial_release": { + "major_version": 9, +@@ -574611,18 +573983,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15966, ++"id": 15949, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-es", ++"name": "langpacks-fonts-as", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22117 ++"set_id": 22100 + }, + "initial_release": { + "major_version": 9, +@@ -574645,18 +574017,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15967, ++"id": 15950, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-et", ++"name": "langpacks-fonts-ast", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22118 ++"set_id": 22101 + }, + "initial_release": { + "major_version": 9, +@@ -574679,18 +574051,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15968, ++"id": 15951, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-eu", ++"name": "langpacks-fonts-be", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22119 ++"set_id": 22102 + }, + "initial_release": { + "major_version": 9, +@@ -574713,18 +574085,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15969, ++"id": 15952, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-fa", ++"name": "langpacks-fonts-bg", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22120 ++"set_id": 22103 + }, + "initial_release": { + "major_version": 9, +@@ -574747,18 +574119,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15970, ++"id": 15953, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-fi", ++"name": "langpacks-fonts-bn", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22121 ++"set_id": 22104 + }, + "initial_release": { + "major_version": 9, +@@ -574781,18 +574153,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15971, ++"id": 15954, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-fr", ++"name": "langpacks-fonts-bo", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22122 ++"set_id": 22105 + }, + "initial_release": { + "major_version": 9, +@@ -574815,18 +574187,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15972, ++"id": 15955, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ga", ++"name": "langpacks-fonts-br", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22123 ++"set_id": 22106 + }, + "initial_release": { + "major_version": 9, +@@ -574849,18 +574221,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15973, ++"id": 15956, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-gl", ++"name": "langpacks-fonts-bs", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22124 ++"set_id": 22107 + }, + "initial_release": { + "major_version": 9, +@@ -574883,18 +574255,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15974, ++"id": 15957, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-gu", ++"name": "langpacks-fonts-ca", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22125 ++"set_id": 22108 + }, + "initial_release": { + "major_version": 9, +@@ -574917,18 +574289,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15975, ++"id": 15958, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-he", ++"name": "langpacks-fonts-cs", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22126 ++"set_id": 22109 + }, + "initial_release": { + "major_version": 9, +@@ -574951,18 +574323,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15976, ++"id": 15959, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-hi", ++"name": "langpacks-fonts-cy", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22127 ++"set_id": 22110 + }, + "initial_release": { + "major_version": 9, +@@ -574985,18 +574357,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15977, ++"id": 15960, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-hr", ++"name": "langpacks-fonts-da", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22128 ++"set_id": 22111 + }, + "initial_release": { + "major_version": 9, +@@ -575019,18 +574391,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15978, ++"id": 15961, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-hu", ++"name": "langpacks-fonts-de", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22129 ++"set_id": 22112 + }, + "initial_release": { + "major_version": 9, +@@ -575053,18 +574425,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15979, ++"id": 15962, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ia", ++"name": "langpacks-fonts-dz", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22130 ++"set_id": 22113 + }, + "initial_release": { + "major_version": 9, +@@ -575087,18 +574459,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15980, ++"id": 15963, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-id", ++"name": "langpacks-fonts-el", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22131 ++"set_id": 22114 + }, + "initial_release": { + "major_version": 9, +@@ -575121,18 +574493,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15981, ++"id": 15964, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-is", ++"name": "langpacks-fonts-en", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22132 ++"set_id": 22115 + }, + "initial_release": { + "major_version": 9, +@@ -575155,18 +574527,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15982, ++"id": 15965, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-it", ++"name": "langpacks-fonts-eo", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22133 ++"set_id": 22116 + }, + "initial_release": { + "major_version": 9, +@@ -575189,18 +574561,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15983, ++"id": 15966, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ja", ++"name": "langpacks-fonts-es", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22134 ++"set_id": 22117 + }, + "initial_release": { + "major_version": 9, +@@ -575223,18 +574595,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15984, ++"id": 15967, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ka", ++"name": "langpacks-fonts-et", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22135 ++"set_id": 22118 + }, + "initial_release": { + "major_version": 9, +@@ -575257,18 +574629,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15985, ++"id": 15968, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-kk", ++"name": "langpacks-fonts-eu", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22136 ++"set_id": 22119 + }, + "initial_release": { + "major_version": 9, +@@ -575291,18 +574663,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15986, ++"id": 15969, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-km", ++"name": "langpacks-fonts-fa", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22137 ++"set_id": 22120 + }, + "initial_release": { + "major_version": 9, +@@ -575325,18 +574697,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15987, ++"id": 15970, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-kn", ++"name": "langpacks-fonts-fi", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22138 ++"set_id": 22121 + }, + "initial_release": { + "major_version": 9, +@@ -575359,18 +574731,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15988, ++"id": 15971, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ko", ++"name": "langpacks-fonts-fr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22139 ++"set_id": 22122 + }, + "initial_release": { + "major_version": 9, +@@ -575393,18 +574765,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15989, ++"id": 15972, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ku", ++"name": "langpacks-fonts-ga", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22140 ++"set_id": 22123 + }, + "initial_release": { + "major_version": 9, +@@ -575427,18 +574799,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15990, ++"id": 15973, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-lt", ++"name": "langpacks-fonts-gl", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22141 ++"set_id": 22124 + }, + "initial_release": { + "major_version": 9, +@@ -575461,18 +574833,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15991, ++"id": 15974, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-lv", ++"name": "langpacks-fonts-gu", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22142 ++"set_id": 22125 + }, + "initial_release": { + "major_version": 9, +@@ -575495,18 +574867,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15992, ++"id": 15975, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-mai", ++"name": "langpacks-fonts-he", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22143 ++"set_id": 22126 + }, + "initial_release": { + "major_version": 9, +@@ -575529,18 +574901,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15993, ++"id": 15976, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-mk", ++"name": "langpacks-fonts-hi", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22144 ++"set_id": 22127 + }, + "initial_release": { + "major_version": 9, +@@ -575563,18 +574935,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15994, ++"id": 15977, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ml", ++"name": "langpacks-fonts-hr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22145 ++"set_id": 22128 + }, + "initial_release": { + "major_version": 9, +@@ -575597,18 +574969,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15995, ++"id": 15978, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-mr", ++"name": "langpacks-fonts-hu", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22146 ++"set_id": 22129 + }, + "initial_release": { + "major_version": 9, +@@ -575631,18 +575003,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15996, ++"id": 15979, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ms", ++"name": "langpacks-fonts-ia", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22147 ++"set_id": 22130 + }, + "initial_release": { + "major_version": 9, +@@ -575665,18 +575037,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15997, ++"id": 15980, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-my", ++"name": "langpacks-fonts-id", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22148 ++"set_id": 22131 + }, + "initial_release": { + "major_version": 9, +@@ -575699,18 +575071,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15998, ++"id": 15981, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-nb", ++"name": "langpacks-fonts-is", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22149 ++"set_id": 22132 + }, + "initial_release": { + "major_version": 9, +@@ -575733,18 +575105,18 @@ null + "s390x", + "x86_64" + ], +-"id": 15999, ++"id": 15982, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ne", ++"name": "langpacks-fonts-it", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22150 ++"set_id": 22133 + }, + "initial_release": { + "major_version": 9, +@@ -575767,18 +575139,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16000, ++"id": 15983, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-nl", ++"name": "langpacks-fonts-ja", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22151 ++"set_id": 22134 + }, + "initial_release": { + "major_version": 9, +@@ -575801,18 +575173,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16001, ++"id": 15984, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-nn", ++"name": "langpacks-fonts-ka", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22152 ++"set_id": 22135 + }, + "initial_release": { + "major_version": 9, +@@ -575835,18 +575207,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16002, ++"id": 15985, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-nr", ++"name": "langpacks-fonts-kk", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22153 ++"set_id": 22136 + }, + "initial_release": { + "major_version": 9, +@@ -575869,18 +575241,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16003, ++"id": 15986, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-nso", ++"name": "langpacks-fonts-km", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22154 ++"set_id": 22137 + }, + "initial_release": { + "major_version": 9, +@@ -575903,18 +575275,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16004, ++"id": 15987, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-or", ++"name": "langpacks-fonts-kn", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22155 ++"set_id": 22138 + }, + "initial_release": { + "major_version": 9, +@@ -575937,18 +575309,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16005, ++"id": 15988, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-pa", ++"name": "langpacks-fonts-ko", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22156 ++"set_id": 22139 + }, + "initial_release": { + "major_version": 9, +@@ -575971,18 +575343,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16006, ++"id": 15989, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-pl", ++"name": "langpacks-fonts-ku", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22157 ++"set_id": 22140 + }, + "initial_release": { + "major_version": 9, +@@ -576005,18 +575377,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16007, ++"id": 15990, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-pt", ++"name": "langpacks-fonts-lt", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22158 ++"set_id": 22141 + }, + "initial_release": { + "major_version": 9, +@@ -576039,18 +575411,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16008, ++"id": 15991, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ro", ++"name": "langpacks-fonts-lv", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22159 ++"set_id": 22142 + }, + "initial_release": { + "major_version": 9, +@@ -576073,18 +575445,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16009, ++"id": 15992, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ru", ++"name": "langpacks-fonts-mai", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22160 ++"set_id": 22143 + }, + "initial_release": { + "major_version": 9, +@@ -576107,18 +575479,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16010, ++"id": 15993, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-si", ++"name": "langpacks-fonts-mk", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22161 ++"set_id": 22144 + }, + "initial_release": { + "major_version": 9, +@@ -576141,18 +575513,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16011, ++"id": 15994, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-sk", ++"name": "langpacks-fonts-ml", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22162 ++"set_id": 22145 + }, + "initial_release": { + "major_version": 9, +@@ -576175,18 +575547,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16012, ++"id": 15995, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-sl", ++"name": "langpacks-fonts-mr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22163 ++"set_id": 22146 + }, + "initial_release": { + "major_version": 9, +@@ -576209,18 +575581,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16013, ++"id": 15996, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-sq", ++"name": "langpacks-fonts-ms", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22164 ++"set_id": 22147 + }, + "initial_release": { + "major_version": 9, +@@ -576243,18 +575615,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16014, ++"id": 15997, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-sr", ++"name": "langpacks-fonts-my", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22165 ++"set_id": 22148 + }, + "initial_release": { + "major_version": 9, +@@ -576277,18 +575649,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16015, ++"id": 15998, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ss", ++"name": "langpacks-fonts-nb", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22166 ++"set_id": 22149 + }, + "initial_release": { + "major_version": 9, +@@ -576311,18 +575683,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16016, ++"id": 15999, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-sv", ++"name": "langpacks-fonts-ne", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22167 ++"set_id": 22150 + }, + "initial_release": { + "major_version": 9, +@@ -576345,18 +575717,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16017, ++"id": 16000, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ta", ++"name": "langpacks-fonts-nl", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22168 ++"set_id": 22151 + }, + "initial_release": { + "major_version": 9, +@@ -576379,18 +575751,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16018, ++"id": 16001, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-te", ++"name": "langpacks-fonts-nn", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22169 ++"set_id": 22152 + }, + "initial_release": { + "major_version": 9, +@@ -576413,18 +575785,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16019, ++"id": 16002, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-th", ++"name": "langpacks-fonts-nr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22170 ++"set_id": 22153 + }, + "initial_release": { + "major_version": 9, +@@ -576447,18 +575819,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16020, ++"id": 16003, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-tn", ++"name": "langpacks-fonts-nso", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22171 ++"set_id": 22154 + }, + "initial_release": { + "major_version": 9, +@@ -576481,18 +575853,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16021, ++"id": 16004, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-tr", ++"name": "langpacks-fonts-or", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22172 ++"set_id": 22155 + }, + "initial_release": { + "major_version": 9, +@@ -576515,18 +575887,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16022, ++"id": 16005, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ts", ++"name": "langpacks-fonts-pa", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22173 ++"set_id": 22156 + }, + "initial_release": { + "major_version": 9, +@@ -576549,18 +575921,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16023, ++"id": 16006, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-uk", ++"name": "langpacks-fonts-pl", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22174 ++"set_id": 22157 + }, + "initial_release": { + "major_version": 9, +@@ -576583,18 +575955,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16024, ++"id": 16007, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ur", ++"name": "langpacks-fonts-pt", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22175 ++"set_id": 22158 + }, + "initial_release": { + "major_version": 9, +@@ -576617,18 +575989,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16025, ++"id": 16008, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-ve", ++"name": "langpacks-fonts-ro", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22176 ++"set_id": 22159 + }, + "initial_release": { + "major_version": 9, +@@ -576651,18 +576023,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16026, ++"id": 16009, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-vi", ++"name": "langpacks-fonts-ru", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22177 ++"set_id": 22160 + }, + "initial_release": { + "major_version": 9, +@@ -576685,18 +576057,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16027, ++"id": 16010, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-xh", ++"name": "langpacks-fonts-si", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22178 ++"set_id": 22161 + }, + "initial_release": { + "major_version": 9, +@@ -576719,18 +576091,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16028, ++"id": 16011, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-yi", ++"name": "langpacks-fonts-sk", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22179 ++"set_id": 22162 + }, + "initial_release": { + "major_version": 9, +@@ -576753,18 +576125,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16029, ++"id": 16012, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-zh_CN", ++"name": "langpacks-fonts-sl", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22180 ++"set_id": 22163 + }, + "initial_release": { + "major_version": 9, +@@ -576787,18 +576159,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16030, ++"id": 16013, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-zh_HK", ++"name": "langpacks-fonts-sq", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22181 ++"set_id": 22164 + }, + "initial_release": { + "major_version": 9, +@@ -576821,18 +576193,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16031, ++"id": 16014, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-zh_TW", ++"name": "langpacks-fonts-sr", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22182 ++"set_id": 22165 + }, + "initial_release": { + "major_version": 9, +@@ -576855,18 +576227,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16032, ++"id": 16015, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "langpacks-fonts-zu", ++"name": "langpacks-fonts-ss", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22183 ++"set_id": 22166 + }, + "initial_release": { + "major_version": 9, +@@ -576882,49 +576254,33 @@ null + } + }, + { +-"action": 7, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16033, ++"id": 16016, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gcr", +-"repository": "rhel9-AppStream" ++"name": "langpacks-fonts-sv", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22184 ++"set_id": 22167 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "gcr3", +-"repository": "rhel10-AppStream" +-} +-], +-"set_id": 22185 +-}, ++"modulestream_maps": [], ++"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -576939,18 +576295,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16034, ++"id": 16017, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libdisplay-info", ++"name": "langpacks-fonts-ta", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22186 ++"set_id": 22168 + }, + "initial_release": { + "major_version": 9, +@@ -576968,20 +576324,23 @@ null + { + "action": 0, + "architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", + "x86_64" + ], +-"id": 16035, ++"id": 16018, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "virtio-win", ++"name": "langpacks-fonts-te", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22187 ++"set_id": 22169 + }, + "initial_release": { + "major_version": 9, +@@ -577004,18 +576363,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16036, ++"id": 16019, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "freerdp-server", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-th", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22188 ++"set_id": 22170 + }, + "initial_release": { + "major_version": 9, +@@ -577038,18 +576397,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16037, ++"id": 16020, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gnome-autoar-devel", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-tn", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22189 ++"set_id": 22171 + }, + "initial_release": { + "major_version": 9, +@@ -577072,18 +576431,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16038, ++"id": 16021, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libexif-doc", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-tr", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22190 ++"set_id": 22172 + }, + "initial_release": { + "major_version": 9, +@@ -577106,18 +576465,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16039, ++"id": 16022, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libical-glib-doc", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-ts", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22191 ++"set_id": 22173 + }, + "initial_release": { + "major_version": 9, +@@ -577140,18 +576499,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16040, ++"id": 16023, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "libmtp-examples", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-uk", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22192 ++"set_id": 22174 + }, + "initial_release": { + "major_version": 9, +@@ -577174,18 +576533,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16041, ++"id": 16024, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "poppler-qt6", ++"name": "langpacks-fonts-ur", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22193 ++"set_id": 22175 + }, + "initial_release": { + "major_version": 9, +@@ -577208,18 +576567,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16042, ++"id": 16025, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "PyQt-builder", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-ve", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22194 ++"set_id": 22176 + }, + "initial_release": { + "major_version": 9, +@@ -577242,18 +576601,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16043, ++"id": 16026, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "python3-pyqt6-devel", ++"name": "langpacks-fonts-vi", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22195 ++"set_id": 22177 + }, + "initial_release": { + "major_version": 9, +@@ -577276,18 +576635,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16044, ++"id": 16027, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "python-pyqt6-doc", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-xh", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22196 ++"set_id": 22178 + }, + "initial_release": { + "major_version": 9, +@@ -577310,18 +576669,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16045, ++"id": 16028, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-assistant", ++"name": "langpacks-fonts-yi", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22197 ++"set_id": 22179 + }, + "initial_release": { + "major_version": 9, +@@ -577344,18 +576703,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16046, ++"id": 16029, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qdbusviewer", ++"name": "langpacks-fonts-zh_CN", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22198 ++"set_id": 22180 + }, + "initial_release": { + "major_version": 9, +@@ -577378,18 +576737,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16047, ++"id": 16030, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qttools-examples", +-"repository": "rhel10-CRB" ++"name": "langpacks-fonts-zh_HK", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22199 ++"set_id": 22181 + }, + "initial_release": { + "major_version": 9, +@@ -577412,18 +576771,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16048, ++"id": 16031, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt3d", ++"name": "langpacks-fonts-zh_TW", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22200 ++"set_id": 22182 + }, + "initial_release": { + "major_version": 9, +@@ -577446,18 +576805,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16049, ++"id": 16032, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt3d-devel", ++"name": "langpacks-fonts-zu", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22201 ++"set_id": 22183 + }, + "initial_release": { + "major_version": 9, +@@ -577480,18 +576839,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16050, ++"id": 16034, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt3d-examples", +-"repository": "rhel10-CRB" ++"name": "libdisplay-info", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22202 ++"set_id": 22186 + }, + "initial_release": { + "major_version": 9, +@@ -577509,23 +576868,20 @@ null + { + "action": 0, + "architectures": [ +-"aarch64", +-"ppc64le", +-"s390x", + "x86_64" + ], +-"id": 16051, ++"id": 16035, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt5compat", ++"name": "virtio-win", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22203 ++"set_id": 22187 + }, + "initial_release": { + "major_version": 9, +@@ -577548,18 +576904,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16052, ++"id": 16036, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt5compat-devel", +-"repository": "rhel10-AppStream" ++"name": "freerdp-server", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22204 ++"set_id": 22188 + }, + "initial_release": { + "major_version": 9, +@@ -577582,18 +576938,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16053, ++"id": 16037, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qt5compat-examples", ++"name": "gnome-autoar-devel", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22205 ++"set_id": 22189 + }, + "initial_release": { + "major_version": 9, +@@ -577616,18 +576972,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16054, ++"id": 16038, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase", +-"repository": "rhel10-AppStream" ++"name": "libexif-doc", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22206 ++"set_id": 22190 + }, + "initial_release": { + "major_version": 9, +@@ -577650,18 +577006,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16055, ++"id": 16039, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-common", +-"repository": "rhel10-AppStream" ++"name": "libical-glib-doc", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22207 ++"set_id": 22191 + }, + "initial_release": { + "major_version": 9, +@@ -577684,18 +577040,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16056, ++"id": 16040, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-devel", +-"repository": "rhel10-AppStream" ++"name": "libmtp-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22208 ++"set_id": 22192 + }, + "initial_release": { + "major_version": 9, +@@ -577718,18 +577074,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16057, ++"id": 16041, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-gui", ++"name": "poppler-qt6", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22209 ++"set_id": 22193 + }, + "initial_release": { + "major_version": 9, +@@ -577752,18 +577108,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16058, ++"id": 16042, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-mysql", +-"repository": "rhel10-AppStream" ++"name": "PyQt-builder", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22210 ++"set_id": 22194 + }, + "initial_release": { + "major_version": 9, +@@ -577786,18 +577142,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16059, ++"id": 16043, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-odbc", ++"name": "python3-pyqt6-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22211 ++"set_id": 22195 + }, + "initial_release": { + "major_version": 9, +@@ -577820,18 +577176,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16060, ++"id": 16044, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-postgresql", +-"repository": "rhel10-AppStream" ++"name": "python-pyqt6-doc", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22212 ++"set_id": 22196 + }, + "initial_release": { + "major_version": 9, +@@ -577854,18 +577210,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16061, ++"id": 16045, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-assistant", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22213 ++"set_id": 22197 + }, + "initial_release": { + "major_version": 9, +@@ -577888,18 +577244,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16062, ++"id": 16046, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-private-devel", +-"repository": "rhel10-CRB" ++"name": "qt6-qdbusviewer", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22214 ++"set_id": 22198 + }, + "initial_release": { + "major_version": 9, +@@ -577922,18 +577278,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16063, ++"id": 16047, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtbase-static", ++"name": "qt6-qttools-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22215 ++"set_id": 22199 + }, + "initial_release": { + "major_version": 9, +@@ -577956,18 +577312,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16064, ++"id": 16048, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtcharts", ++"name": "qt6-qt3d", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22216 ++"set_id": 22200 + }, + "initial_release": { + "major_version": 9, +@@ -577990,18 +577346,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16065, ++"id": 16049, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtcharts-devel", ++"name": "qt6-qt3d-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22217 ++"set_id": 22201 + }, + "initial_release": { + "major_version": 9, +@@ -578024,18 +577380,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16066, ++"id": 16050, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtcharts-examples", +-"repository": "rhel10-AppStream" ++"name": "qt6-qt3d-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22218 ++"set_id": 22202 + }, + "initial_release": { + "major_version": 9, +@@ -578058,18 +577414,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16067, ++"id": 16051, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtconnectivity", ++"name": "qt6-qt5compat", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22219 ++"set_id": 22203 + }, + "initial_release": { + "major_version": 9, +@@ -578092,18 +577448,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16068, ++"id": 16052, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtconnectivity-devel", ++"name": "qt6-qt5compat-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22220 ++"set_id": 22204 + }, + "initial_release": { + "major_version": 9, +@@ -578126,18 +577482,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16069, ++"id": 16053, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtconnectivity-examples", ++"name": "qt6-qt5compat-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22221 ++"set_id": 22205 + }, + "initial_release": { + "major_version": 9, +@@ -578160,18 +577516,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16070, ++"id": 16054, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdatavis3d", ++"name": "qt6-qtbase", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22222 ++"set_id": 22206 + }, + "initial_release": { + "major_version": 9, +@@ -578194,18 +577550,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16071, ++"id": 16055, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdatavis3d-devel", ++"name": "qt6-qtbase-common", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22223 ++"set_id": 22207 + }, + "initial_release": { + "major_version": 9, +@@ -578228,18 +577584,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16072, ++"id": 16056, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdatavis3d-examples", ++"name": "qt6-qtbase-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22224 ++"set_id": 22208 + }, + "initial_release": { + "major_version": 9, +@@ -578262,18 +577618,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16073, ++"id": 16057, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdeclarative", ++"name": "qt6-qtbase-gui", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22225 ++"set_id": 22209 + }, + "initial_release": { + "major_version": 9, +@@ -578296,18 +577652,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16074, ++"id": 16058, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdeclarative-devel", ++"name": "qt6-qtbase-mysql", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22226 ++"set_id": 22210 + }, + "initial_release": { + "major_version": 9, +@@ -578330,18 +577686,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16075, ++"id": 16059, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdeclarative-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtbase-odbc", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22227 ++"set_id": 22211 + }, + "initial_release": { + "major_version": 9, +@@ -578364,18 +577720,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16076, ++"id": 16060, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtdeclarative-static", +-"repository": "rhel10-CRB" ++"name": "qt6-qtbase-postgresql", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22228 ++"set_id": 22212 + }, + "initial_release": { + "major_version": 9, +@@ -578398,18 +577754,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16077, ++"id": 16061, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtimageformats", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtbase-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22229 ++"set_id": 22213 + }, + "initial_release": { + "major_version": 9, +@@ -578432,18 +577788,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16078, ++"id": 16062, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlanguageserver", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtbase-private-devel", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22230 ++"set_id": 22214 + }, + "initial_release": { + "major_version": 9, +@@ -578466,18 +577822,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16079, ++"id": 16063, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlanguageserver-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtbase-static", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22231 ++"set_id": 22215 + }, + "initial_release": { + "major_version": 9, +@@ -578500,18 +577856,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16080, ++"id": 16064, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlocation", ++"name": "qt6-qtcharts", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22232 ++"set_id": 22216 + }, + "initial_release": { + "major_version": 9, +@@ -578534,18 +577890,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16081, ++"id": 16065, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlocation-devel", ++"name": "qt6-qtcharts-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22233 ++"set_id": 22217 + }, + "initial_release": { + "major_version": 9, +@@ -578568,18 +577924,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16082, ++"id": 16067, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlocation-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtconnectivity", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22234 ++"set_id": 22219 + }, + "initial_release": { + "major_version": 9, +@@ -578602,18 +577958,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16083, ++"id": 16068, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlottie", ++"name": "qt6-qtconnectivity-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22235 ++"set_id": 22220 + }, + "initial_release": { + "major_version": 9, +@@ -578636,18 +577992,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16084, ++"id": 16069, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtlottie-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtconnectivity-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22236 ++"set_id": 22221 + }, + "initial_release": { + "major_version": 9, +@@ -578670,18 +578026,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16085, ++"id": 16070, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtmultimedia", ++"name": "qt6-qtdatavis3d", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22237 ++"set_id": 22222 + }, + "initial_release": { + "major_version": 9, +@@ -578704,18 +578060,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16086, ++"id": 16071, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtmultimedia-devel", ++"name": "qt6-qtdatavis3d-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22238 ++"set_id": 22223 + }, + "initial_release": { + "major_version": 9, +@@ -578738,18 +578094,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16087, ++"id": 16073, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtmultimedia-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtdeclarative", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22239 ++"set_id": 22225 + }, + "initial_release": { + "major_version": 9, +@@ -578772,18 +578128,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16088, ++"id": 16074, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtnetworkauth", ++"name": "qt6-qtdeclarative-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22240 ++"set_id": 22226 + }, + "initial_release": { + "major_version": 9, +@@ -578806,18 +578162,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16089, ++"id": 16075, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtnetworkauth-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtdeclarative-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22241 ++"set_id": 22227 + }, + "initial_release": { + "major_version": 9, +@@ -578840,18 +578196,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16090, ++"id": 16076, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtnetworkauth-examples", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtdeclarative-static", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22242 ++"set_id": 22228 + }, + "initial_release": { + "major_version": 9, +@@ -578874,18 +578230,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16091, ++"id": 16077, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtpositioning", ++"name": "qt6-qtimageformats", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22243 ++"set_id": 22229 + }, + "initial_release": { + "major_version": 9, +@@ -578908,18 +578264,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16092, ++"id": 16078, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtpositioning-devel", ++"name": "qt6-qtlanguageserver", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22244 ++"set_id": 22230 + }, + "initial_release": { + "major_version": 9, +@@ -578942,18 +578298,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16093, ++"id": 16079, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtpositioning-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtlanguageserver-devel", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22245 ++"set_id": 22231 + }, + "initial_release": { + "major_version": 9, +@@ -578976,18 +578332,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16094, ++"id": 16080, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtquick3d", ++"name": "qt6-qtlocation", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22246 ++"set_id": 22232 + }, + "initial_release": { + "major_version": 9, +@@ -579010,18 +578366,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16095, ++"id": 16081, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtquick3d-devel", ++"name": "qt6-qtlocation-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22247 ++"set_id": 22233 + }, + "initial_release": { + "major_version": 9, +@@ -579044,18 +578400,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16096, ++"id": 16082, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtquick3d-examples", ++"name": "qt6-qtlocation-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22248 ++"set_id": 22234 + }, + "initial_release": { + "major_version": 9, +@@ -579078,18 +578434,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16097, ++"id": 16083, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtquicktimeline", ++"name": "qt6-qtlottie", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22249 ++"set_id": 22235 + }, + "initial_release": { + "major_version": 9, +@@ -579112,18 +578468,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16098, ++"id": 16084, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtquicktimeline-devel", ++"name": "qt6-qtlottie-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22250 ++"set_id": 22236 + }, + "initial_release": { + "major_version": 9, +@@ -579146,18 +578502,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16099, ++"id": 16085, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtremoteobjects", ++"name": "qt6-qtmultimedia", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22251 ++"set_id": 22237 + }, + "initial_release": { + "major_version": 9, +@@ -579180,18 +578536,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16100, ++"id": 16086, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtremoteobjects-devel", ++"name": "qt6-qtmultimedia-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22252 ++"set_id": 22238 + }, + "initial_release": { + "major_version": 9, +@@ -579214,18 +578570,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16101, ++"id": 16087, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtremoteobjects-examples", ++"name": "qt6-qtmultimedia-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22253 ++"set_id": 22239 + }, + "initial_release": { + "major_version": 9, +@@ -579248,18 +578604,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16102, ++"id": 16088, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtscxml", ++"name": "qt6-qtnetworkauth", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22254 ++"set_id": 22240 + }, + "initial_release": { + "major_version": 9, +@@ -579282,18 +578638,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16103, ++"id": 16089, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtscxml-devel", ++"name": "qt6-qtnetworkauth-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22255 ++"set_id": 22241 + }, + "initial_release": { + "major_version": 9, +@@ -579316,18 +578672,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16104, ++"id": 16091, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtscxml-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtpositioning", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22256 ++"set_id": 22243 + }, + "initial_release": { + "major_version": 9, +@@ -579350,18 +578706,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16105, ++"id": 16092, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsensors", ++"name": "qt6-qtpositioning-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22257 ++"set_id": 22244 + }, + "initial_release": { + "major_version": 9, +@@ -579384,18 +578740,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16106, ++"id": 16093, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsensors-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtpositioning-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22258 ++"set_id": 22245 + }, + "initial_release": { + "major_version": 9, +@@ -579418,18 +578774,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16107, ++"id": 16094, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsensors-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtquick3d", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22259 ++"set_id": 22246 + }, + "initial_release": { + "major_version": 9, +@@ -579452,18 +578808,51 @@ null + "s390x", + "x86_64" + ], +-"id": 16108, ++"id": 16095, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialbus", ++"name": "qt6-qtquick3d-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22260 ++"set_id": 22247 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 16096, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "qt6-qtquick3d-examples", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22248 + }, + "initial_release": { + "major_version": 9, +@@ -579486,18 +578875,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16109, ++"id": 16097, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialbus-devel", ++"name": "qt6-qtquicktimeline", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22261 ++"set_id": 22249 + }, + "initial_release": { + "major_version": 9, +@@ -579520,18 +578909,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16110, ++"id": 16098, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialbus-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtquicktimeline-devel", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22262 ++"set_id": 22250 + }, + "initial_release": { + "major_version": 9, +@@ -579554,18 +578943,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16111, ++"id": 16099, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialport", ++"name": "qt6-qtremoteobjects", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22263 ++"set_id": 22251 + }, + "initial_release": { + "major_version": 9, +@@ -579588,18 +578977,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16112, ++"id": 16100, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialport-devel", ++"name": "qt6-qtremoteobjects-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22264 ++"set_id": 22252 + }, + "initial_release": { + "major_version": 9, +@@ -579622,18 +579011,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16113, ++"id": 16101, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtserialport-examples", ++"name": "qt6-qtremoteobjects-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22265 ++"set_id": 22253 + }, + "initial_release": { + "major_version": 9, +@@ -579656,18 +579045,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16114, ++"id": 16102, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtshadertools", ++"name": "qt6-qtscxml", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22266 ++"set_id": 22254 + }, + "initial_release": { + "major_version": 9, +@@ -579690,18 +579079,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16115, ++"id": 16103, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtshadertools-devel", ++"name": "qt6-qtscxml-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22267 ++"set_id": 22255 + }, + "initial_release": { + "major_version": 9, +@@ -579724,18 +579113,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16116, ++"id": 16104, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtspeech", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtscxml-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22268 ++"set_id": 22256 + }, + "initial_release": { + "major_version": 9, +@@ -579758,18 +579147,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16117, ++"id": 16105, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtspeech-devel", ++"name": "qt6-qtsensors", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22269 ++"set_id": 22257 + }, + "initial_release": { + "major_version": 9, +@@ -579792,18 +579181,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16118, ++"id": 16106, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtspeech-speechd", ++"name": "qt6-qtsensors-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22270 ++"set_id": 22258 + }, + "initial_release": { + "major_version": 9, +@@ -579826,18 +579215,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16119, ++"id": 16107, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtspeech-examples", ++"name": "qt6-qtsensors-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22271 ++"set_id": 22259 + }, + "initial_release": { + "major_version": 9, +@@ -579860,18 +579249,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16120, ++"id": 16108, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsvg", ++"name": "qt6-qtserialbus", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22272 ++"set_id": 22260 + }, + "initial_release": { + "major_version": 9, +@@ -579894,18 +579283,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16121, ++"id": 16109, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsvg-devel", ++"name": "qt6-qtserialbus-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22273 ++"set_id": 22261 + }, + "initial_release": { + "major_version": 9, +@@ -579928,18 +579317,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16122, ++"id": 16110, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtsvg-examples", ++"name": "qt6-qtserialbus-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22274 ++"set_id": 22262 + }, + "initial_release": { + "major_version": 9, +@@ -579962,18 +579351,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16123, ++"id": 16111, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qttranslations", ++"name": "qt6-qtserialport", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22275 ++"set_id": 22263 + }, + "initial_release": { + "major_version": 9, +@@ -579996,18 +579385,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16124, ++"id": 16112, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtvirtualkeyboard", ++"name": "qt6-qtserialport-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22276 ++"set_id": 22264 + }, + "initial_release": { + "major_version": 9, +@@ -580030,18 +579419,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16125, ++"id": 16113, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtvirtualkeyboard-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtserialport-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22277 ++"set_id": 22265 + }, + "initial_release": { + "major_version": 9, +@@ -580064,18 +579453,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16126, ++"id": 16114, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtvirtualkeyboard-examples", ++"name": "qt6-qtshadertools", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22278 ++"set_id": 22266 + }, + "initial_release": { + "major_version": 9, +@@ -580098,18 +579487,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16127, ++"id": 16115, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwayland", ++"name": "qt6-qtshadertools-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22279 ++"set_id": 22267 + }, + "initial_release": { + "major_version": 9, +@@ -580132,18 +579521,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16128, ++"id": 16116, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwayland-devel", ++"name": "qt6-qtspeech", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22280 ++"set_id": 22268 + }, + "initial_release": { + "major_version": 9, +@@ -580166,18 +579555,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16129, ++"id": 16117, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwayland-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtspeech-devel", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22281 ++"set_id": 22269 + }, + "initial_release": { + "major_version": 9, +@@ -580200,18 +579589,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16130, ++"id": 16118, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebchannel", ++"name": "qt6-qtspeech-speechd", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22282 ++"set_id": 22270 + }, + "initial_release": { + "major_version": 9, +@@ -580234,18 +579623,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16131, ++"id": 16119, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebchannel-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtspeech-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22283 ++"set_id": 22271 + }, + "initial_release": { + "major_version": 9, +@@ -580268,18 +579657,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16132, ++"id": 16120, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebchannel-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qtsvg", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22284 ++"set_id": 22272 + }, + "initial_release": { + "major_version": 9, +@@ -580302,18 +579691,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16133, ++"id": 16121, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebsockets", ++"name": "qt6-qtsvg-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22285 ++"set_id": 22273 + }, + "initial_release": { + "major_version": 9, +@@ -580336,18 +579725,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16134, ++"id": 16122, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebsockets-devel", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtsvg-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22286 ++"set_id": 22274 + }, + "initial_release": { + "major_version": 9, +@@ -580370,18 +579759,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16135, ++"id": 16123, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-qtwebsockets-examples", +-"repository": "rhel10-CRB" ++"name": "qt6-qttranslations", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22287 ++"set_id": 22275 + }, + "initial_release": { + "major_version": 9, +@@ -580404,18 +579793,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16136, ++"id": 16124, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-rpm-macros", ++"name": "qt6-qtvirtualkeyboard", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22288 ++"set_id": 22276 + }, + "initial_release": { + "major_version": 9, +@@ -580438,18 +579827,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16137, ++"id": 16125, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "qt6-srpm-macros", ++"name": "qt6-qtvirtualkeyboard-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22289 ++"set_id": 22277 + }, + "initial_release": { + "major_version": 9, +@@ -580472,18 +579861,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16138, ++"id": 16127, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "rest-devel", +-"repository": "rhel10-CRB" ++"name": "qt6-qtwayland", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22290 ++"set_id": 22279 + }, + "initial_release": { + "major_version": 9, +@@ -580506,18 +579895,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16139, ++"id": 16128, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "xdg-desktop-portal-devel", +-"repository": "rhel10-CRB" ++"name": "qt6-qtwayland-devel", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22291 ++"set_id": 22280 + }, + "initial_release": { + "major_version": 9, +@@ -580540,18 +579929,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16140, ++"id": 16129, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gnome-clocks", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtwayland-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22292 ++"set_id": 22281 + }, + "initial_release": { + "major_version": 9, +@@ -580574,18 +579963,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16141, ++"id": 16130, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gnome-desktop4", ++"name": "qt6-qtwebchannel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22293 ++"set_id": 22282 + }, + "initial_release": { + "major_version": 9, +@@ -580608,18 +579997,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16142, ++"id": 16131, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gnome-desktop4-devel", +-"repository": "rhel10-CRB" ++"name": "qt6-qtwebchannel-devel", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22294 ++"set_id": 22283 + }, + "initial_release": { + "major_version": 9, +@@ -580642,18 +580031,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16143, ++"id": 16132, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "gnome-calculator-devel", ++"name": "qt6-qtwebchannel-examples", + "repository": "rhel10-CRB" + } + ], +-"set_id": 22295 ++"set_id": 22284 + }, + "initial_release": { + "major_version": 9, +@@ -580676,18 +580065,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16144, ++"id": 16133, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "glycin-loaders", ++"name": "qt6-qtwebsockets", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22296 ++"set_id": 22285 + }, + "initial_release": { + "major_version": 9, +@@ -580710,18 +580099,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16145, ++"id": 16134, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "loupe", ++"name": "qt6-qtwebsockets-devel", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22297 ++"set_id": 22286 + }, + "initial_release": { + "major_version": 9, +@@ -580744,18 +580133,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16146, ++"id": 16135, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "snapshot", +-"repository": "rhel10-AppStream" ++"name": "qt6-qtwebsockets-examples", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22298 ++"set_id": 22287 + }, + "initial_release": { + "major_version": 9, +@@ -580778,18 +580167,18 @@ null + "s390x", + "x86_64" + ], +-"id": 16147, ++"id": 16136, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "vte291-gtk4", ++"name": "qt6-rpm-macros", + "repository": "rhel10-AppStream" + } + ], +-"set_id": 22299 ++"set_id": 22288 + }, + "initial_release": { + "major_version": 9, +@@ -580805,49 +580194,33 @@ null + } + }, + { +-"action": 6, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16148, ++"id": 16137, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "glib2-doc", +-"repository": "rhel9-AppStream" ++"name": "qt6-srpm-macros", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22300 ++"set_id": 22289 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [ +-{ +-"in_modulestream": null, +-"out_modulestream": null +-} +-], +-"out_packageset": { +-"package": [ +-{ +-"modulestreams": [ +-null +-], +-"name": "glib2-doc", +-"repository": "rhel10-CRB" +-} +-], +-"set_id": 22301 +-}, ++"modulestream_maps": [], ++"out_packageset": null, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -580855,25 +580228,25 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16149, ++"id": 16138, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "yelp", +-"repository": "rhel9-AppStream" ++"name": "rest-devel", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22302 ++"set_id": 22290 + }, + "initial_release": { + "major_version": 9, +@@ -580889,59 +580262,59 @@ null + } + }, + { +-"action": 2, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16150, ++"id": 16139, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "yelp", +-"repository": "rhel9-AppStream" ++"name": "xdg-desktop-portal-devel", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22303 ++"set_id": 22291 + }, + "initial_release": { + "major_version": 9, +-"minor_version": 4, ++"minor_version": 5, + "os_name": "RHEL" + }, + "modulestream_maps": [], + "out_packageset": null, + "release": { +-"major_version": 9, +-"minor_version": 5, ++"major_version": 10, ++"minor_version": 0, + "os_name": "RHEL" + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16151, ++"id": 16140, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "yelp-libs", +-"repository": "rhel9-AppStream" ++"name": "gnome-clocks", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22304 ++"set_id": 22292 + }, + "initial_release": { + "major_version": 9, +@@ -580957,59 +580330,59 @@ null + } + }, + { +-"action": 2, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16152, ++"id": 16141, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "yelp-libs", +-"repository": "rhel9-AppStream" ++"name": "gnome-desktop4", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22305 ++"set_id": 22293 + }, + "initial_release": { + "major_version": 9, +-"minor_version": 4, ++"minor_version": 5, + "os_name": "RHEL" + }, + "modulestream_maps": [], + "out_packageset": null, + "release": { +-"major_version": 9, +-"minor_version": 5, ++"major_version": 10, ++"minor_version": 0, + "os_name": "RHEL" + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16153, ++"id": 16142, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "yelp-devel", +-"repository": "rhel9-CRB" ++"name": "gnome-desktop4-devel", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22306 ++"set_id": 22294 + }, + "initial_release": { + "major_version": 9, +@@ -581025,22 +580398,25 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", + "x86_64" + ], +-"id": 16154, ++"id": 16143, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "mingw32-pcre", +-"repository": "rhel9-CRB" ++"name": "gnome-calculator-devel", ++"repository": "rhel10-CRB" + } + ], +-"set_id": 22307 ++"set_id": 22295 + }, + "initial_release": { + "major_version": 9, +@@ -581056,22 +580432,23 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ ++"ppc64le", + "x86_64" + ], +-"id": 16155, ++"id": 16144, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "mingw32-pcre-static", +-"repository": "rhel9-CRB" ++"name": "glycin-loaders", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22308 ++"set_id": 22296 + }, + "initial_release": { + "major_version": 9, +@@ -581087,22 +580464,25 @@ null + } + }, + { +-"action": 1, ++"action": 0, + "architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", + "x86_64" + ], +-"id": 16156, ++"id": 16147, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "mingw64-pcre", +-"repository": "rhel9-CRB" ++"name": "vte291-gtk4", ++"repository": "rhel10-AppStream" + } + ], +-"set_id": 22309 ++"set_id": 22299 + }, + "initial_release": { + "major_version": 9, +@@ -581118,30 +580498,49 @@ null + } + }, + { +-"action": 1, ++"action": 6, + "architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", + "x86_64" + ], +-"id": 16157, ++"id": 16148, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "mingw64-pcre-static", +-"repository": "rhel9-CRB" ++"name": "glib2-doc", ++"repository": "rhel9-AppStream" + } + ], +-"set_id": 22310 ++"set_id": 22300 + }, + "initial_release": { + "major_version": 9, + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glib2-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22301 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -581149,22 +580548,25 @@ null + } + }, + { +-"action": 0, ++"action": 1, + "architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", + "x86_64" + ], +-"id": 16158, ++"id": 16149, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "intel-lpmd", +-"repository": "rhel10-AppStream" ++"name": "yelp", ++"repository": "rhel9-AppStream" + } + ], +-"set_id": 22311 ++"set_id": 22302 + }, + "initial_release": { + "major_version": 9, +@@ -581180,36 +580582,36 @@ null + } + }, + { +-"action": 0, ++"action": 2, + "architectures": [ + "aarch64", + "ppc64le", + "s390x", + "x86_64" + ], +-"id": 16159, ++"id": 16150, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "ptyxis", +-"repository": "rhel10-AppStream" ++"name": "yelp", ++"repository": "rhel9-AppStream" + } + ], +-"set_id": 22312 ++"set_id": 22303 + }, + "initial_release": { + "major_version": 9, +-"minor_version": 5, ++"minor_version": 4, + "os_name": "RHEL" + }, + "modulestream_maps": [], + "out_packageset": null, + "release": { +-"major_version": 10, +-"minor_version": 0, ++"major_version": 9, ++"minor_version": 5, + "os_name": "RHEL" + } + }, +@@ -581221,18 +580623,275 @@ null + "s390x", + "x86_64" + ], +-"id": 16160, ++"id": 16151, + "in_packageset": { + "package": [ + { + "modulestreams": [ + null + ], +-"name": "mesa-libGLw", ++"name": "yelp-libs", + "repository": "rhel9-AppStream" + } + ], +-"set_id": 22313 ++"set_id": 22304 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16152, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yelp-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22305 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16153, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yelp-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22306 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16154, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mingw32-pcre", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22307 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16155, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mingw32-pcre-static", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22308 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16156, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mingw64-pcre", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22309 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16157, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mingw64-pcre-static", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22310 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"x86_64" ++], ++"id": 16158, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "intel-lpmd", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22311 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16160, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mesa-libGLw", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22313 + }, + "initial_release": { + "major_version": 9, +@@ -584641,7 +584300,7 @@ null + } + }, + { +-"action": 1, ++"action": 3, + "architectures": [ + "aarch64", + "ppc64le", +@@ -584666,8 +584325,24 @@ null + "minor_version": 5, + "os_name": "RHEL" + }, +-"modulestream_maps": [], +-"out_packageset": null, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ptyxis", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23160 ++}, + "release": { + "major_version": 10, + "minor_version": 0, +@@ -601333,6 +601008,25188 @@ null + "minor_version": 5, + "os_name": "RHEL" + } ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16750, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++{ ++"name": "postgresql", ++"stream": "16" ++} ++], ++"name": "pgvector", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22941 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16751, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl1000-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl100-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl105-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl135-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl2000-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl2030-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl5000-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl5150-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl6000-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl6000g2a-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl6000g2b-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl6050-firmware", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 22942 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwlwifi-dvm-firmware", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22943 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16752, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl3160-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl7260-firmware", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 22944 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwlwifi-mvm-firmware", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22945 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16753, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl3945-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "iwl4965-firmware", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 22946 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iwlegacy-firmware", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22947 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16754, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libertas-sd8686-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "libertas-sd8787-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "libertas-usb8388-firmware", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "libertas-usb8388-olpc-firmware", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 22948 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libertas-firmware", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22949 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 4, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16755, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "linux-firmware", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 22950 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "amd-gpu-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "amd-ucode-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "atheros-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "brcmfmac-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "cirrus-audio-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "dvb-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "intel-audio-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "intel-gpu-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "intel-vsc-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "linux-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "mlxsw_spectrum-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "mrvlprestera-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "mt7xxx-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "nvidia-gpu-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "nxpwireless-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "qcom-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "realtek-firmware", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "tiwilink-firmware", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 22951 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16756, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "redhat-cloud-client-configuration", ++"repository": "rhel7-base" ++} ++], ++"set_id": 22952 ++}, ++"initial_release": { ++"major_version": 7, ++"minor_version": 8, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 7, ++"minor_version": 9, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16757, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "redhat-cloud-client-configuration", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 22953 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16758, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "redhat-cloud-client-configuration", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22954 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16759, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "insights-client", ++"repository": "rhel7-base" ++} ++], ++"set_id": 22955 ++}, ++"initial_release": { ++"major_version": 7, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 7, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16760, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-lasso", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22956 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16761, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-lasso", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22957 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16762, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "lasso-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 22958 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16763, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "lasso", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22959 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 0, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 1, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16764, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "lasso", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22960 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16765, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "lasso", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22961 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16766, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22962 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16767, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22963 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16768, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22964 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16769, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22965 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16770, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-nautilus", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22966 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16771, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-nautilus", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22967 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16772, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-previewer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22968 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16773, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-previewer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22969 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16774, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-thumbnailer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22970 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16775, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "evince-thumbnailer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22971 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16776, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "valadoc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22972 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16777, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "vala-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22973 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16778, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "valadoc-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22974 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16779, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libical-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22975 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libical-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22976 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16780, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libical-glib-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 22977 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libical-glib-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22978 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16781, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairo-tools", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22979 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16782, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dbus-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22980 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16783, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "editorconfig", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22981 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16784, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "editorconfig-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22982 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16785, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "editorconfig-libs", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22983 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16786, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "enchant2-voikko", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22984 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16787, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcr3-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23184 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16788, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xrdb", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22986 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16789, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcr-libs", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22987 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16790, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-shell-extension-light-style", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22988 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16792, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtk3-immodules", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22990 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16793, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtk4-devel-docs", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22991 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16794, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtk4-devel-tools", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22992 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16795, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtksourceview5", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22993 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16796, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtksourceview5-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22994 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16797, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libadwaita-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22995 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16798, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libgweather-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22996 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16799, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libhandy-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 22997 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16800, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpanel", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22998 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16801, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 22999 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16802, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-gtk3", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23000 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16803, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-gtk4", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23001 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16804, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23002 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16805, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-devel-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23003 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16806, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-gtk3-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23004 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16807, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libportal-gtk4-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23005 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16808, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsoup3-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23006 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16809, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsysprof", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23007 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16810, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sysprof", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23008 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16811, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sysprof-agent", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23009 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16812, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sysprof-cli", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23010 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16813, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sysprof-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23011 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16814, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libxml2-static", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23012 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16815, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rsvg-pixbuf-loader", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23013 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16816, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "tecla", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23014 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16817, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "tecla-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23015 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16818, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "tracker-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23016 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16819, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "vte291-gtk4-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23017 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16820, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yelp-xsl-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23018 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16821, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "geocode-glib-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23019 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "geocode-glib-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23020 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16822, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libgweather-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23021 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libgweather-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23022 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16823, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm4.0", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23023 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16824, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm4.0-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23024 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16825, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm4.0-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23025 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16826, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++30", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23026 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16827, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++30-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23027 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16828, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++30-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23028 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16832, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mm-common", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23032 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16833, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mm-common-docs", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23033 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16840, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm24", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23426 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm2.68", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23427 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16841, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm24-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23429 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm2.68-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23430 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16842, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm24-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23431 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm2.68-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23432 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16843, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-session-xsession", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23046 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16844, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-session-xsession", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23047 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16845, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm30", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23433 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16846, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm30-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23435 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16847, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm30-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23436 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16848, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "brasero-nautilus", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23054 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16849, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "brasero-nautilus", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23055 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16850, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdex", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23056 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16851, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdex-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23057 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16852, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pycdlib", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23058 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16853, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pycdlib", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23059 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16854, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-jsonschema-specifications", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23060 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16855, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-core-mni", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23061 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16856, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-core-sat", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23062 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16857, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-dv", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23063 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16858, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-mni", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23064 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16859, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-sat", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23065 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16860, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-fonts-sat", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23066 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16861, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "langpacks-fonts-mni", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23067 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16862, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mythes-eo", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23068 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"x86_64" ++], ++"id": 16863, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mythes-eo", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23069 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16864, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "usbredir-tools", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23070 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16865, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "zhongyi-song-fonts", ++"repository": "rhel9-Supplementary" ++} ++], ++"set_id": 23071 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16866, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "zhongyi-song-fonts", ++"repository": "rhel9-Supplementary" ++} ++], ++"set_id": 23072 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16867, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ghostscript-tools-dvipdf", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23073 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ghostscript-tools-dvipdf", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23074 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16868, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23075 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16869, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-chroot", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23076 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16870, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23077 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16871, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-dnssec-utils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23078 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16872, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23079 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16873, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23080 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16874, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-utils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23081 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16875, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bind9.18-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23082 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16876, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yggdrasil-worker-package-manager", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23083 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16877, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "vdo", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23084 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16878, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "plotnetcfg", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23085 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16879, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-grc", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23086 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16880, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-fo", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23087 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"s390x" ++], ++"id": 16881, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gettext-runtime", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23088 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16882, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-tk", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23089 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16883, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-sa", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23090 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16884, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-mn", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23091 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16885, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-mi", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23092 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16886, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-ku", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23093 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16887, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-is", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23094 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16888, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-ia", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23095 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16889, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "hyphen-hsb", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23096 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16890, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-fonts-common", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23097 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-fonts-common", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23098 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16891, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sil-nuosu-fonts", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23099 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sil-nuosu-fonts", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23100 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16892, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdbusmenu-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23101 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16893, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdbusmenu-gtk3-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23102 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16894, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "kyotocabinet-libs", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23103 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16895, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-kufi-arabic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23104 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16896, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-naskh-arabic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23105 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16897, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-naskh-arabic-ui-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23106 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16898, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-nastaliq-urdu-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23107 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16899, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-balinese-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23108 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16900, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-bamum-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23109 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16901, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-batak-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23110 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16902, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-buginese-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23111 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-buginese-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23683 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16903, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-buhid-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23112 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-buhid-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23684 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16904, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-canadian-aboriginal-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23113 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16905, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-cham-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23114 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16906, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-cuneiform-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23115 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-cuneiform-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23685 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16907, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-cypriot-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23116 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-cypriot-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23686 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16908, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-gothic-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23117 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-gothic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23722 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16909, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-gurmukhi-ui-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23118 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-gurmukhi-ui-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23723 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16910, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-hanunoo-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23119 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16911, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-inscriptional-pahlavi-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23120 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16912, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-inscriptional-parthian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23121 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16913, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-javanese-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23122 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16914, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lepcha-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23123 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16915, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-limbu-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23124 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16916, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-linear-b-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23125 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-linear-b-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23727 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16917, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lisu-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23126 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16918, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-mandaic-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23127 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-mandaic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23728 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16919, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-meetei-mayek-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23128 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16920, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-mongolian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23129 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16921, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-myanmar-ui-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23130 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-myanmar-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23756 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16922, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-new-tai-lue-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23131 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16923, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-ogham-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23132 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-ogham-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23759 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16924, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-ol-chiki-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23133 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16925, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-old-italic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23134 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16926, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-old-persian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23135 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16927, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-oriya-ui-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23136 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-oriya-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23760 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16928, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-rejang-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23137 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16929, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-runic-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23138 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-runic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23762 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16930, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-samaritan-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23139 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16931, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-saurashtra-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23140 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16932, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-sundanese-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23141 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16933, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-syloti-nagri-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23142 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16934, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-syriac-eastern-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23143 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16935, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-syriac-western-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23144 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16936, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tagalog-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23145 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16937, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tagbanwa-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23146 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tagbanwa-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23787 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16938, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tai-le-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23147 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16939, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tai-tham-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23148 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16940, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tai-viet-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23149 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16941, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tifinagh-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23150 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16942, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-yi-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23151 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-yi-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23818 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16943, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-bengali-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23152 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16944, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-devanagari-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23153 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16945, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-gujarati-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23154 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16946, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-kannada-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23155 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16947, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-malayalam-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23156 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16948, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-tamil-slanted-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23157 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-tamil-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23823 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16949, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-telugu-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23158 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16950, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "eog", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23162 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16951, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cheese", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23166 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16952, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gedit", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23168 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16953, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++{ ++"name": "redis", ++"stream": "7" ++}, ++null ++], ++"name": "redis-doc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23169 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16954, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libblockdev-smart", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23170 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16955, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libblockdev-smartmontools", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23171 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16956, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "authselect-compat", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23172 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16957, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "authselect-compat", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23173 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16958, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pam_ssh_agent_auth", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23174 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16959, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pam_ssh_agent_auth", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23175 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16960, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openssl-pkcs11", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23176 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pkcs11-provider", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23560 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16961, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ht-caladea-fonts", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23177 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-crosextra-caladea-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23178 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16964, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcr3", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23182 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16965, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcr3-base", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23183 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 4, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16966, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libkcapi-hmaccalc", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23185 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libkcapi-hasher", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "libkcapi-hmaccalc", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23186 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16967, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libproxy-gnome", ++"repository": "rhel9-AppStream" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "libproxy-webkitgtk4", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23187 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libproxy", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23188 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16968, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-libproxy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23189 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16969, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-libproxy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23190 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16970, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpmemobj++-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23191 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16971, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpmemobj++-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23192 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16972, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpmemobj++-doc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23193 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16973, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpmemobj++-doc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23194 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 16974, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pmdk-convert", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23195 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"x86_64" ++], ++"id": 16975, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pmdk-convert", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23196 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16976, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "iniparser", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23197 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16977, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cxl-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23198 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cxl-libs", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23199 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16978, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "liburing", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23200 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "liburing", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23201 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16979, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "nvme-stas", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23202 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16980, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "nvme-stas", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23203 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 16981, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "compat-sap-c++-13", ++"repository": "rhel9-SAP-Solutions" ++} ++], ++"set_id": 23204 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 4, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16984, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mysql-test", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23208 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mysql-test", ++"repository": "rhel10-CRB" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "mysql-test-data", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23209 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16985, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "erofs-fuse", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23210 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16986, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "erofs-utils", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23211 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16987, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcr-base", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23213 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16988, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-desktop3-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23214 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-desktop3-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23215 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"x86_64" ++], ++"id": 16989, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fwupd-efi", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23216 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"x86_64" ++], ++"id": 16990, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnu-efi-compat", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23217 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"x86_64" ++], ++"id": 16991, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rust-std-static-x86_64-unknown-none", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23218 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16992, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-netifaces", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23219 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16993, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-netifaces", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23220 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16994, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "udev-hid-bpf", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23221 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16995, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "udev-hid-bpf-stable", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23222 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16996, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "opentelemetry-collector", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23223 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16997, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest-SHA1", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23224 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16998, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest-SHA1", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23225 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 16999, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rpmlint", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23226 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17000, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rpmlint", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23227 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17001, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "alsa-ucm-utils", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23228 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17002, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cockpit-ha-cluster", ++"repository": "rhel10-HighAvailability" ++} ++], ++"set_id": 23229 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17007, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23244 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17008, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23246 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17009, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23247 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17010, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23248 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17013, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23245 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17014, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "xxhash-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23249 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17015, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ucs-miscfixed-fonts", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23250 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17016, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ucs-miscfixed-fonts", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23251 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"s390x" ++], ++"id": 17017, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gettext-envsubst", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23252 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17018, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mtx", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23253 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17020, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pam-docs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23255 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pam-doc", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23256 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17021, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pam-libs", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23257 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"ppc64le", ++"x86_64" ++], ++"id": 17022, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sap-hana-ha", ++"repository": "rhel10-SAP-Solutions" ++} ++], ++"set_id": 23258 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17023, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-cxx", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23259 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17024, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-cxx-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23260 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17025, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23261 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17026, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23262 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17027, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-devel-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23263 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17028, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-sql", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23264 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17029, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-sql-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23265 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17030, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-utils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23266 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17031, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libdb-utils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23267 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17032, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++{ ++"name": "postgresql", ++"stream": "16" ++} ++], ++"name": "pgvector", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23268 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": { ++"name": "postgresql", ++"stream": "16" ++}, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pgvector", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23269 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17033, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpq", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23270 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libpq", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23271 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"s390x" ++], ++"id": 17034, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "qclib-static", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23272 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17035, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "acpica-tools", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23273 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "acpica-tools", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23274 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17036, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libnsl2", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23275 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17037, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libnsl2", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23276 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17038, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "flexiblas-openblas-serial", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23277 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17039, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-Cython", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23278 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-cython", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23279 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17040, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "emacs-cython-mode", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23280 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17041, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23281 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17042, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-debug", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23282 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17043, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-idle", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23283 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17044, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-test", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23284 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17045, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23285 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"x86_64" ++], ++"id": 17046, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23286 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17047, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23287 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"x86_64" ++], ++"id": 17048, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23288 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17049, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-tkinter", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23289 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"x86_64" ++], ++"id": 17050, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-tkinter", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23290 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17051, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-attrs", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23291 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17052, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libstemmer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23292 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17053, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libstemmer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23293 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17054, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libstemmer-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23294 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17055, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-cffi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23295 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17056, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-cffi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23296 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17057, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-charset-normalizer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23297 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17058, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-charset-normalizer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23298 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17059, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-cryptography", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23299 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17060, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-cryptography", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23300 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17061, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-Cython", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23301 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17062, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-idna", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23302 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17063, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-idna", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23303 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17064, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-iniconfig", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23304 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17065, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-lxml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23305 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17066, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-lxml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23306 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17067, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-mod_wsgi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23307 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17068, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-mod_wsgi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23308 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17069, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-numpy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23309 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17070, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-numpy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23310 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17071, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-numpy-f2py", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23311 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17072, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-numpy-f2py", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23312 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17073, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-packaging", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23313 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17074, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pip", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23314 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17075, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pip", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23315 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17076, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pip-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23316 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17077, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pip-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23317 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17078, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pluggy", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23318 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17079, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-ply", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23319 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17080, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-ply", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23320 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17081, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-psycopg2", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23321 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17082, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-psycopg2", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23322 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17083, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-psycopg2-debug", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23323 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17084, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-psycopg2-tests", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23324 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17085, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pybind11-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23325 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17086, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pybind11", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23326 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17087, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pycparser", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23327 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17088, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pycparser", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23328 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17089, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-PyMySQL+rsa", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23329 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17090, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-PyMySQL+rsa", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23330 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17091, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-PyMySQL", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23331 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17092, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-PyMySQL", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23332 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17093, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pyparsing", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23333 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17094, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pysocks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23334 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17095, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pysocks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23335 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17096, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pytest", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23336 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17097, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23337 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17098, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23338 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17099, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests+security", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23339 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17100, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests+security", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23340 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17101, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests+socks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23341 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17102, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-requests+socks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23342 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17103, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-scipy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23343 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17104, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-scipy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23344 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17105, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-semantic_version", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23345 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17106, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-setuptools", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23346 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17107, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-setuptools", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23347 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17108, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-setuptools-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23348 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17109, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-setuptools-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23349 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17110, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23350 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17111, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23351 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"x86_64" ++], ++"id": 17112, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-tkinter", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23352 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17113, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pyyaml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23353 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17114, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-pyyaml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23354 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17115, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-setuptools-rust", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23355 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17116, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-six", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23356 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17117, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-six", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23357 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17118, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-urllib3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23358 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17119, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-urllib3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23359 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17120, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23360 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17121, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23361 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17122, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.11-wheel-wheel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23362 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17123, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23363 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23364 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17124, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-debug", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23365 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-debug", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23366 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17125, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23367 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-devel", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23368 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17126, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-idle", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23369 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-idle", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23370 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17127, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23371 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-libs", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23372 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17128, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-test", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23373 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-test", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23374 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17129, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-tkinter", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23375 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-tkinter", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23376 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17130, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-cffi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23377 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-cffi", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23378 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17131, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-charset-normalizer", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23379 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-charset-normalizer", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23380 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17132, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-cryptography", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23381 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-cryptography", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23382 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17133, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ansible-collection-microsoft-sql", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23383 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17134, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnutls-fips", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23384 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17135, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "liboqs-devel", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23385 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17136, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++{ ++"name": "postgresql", ++"stream": "15" ++}, ++{ ++"name": "postgresql", ++"stream": "16" ++} ++], ++"name": "postgresql-test-rpm-macros", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23392 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17138, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "atkmm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23395 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17139, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "atkmm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23396 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17140, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "atkmm-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23397 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17141, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "atkmm-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23398 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17142, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23420 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm1.16", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23421 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17143, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23400 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17144, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23422 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm1.16-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23423 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17145, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23424 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cairomm1.16-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23425 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17146, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++20", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23403 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17147, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++20", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23404 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17148, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++20-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23405 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17149, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libsigc++20-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23406 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17150, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23411 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm2.48", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23412 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17151, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23413 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17152, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23416 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm2.48-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23417 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 3, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17153, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23418 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pangomm2.48-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23419 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17154, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "glibmm24", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23428 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17155, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gtkmm30", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23434 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17158, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "harfbuzz-cairo", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23439 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17159, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sssd-polkit-rules", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23440 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17160, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "insights-client-ros", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23441 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17161, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-Cython", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23442 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-cython", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23443 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17162, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-flit-core", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23444 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-flit-core", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23445 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17163, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-idna", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23446 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-idna", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23447 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17164, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-iniconfig", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23448 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-iniconfig", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23449 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17165, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-lxml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23450 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-lxml", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23451 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17166, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-mod_wsgi", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23452 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-mod_wsgi", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23453 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17167, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-numpy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23454 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-numpy", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23455 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17168, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-numpy-f2py", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23456 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-numpy-f2py", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23457 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17169, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-packaging", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23458 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-packaging", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23459 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17170, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pip", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23460 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pip", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23461 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17171, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pip-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23462 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pip-wheel", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23463 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17172, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pluggy", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23464 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pluggy", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23465 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17173, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-ply", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23466 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-ply", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23467 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17174, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-psycopg2", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23468 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-psycopg2", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23469 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17175, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-psycopg2-debug", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23470 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17176, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-psycopg2-tests", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23471 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17177, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pybind11", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23472 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pybind11", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23473 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17178, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pybind11-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23474 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "pybind11-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23475 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17179, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pycparser", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23476 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pycparser", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23477 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17180, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-PyMySQL", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23478 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-PyMySQL", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23479 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17181, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-PyMySQL+rsa", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23480 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17182, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-PyMySQL+rsa", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23481 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17183, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pytest", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23482 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pytest", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23483 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17184, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-pyyaml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23484 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pyyaml", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23485 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17185, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-requests", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23486 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-requests", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23487 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17186, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-scipy-tests", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23488 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17187, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-scipy", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23489 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-scipy", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23490 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17188, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-semantic_version", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23491 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17189, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-setuptools", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23492 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-setuptools", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23493 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17190, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-setuptools-wheel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23494 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-setuptools-wheel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23495 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17191, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-setuptools-rust", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23496 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"x86_64" ++], ++"id": 17192, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-tkinter", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23497 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-tkinter", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23498 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17193, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-urllib3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23499 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-urllib3", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23500 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17194, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-wheel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23501 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-wheel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23502 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17195, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3.12-wheel-wheel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23503 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-wheel-wheel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23504 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17196, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-chardet", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23505 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17197, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-chardet", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23506 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17198, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-py", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23507 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17199, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-py", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23508 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17200, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pysocks", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23509 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17201, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pysocks", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23510 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17202, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pytz", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23511 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17203, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pytz", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23512 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17204, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-readthedocs-sphinx-ext", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23513 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17205, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-requests+security", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23514 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17206, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-requests+security", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23515 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17207, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-requests+socks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23516 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17208, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-requests+socks", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23517 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17209, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-applehelp", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23518 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17210, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-devhelp", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23519 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17211, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-htmlhelp", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23520 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17212, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-httpdomain", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23521 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17213, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-jsmath", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23522 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17214, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-qthelp", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23523 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17215, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-serializinghtml", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23524 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17216, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-websupport", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23525 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17217, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-toml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23526 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17218, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-toml", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23527 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17219, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-tomli", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23528 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17220, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-tomli", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23529 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17221, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python-packaging-doc", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23530 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17222, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "babel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23531 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "babel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23532 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17223, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mpdecimal", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23533 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "mpdecimal", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23534 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17224, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-babel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23535 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-babel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23536 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17225, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "micropipenv+toml", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23537 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17226, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-hatchling", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23538 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17227, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-jinja2+i18n", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23539 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17228, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-installer", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23540 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17229, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pathspec", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23541 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17230, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-pyproject-hooks", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23542 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17231, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-sphinxcontrib-jquery", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23543 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17232, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-testpath", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23544 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17233, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python-testpath-doc", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23545 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17234, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-trove-classifiers", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23546 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17235, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "jq", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23547 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 3, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "jq", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23548 ++}, ++"release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17236, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-dnf-plugin-pre-transaction-actions", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23549 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17237, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ha-openstack-support", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23550 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17238, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "ha-openstack-support", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23551 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17239, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "firefox", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23552 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17240, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "firefox", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23553 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17241, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "firefox-x11", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23554 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17242, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "firefox-x11", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23555 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17243, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "thunderbird", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23556 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17244, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "thunderbird", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23557 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17245, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rhc", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23561 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 3, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 4, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17246, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rhc-worker-playbook", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23562 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 3, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 4, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17247, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-cloud-what", ++"repository": "rhel8-BaseOS" ++} ++], ++"set_id": 23563 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17248, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rhc-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23564 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 0, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 1, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17249, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sequoia-sqv", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23565 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17250, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "sequoia-sq", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23566 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17251, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "teamd", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23567 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17252, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "teamd", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23568 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17253, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "avahi-gobject", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23569 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17254, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "avahi-gobject-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23570 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17255, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libev-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23571 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17256, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "avahi-autoipd", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23572 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17257, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libbabeltrace", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23573 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libbabeltrace", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23574 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17258, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-shell-extension-top-icons", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23575 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-shell-extension-status-icons", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23576 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17259, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rhc-worker-playbook", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23577 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17260, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "python3-ifaddr", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23578 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17261, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openscap-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23579 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17262, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openscap-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23580 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17263, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openscap-engine-sce-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23581 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17264, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openscap-python3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23582 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17265, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openscap-python3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23583 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17266, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openldap-servers", ++"repository": "rhel8-CRB" ++} ++], ++"set_id": 23584 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17267, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "aspnetcore-runtime-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23586 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17268, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "aspnetcore-runtime-dbg-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23587 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17269, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "aspnetcore-targeting-pack-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23588 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17270, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23589 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17271, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-apphost-pack-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23590 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17272, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-host", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23591 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17273, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-hostfxr-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23592 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17274, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-runtime-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23593 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17275, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-runtime-dbg-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23594 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17276, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-sdk-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23595 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17277, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-sdk-9.0-source-built-artifacts", ++"repository": "rhel8-CRB" ++} ++], ++"set_id": 23596 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17278, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-sdk-aot-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23597 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17279, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-sdk-dbg-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23598 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17280, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-targeting-pack-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23599 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17281, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dotnet-templates-9.0", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23600 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17282, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "netstandard-targeting-pack-2.1", ++"repository": "rhel8-AppStream" ++} ++], ++"set_id": 23601 ++}, ++"initial_release": { ++"major_version": 8, ++"minor_version": 9, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 8, ++"minor_version": 10, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17283, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "rust-std-static-wasm32-wasip1", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23602 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17284, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dlm", ++"repository": "rhel9-ResilientStorage" ++} ++], ++"set_id": 23603 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17285, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "dlm-lib", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23604 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17286, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "firefox", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23605 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 4, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17287, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openssh", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23606 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "openssh", ++"repository": "rhel10-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "openssh-keysign", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23607 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17288, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "postgresql-test-rpm-macros", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23608 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17289, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gnome-shell-extension-no-overview", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23609 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17290, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "opencryptoki-ccatok", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23610 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17291, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "opencryptoki-ccatok", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23612 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17292, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yajl", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23613 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17293, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yajl", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23614 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17294, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23615 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17295, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-runtime", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23616 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17296, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-annobin-annocheck", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23618 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17297, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-annobin-docs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23619 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17298, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-annobin-plugin-gcc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23620 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17299, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-binutils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23621 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17300, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-binutils-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23622 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17301, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-binutils-gold", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23623 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17302, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-binutils-gprofng", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23624 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17303, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-dwz", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23625 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17304, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-gcc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23626 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17305, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-gcc-c++", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23627 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17306, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-gcc-gfortran", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23628 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17307, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-gcc-plugin-annobin", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23629 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17308, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-gcc-plugin-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23630 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17309, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libasan-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23631 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17310, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libatomic-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23632 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17311, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libgccjit", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23633 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17312, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libgccjit-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23634 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17313, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libitm-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23635 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17314, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-liblsan-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23636 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17315, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libquadmath-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23637 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17316, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libstdc++-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23638 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17317, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libstdc++-docs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23639 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17318, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libtsan-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23640 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17319, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-libubsan-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23641 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17320, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "gcc-toolset-14-offload-nvptx", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23642 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17321, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-avestan-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23657 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-avestan-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23658 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17322, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-bengali-ui-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23659 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-bengali-ui-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23660 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17323, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-carian-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23669 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-carian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23670 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17324, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-deseret-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23675 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-deseret-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23676 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17325, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-devanagari-ui-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23677 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-devanagari-ui-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23678 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17326, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-display-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23679 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23680 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17327, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-egyptian-hieroglyphs-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23681 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-egyptian-hieroglyphs-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23682 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17328, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-imperial-aramaic-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23695 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-imperial-aramaic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23696 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17329, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-khmer-ui-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23697 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-khmer-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23698 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17330, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lycian-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23705 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lycian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23706 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17331, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lydian-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23707 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-lydian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23708 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17332, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-osmanya-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23748 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-osmanya-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23749 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17333, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-shavian-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23763 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-shavian-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23764 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17334, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tamil-supplement-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23773 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-tamil-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23774 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17335, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-thai-ui-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23777 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-thai-vf-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23778 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17336, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-ugaritic-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23779 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-ugaritic-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23780 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17337, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-vai-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23781 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-vai-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23782 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 7, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17338, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-display-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23803 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-serif-fonts", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23804 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17339, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "google-noto-sans-phoenician-vf-fonts", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23826 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17340, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-client", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23827 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17341, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-client", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23828 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17342, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-common", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23829 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17343, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-common", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23830 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17344, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-console", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23831 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17345, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-console", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23832 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17346, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-director", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23833 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17347, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-director", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23834 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17348, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23835 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17349, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23836 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17350, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-libs-sql", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23837 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17351, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-libs-sql", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23838 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17352, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-logwatch", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23839 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17353, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-logwatch", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23840 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17354, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-storage", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23841 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17355, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "bacula-storage", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23842 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17356, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libcdio-paranoia", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23843 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17357, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libcdio-paranoia", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23844 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17358, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libcdio-paranoia-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23845 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 2, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17359, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "libcdio-paranoia-devel", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23846 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17360, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23847 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-libs", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23848 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17361, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-AutoLoader", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23849 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-AutoLoader", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23850 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17362, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-B", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23851 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-B", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23852 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17363, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Carp", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23853 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Carp", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23854 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17364, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Class-Struct", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23855 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Class-Struct", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23856 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17365, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Data-Dumper", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23857 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Data-Dumper", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23858 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17366, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23859 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23860 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17367, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest-MD5", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23861 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Digest-MD5", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23862 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17368, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-DynaLoader", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23863 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-DynaLoader", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23864 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17369, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Encode", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23865 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Encode", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23866 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17370, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Errno", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23867 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Errno", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23868 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17371, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Exporter", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23869 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Exporter", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23870 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17372, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Fcntl", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23871 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Fcntl", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23872 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17373, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Basename", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23873 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Basename", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23874 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17374, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Path", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23875 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Path", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23876 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17375, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Temp", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23877 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-Temp", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23878 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17376, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-stat", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23879 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-File-stat", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23880 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17377, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-FileHandle", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23881 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-FileHandle", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23882 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17378, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Getopt-Long", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23883 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Getopt-Long", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23884 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17379, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Getopt-Std", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23885 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Getopt-Std", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23886 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17380, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-HTTP-Tiny", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23887 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-HTTP-Tiny", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23888 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17381, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23889 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23890 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17382, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO-Socket-IP", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23891 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO-Socket-IP", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23892 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17383, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO-Socket-SSL", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23893 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IO-Socket-SSL", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23894 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17384, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IPC-Open3", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23895 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-IPC-Open3", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23896 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17385, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-MIME-Base64", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23897 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-MIME-Base64", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23898 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17386, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Mozilla-CA", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23899 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Mozilla-CA", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23900 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17387, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Net-SSLeay", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23901 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Net-SSLeay", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23902 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17388, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-POSIX", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23903 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-POSIX", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23904 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17389, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-PathTools", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23905 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-PathTools", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23906 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17390, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Escapes", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23907 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Escapes", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23908 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17391, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Perldoc", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23909 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Perldoc", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23910 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17392, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Simple", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23911 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Simple", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23912 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17393, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Usage", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23913 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Pod-Usage", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23914 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17394, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Scalar-List-Utils", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23915 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Scalar-List-Utils", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23916 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17395, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-SelectSaver", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23917 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-SelectSaver", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23918 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17396, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Socket", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23919 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Socket", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23920 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17397, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Storable", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23921 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Storable", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23922 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17398, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Symbol", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23923 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Symbol", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23924 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17399, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Term-ANSIColor", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23925 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Term-ANSIColor", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23926 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17400, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Term-Cap", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23927 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Term-Cap", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23928 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17401, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Text-ParseWords", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23929 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Text-ParseWords", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23930 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17402, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Text-Tabs+Wrap", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23931 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Text-Tabs+Wrap", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23932 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17403, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Time-Local", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23933 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-Time-Local", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23934 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17404, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-URI", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23935 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-URI", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23936 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17405, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-base", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23937 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-base", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23938 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17406, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-constant", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23939 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-constant", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23940 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17407, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-if", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23941 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-if", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23942 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17408, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-interpreter", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23943 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-interpreter", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23944 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17409, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-libnet", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23945 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-libnet", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23946 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17410, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-locale", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23947 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-locale", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23948 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17411, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-mro", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23949 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-mro", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23950 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17412, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-overload", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23951 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-overload", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23952 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17413, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-overloading", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23953 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-overloading", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23954 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17414, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-parent", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23955 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-parent", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23956 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17415, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-podlators", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23957 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-podlators", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23958 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 6, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17416, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-vars", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23959 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "perl-vars", ++"repository": "rhel10-BaseOS" ++} ++], ++"set_id": 23960 ++}, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17417, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "yara", ++"repository": "rhel10-AppStream" ++} ++], ++"set_id": 23961 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 1, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17418, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "doxygen-doxywizard", ++"repository": "rhel9-CRB" ++} ++], ++"set_id": 23963 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17420, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "zlib-ng", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23967 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17421, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "zlib-ng-devel", ++"repository": "rhel10-CRB" ++} ++], ++"set_id": 23968 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 10, ++"minor_version": 0, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17422, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-devel", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23969 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17423, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-libs", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23970 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17424, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-libs-double", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23971 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17425, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-libs-long", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23972 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17426, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-libs-single", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23973 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"x86_64" ++], ++"id": 17427, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "fftw-openmpi-static", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23974 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 5, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17428, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cockpit-bridge", ++"repository": "rhel9-BaseOS" ++}, ++{ ++"modulestreams": [ ++null ++], ++"name": "cockpit-pcp", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23975 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [ ++{ ++"in_modulestream": null, ++"out_modulestream": null ++} ++], ++"out_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "cockpit-bridge", ++"repository": "rhel9-BaseOS" ++} ++], ++"set_id": 23976 ++}, ++"release": { ++"major_version": 9, ++"minor_version": 6, ++"os_name": "RHEL" ++} ++}, ++{ ++"action": 0, ++"architectures": [ ++"aarch64", ++"ppc64le", ++"s390x", ++"x86_64" ++], ++"id": 17429, ++"in_packageset": { ++"package": [ ++{ ++"modulestreams": [ ++null ++], ++"name": "samba-gpupdate", ++"repository": "rhel9-AppStream" ++} ++], ++"set_id": 23977 ++}, ++"initial_release": { ++"major_version": 9, ++"minor_version": 4, ++"os_name": "RHEL" ++}, ++"modulestream_maps": [], ++"out_packageset": null, ++"release": { ++"major_version": 9, ++"minor_version": 5, ++"os_name": "RHEL" ++} + } + ] + } +diff --git a/etc/leapp/files/repomap.json b/etc/leapp/files/repomap.json +index d612f554..178225c6 100644 +--- a/etc/leapp/files/repomap.json ++++ b/etc/leapp/files/repomap.json +@@ -1,6 +1,11 @@ + { + "datetime": "202405281033Z", + "version_format": "1.2.1", ++ "provided_data_streams": [ ++ "3.0", ++ "3.1", ++ "3.2" ++ ], + "mapping": [ + { + "source_major_version": "7", +@@ -4469,8 +4474,5 @@ + } + ] + } +- ], +- "provided_data_streams": [ +- "3.1" + ] + } +-- +2.47.0 + diff --git a/SOURCES/0031-Packaging-Require-leapp-framework-6.x-update-leapp-d.patch b/SOURCES/0031-Packaging-Require-leapp-framework-6.x-update-leapp-d.patch new file mode 100644 index 0000000..e910489 --- /dev/null +++ b/SOURCES/0031-Packaging-Require-leapp-framework-6.x-update-leapp-d.patch @@ -0,0 +1,56 @@ +From 89afbe8cb41f874f32acddc1e1696132f3531677 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Fri, 8 Nov 2024 17:40:01 +0100 +Subject: [PATCH 31/40] Packaging: Require leapp-framework 6.x + update leapp + deps + +The leapp actors configuration feature is present since +leapp-framework 6.0. Update the dependencies to ensure the correct +version of the framework is installed on the system. + +Also, leapp requirements have been updated - requiring python3-PyYAML +as it requires YAML parser, bumping leapp-framework-dependencies to 6. +Address the change in leapp-deps metapackage to satisfy leapp +dependencies during the upgrade process. +--- + packaging/leapp-repository.spec | 2 +- + packaging/other_specs/leapp-el7toel8-deps.spec | 3 ++- + 2 files changed, 3 insertions(+), 2 deletions(-) + +diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec +index 0d63ba02..570d0df2 100644 +--- a/packaging/leapp-repository.spec ++++ b/packaging/leapp-repository.spec +@@ -120,7 +120,7 @@ Requires: leapp-repository-dependencies = %{leapp_repo_deps} + + # IMPORTANT: this is capability provided by the leapp framework rpm. + # Check that 'version' instead of the real framework rpm version. +-Requires: leapp-framework >= 5.0, leapp-framework < 6 ++Requires: leapp-framework >= 6.0, leapp-framework < 7 + + # Since we provide sub-commands for the leapp utility, we expect the leapp + # tool to be installed as well. +diff --git a/packaging/other_specs/leapp-el7toel8-deps.spec b/packaging/other_specs/leapp-el7toel8-deps.spec +index d9e94faa..2c662a37 100644 +--- a/packaging/other_specs/leapp-el7toel8-deps.spec ++++ b/packaging/other_specs/leapp-el7toel8-deps.spec +@@ -14,7 +14,7 @@ + + + %define leapp_repo_deps 10 +-%define leapp_framework_deps 5 ++%define leapp_framework_deps 6 + + # NOTE: the Version contains the %{rhel} macro just for the convenience to + # have always upgrade path between newer and older deps packages. So for +@@ -112,6 +112,7 @@ Requires: python3 + Requires: python3-six + Requires: python3-setuptools + Requires: python3-requests ++Requires: python3-PyYAML + + + %description -n %{ldname} +-- +2.47.0 + diff --git a/SOURCES/0032-spec-create-etc-leapp-actor_conf.d.patch b/SOURCES/0032-spec-create-etc-leapp-actor_conf.d.patch new file mode 100644 index 0000000..d1a271f --- /dev/null +++ b/SOURCES/0032-spec-create-etc-leapp-actor_conf.d.patch @@ -0,0 +1,48 @@ +From 36b93e4a2504f72e5a371a75a23e7cd2c695b84b Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Sun, 6 Oct 2024 21:01:13 +0200 +Subject: [PATCH 32/40] spec: create /etc/leapp/actor_conf.d + +Add additional build steps to the specfile that create the actor +configuration directory. The directory is owned by the package, so +it gets removed when the user uninstalls leapp. + +Also prepared some comment lines for future when we will want to +include some configuration files as part of the rpm. +--- + etc/leapp/actor_conf.d/.gitkeep | 0 + packaging/leapp-repository.spec | 7 +++++++ + 2 files changed, 7 insertions(+) + create mode 100644 etc/leapp/actor_conf.d/.gitkeep + +diff --git a/etc/leapp/actor_conf.d/.gitkeep b/etc/leapp/actor_conf.d/.gitkeep +new file mode 100644 +index 00000000..e69de29b +diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec +index 570d0df2..828355bf 100644 +--- a/packaging/leapp-repository.spec ++++ b/packaging/leapp-repository.spec +@@ -250,6 +250,11 @@ install -m 0755 -d %{buildroot}%{_sysconfdir}/leapp/files/ + install -m 0644 etc/leapp/transaction/* %{buildroot}%{_sysconfdir}/leapp/transaction + install -m 0644 etc/leapp/files/* %{buildroot}%{_sysconfdir}/leapp/files + ++# Actor configuration dir ++install -m 0755 -d %{buildroot}%{_sysconfdir}/leapp/actor_conf.d/ ++# uncomment to install existing configs ++#install -m 0644 etc/leapp/actor_conf.d/* %%{buildroot}%%{_sysconfdir}/leapp/actor_conf.d ++ + # install CLI commands for the leapp utility on the expected path + install -m 0755 -d %{buildroot}%{leapp_python_sitelib}/leapp/cli/ + cp -r commands %{buildroot}%{leapp_python_sitelib}/leapp/cli/ +@@ -295,6 +300,8 @@ done; + %dir %{custom_repositorydir} + %dir %{leapp_python_sitelib}/leapp/cli/commands + %config %{_sysconfdir}/leapp/files/* ++# uncomment to package installed configs ++#%%config %%{_sysconfdir}/leapp/actor_conf.d/* + %{_sysconfdir}/leapp/repos.d/* + %{_sysconfdir}/leapp/transaction/* + %{repositorydir}/* +-- +2.47.0 + diff --git a/SOURCES/0033-spec-drop-.gitkeep-files-from-the-RPM.patch b/SOURCES/0033-spec-drop-.gitkeep-files-from-the-RPM.patch new file mode 100644 index 0000000..42995b6 --- /dev/null +++ b/SOURCES/0033-spec-drop-.gitkeep-files-from-the-RPM.patch @@ -0,0 +1,31 @@ +From 87db66c863104fea824a4406732cbe233ffee412 Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Wed, 13 Nov 2024 15:05:50 +0100 +Subject: [PATCH 33/40] spec: drop .gitkeep files from the RPM + +We have several .gitkeep files in the repo as we want to have some +directories present in git however these directories are empty +otherwise. This is common hack to achieve this, but we do not want +to have these files really in the resulting RPMs. So we just remove +them. +--- + packaging/leapp-repository.spec | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec +index 828355bf..2bb52505 100644 +--- a/packaging/leapp-repository.spec ++++ b/packaging/leapp-repository.spec +@@ -272,6 +272,9 @@ rm -rf %{buildroot}%{repositorydir}/common/actors/testactor + find %{buildroot}%{repositorydir}/common -name "test.py" -delete + rm -rf `find %{buildroot}%{repositorydir} -name "tests" -type d` + find %{buildroot}%{repositorydir} -name "Makefile" -delete ++# .gitkeep file is used to have a directory in the repo. but we do not want these ++# files in the resulting RPM ++find %{buildroot} -name .gitkeep -delete + + for DIRECTORY in $(find %{buildroot}%{repositorydir}/ -mindepth 1 -maxdepth 1 -type d); + do +-- +2.47.0 + diff --git a/SOURCES/0034-cli-load-actor-configuration.patch b/SOURCES/0034-cli-load-actor-configuration.patch new file mode 100644 index 0000000..927b99c --- /dev/null +++ b/SOURCES/0034-cli-load-actor-configuration.patch @@ -0,0 +1,95 @@ +From 140a0bbb689814041fa6a03ee2b703e70a20f2f2 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Sun, 10 Nov 2024 13:54:20 +0100 +Subject: [PATCH 34/40] cli: load actor configuration + +Load actor configuration when running `leapp upgrade` or `leapp +preupgrade`. The configuration is loaded, saved to leapp's DB, +and remains available to all actors via framework's global variable. +--- + commands/command_utils.py | 32 +++++++++++++++++++++++++++++++- + commands/preupgrade/__init__.py | 3 +++ + commands/upgrade/__init__.py | 3 +++ + 3 files changed, 37 insertions(+), 1 deletion(-) + +diff --git a/commands/command_utils.py b/commands/command_utils.py +index 2810a542..190f5f03 100644 +--- a/commands/command_utils.py ++++ b/commands/command_utils.py +@@ -1,10 +1,12 @@ ++import hashlib + import json + import os + import re + import resource + ++from leapp.actors import config as actor_config + from leapp.exceptions import CommandError +-from leapp.utils import path ++from leapp.utils import audit, path + + HANA_BASE_PATH = '/hana/shared' + HANA_SAPCONTROL_PATH_X86_64 = 'exe/linuxx86_64/hdb/sapcontrol' +@@ -178,3 +180,31 @@ def set_resource_limits(): + + if soft_fsize != fsize_limit: + set_resource_limit(resource.RLIMIT_FSIZE, fsize_limit, fsize_limit) ++ ++ ++def load_actor_configs_and_store_it_in_db(context, repositories, framework_cfg): ++ """ ++ Load actor configuration so that actor's can access it and store it into leapp db. ++ ++ :param context: Current execution context ++ :param repositories: Discovered repositories ++ :param framework_cfg: Leapp's configuration ++ """ ++ # Read the Actor Config and validate it against the schemas saved in the ++ # configuration. ++ ++ actor_config_schemas = tuple(actor.config_schemas for actor in repositories.actors) ++ actor_config_schemas = actor_config.normalize_schemas(actor_config_schemas) ++ actor_config_path = framework_cfg.get('actor_config', 'path') ++ ++ # Note: actor_config.load() stores the loaded actor config into a global ++ # variable which can then be accessed by functions in that file. Is this ++ # the right way to store that information? ++ actor_cfg = actor_config.load(actor_config_path, actor_config_schemas) ++ ++ # Dump the collected configuration, checksum it and store it inside the DB ++ config_text = json.dumps(actor_cfg) ++ config_text_hash = hashlib.sha256(config_text.encode('utf-8')).hexdigest() ++ config_data = audit.ActorConfigData(config=config_text, hash_id=config_text_hash) ++ db_config = audit.ActorConfig(config=config_data, context=context) ++ db_config.store() +diff --git a/commands/preupgrade/__init__.py b/commands/preupgrade/__init__.py +index a9fa40e0..631eca6b 100644 +--- a/commands/preupgrade/__init__.py ++++ b/commands/preupgrade/__init__.py +@@ -62,6 +62,9 @@ def preupgrade(args, breadcrumbs): + command_utils.set_resource_limits() + + workflow = repositories.lookup_workflow('IPUWorkflow')() ++ ++ command_utils.load_actor_configs_and_store_it_in_db(context, repositories, cfg) ++ + util.warn_if_unsupported(configuration) + util.process_whitelist_experimental(repositories, workflow, configuration, logger) + with beautify_actor_exception(): +diff --git a/commands/upgrade/__init__.py b/commands/upgrade/__init__.py +index c7487fde..3dedd438 100644 +--- a/commands/upgrade/__init__.py ++++ b/commands/upgrade/__init__.py +@@ -93,6 +93,9 @@ def upgrade(args, breadcrumbs): + command_utils.set_resource_limits() + + workflow = repositories.lookup_workflow('IPUWorkflow')(auto_reboot=args.reboot) ++ ++ command_utils.load_actor_configs_and_store_it_in_db(context, repositories, cfg) ++ + util.process_whitelist_experimental(repositories, workflow, configuration, logger) + util.warn_if_unsupported(configuration) + with beautify_actor_exception(): +-- +2.47.0 + diff --git a/SOURCES/0035-configs-common-introduce-RHUI-configuration.patch b/SOURCES/0035-configs-common-introduce-RHUI-configuration.patch new file mode 100644 index 0000000..7be8dfd --- /dev/null +++ b/SOURCES/0035-configs-common-introduce-RHUI-configuration.patch @@ -0,0 +1,157 @@ +From f3d38325fb525bca427a2b00e2bfb73b9297c36a Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Sun, 10 Nov 2024 14:35:26 +0100 +Subject: [PATCH 35/40] configs(common): introduce RHUI configuration + +Introduce a common configuration definition for RHUI related decisions. +The configuration has an atomic nature - if the user wants to overwrite +leapp's decisions, he/she must overwrite all of them. Essentially, all +fields of the RHUI_SETUPS cloud map entry can be configured. Almost no +non-empty defaults are provided, as no reasonable defaults can be given. +This is due to all setup parameters are different from provider to +provider. Therefore, default values are empty values, so that it can +later be detected by an actor whether all fields of the RHUI config +has been filled. + +Jira ref: RHEL-56251 +--- + repos/system_upgrade/common/configs/rhui.py | 127 ++++++++++++++++++++ + 1 file changed, 127 insertions(+) + create mode 100644 repos/system_upgrade/common/configs/rhui.py + +diff --git a/repos/system_upgrade/common/configs/rhui.py b/repos/system_upgrade/common/configs/rhui.py +new file mode 100644 +index 00000000..ade9bab9 +--- /dev/null ++++ b/repos/system_upgrade/common/configs/rhui.py +@@ -0,0 +1,127 @@ ++""" ++Configuration keys for RHUI. ++ ++In case of RHUI in private regions it usual that publicly known RHUI data ++is not valid. In such cases it's possible to provide the correct expected ++RHUI data to correct the in-place upgrade process. ++""" ++ ++from leapp.actors.config import Config ++from leapp.models import fields ++ ++RHUI_CONFIG_SECTION = 'rhui' ++ ++ ++# @Note(mhecko): We use to distinguish config instantiated from default values that we should ignore ++# # Maybe we could make all config values None and detect it that way, but then we cannot ++# # give the user an example how the config should look like. ++class RhuiUseConfig(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "use_config" ++ type_ = fields.Boolean() ++ default = False ++ description = """ ++ Use values provided in the configuration file to override leapp's decisions. ++ """ ++ ++ ++class RhuiSourcePkgs(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "source_clients" ++ type_ = fields.List(fields.String()) ++ default = [] ++ description = """ ++ The name of the source RHUI client RPMs (to be removed from the system). ++ """ ++ ++ ++class RhuiTargetPkgs(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "target_clients" ++ type_ = fields.List(fields.String()) ++ default = [] ++ description = """ ++ The name of the target RHUI client RPM (to be installed on the system). ++ """ ++ ++ ++class RhuiCloudProvider(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "cloud_provider" ++ type_ = fields.String() ++ default = "" ++ description = """ ++ Cloud provider name that should be used internally by leapp. ++ ++ Leapp recognizes the following cloud providers: ++ - azure ++ - aws ++ - google ++ ++ Cloud provider information is used for triggering some provider-specific modifications. The value also ++ influences how leapp determines target repositories to enable. ++ """ ++ ++ ++# @Note(mhecko): We likely don't need this. We need the variant primarily to grab files from a correct directory ++# in leapp-rhui-<provider> folders. ++class RhuiCloudVariant(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "image_variant" ++ type_ = fields.String() ++ default = "ordinary" ++ description = """ ++ RHEL variant of the source system - is the source system SAP-specific image? ++ ++ Leapp recognizes the following cloud providers: ++ - ordinary # The source system has not been deployed from a RHEL with SAP image ++ - sap # RHEL SAP images ++ - sap-apps # RHEL SAP Apps images (Azure only) ++ - sap-ha # RHEL HA Apps images (HA only) ++ ++ Cloud provider information is used for triggering some provider-specific modifications. The value also ++ influences how leapp determines target repositories to enable. ++ ++ Default: ++ "ordinary" ++ """ ++ ++ ++class RhuiUpgradeFiles(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "upgrade_files" ++ type_ = fields.StringMap(fields.String()) ++ default = dict() ++ description = """ ++ A mapping from source file paths to the destination where should they be ++ placed in the upgrade container. ++ ++ Typically, these files should be provided by leapp-rhui-<PROVIDER> packages. ++ ++ These files are needed to facilitate access to target repositories. Typical examples are: repofile(s), ++ certificates and keys. ++ """ ++ ++ ++class RhuiTargetRepositoriesToUse(Config): ++ section = RHUI_CONFIG_SECTION ++ name = "rhui_target_repositories_to_use" ++ type_ = fields.List(fields.String()) ++ description = """ ++ List of target repositories enabled during the upgrade. Similar to executing leapp with --enablerepo. ++ ++ The repositories to be enabled need to be either in the repofiles listed in the `upgrade_files` field, ++ or in repofiles present on the source system. ++ """ ++ default = list() ++ ++ ++all_rhui_cfg = ( ++ RhuiTargetPkgs, ++ RhuiUpgradeFiles, ++ RhuiTargetRepositoriesToUse, ++ RhuiCloudProvider, ++ RhuiCloudVariant, ++ RhuiSourcePkgs, ++ RhuiUseConfig ++) +-- +2.47.0 + diff --git a/SOURCES/0036-check_rhui-read-RHUI-configuration.patch b/SOURCES/0036-check_rhui-read-RHUI-configuration.patch new file mode 100644 index 0000000..e3642fa --- /dev/null +++ b/SOURCES/0036-check_rhui-read-RHUI-configuration.patch @@ -0,0 +1,457 @@ +From a03e8e5d10c1d6f3cdae216fafa0d7f0d0896494 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Sun, 10 Nov 2024 14:36:07 +0100 +Subject: [PATCH 36/40] check_rhui: read RHUI configuration + +Extend the check_rhui actor to read user-provided RHUI configuration. +If the provided configuration values say that the user wants to +overrwrite leapp's decisions, then the patch checks whether all values +are provided. If so, corresponding RHUIInfo message is produced. The +only implemented safe-guards are those that prevent the user from +accidentaly specifying a non-existing file to be copied into the +scrach container during us preparing to download target userspace +content. If the user provides only some of the configuration values +the upgrade is terminated early with an error, providing quick feedback +about misconfiguration. The patch has been designed to allow development +of upgrades on previously unknown clouds (clouds without an entry in +RHUI_SETUPS). + +Jira ref: RHEL-56251 +--- + .../common/actors/cloud/checkrhui/actor.py | 4 + + .../cloud/checkrhui/libraries/checkrhui.py | 102 +++++++++- + .../tests/component_test_checkrhui.py | 178 ++++++++++++++++-- + 3 files changed, 265 insertions(+), 19 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py b/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py +index 593e73e5..933ffcb3 100644 +--- a/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py ++++ b/repos/system_upgrade/common/actors/cloud/checkrhui/actor.py +@@ -1,4 +1,5 @@ + from leapp.actors import Actor ++from leapp.configs.common.rhui import all_rhui_cfg + from leapp.libraries.actor import checkrhui as checkrhui_lib + from leapp.models import ( + CopyFile, +@@ -8,6 +9,7 @@ from leapp.models import ( + RequiredTargetUserspacePackages, + RHUIInfo, + RpmTransactionTasks, ++ TargetRepositories, + TargetUserSpacePreupgradeTasks + ) + from leapp.reporting import Report +@@ -21,6 +23,7 @@ class CheckRHUI(Actor): + """ + + name = 'checkrhui' ++ config_schemas = all_rhui_cfg + consumes = (InstalledRPM,) + produces = ( + KernelCmdlineArg, +@@ -28,6 +31,7 @@ class CheckRHUI(Actor): + RequiredTargetUserspacePackages, + Report, DNFPluginTask, + RpmTransactionTasks, ++ TargetRepositories, + TargetUserSpacePreupgradeTasks, + CopyFile, + ) +diff --git a/repos/system_upgrade/common/actors/cloud/checkrhui/libraries/checkrhui.py b/repos/system_upgrade/common/actors/cloud/checkrhui/libraries/checkrhui.py +index 3b217917..64e36e08 100644 +--- a/repos/system_upgrade/common/actors/cloud/checkrhui/libraries/checkrhui.py ++++ b/repos/system_upgrade/common/actors/cloud/checkrhui/libraries/checkrhui.py +@@ -2,17 +2,29 @@ import itertools + import os + from collections import namedtuple + ++import leapp.configs.common.rhui as rhui_config_lib + from leapp import reporting ++from leapp.configs.common.rhui import ( # Import all config fields so we are not using their name attributes directly ++ RhuiCloudProvider, ++ RhuiCloudVariant, ++ RhuiSourcePkgs, ++ RhuiTargetPkgs, ++ RhuiTargetRepositoriesToUse, ++ RhuiUpgradeFiles, ++ RhuiUseConfig ++) + from leapp.exceptions import StopActorExecutionError + from leapp.libraries.common import rhsm, rhui + from leapp.libraries.common.config import version + from leapp.libraries.stdlib import api + from leapp.models import ( + CopyFile, ++ CustomTargetRepository, + DNFPluginTask, + InstalledRPM, + RHUIInfo, + RpmTransactionTasks, ++ TargetRepositories, + TargetRHUIPostInstallTasks, + TargetRHUIPreInstallTasks, + TargetRHUISetupInfo, +@@ -291,11 +303,11 @@ def produce_rhui_info_to_setup_target(rhui_family, source_setup_desc, target_set + api.produce(rhui_info) + + +-def produce_rpms_to_install_into_target(source_setup, target_setup): +- to_install = sorted(target_setup.clients - source_setup.clients) +- to_remove = sorted(source_setup.clients - target_setup.clients) ++def produce_rpms_to_install_into_target(source_clients, target_clients): ++ to_install = sorted(target_clients - source_clients) ++ to_remove = sorted(source_clients - target_clients) + +- api.produce(TargetUserSpacePreupgradeTasks(install_rpms=sorted(target_setup.clients))) ++ api.produce(TargetUserSpacePreupgradeTasks(install_rpms=sorted(target_clients))) + if to_install or to_remove: + api.produce(RpmTransactionTasks(to_install=to_install, to_remove=to_remove)) + +@@ -316,7 +328,85 @@ def inform_about_upgrade_with_rhui_without_no_rhsm(): + return False + + ++def emit_rhui_setup_tasks_based_on_config(rhui_config_dict): ++ config_upgrade_files = rhui_config_dict[RhuiUpgradeFiles.name] ++ ++ nonexisting_files_to_copy = [] ++ for source_path in config_upgrade_files: ++ if not os.path.exists(source_path): ++ nonexisting_files_to_copy.append(source_path) ++ ++ if nonexisting_files_to_copy: ++ details_lines = ['The following files were not found:'] ++ # Use .format and put backticks around paths so that weird unicode spaces will be easily seen ++ details_lines.extend(' - `{0}`'.format(path) for path in nonexisting_files_to_copy) ++ details = '\n'.join(details_lines) ++ ++ reason = 'RHUI config lists nonexisting files in its `{0}` field.'.format(RhuiUpgradeFiles.name) ++ raise StopActorExecutionError(reason, details={'details': details}) ++ ++ files_to_copy_into_overlay = [CopyFile(src=key, dst=value) for key, value in config_upgrade_files.items()] ++ preinstall_tasks = TargetRHUIPreInstallTasks(files_to_copy_into_overlay=files_to_copy_into_overlay) ++ ++ target_client_setup_info = TargetRHUISetupInfo( ++ preinstall_tasks=preinstall_tasks, ++ postinstall_tasks=TargetRHUIPostInstallTasks(), ++ bootstrap_target_client=False, # We don't need to install the client into overlay - user provided all files ++ ) ++ ++ rhui_info = RHUIInfo( ++ provider=rhui_config_dict[RhuiCloudProvider.name], ++ variant=rhui_config_dict[RhuiCloudVariant.name], ++ src_client_pkg_names=rhui_config_dict[RhuiSourcePkgs.name], ++ target_client_pkg_names=rhui_config_dict[RhuiTargetPkgs.name], ++ target_client_setup_info=target_client_setup_info ++ ) ++ api.produce(rhui_info) ++ ++ ++def request_configured_repos_to_be_enabled(rhui_config): ++ config_repos_to_enable = rhui_config[RhuiTargetRepositoriesToUse.name] ++ custom_repos = [CustomTargetRepository(repoid=repoid) for repoid in config_repos_to_enable] ++ if custom_repos: ++ target_repos = TargetRepositories(custom_repos=custom_repos, rhel_repos=[]) ++ api.produce(target_repos) ++ ++ ++def stop_with_err_if_config_missing_fields(config): ++ required_fields = [ ++ RhuiTargetRepositoriesToUse, ++ RhuiCloudProvider, ++ # RhuiCloudVariant, <- this is not required ++ RhuiSourcePkgs, ++ RhuiTargetPkgs, ++ RhuiUpgradeFiles, ++ ] ++ ++ missing_fields = tuple(field for field in required_fields if not config[field.name]) ++ if missing_fields: ++ field_names = (field.name for field in missing_fields) ++ missing_fields_str = ', '.join(field_names) ++ details = 'The following required RHUI config fields are missing or they are set to an empty value: {}' ++ details = details.format(missing_fields_str) ++ raise StopActorExecutionError('Provided RHUI config is missing values for required fields.', ++ details={'details': details}) ++ ++ + def process(): ++ rhui_config = api.current_actor().config[rhui_config_lib.RHUI_CONFIG_SECTION] ++ ++ if rhui_config[RhuiUseConfig.name]: ++ api.current_logger().info('Skipping RHUI upgrade auto-configuration - using provided config instead.') ++ stop_with_err_if_config_missing_fields(rhui_config) ++ emit_rhui_setup_tasks_based_on_config(rhui_config) ++ ++ src_clients = set(rhui_config[RhuiSourcePkgs.name]) ++ target_clients = set(rhui_config[RhuiTargetPkgs.name]) ++ produce_rpms_to_install_into_target(src_clients, target_clients) ++ ++ request_configured_repos_to_be_enabled(rhui_config) ++ return ++ + installed_rpm = itertools.chain(*[installed_rpm_msg.items for installed_rpm_msg in api.consume(InstalledRPM)]) + installed_pkgs = {rpm.name for rpm in installed_rpm} + +@@ -342,7 +432,9 @@ def process(): + # Instruction on how to access the target content + produce_rhui_info_to_setup_target(src_rhui_setup.family, src_rhui_setup.description, target_setup_desc) + +- produce_rpms_to_install_into_target(src_rhui_setup.description, target_setup_desc) ++ source_clients = src_rhui_setup.description.clients ++ target_clients = target_setup_desc.clients ++ produce_rpms_to_install_into_target(source_clients, target_clients) + + if src_rhui_setup.family.provider == rhui.RHUIProvider.AWS: + # We have to disable Amazon-id plugin in the initramdisk phase as there is no network +diff --git a/repos/system_upgrade/common/actors/cloud/checkrhui/tests/component_test_checkrhui.py b/repos/system_upgrade/common/actors/cloud/checkrhui/tests/component_test_checkrhui.py +index 27e70eea..3ac9c1b8 100644 +--- a/repos/system_upgrade/common/actors/cloud/checkrhui/tests/component_test_checkrhui.py ++++ b/repos/system_upgrade/common/actors/cloud/checkrhui/tests/component_test_checkrhui.py +@@ -1,30 +1,43 @@ +-from collections import namedtuple ++import itertools ++import os ++from collections import defaultdict + from enum import Enum + + import pytest + + from leapp import reporting ++from leapp.configs.common.rhui import ( ++ all_rhui_cfg, ++ RhuiCloudProvider, ++ RhuiCloudVariant, ++ RhuiSourcePkgs, ++ RhuiTargetPkgs, ++ RhuiTargetRepositoriesToUse, ++ RhuiUpgradeFiles, ++ RhuiUseConfig ++) + from leapp.exceptions import StopActorExecutionError + from leapp.libraries.actor import checkrhui as checkrhui_lib + from leapp.libraries.common import rhsm, rhui +-from leapp.libraries.common.config import mock_configs, version + from leapp.libraries.common.rhui import mk_rhui_setup, RHUIFamily +-from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked, produce_mocked ++from leapp.libraries.common.testutils import ( ++ _make_default_config, ++ create_report_mocked, ++ CurrentActorMocked, ++ produce_mocked ++) + from leapp.libraries.stdlib import api + from leapp.models import ( +- CopyFile, + InstalledRPM, +- RequiredTargetUserspacePackages, + RHUIInfo, + RPM, + RpmTransactionTasks, ++ TargetRepositories, + TargetRHUIPostInstallTasks, + TargetRHUIPreInstallTasks, + TargetRHUISetupInfo, + TargetUserSpacePreupgradeTasks + ) +-from leapp.reporting import Report +-from leapp.snactor.fixture import current_actor_context + + RH_PACKAGER = 'Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>' + +@@ -95,7 +108,8 @@ def mk_cloud_map(variants): + ] + ) + def test_determine_rhui_src_variant(monkeypatch, extra_pkgs, rhui_setups, expected_result): +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(src_ver='7.9')) ++ actor = CurrentActorMocked(src_ver='7.9', config=_make_default_config(all_rhui_cfg)) ++ monkeypatch.setattr(api, 'current_actor', actor) + installed_pkgs = {'zip', 'zsh', 'bash', 'grubby'}.union(set(extra_pkgs)) + + if expected_result and not isinstance(expected_result, RHUIFamily): # An exception +@@ -167,7 +181,8 @@ def test_google_specific_customization(provider, should_mutate): + ) + def test_aws_specific_customization(monkeypatch, rhui_family, target_major, should_mutate): + dst_ver = '{major}.0'.format(major=target_major) +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver=dst_ver)) ++ actor = CurrentActorMocked(dst_ver=dst_ver, config=_make_default_config(all_rhui_cfg)) ++ monkeypatch.setattr(api, 'current_actor', actor) + + setup_info = mk_setup_info() + checkrhui_lib.customize_rhui_setup_for_aws(rhui_family, setup_info) +@@ -215,12 +230,12 @@ def produce_rhui_info_to_setup_target(monkeypatch): + + + def test_produce_rpms_to_install_into_target(monkeypatch): +- source_rhui_setup = mk_rhui_setup(clients={'src_pkg'}, leapp_pkg='leapp_pkg') +- target_rhui_setup = mk_rhui_setup(clients={'target_pkg'}, leapp_pkg='leapp_pkg') ++ source_clients = {'src_pkg'} ++ target_clients = {'target_pkg'} + + monkeypatch.setattr(api, 'produce', produce_mocked()) + +- checkrhui_lib.produce_rpms_to_install_into_target(source_rhui_setup, target_rhui_setup) ++ checkrhui_lib.produce_rpms_to_install_into_target(source_clients, target_clients) + + assert len(api.produce.model_instances) == 2 + userspace_tasks, target_rpm_tasks = api.produce.model_instances[0], api.produce.model_instances[1] +@@ -276,7 +291,8 @@ def test_process(monkeypatch, extra_installed_pkgs, skip_rhsm, expected_action): + installed_rpms = InstalledRPM(items=installed_pkgs) + + monkeypatch.setattr(api, 'produce', produce_mocked()) +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(src_ver='7.9', msgs=[installed_rpms])) ++ actor = CurrentActorMocked(src_ver='7.9', msgs=[installed_rpms], config=_make_default_config(all_rhui_cfg)) ++ monkeypatch.setattr(api, 'current_actor', actor) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: skip_rhsm) + monkeypatch.setattr(rhui, 'RHUI_SETUPS', known_setups) +@@ -315,7 +331,8 @@ def test_unknown_target_rhui_setup(monkeypatch, is_target_setup_known): + installed_rpms = InstalledRPM(items=installed_pkgs) + + monkeypatch.setattr(api, 'produce', produce_mocked()) +- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(src_ver='7.9', msgs=[installed_rpms])) ++ actor = CurrentActorMocked(src_ver='7.9', msgs=[installed_rpms], config=_make_default_config(all_rhui_cfg)) ++ monkeypatch.setattr(api, 'current_actor', actor) + monkeypatch.setattr(reporting, 'create_report', create_report_mocked()) + monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: True) + monkeypatch.setattr(rhui, 'RHUI_SETUPS', known_setups) +@@ -374,3 +391,136 @@ def test_select_chronologically_closest(monkeypatch, setups, desired_minor, expe + setup = setups[0] + + assert setup == expected_setup ++ ++ ++def test_config_overwrites_everything(monkeypatch): ++ rhui_config = { ++ RhuiUseConfig.name: True, ++ RhuiSourcePkgs.name: ['client_source'], ++ RhuiTargetPkgs.name: ['client_target'], ++ RhuiCloudProvider.name: 'aws', ++ RhuiUpgradeFiles.name: { ++ '/root/file.repo': '/etc/yum.repos.d/' ++ }, ++ RhuiTargetRepositoriesToUse.name: [ ++ 'repoid_to_use' ++ ] ++ } ++ all_config = {'rhui': rhui_config} ++ ++ actor = CurrentActorMocked(config=all_config) ++ monkeypatch.setattr(api, 'current_actor', actor) ++ ++ function_calls = defaultdict(int) ++ ++ def mk_function_probe(fn_name): ++ def probe(*args, **kwargs): ++ function_calls[fn_name] += 1 ++ return probe ++ ++ monkeypatch.setattr(checkrhui_lib, ++ 'emit_rhui_setup_tasks_based_on_config', ++ mk_function_probe('emit_rhui_setup_tasks_based_on_config')) ++ monkeypatch.setattr(checkrhui_lib, ++ 'stop_with_err_if_config_missing_fields', ++ mk_function_probe('stop_with_err_if_config_missing_fields')) ++ monkeypatch.setattr(checkrhui_lib, ++ 'produce_rpms_to_install_into_target', ++ mk_function_probe('produce_rpms_to_install_into_target')) ++ monkeypatch.setattr(checkrhui_lib, ++ 'request_configured_repos_to_be_enabled', ++ mk_function_probe('request_configured_repos_to_be_enabled')) ++ ++ checkrhui_lib.process() ++ ++ expected_function_calls = { ++ 'emit_rhui_setup_tasks_based_on_config': 1, ++ 'stop_with_err_if_config_missing_fields': 1, ++ 'produce_rpms_to_install_into_target': 1, ++ 'request_configured_repos_to_be_enabled': 1, ++ } ++ ++ assert function_calls == expected_function_calls ++ ++ ++def test_request_configured_repos_to_be_enabled(monkeypatch): ++ monkeypatch.setattr(api, 'produce', produce_mocked()) ++ ++ rhui_config = { ++ RhuiUseConfig.name: True, ++ RhuiSourcePkgs.name: ['client_source'], ++ RhuiTargetPkgs.name: ['client_target'], ++ RhuiCloudProvider.name: 'aws', ++ RhuiUpgradeFiles.name: { ++ '/root/file.repo': '/etc/yum.repos.d/' ++ }, ++ RhuiTargetRepositoriesToUse.name: [ ++ 'repoid1', ++ 'repoid2', ++ 'repoid3', ++ ] ++ } ++ ++ checkrhui_lib.request_configured_repos_to_be_enabled(rhui_config) ++ ++ assert api.produce.called ++ assert len(api.produce.model_instances) == 1 ++ ++ target_repos = api.produce.model_instances[0] ++ assert isinstance(target_repos, TargetRepositories) ++ assert not target_repos.rhel_repos ++ ++ custom_repoids = sorted(custom_repo_model.repoid for custom_repo_model in target_repos.custom_repos) ++ assert custom_repoids == ['repoid1', 'repoid2', 'repoid3'] ++ ++ ++@pytest.mark.parametrize( ++ ('upgrade_files', 'existing_files'), ++ ( ++ (['/root/a', '/root/b'], ['/root/a', '/root/b']), ++ (['/root/a', '/root/b'], ['/root/b']), ++ (['/root/a', '/root/b'], []), ++ ) ++) ++def test_missing_files_in_config(monkeypatch, upgrade_files, existing_files): ++ upgrade_files_map = dict((source_path, '/tmp/dummy') for source_path in upgrade_files) ++ ++ rhui_config = { ++ RhuiUseConfig.name: True, ++ RhuiSourcePkgs.name: ['client_source'], ++ RhuiTargetPkgs.name: ['client_target'], ++ RhuiCloudProvider.name: 'aws', ++ RhuiCloudVariant.name: 'ordinary', ++ RhuiUpgradeFiles.name: upgrade_files_map, ++ RhuiTargetRepositoriesToUse.name: [ ++ 'repoid_to_use' ++ ] ++ } ++ ++ monkeypatch.setattr(os.path, 'exists', lambda path: path in existing_files) ++ monkeypatch.setattr(api, 'produce', produce_mocked()) ++ ++ should_error = (len(upgrade_files) != len(existing_files)) ++ if should_error: ++ with pytest.raises(StopActorExecutionError): ++ checkrhui_lib.emit_rhui_setup_tasks_based_on_config(rhui_config) ++ else: ++ checkrhui_lib.emit_rhui_setup_tasks_based_on_config(rhui_config) ++ assert api.produce.called ++ assert len(api.produce.model_instances) == 1 ++ ++ rhui_info = api.produce.model_instances[0] ++ assert isinstance(rhui_info, RHUIInfo) ++ assert rhui_info.provider == 'aws' ++ assert rhui_info.variant == 'ordinary' ++ assert rhui_info.src_client_pkg_names == ['client_source'] ++ assert rhui_info.target_client_pkg_names == ['client_target'] ++ ++ setup_info = rhui_info.target_client_setup_info ++ assert not setup_info.bootstrap_target_client ++ ++ _copies_to_perform = setup_info.preinstall_tasks.files_to_copy_into_overlay ++ copies_to_perform = sorted((copy.src, copy.dst) for copy in _copies_to_perform) ++ expected_copies = sorted(zip(upgrade_files, itertools.repeat('/tmp/dummy'))) ++ ++ assert copies_to_perform == expected_copies +-- +2.47.0 + diff --git a/SOURCES/0037-testutils-add-support-for-configs.patch b/SOURCES/0037-testutils-add-support-for-configs.patch new file mode 100644 index 0000000..0ebbf0a --- /dev/null +++ b/SOURCES/0037-testutils-add-support-for-configs.patch @@ -0,0 +1,53 @@ +From a206a7f02c68f50ab50c9f547669d3a4178c4bd2 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Wed, 16 Oct 2024 17:38:36 +0200 +Subject: [PATCH 37/40] testutils: add support for configs + +Extend the CurrentActorMocked class to accept a `config` value, +allowing developers to mock actors that rely on configuration. +A library function `_make_default_config` is also introduced, +allowing to instantiate default configs from config schemas. +--- + repos/system_upgrade/common/libraries/testutils.py | 10 +++++++++- + 1 file changed, 9 insertions(+), 1 deletion(-) + +diff --git a/repos/system_upgrade/common/libraries/testutils.py b/repos/system_upgrade/common/libraries/testutils.py +index c538af1a..afeb360a 100644 +--- a/repos/system_upgrade/common/libraries/testutils.py ++++ b/repos/system_upgrade/common/libraries/testutils.py +@@ -4,6 +4,7 @@ import os + from collections import namedtuple + + from leapp import reporting ++from leapp.actors.config import _normalize_config, normalize_schemas + from leapp.libraries.common.config import architecture + from leapp.models import EnvVar + from leapp.utils.deprecation import deprecated +@@ -67,9 +68,15 @@ class logger_mocked(object): + return self + + ++def _make_default_config(actor_config_schema): ++ """ Make a config dict populated with default values. """ ++ merged_schema = normalize_schemas((actor_config_schema, )) ++ return _normalize_config({}, merged_schema) # Will fill default values during normalization ++ ++ + class CurrentActorMocked(object): # pylint:disable=R0904 + def __init__(self, arch=architecture.ARCH_X86_64, envars=None, kernel='3.10.0-957.43.1.el7.x86_64', +- release_id='rhel', src_ver='7.8', dst_ver='8.1', msgs=None, flavour='default'): ++ release_id='rhel', src_ver='7.8', dst_ver='8.1', msgs=None, flavour='default', config=None): + envarsList = [EnvVar(name=k, value=v) for k, v in envars.items()] if envars else [] + version = namedtuple('Version', ['source', 'target'])(src_ver, dst_ver) + release = namedtuple('OS_release', ['release_id', 'version_id'])(release_id, src_ver) +@@ -82,6 +89,7 @@ class CurrentActorMocked(object): # pylint:disable=R0904 + 'configuration', ['architecture', 'kernel', 'leapp_env_vars', 'os_release', 'version', 'flavour'] + )(arch, kernel, envarsList, release, version, flavour) + self._msgs = msgs or [] ++ self.config = {} if config is None else config + + def __call__(self): + return self +-- +2.47.0 + diff --git a/SOURCES/0038-userspacegen-rhui-remove-repofiles-only-if-now-owned.patch b/SOURCES/0038-userspacegen-rhui-remove-repofiles-only-if-now-owned.patch new file mode 100644 index 0000000..27c7444 --- /dev/null +++ b/SOURCES/0038-userspacegen-rhui-remove-repofiles-only-if-now-owned.patch @@ -0,0 +1,70 @@ +From 0147bc268607e5931ebca95e3253087ec71a3c66 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Sun, 20 Oct 2024 16:08:49 +0200 +Subject: [PATCH 38/40] userspacegen(rhui): remove repofiles only if now owned + by an RPM + +We copy files into the target userspace when setting up target +repository content. If this file is named equally as some of the +files installed by the target RHUI client installed during early +phases of target userspace setup process, we would delete it in +cleanup. Therefore, if we copy a repofile named /etc/yum.repos.d/X.repo +and the target client also owns a file /etc/yum.repos.d/X.repo, we +would remove it, making the container loose access to target content. +This patch prevents us from blindly deleting files, keeping files that +are owned by some RPM (usually that would be the target RHUI client). +--- + .../libraries/userspacegen.py | 30 ++++++++++++++----- + 1 file changed, 22 insertions(+), 8 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py b/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py +index d7698056..12736ab7 100644 +--- a/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py ++++ b/repos/system_upgrade/common/actors/targetuserspacecreator/libraries/userspacegen.py +@@ -1120,6 +1120,27 @@ def _get_target_userspace(): + return constants.TARGET_USERSPACE.format(get_target_major_version()) + + ++def _remove_injected_repofiles_from_our_rhui_packages(target_userspace_ctx, rhui_setup_info): ++ target_userspace_path = _get_target_userspace() ++ for copy in rhui_setup_info.preinstall_tasks.files_to_copy_into_overlay: ++ dst_in_container = get_copy_location_from_copy_in_task(target_userspace_path, copy) ++ dst_in_container = dst_in_container.strip('/') ++ dst_in_host = os.path.join(target_userspace_path, dst_in_container) ++ ++ if os.path.isfile(dst_in_host) and dst_in_host.endswith('.repo'): ++ # The repofile might have been replaced by a new one provided by the RHUI client if names collide ++ # Performance: Do the query here and not earlier, because we would be running rpm needlessly ++ try: ++ path_with_root = '/' + dst_in_container ++ target_userspace_ctx.call(['rpm', '-q', '--whatprovides', path_with_root]) ++ api.current_logger().debug('Repofile {0} kept as it is owned by some RPM.'.format(dst_in_host)) ++ except CalledProcessError: ++ # rpm exists with 1 if the file is not owned by any RPM. We might be catching all kinds of other ++ # problems here, but still better than always removing repofiles. ++ api.current_logger().debug('Removing repofile - not owned by any RPM: {0}'.format(dst_in_host)) ++ os.remove(dst_in_host) ++ ++ + def _create_target_userspace(context, indata, packages, files, target_repoids): + """Create the target userspace.""" + target_path = _get_target_userspace() +@@ -1139,14 +1160,7 @@ def _create_target_userspace(context, indata, packages, files, target_repoids): + ) + setup_info = indata.rhui_info.target_client_setup_info + if not setup_info.bootstrap_target_client: +- target_userspace_path = _get_target_userspace() +- for copy in setup_info.preinstall_tasks.files_to_copy_into_overlay: +- dst_in_container = get_copy_location_from_copy_in_task(target_userspace_path, copy) +- dst_in_container = dst_in_container.strip('/') +- dst_in_host = os.path.join(target_userspace_path, dst_in_container) +- if os.path.isfile(dst_in_host) and dst_in_host.endswith('.repo'): +- api.current_logger().debug('Removing repofile: {0}'.format(dst_in_host)) +- os.remove(dst_in_host) ++ _remove_injected_repofiles_from_our_rhui_packages(context, setup_info) + + # and do not forget to set the rhsm into the container mode again + with mounting.NspawnActions(_get_target_userspace()) as target_context: +-- +2.47.0 + diff --git a/SOURCES/0039-Enable-IPU-for-EL-9.6-and-drop-EL-8.8-9.2.patch b/SOURCES/0039-Enable-IPU-for-EL-9.6-and-drop-EL-8.8-9.2.patch new file mode 100644 index 0000000..ac99b4b --- /dev/null +++ b/SOURCES/0039-Enable-IPU-for-EL-9.6-and-drop-EL-8.8-9.2.patch @@ -0,0 +1,857 @@ +From c2f2895bb570a75eb2aaa7b84a2bcd9dcd537b0e Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Thu, 14 Nov 2024 14:24:15 +0100 +Subject: [PATCH 39/40] Enable IPU for EL 9.6 (and drop EL 8.8/9.2) + +* Add product certificates for RHEL 9.6 +* Introduce upgrade path 8.10 -> 9.6 +* Drop IPUs related to EL 8.8 and 9.2 + * This will not be supported in this release. + * Keeping for now still IPU 8.10 -> 9.5 as it is a fresh release + so it has a value for us to run tests there. We will drop it + later during this lifecycle (CTC-2?). +* Drop EL 8.8 from the list of supported versions +* Update tests in packit + * Note that tests for 9.6 could be failing for a while until + composes are created. + +jira: RHEL-67621 +--- + .packit.yaml | 257 +++++------------- + .../common/files/prod-certs/9.6/279.pem | 37 +++ + .../common/files/prod-certs/9.6/362.pem | 37 +++ + .../common/files/prod-certs/9.6/363.pem | 37 +++ + .../common/files/prod-certs/9.6/419.pem | 36 +++ + .../common/files/prod-certs/9.6/433.pem | 37 +++ + .../common/files/prod-certs/9.6/479.pem | 36 +++ + .../common/files/prod-certs/9.6/486.pem | 37 +++ + .../common/files/prod-certs/9.6/72.pem | 36 +++ + .../common/files/upgrade_paths.json | 18 +- + .../common/libraries/config/version.py | 2 +- + 11 files changed, 363 insertions(+), 207 deletions(-) + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/279.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/362.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/363.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/419.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/433.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/479.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/486.pem + create mode 100644 repos/system_upgrade/common/files/prod-certs/9.6/72.pem + +diff --git a/.packit.yaml b/.packit.yaml +index fbfd0eea..48c3cbbb 100644 +--- a/.packit.yaml ++++ b/.packit.yaml +@@ -145,104 +145,6 @@ jobs: + # ######################### Individual tests ########################### # + # ###################################################################### # + +-# Tests: 7.9 -> 8.8 +-- &sanity-79to88-aws +- <<: *sanity-abstract-7to8-aws +- trigger: pull_request +- identifier: sanity-7.9to8.8-aws +- tf_extra_params: +- test: +- tmt: +- plan_filter: 'tag:7to8 & tag:upgrade_happy_path & enabled:true' +- environments: +- - tmt: +- context: +- distro: "rhel-7.9" +- distro_target: "rhel-8.8" +- settings: +- provisioning: +- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys" +- tags: +- BusinessUnit: sst_upgrades@leapp_upstream_test +- env: +- SOURCE_RELEASE: "7.9" +- TARGET_RELEASE: "8.8" +- RHUI: "aws" +- LEAPPDATA_BRANCH: "upstream" +- LEAPP_NO_RHSM: "1" +- USE_CUSTOM_REPOS: rhui +- +-- &sanity-79to88 +- <<: *sanity-abstract-7to8 +- trigger: pull_request +- identifier: sanity-7.9to8.8 +- tf_extra_params: +- test: +- tmt: +- plan_filter: 'tag:7to8 & tag:sanity & enabled:true' +- environments: +- - tmt: +- context: +- distro: "rhel-7.9" +- distro_target: "rhel-8.8" +- settings: +- provisioning: +- tags: +- BusinessUnit: sst_upgrades@leapp_upstream_test +- env: +- SOURCE_RELEASE: "7.9" +- TARGET_RELEASE: "8.8" +- +-- &beaker-minimal-79to88 +- <<: *beaker-minimal-7to8-abstract-ondemand +- trigger: pull_request +- labels: +- - beaker-minimal +- - beaker-minimal-7.9to8.8 +- - 7.9to8.8 +- identifier: sanity-7.9to8.8-beaker-minimal-ondemand +- tf_extra_params: +- test: +- tmt: +- plan_filter: 'tag:7to8 & tag:partitioning & enabled:true' +- environments: +- - tmt: +- context: +- distro: "rhel-7.9" +- distro_target: "rhel-8.8" +- settings: +- provisioning: +- tags: +- BusinessUnit: sst_upgrades@leapp_upstream_test +- env: +- SOURCE_RELEASE: "7.9" +- TARGET_RELEASE: "8.8" +- +-- &kernel-rt-79to88 +- <<: *kernel-rt-abstract-7to8-ondemand +- trigger: pull_request +- labels: +- - kernel-rt +- - kernel-rt-7.9to8.8 +- - 7.9to8.8 +- identifier: sanity-7.9to8.8-kernel-rt-ondemand +- tf_extra_params: +- test: +- tmt: +- plan_filter: 'tag:7to8 & tag:kernel-rt & enabled:true' +- environments: +- - tmt: +- context: +- distro: "rhel-7.9" +- distro_target: "rhel-8.8" +- settings: +- provisioning: +- tags: +- BusinessUnit: sst_upgrades@leapp_upstream_test +- env: +- SOURCE_RELEASE: "7.9" +- TARGET_RELEASE: "8.8" +- + # Tests: 7.9 -> 8.10 + - &sanity-79to810 + <<: *sanity-abstract-7to8 +@@ -397,14 +299,11 @@ jobs: + # ######################### Individual tests ########################### # + # ###################################################################### # + +-# Tests: 8.8 -> 9.2 +-- &sanity-88to92 ++# Tests: 8.10 -> 9.4 ++- &sanity-810to94 + <<: *sanity-abstract-8to9 + trigger: pull_request +- targets: +- epel-8-x86_64: +- distros: [RHEL-8.8.0-Nightly] +- identifier: sanity-8.8to9.2 ++ identifier: sanity-8.10to9.4 + tf_extra_params: + test: + tmt: +@@ -412,108 +311,74 @@ jobs: + environments: + - tmt: + context: +- distro: "rhel-8.8" +- distro_target: "rhel-9.2" +- settings: +- provisioning: +- tags: +- BusinessUnit: sst_upgrades@leapp_upstream_test +- env: +- SOURCE_RELEASE: "8.8" +- TARGET_RELEASE: "9.2" +- RHSM_REPOS_EUS: "eus" +- +-- &sanity-88to92-aws +- <<: *sanity-abstract-8to9-aws +- trigger: pull_request +- targets: +- epel-8-x86_64: +- distros: [RHEL-8.8-rhui] +- identifier: sanity-8.8to9.2-aws +- tf_extra_params: +- test: +- tmt: +- plan_filter: 'tag:8to9 & tag:rhui-tier[0] & enabled:true' +- environments: +- - tmt: +- context: +- distro: "rhel-8.8" +- distro_target: "rhel-9.2" ++ distro: "rhel-8.10" ++ distro_target: "rhel-9.4" + settings: + provisioning: +- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys" + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: +- SOURCE_RELEASE: "8.8" +- TARGET_RELEASE: "9.2" +- RHUI_HYPERSCALER: aws ++ SOURCE_RELEASE: "8.10" ++ TARGET_RELEASE: "9.4" + +-- &beaker-minimal-88to92 ++# On-demand minimal beaker tests ++- &beaker-minimal-810to94 + <<: *beaker-minimal-8to9-abstract-ondemand + trigger: pull_request + labels: + - beaker-minimal +- - beaker-minimal-8.8to9.2 +- - 8.8to9.2 +- targets: +- epel-8-x86_64: +- distros: [RHEL-8.8.0-Nightly] +- identifier: sanity-8.8to9.2-beaker-minimal-ondemand ++ - beaker-minimal-8.10to9.4 ++ - 8.10to9.4 ++ identifier: sanity-8.10to9.4-beaker-minimal-ondemand + tf_extra_params: + test: + tmt: +- plan_filter: 'tag:8to9 &tag:partitioning & enabled:true' ++ plan_filter: 'tag:8to9 & tag:partitioning & enabled:true' + environments: + - tmt: + context: +- distro: "rhel-8.8" +- distro_target: "rhel-9.2" ++ distro: "rhel-8.10" ++ distro_target: "rhel-9.4" + settings: + provisioning: +- post_install_script: "#!/bin/sh\nsudo sed -i s/.*ssh-rsa/ssh-rsa/ /root/.ssh/authorized_keys" + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: +- SOURCE_RELEASE: "8.8" +- TARGET_RELEASE: "9.2" +- RHSM_REPOS_EUS: "eus" ++ SOURCE_RELEASE: "8.10" ++ TARGET_RELEASE: "9.4" + +-- &kernel-rt-88to92 ++# On-demand kernel-rt tests ++- &kernel-rt-810to94 + <<: *kernel-rt-abstract-8to9-ondemand + trigger: pull_request + labels: + - kernel-rt +- - kernel-rt-8.8to9.2 +- - 8.8to9.2 +- identifier: sanity-8.8to9.2-kernel-rt-ondemand +- targets: +- epel-8-x86_64: +- distros: [RHEL-8.8.0-Nightly] ++ - kernel-rt-8.10to9.4 ++ - 8.10to9.4 ++ identifier: sanity-8.10to9.4-kernel-rt-ondemand + tf_extra_params: + test: + tmt: +- plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true' ++ plan_filter: 'tag:8to9 & tag:kernel-rt & enabled:true' + environments: + - tmt: + context: +- distro: "rhel-8.8" +- distro_target: "rhel-9.2" ++ distro: "rhel-8.10" ++ distro_target: "rhel-9.4" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: +- SOURCE_RELEASE: "8.8" +- TARGET_RELEASE: "9.2" +- RHSM_REPOS_EUS: "eus" ++ SOURCE_RELEASE: "8.10" ++ TARGET_RELEASE: "9.4" + + +-# Tests: 8.10 -> 9.4 +-- &sanity-810to94 ++# Tests: 8.10 -> 9.5 ++- &sanity-810to95 + <<: *sanity-abstract-8to9 + trigger: pull_request +- identifier: sanity-8.10to9.4 ++ identifier: sanity-8.10to9.5 + tf_extra_params: + test: + tmt: +@@ -522,24 +387,24 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.4" ++ distro_target: "rhel-9.5" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.4" ++ TARGET_RELEASE: "9.5" + + # On-demand minimal beaker tests +-- &beaker-minimal-810to94 ++- &beaker-minimal-810to95 + <<: *beaker-minimal-8to9-abstract-ondemand + trigger: pull_request + labels: + - beaker-minimal +- - beaker-minimal-8.10to9.4 +- - 8.10to9.4 +- identifier: sanity-8.10to9.4-beaker-minimal-ondemand ++ - beaker-minimal-8.10to9.5 ++ - 8.10to9.5 ++ identifier: sanity-8.10to9.5-beaker-minimal-ondemand + tf_extra_params: + test: + tmt: +@@ -548,24 +413,24 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.4" ++ distro_target: "rhel-9.5" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.4" ++ TARGET_RELEASE: "9.5" + + # On-demand kernel-rt tests +-- &kernel-rt-810to94 ++- &kernel-rt-810to95 + <<: *kernel-rt-abstract-8to9-ondemand + trigger: pull_request + labels: + - kernel-rt +- - kernel-rt-8.10to9.4 +- - 8.10to9.4 +- identifier: sanity-8.10to9.4-kernel-rt-ondemand ++ - kernel-rt-8.10to9.5 ++ - 8.10to9.5 ++ identifier: sanity-8.10to9.5-kernel-rt-ondemand + tf_extra_params: + test: + tmt: +@@ -574,21 +439,21 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.4" ++ distro_target: "rhel-9.5" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.4" ++ TARGET_RELEASE: "9.5" + + +-# Tests: 8.10 -> 9.5 +-- &sanity-810to95 ++# Tests: 8.10 -> 9.6 ++- &sanity-810to96 + <<: *sanity-abstract-8to9 + trigger: pull_request +- identifier: sanity-8.10to9.5 ++ identifier: sanity-8.10to9.6 + tf_extra_params: + test: + tmt: +@@ -597,24 +462,24 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.5" ++ distro_target: "rhel-9.6" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.5" ++ TARGET_RELEASE: "9.6" + + # On-demand minimal beaker tests +-- &beaker-minimal-810to95 ++- &beaker-minimal-810to96 + <<: *beaker-minimal-8to9-abstract-ondemand + trigger: pull_request + labels: + - beaker-minimal +- - beaker-minimal-8.10to9.5 +- - 8.10to9.5 +- identifier: sanity-8.10to9.5-beaker-minimal-ondemand ++ - beaker-minimal-8.10to9.6 ++ - 8.10to9.6 ++ identifier: sanity-8.10to9.6-beaker-minimal-ondemand + tf_extra_params: + test: + tmt: +@@ -623,24 +488,24 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.5" ++ distro_target: "rhel-9.6" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.5" ++ TARGET_RELEASE: "9.6" + + # On-demand kernel-rt tests +-- &kernel-rt-810to95 ++- &kernel-rt-810to96 + <<: *kernel-rt-abstract-8to9-ondemand + trigger: pull_request + labels: + - kernel-rt +- - kernel-rt-8.10to9.5 +- - 8.10to9.5 +- identifier: sanity-8.10to9.5-kernel-rt-ondemand ++ - kernel-rt-8.10to9.6 ++ - 8.10to9.6 ++ identifier: sanity-8.10to9.6-kernel-rt-ondemand + tf_extra_params: + test: + tmt: +@@ -649,11 +514,11 @@ jobs: + - tmt: + context: + distro: "rhel-8.10" +- distro_target: "rhel-9.5" ++ distro_target: "rhel-9.6" + settings: + provisioning: + tags: + BusinessUnit: sst_upgrades@leapp_upstream_test + env: + SOURCE_RELEASE: "8.10" +- TARGET_RELEASE: "9.5" ++ TARGET_RELEASE: "9.6" +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/279.pem b/repos/system_upgrade/common/files/prod-certs/9.6/279.pem +new file mode 100644 +index 00000000..a9ef267b +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/279.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGZTCCBE2gAwIBAgIJALDxRLt/tVEiMA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIwNVoXDTQ0MDgx ++MjE5MDIwNVowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFs1MzUwNTA4 ++OC05ZTk5LTQyODItYmE4OS1mMjhhNjAwZWNhZWFdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB7jCB6zAJBgNVHRMEAjAAMEMGDCsGAQQBkggJAYIXAQQzDDFSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIFBvd2VyLCBsaXR0bGUgZW5kaWFuMBUGDCsG ++AQQBkggJAYIXAgQFDAM5LjYwGQYMKwYBBAGSCAkBghcDBAkMB3BwYzY0bGUwJwYM ++KwYBBAGSCAkBghcEBBcMFXJoZWwtOSxyaGVsLTktcHBjNjRsZTAdBgNVHQ4EFgQU ++YeogtTV8r2dkOv9rCOYQeNDNH5UwHwYDVR0jBBgwFoAUlv27HEBA/0CErbIfCybB ++w2pv1nwwDQYJKoZIhvcNAQELBQADggIBACRmyYbMhmuV+w4E+Hlonlt0mooB6EF6 ++h/xknuBRw/saSL+7sLfbItaxWH5euxDc/5XvII2t0Jjl+GDnAjI75xrTuN3gT88Z ++9wd1kvDVqt46GI6VKVH1SujJoJpGenfhTVwenATZwdq260RgYgM3Zv1d3I4Lu/GY ++65T//j0/8tBmgqMc6BRvIrDa1wtVUbEwH3b/jwZoeitps1hKIH9yKZV79HZ7WVdb ++otDtsAk7VKZGRjGdvYsfWZrjmyyyc5wX2AemzpnhSm1kkGvOAjSMsJ0QcrSu/5vj ++AAK64J1tDA93WKsAqDnK7tUOx6qwICllbgVmKWl/02JH8ELs/sJnsWBEigfdZmTh ++/3Q8DPNni7scYkJ5Vs0tL8pke29C1bgAYjoBiQgf/ffNunTOWgdkdFHbd9I3+aLh ++pO7qqkndEkl85xkQJrZWO35NvPD4NAwnsDrIP0oJg5mYNTB11C5SlHhllT/Iu374 ++8afWtoHaB50vsqM2dtvh/UsCyGynWYc93TLsU6a4gBl19D7VAx0fiOwdD+CyweUp ++xcos6MIIuFAFUIVpD+/3w499Lw9m5dcfApl6HCyQgAoafXCJjM/aXsSsSWr2d9TF ++c6S/uA2egh4fUv8zYnlZKUvCTu8kn4Lv439wW0xyIEB/sD/gXk9e8H9KkUuKDExx ++yTSjzqnPM82N ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/362.pem b/repos/system_upgrade/common/files/prod-certs/9.6/362.pem +new file mode 100644 +index 00000000..d7c1a6be +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/362.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGdDCCBFygAwIBAgIJALDxRLt/tVE4MA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIyNFoXDTQ0MDgx ++MjE5MDIyNFowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFs2MjBmNzkx ++MC0xNDk5LTRmMzAtYTk3NS1hYWFiOGQyMWE1NmNdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB/TCB+jAJBgNVHRMEAjAAMEgGDCsGAQQBkggJAYJqAQQ4DDZSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIFBvd2VyLCBsaXR0bGUgZW5kaWFuIEJldGEw ++GgYMKwYBBAGSCAkBgmoCBAoMCDkuNiBCZXRhMBkGDCsGAQQBkggJAYJqAwQJDAdw ++cGM2NGxlMCwGDCsGAQQBkggJAYJqBAQcDBpyaGVsLTkscmhlbC05LWJldGEtcHBj ++NjRsZTAdBgNVHQ4EFgQUYeogtTV8r2dkOv9rCOYQeNDNH5UwHwYDVR0jBBgwFoAU ++lv27HEBA/0CErbIfCybBw2pv1nwwDQYJKoZIhvcNAQELBQADggIBADzaMxiligMU ++vVUxGdlKgceVXcZR6TC/nACDxyRFm7JGKYC0Ncxum2RWQ10mMD1HM1xa0NVz3BLO ++a+VrZ3MGTpKuWQgN0TKIzjykxxfJMip8AVYx6UvQ4SxxZWFIVPuC0XYfYc2pOV5A ++OcO63O+R7QVvLpZ3q7tX3uAXCfWWvJkoJ+MzKCl3lEmeKAcaikcums+aOd/JwTSo ++bt5ExLgC4J1cvevH+IBCUbmN1r+xrkHNiNWjys0MIo1JsPmi1A1kDeORXPN4xXvH ++x69z9SuHrUd2iFXpMfezqZsmiaa/FP6UOKwpDyEqZGE+/aT/RBza9BeYX74vDpFI ++h0vMtx3lHE+PGh7a6kfXV2GL4IP7w5MbdZQIJ/ZS4oT/zG3E2wRnGD4+oQ3Bm/TV ++Or0IHnafxXYXgsQ6bsMsZN7BRZ8VfaEdM3IVRqVyPVWzo0kYkHZcnVQpabmCWPjc ++NUwMJDni3LfjxKreHLDQBEkwX4XoZnSq/xMHO6ppe0sZ2XgAOsw/B92ekTTEdoKZ ++dEQBkqv2FRUbMoILnNVWJp4yGMOPcTl7hrlcJjKRvKs1hKWkQKN6g4YDHCglkVfH ++ltDGkolsUYFvoygoi8VCCDfz7whn6pXmzlpk1VkzE+V1R88Tf5ygrSNWETOZMU/B ++5P07jdNriEBCZaCPq7T8odOt1cKZpVdg ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/363.pem b/repos/system_upgrade/common/files/prod-certs/9.6/363.pem +new file mode 100644 +index 00000000..f75b478d +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/363.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGZjCCBE6gAwIBAgIJALDxRLt/tVE3MA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIyNFoXDTQ0MDgx ++MjE5MDIyNFowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFs1MDE5NmU1 ++ZC1lNDgzLTQwNDAtYjcwYS03NDg5NDliZTRjZmFdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB7zCB7DAJBgNVHRMEAjAAMDoGDCsGAQQBkggJAYJrAQQqDChSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIEFSTSA2NCBCZXRhMBoGDCsGAQQBkggJAYJr ++AgQKDAg5LjYgQmV0YTAZBgwrBgEEAZIICQGCawMECQwHYWFyY2g2NDAsBgwrBgEE ++AZIICQGCawQEHAwacmhlbC05LHJoZWwtOS1iZXRhLWFhcmNoNjQwHQYDVR0OBBYE ++FGHqILU1fK9nZDr/awjmEHjQzR+VMB8GA1UdIwQYMBaAFJb9uxxAQP9AhK2yHwsm ++wcNqb9Z8MA0GCSqGSIb3DQEBCwUAA4ICAQBiaXwTsDt1Kz79ZJ3TnNDuX3IntXuS ++DxIGAhpgJ+ynaSULh8xL6pq5L6EtYnVzpO6T+j2ADbJlLkIRV0fMD6MMZo4YQtHH ++NofoNgJoYI4uXcCKYS2vIUw+0Br7qx8BPTb5jP+VRl9LU8W299nYOTp+vY7GQ0Ny ++hT66G+FJfo5CqHZpMTGgJbpjoP3DMpXZcARBnjQ0LhvjvcalGmPP4//tcPNwft6r ++ei8fxBvpmCXDS9/vXwiEf6jEidqq1Q6bCdL20Y1ZPY13oUEYFqrf8PhexlV1yoD4 ++F4gEbVHPQ4yvH3D6xIAFE4959+H+dgMfXqn9gkUvnTMdyfzcUYGLTAib3zb4eW/J ++anzwfBAcssBzjU1v/txWMRlZI1GJFNtboAixnRksj1epE848J3bjtiw3R/Z5grFn ++dieJwjfM4AEDrpRmA5tDnv5z73k1djJbacL7fTIyTuSnDbjH2J5PtCAvWTLYq/kP ++h8E3sJ9zXP2nJMBRgQiZJY98bPKLT63ngRScI+CZs1fLvaoCq0o+qkcfnDEja3aH ++TQYXHVZblA4TYnD8Vh8gKwCt8+1WF5C9BGcMmKvozuuIaIJgT21V+DLzfTESpZz7 ++lcPKk/3dBFtFGOdA4SQ4o/dxItJ0Eay1SlOI9xL9KgTNqv6ftA+9kxZ0MSPwO7eG ++b5Am4gNTK734uQ== ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/419.pem b/repos/system_upgrade/common/files/prod-certs/9.6/419.pem +new file mode 100644 +index 00000000..e2d3ee5b +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/419.pem +@@ -0,0 +1,36 @@ ++-----BEGIN CERTIFICATE----- ++MIIGVzCCBD+gAwIBAgIJALDxRLt/tVEhMA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIwNVoXDTQ0MDgx ++MjE5MDIwNVowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFtkN2E2ZDhi ++Mi0yZjMzLTRhYzMtYmM5Ni1mMjU5MTNmZTQxNWNdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB4DCB3TAJBgNVHRMEAjAAMDUGDCsGAQQBkggJAYMjAQQlDCNSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIEFSTSA2NDAVBgwrBgEEAZIICQGDIwIEBQwD ++OS42MBkGDCsGAQQBkggJAYMjAwQJDAdhYXJjaDY0MCcGDCsGAQQBkggJAYMjBAQX ++DBVyaGVsLTkscmhlbC05LWFhcmNoNjQwHQYDVR0OBBYEFGHqILU1fK9nZDr/awjm ++EHjQzR+VMB8GA1UdIwQYMBaAFJb9uxxAQP9AhK2yHwsmwcNqb9Z8MA0GCSqGSIb3 ++DQEBCwUAA4ICAQCJqWcTJezGVGxsNvFkbsrvbHhJBuBMeDZZuOLaXaQVyfNwYRS2 ++2k/oUhhQQMfiDiaLkz7yz0Zw5clC/K5G6Sg9+nWDA57lsZuNV5CnSBYOJf2jY2fK ++ue/1M75Y4fJAKtBxpvkFaIaKyMQ/0VC67OFYtbBZEOuwIpQh9aPFHnrh2WnpcUvJ ++B93O0fsRjHK30E7jF8ncNmhevMLvVlxH0JjfbvcU3dGG964K41tFiozshvnAGFce ++kFzxVVYQL3ZKycqonwFr3BbzgKwx5EXUFBg/ax694aijeeVA6yuQXWJvV42IjUeW ++vn+dvRrHh2fv4MXuyc+oljbXaEZE7m9gtWBtUEBHqWoQz6rQ25uZylnK+SDWE5bt ++xM+1qGUSf90VvyFO3fu1qeVVr0LbnMAgO9YnJjLRQax0mgj3tZTRvM72W4hfBy36 ++ndYnJE2le5xYWVl1Hd29dil70cokj5hN8nQI9eStfcOvs9Vw2ngIL/H3+QTRS/NO ++l7MHQXbriLAaHavED6B50dEfw8pQXybEju4Rs+nDgm5hdE7FjbVflVQejSjyHIMd ++AQnwrDSMPRezCJFHQeB0t7oaHpAHECc2zBpvcvy7qCN2Z08h6jdzfrp15UDkHEcy ++Qa9dtYRUthI3pjGGu7WTPwX9y0veot3EZRnEzeIprIsHcMKfmkMg4HRJ3A== ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/433.pem b/repos/system_upgrade/common/files/prod-certs/9.6/433.pem +new file mode 100644 +index 00000000..ac588c1c +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/433.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGaTCCBFGgAwIBAgIJALDxRLt/tVE5MA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIyNFoXDTQ0MDgx ++MjE5MDIyNFowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFs4NzcwNzQ4 ++MS02MGEwLTQwYTUtYWVhMi0xNjNmODUyMzI3ZTFdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB8jCB7zAJBgNVHRMEAjAAMEEGDCsGAQQBkggJAYMxAQQxDC9SZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIElCTSB6IFN5c3RlbXMgQmV0YTAaBgwrBgEE ++AZIICQGDMQIECgwIOS42IEJldGEwFwYMKwYBBAGSCAkBgzEDBAcMBXMzOTB4MCoG ++DCsGAQQBkggJAYMxBAQaDBhyaGVsLTkscmhlbC05LWJldGEtczM5MHgwHQYDVR0O ++BBYEFGHqILU1fK9nZDr/awjmEHjQzR+VMB8GA1UdIwQYMBaAFJb9uxxAQP9AhK2y ++HwsmwcNqb9Z8MA0GCSqGSIb3DQEBCwUAA4ICAQC57eNKMpTQuIEEoYXkhD0oYkgD ++RzDFyqKZgyK0IdOy6t0d9GcMY/nI/uYQltUC+HWBUJWYkHc84xjfP3ITfuHWP8KP ++3qdXLPwTDcNVUGtLgXIfEz4FEM4OVwfM2X0jIcLfkDmZzffWjHgBpAUfZM6fBvXl ++soPJ+s4/vIUFNbVtcJh9iw4glt/GFBOX/bNPV9kniAAYuyabW43X7GxfREJY18Db +++Fv7c+z2eM4fQFpLkSEZwsNN68G4OHDC7tWsYtCRocipWGs6lN5MBNXC0q90ds5O ++kOLRfHKOLFqbZnBNdgSOlsf+ENH3exUhoDvZE0gnAVALABVv6PCtsHn2rPLonsrB ++l9ZKqCVVDpQMDXmZC79XKB0nVrNQ7qYorCVnYqnTAkuvw4BuXpKASaSCDSRWLQN0 ++H89phUM64VnyPD5pBTw+YJURDm8cwD5e6HaXhKzG1ca9PWL+RVxedB4Rl2VG00fE ++QUBbHZktH+H1P3MtqALB7IUav4IuBgdF27W55GExCgshRuyV6/VHmYiD+L52XxCH ++71mdWTp6JR1/hMYKPLhc5/ESBoMpqMXa4UWIOtMWiafWaDS4Cib+uyIIzCgqW8ee ++t+yQtCs7MUUd6t87XP7/TTQJe6e0JsyDnME9br0E4g57Y8cXjOILGg/ihqBFOGt1 ++vhbX7w/YRjVpwJhi9w== ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/479.pem b/repos/system_upgrade/common/files/prod-certs/9.6/479.pem +new file mode 100644 +index 00000000..c2bac3ee +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/479.pem +@@ -0,0 +1,36 @@ ++-----BEGIN CERTIFICATE----- ++MIIGVTCCBD2gAwIBAgIJALDxRLt/tVEkMA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIwNVoXDTQ0MDgx ++MjE5MDIwNVowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFtjZWRlZTRi ++My0xOGFhLTQwMzMtYjE3OS01OTkwMjk2OGFkZjhdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB3jCB2zAJBgNVHRMEAjAAMDUGDCsGAQQBkggJAYNfAQQlDCNSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIHg4Nl82NDAVBgwrBgEEAZIICQGDXwIEBQwD ++OS42MBgGDCsGAQQBkggJAYNfAwQIDAZ4ODZfNjQwJgYMKwYBBAGSCAkBg18EBBYM ++FHJoZWwtOSxyaGVsLTkteDg2XzY0MB0GA1UdDgQWBBRh6iC1NXyvZ2Q6/2sI5hB4 ++0M0flTAfBgNVHSMEGDAWgBSW/bscQED/QIStsh8LJsHDam/WfDANBgkqhkiG9w0B ++AQsFAAOCAgEADoQWjROe9jPuYIB5cW7URXgDPVK3cpGnlKxEINdXT+dL7N2qNijy ++BcV0+SCHmswZ+F7OTozyGzGbJCrSHZrvF2lp2L8YddvkIFsWqrPkseU/0/oog5Qf ++ULA5WzV12u0Ra/DWinhUq6NZWLAt/FvJ7+WHPdJ7B0WsiA751l7crvfKfen93Xzb ++0eakHrotcPi9YH/Jez8xjs4Wc3ra/7CbLqpsHuWzgzwJabiuLaf5PK95VVedzQIx ++lT+N6JydFIkXkofQJwTptPTh9lDbZDe33/dg5zX3l9CAQK7JYZKYoUzLirM2LO7s ++TGejW1mKGB+O23bQBGRkLoD4kbY17UMCFcKD7mZSO6laoOBOk8NYUxTDjT4e3cUB ++dHw5YVrj+BSHzgOGpc1KrmuBiOWZrZf4iaFuz4Kr88tL6TT6IH5UmfP3fuvvMyXs ++OWqTAfr/CPeJjLhjmbEagkS0kpgkyXodY8sq2Ph5vpn0o1QYNfy6KRtD/m6YaF7G ++SDkWEY5li338SROIFV6X8lKEzHMfQZzhqQWoJWQlFuAdByKrxz8x1RJZTkIT82h6 ++uM/GO3v5xT5UXXa2x1X0JtS9rPGdnmAKQLJJz07s+2WCRqCFuBxJsV+aWCRLsab4 ++jpo1NG0RH0KorjvBBMLx8bVSbl4YFJdOcomlRVrsC2iMUwl+PH5Ah4g= ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/486.pem b/repos/system_upgrade/common/files/prod-certs/9.6/486.pem +new file mode 100644 +index 00000000..e130d5dc +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/486.pem +@@ -0,0 +1,37 @@ ++-----BEGIN CERTIFICATE----- ++MIIGZDCCBEygAwIBAgIJALDxRLt/tVE6MA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIyNFoXDTQ0MDgx ++MjE5MDIyNFowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFsyMTM1ODk1 ++Yi1mMDRiLTRlNjUtOWYzMC04MmRlYmQ0Njc0NjNdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB7TCB6jAJBgNVHRMEAjAAMDoGDCsGAQQBkggJAYNmAQQqDChSZWQgSGF0 ++IEVudGVycHJpc2UgTGludXggZm9yIHg4Nl82NCBCZXRhMBoGDCsGAQQBkggJAYNm ++AgQKDAg5LjYgQmV0YTAYBgwrBgEEAZIICQGDZgMECAwGeDg2XzY0MCsGDCsGAQQB ++kggJAYNmBAQbDBlyaGVsLTkscmhlbC05LWJldGEteDg2XzY0MB0GA1UdDgQWBBRh ++6iC1NXyvZ2Q6/2sI5hB40M0flTAfBgNVHSMEGDAWgBSW/bscQED/QIStsh8LJsHD ++am/WfDANBgkqhkiG9w0BAQsFAAOCAgEAHhaEBX5fhB2zweFT0SuLB3OB11aE3Tjy ++q0dNxm8t3d5glgtratmAkPD+6Ct0gkdoGJ8GcBsFVzzM2ig236YOy8dCPVWBzLtd ++Oni5DpjSqnMX6yq4PuSViF1w+9pCKPJqzQK/u/F0njkwdu0mAwc1fkiCR0B6oB7s ++m1rHhuyC4PkAj5RYQ6+M4MpGfce0HSpUCzlnAlHYgjvmT3qCUvlEYLPg4/Z+wihZ ++1xdhhhoLNi43IdfmFQlTSNZqTwLB780qzHzi+UYgWg7wflTn8m1LAOlad5HWJFnE ++y6JnX+c+vfzvxFBSZABKJsZY/YKIAV14g42XL8zhIpJHtdYnUaveo1M90UAvSECP ++RAnPUIKWM1VYKfa2PpEC2/157KOQ4y7BUrAUlqs1qh8FoGCZYHMRmgYqHoycIvw+ ++gs1gH77O9EyOMMjwyQqBUnzylJfhjkEgINDIGbPEiQpI33TBniw5yMRZ74XWOoi3 ++rOIiaYxHBDpJ25LwbZsJOQUPmIKBTOpLK9N4IK7UvA7O8HCEEJz2+VLVf2svaoU1 ++fd7MUYh9aCjEocKRQknxScJLVBXcFRy0I+tfVQwkcLqWCOrp3qpNmYwhC+C0vYtR ++/LZ58vf60+m+mKUmEJWF6X7QGFZptsc0ERme6sE1E41iNAIq3BsBMU/hQIVP50k4 ++T3KefQomWk4= ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/prod-certs/9.6/72.pem b/repos/system_upgrade/common/files/prod-certs/9.6/72.pem +new file mode 100644 +index 00000000..35927fbc +--- /dev/null ++++ b/repos/system_upgrade/common/files/prod-certs/9.6/72.pem +@@ -0,0 +1,36 @@ ++-----BEGIN CERTIFICATE----- ++MIIGVjCCBD6gAwIBAgIJALDxRLt/tVEjMA0GCSqGSIb3DQEBCwUAMIGuMQswCQYD ++VQQGEwJVUzEXMBUGA1UECAwOTm9ydGggQ2Fyb2xpbmExFjAUBgNVBAoMDVJlZCBI ++YXQsIEluYy4xGDAWBgNVBAsMD1JlZCBIYXQgTmV0d29yazEuMCwGA1UEAwwlUmVk ++IEhhdCBFbnRpdGxlbWVudCBQcm9kdWN0IEF1dGhvcml0eTEkMCIGCSqGSIb3DQEJ ++ARYVY2Etc3VwcG9ydEByZWRoYXQuY29tMB4XDTI0MDgxMjE5MDIwNVoXDTQ0MDgx ++MjE5MDIwNVowRDFCMEAGA1UEAww5UmVkIEhhdCBQcm9kdWN0IElEIFs0ZDhmOTky ++Yy04NDBjLTQ4MzYtODVkOS0zYWI5YjA1ZjViY2FdMIICIjANBgkqhkiG9w0BAQEF ++AAOCAg8AMIICCgKCAgEAxj9J04z+Ezdyx1U33kFftLv0ntNS1BSeuhoZLDhs18yk ++sepG7hXXtHh2CMFfLZmTjAyL9i1XsxykQpVQdXTGpUF33C2qBQHB5glYs9+d781x ++8p8m8zFxbPcW82TIJXbgW3ErVh8vk5qCbG1cCAAHb+DWMq0EAyy1bl/JgAghYNGB ++RvKJObTdCrdpYh02KUqBLkSPZHvo6DUJFN37MXDpVeQq9VtqRjpKLLwuEfXb0Y7I ++5xEOrR3kYbOaBAWVt3mYZ1t0L/KfY2jVOdU5WFyyB9PhbMdLi1xE801j+GJrwcLa ++xmqvj4UaICRzcPATP86zVM1BBQa+lilkRQes5HyjZzZDiGYudnXhbqmLo/n0cuXo ++QBVVjhzRTMx71Eiiahmiw+U1vGqkHhQNxb13HtN1lcAhUCDrxxeMvrAjYdWpYlpI ++yW3NssPWt1YUHidMBSAJ4KctIf91dyE93aStlxwC/QnyFsZOmcEsBzVCnz9GmWMl ++1/6XzBS1yDUqByklx0TLH+z/sK9A+O2rZAy1mByCYwVxvbOZhnqGxAuToIS+A81v ++5hCjsCiOScVB+cil30YBu0cH85RZ0ILNkHdKdrLLWW4wjphK2nBn2g2i3+ztf+nQ ++ED2pQqZ/rhuW79jcyCZl9kXqe1wOdF0Cwah4N6/3LzIXEEKyEJxNqQwtNc2IVE8C ++AwEAAaOB3zCB3DAJBgNVHRMEAjAAMDsGCysGAQQBkggJAUgBBCwMKlJlZCBIYXQg ++RW50ZXJwcmlzZSBMaW51eCBmb3IgSUJNIHogU3lzdGVtczAUBgsrBgEEAZIICQFI ++AgQFDAM5LjYwFgYLKwYBBAGSCAkBSAMEBwwFczM5MHgwJAYLKwYBBAGSCAkBSAQE ++FQwTcmhlbC05LHJoZWwtOS1zMzkweDAdBgNVHQ4EFgQUYeogtTV8r2dkOv9rCOYQ ++eNDNH5UwHwYDVR0jBBgwFoAUlv27HEBA/0CErbIfCybBw2pv1nwwDQYJKoZIhvcN ++AQELBQADggIBANOzzfUKjlJsgJWUryjKfzPYISkCZXauHqBcST4N1HP1GA8tmMXi ++bgh14+l7ZO8EloFvEGANsX2ffMfauuJx2NV6ks07NHWuM7W9kghDe5ZccrJCz88E ++1zdvyWae5oSvTwfnvR/b63duOhs88u7NCQN2+n+pmJA0dPWbGTaIp3n4kJg8YKnd ++O8Nct2doNS+1rrLpRmVKQy/E7fAXQzt1Bxqs2hORqbgffiSE9a+4akitY97GXRBm ++nOO2DkyEW0xPtdy3zDvL7o7b1B0gdMOwqEolgGuDFsrfD+7ofpwOWjS+83gF6hMP ++5YVD3sugu6xzCx6y7Yl/BfX4qvvT4YHtYob5rQA/t7JY4u4ryadkUxQLMEccMsyS ++pKZQ8KFC5ZNJVK/ievkcBCsBlulbRftVJGF3TA2Hl2aBuMhGdUR5y/Q89WHUzeV6 ++U6AVzyEsvIJguswvKvFAyHwNuViCfFCkjNkJolvd/g03OSy1A7piQaU20QyltWmx ++FILCR/DBUbCWIzKTfkLr93TbV2b1AH9uRW1SAGrftuevVXrNemWIwq1x/VgjDm3o ++nk637pnEfZZzX8T2gO5z5yjlP0PR4s7hKkmp3TmAeG9015pFxPnD3AMI261srQ+c ++KZBdIc5UseQo/4KvRKZ1CzxPh0WjJCzc/C/TKzIlEdELq/rnKGuqHKB9 ++-----END CERTIFICATE----- +diff --git a/repos/system_upgrade/common/files/upgrade_paths.json b/repos/system_upgrade/common/files/upgrade_paths.json +index 5399f148..cc9dcdb5 100644 +--- a/repos/system_upgrade/common/files/upgrade_paths.json ++++ b/repos/system_upgrade/common/files/upgrade_paths.json +@@ -1,19 +1,17 @@ + { + "default": { +- "7.9": ["8.8", "8.10"], +- "8.8": ["9.2"], +- "8.10": ["9.4", "9.5"], ++ "7.9": ["8.10"], ++ "8.10": ["9.4", "9.5", "9.6"], + "9.6": ["10.0"], +- "7": ["8.8", "8.10"], +- "8": ["9.2", "9.4", "9.5"], ++ "7": ["8.10"], ++ "8": ["9.4", "9.5", "9.6"], + "9": ["10.0"] + }, + "saphana": { +- "7.9": ["8.10", "8.8"], +- "7": ["8.10", "8.8"], +- "8.8": ["9.2"], +- "8.10": ["9.4"], +- "8": ["9.4", "9.2"], ++ "7.9": ["8.10"], ++ "7": ["8.10"], ++ "8.10": ["9.6", "9.4"], ++ "8": ["9.6", "9.4"], + "9.6": ["10.0"], + "9": ["10.0"] + } +diff --git a/repos/system_upgrade/common/libraries/config/version.py b/repos/system_upgrade/common/libraries/config/version.py +index 152d9112..d710a647 100644 +--- a/repos/system_upgrade/common/libraries/config/version.py ++++ b/repos/system_upgrade/common/libraries/config/version.py +@@ -18,7 +18,7 @@ OP_MAP = { + _SUPPORTED_VERSIONS = { + # Note: 'rhel-alt' is detected when on 'rhel' with kernel 4.x + '7': {'rhel': ['7.9'], 'rhel-alt': [], 'rhel-saphana': ['7.9']}, +- '8': {'rhel': ['8.8', '8.10'], 'rhel-saphana': ['8.8', '8.10']}, ++ '8': {'rhel': ['8.10'], 'rhel-saphana': ['8.10']}, + '9': {'rhel': ['9.4', '9.5', '9.6'], 'rhel-saphana': ['9.4', '9.6']}, + } + +-- +2.47.0 + diff --git a/SOURCES/0040-spec-drop-the-etc-leapp-actor_confid.d-dir.patch b/SOURCES/0040-spec-drop-the-etc-leapp-actor_confid.d-dir.patch new file mode 100644 index 0000000..44aaa8c --- /dev/null +++ b/SOURCES/0040-spec-drop-the-etc-leapp-actor_confid.d-dir.patch @@ -0,0 +1,29 @@ +From f50e3474a619ed338c2514933303320d986e6ffe Mon Sep 17 00:00:00 2001 +From: Petr Stodulka <pstodulk@redhat.com> +Date: Thu, 14 Nov 2024 16:26:55 +0100 +Subject: [PATCH 40/40] spec: drop the /etc/leapp/actor_confid.d dir + +The directory should be provided by the framework. leapp-repository +should provide only a content inside if any present. +--- + packaging/leapp-repository.spec | 4 +--- + 1 file changed, 1 insertion(+), 3 deletions(-) + +diff --git a/packaging/leapp-repository.spec b/packaging/leapp-repository.spec +index 2bb52505..6676d907 100644 +--- a/packaging/leapp-repository.spec ++++ b/packaging/leapp-repository.spec +@@ -250,9 +250,7 @@ install -m 0755 -d %{buildroot}%{_sysconfdir}/leapp/files/ + install -m 0644 etc/leapp/transaction/* %{buildroot}%{_sysconfdir}/leapp/transaction + install -m 0644 etc/leapp/files/* %{buildroot}%{_sysconfdir}/leapp/files + +-# Actor configuration dir +-install -m 0755 -d %{buildroot}%{_sysconfdir}/leapp/actor_conf.d/ +-# uncomment to install existing configs ++# uncomment to install existing configs if any exists + #install -m 0644 etc/leapp/actor_conf.d/* %%{buildroot}%%{_sysconfdir}/leapp/actor_conf.d + + # install CLI commands for the leapp utility on the expected path +-- +2.47.0 + diff --git a/SOURCES/0041-feat-net-naming-scheme-enable-by-default.patch b/SOURCES/0041-feat-net-naming-scheme-enable-by-default.patch new file mode 100644 index 0000000..9400d4e --- /dev/null +++ b/SOURCES/0041-feat-net-naming-scheme-enable-by-default.patch @@ -0,0 +1,74 @@ +From 3c3421a0f155fe3bdfaee74c5345e86874684a09 Mon Sep 17 00:00:00 2001 +From: Michal Hecko <mhecko@redhat.com> +Date: Tue, 19 Nov 2024 10:56:50 +0100 +Subject: [PATCH] feat(net-naming-scheme): enable by default + +This commit enables the use of net.naming-scheme for 8>9 upgrades by +default. The previously used environmental variablel +LEAPP_USE_NET_NAMING_SCHEMES is replaced with +LEAPP_DISABLE_NET_NAMING_SCHEMES with inverse semantics. +--- + .../libraries/persistentnetnamesconfig.py | 11 ++++++++--- + .../libraries/emit_net_naming.py | 4 ++-- + .../tests/test_emit_net_naming_scheme.py | 4 ++-- + 3 files changed, 12 insertions(+), 7 deletions(-) + +diff --git a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +index b2c7f5ff..c90d13f2 100644 +--- a/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py ++++ b/repos/system_upgrade/common/actors/persistentnetnamesconfig/libraries/persistentnetnamesconfig.py +@@ -39,9 +39,14 @@ def generate_link_file(interface): + + @suppress_deprecation(InitrdIncludes) + def process(): +- if get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' and version.get_target_major_version() == '9': +- # We can use this only for 8>9, for now +- api.current_logger().info('Skipping generation of .link files renaming NICs as LEAPP_USE_NET_NAMING_SCHEMES=1') ++ are_net_schemes_enabled = get_env('LEAPP_DISABLE_NET_NAMING_SCHEMES', '0') != '1' ++ is_upgrade_8to9 = version.get_target_major_version() == '9' ++ ++ if are_net_schemes_enabled and is_upgrade_8to9: ++ # For 8>9 we are using net.naming_scheme kernel arg by default - do not generate link files ++ msg = ('Skipping generation of .link files renaming NICs as net.naming-scheme ' ++ '{LEAPP_DISABLE_NET_NAMING_SCHEMES != 1} is enabled and upgrade is 8>9') ++ api.current_logger().info(msg) + return + + if get_env('LEAPP_NO_NETWORK_RENAMING', '0') == '1': +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +index 726bb459..bab62a56 100644 +--- a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/libraries/emit_net_naming.py +@@ -44,9 +44,9 @@ def is_net_scheme_compatible_with_current_cmdline(): + + + def emit_msgs_to_use_net_naming_schemes(): +- is_env_var_set = get_env('LEAPP_USE_NET_NAMING_SCHEMES', '0') == '1' ++ is_feature_enabled = get_env('LEAPP_DISABLE_NET_NAMING_SCHEMES', '0') != '1' + is_upgrade_8to9 = version.get_target_major_version() == '9' +- is_net_naming_enabled_and_permitted = is_env_var_set and is_upgrade_8to9 ++ is_net_naming_enabled_and_permitted = is_feature_enabled and is_upgrade_8to9 + if not is_net_naming_enabled_and_permitted: + return + +diff --git a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py +index 7a5eeba5..acf72241 100644 +--- a/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py ++++ b/repos/system_upgrade/el8toel9/actors/emit_net_naming_scheme/tests/test_emit_net_naming_scheme.py +@@ -51,11 +51,11 @@ def test_is_net_scheme_compatible_with_current_cmdline(monkeypatch, kernel_args, + ] + ) + def test_emit_msgs_to_use_net_naming_schemes(monkeypatch, is_net_scheme_enabled, is_current_cmdline_compatible): +- envvar_value = '1' if is_net_scheme_enabled else '0' ++ envvar_value = '0' if is_net_scheme_enabled else '1' + + mocked_actor = CurrentActorMocked(src_ver='8.10', + dst_ver='9.5', +- envars={'LEAPP_USE_NET_NAMING_SCHEMES': envvar_value}) ++ envars={'LEAPP_DISABLE_NET_NAMING_SCHEMES': envvar_value}) + monkeypatch.setattr(api, 'current_actor', mocked_actor) + + monkeypatch.setattr(api, 'produce', produce_mocked()) +-- +2.47.0 + diff --git a/SPECS/leapp-repository.spec b/SPECS/leapp-repository.spec index 54658b2..fa4506d 100644 --- a/SPECS/leapp-repository.spec +++ b/SPECS/leapp-repository.spec @@ -53,13 +53,13 @@ py2_byte_compile "%1" "%2"} Epoch: 1 Name: leapp-repository Version: 0.21.0 -Release: 2%{?dist}.elevate.4 +Release: 4%{?dist}.elevate.1 Summary: Repositories for leapp License: ASL 2.0 URL: https://oamg.github.io/leapp/ Source0: https://github.com/oamg/%{name}/archive/v%{version}.tar.gz#/%{name}-%{version}.tar.gz -Source1: deps-pkgs-10.tar.gz +Source1: deps-pkgs-11.tar.gz # NOTE: Our packages must be noarch. Do no drop this in any way. BuildArch: noarch @@ -67,7 +67,47 @@ BuildArch: noarch ### PATCHES HERE # Patch0001: filename.patch Patch0001: 0001-rhui-alibaba-add-ARM-RHEL8-and-RHEL9-setup-entries-1.patch -Patch0010: leapp-repository-0.21.0-elevate.patch +Patch0002: 0002-don-t-require-all-versions-to-be-defined-for-obsolet.patch +Patch0003: 0003-Add-RHEL-10.0-prod-certs.patch +Patch0004: 0004-properly-scope-try-except-when-loading-obsoleted-key.patch +Patch0005: 0005-Update-references-from-master-branch-to-main.patch +Patch0006: 0006-ReadOfKernelArgsError-fix-the-error.patch +Patch0007: 0007-pylint-exclude-rule-too-many-positional-arguments-co.patch +Patch0008: 0008-pam_userdb-migrate-backend-database.patch +Patch0009: 0009-Replace-mirror.centos.org-with-vault.centos.org-Cent.patch +Patch0010: 0010-kernelcmdlineconfig-Add-Report-to-produces-tuple.patch +Patch0011: 0011-kernelcmdlineconfig-Use-args-from-first-entry-when-m.patch +Patch0012: 0012-check_microarch-refactor-to-handle-possible-future-r.patch +Patch0013: 0013-check_microarch-add-rhel10-requirements.patch +Patch0014: 0014-Skip-checking-files-under-.-directory-hash-dir.patch +Patch0015: 0015-lib-overlay-cap-the-max-size-of-disk-images.patch +Patch0016: 0016-Raise-proper-error-when-ModelViolationError-occurs.patch +Patch0017: 0017-InhibitWhenLuks-simplify-the-logic.patch +Patch0018: 0018-StorageScanner-Add-parent-device-name-to-lsblk.patch +Patch0019: 0019-LuksScanner-Add-LUKS-dump-scanner-and-models.patch +Patch0020: 0020-InhibitWhenLuks-allow-upgrades-for-LUKS2-bound-to-Cl.patch +Patch0021: 0021-Rename-inhibitwhenluks-actor-to-checkluks.patch +Patch0022: 0022-Fix-IPU-being-blocked-by-resource-limitations.patch +Patch0023: 0023-feature-add-possibility-to-use-net.naming-scheme.patch +Patch0024: 0024-prevent-the-feature-for-being-used-outside-8-9.patch +Patch0025: 0025-fix-condition-on-when-net-naming-is-emitted.patch +Patch0026: 0026-scangrubdevpartitionlayout-Skip-warning-msgs.patch +Patch0027: 0027-Workaround-for-ARM-Upgrades-from-RHEL8-to-RHEL9.5.patch +Patch0028: 0028-Add-el9toel10-actor-to-handle-symlink-directory-with.patch +Patch0029: 0029-Expand-on-the-actor-docstring-for-the-el8-el9-rubyge.patch +Patch0030: 0030-data-update-data-files.patch +Patch0031: 0031-Packaging-Require-leapp-framework-6.x-update-leapp-d.patch +Patch0032: 0032-spec-create-etc-leapp-actor_conf.d.patch +Patch0033: 0033-spec-drop-.gitkeep-files-from-the-RPM.patch +Patch0034: 0034-cli-load-actor-configuration.patch +Patch0035: 0035-configs-common-introduce-RHUI-configuration.patch +Patch0036: 0036-check_rhui-read-RHUI-configuration.patch +Patch0037: 0037-testutils-add-support-for-configs.patch +Patch0038: 0038-userspacegen-rhui-remove-repofiles-only-if-now-owned.patch +Patch0039: 0039-Enable-IPU-for-EL-9.6-and-drop-EL-8.8-9.2.patch +Patch0040: 0040-spec-drop-the-etc-leapp-actor_confid.d-dir.patch +Patch0041: 0041-feat-net-naming-scheme-enable-by-default.patch +Patch0100: leapp-repository-0.21.0-elevate.patch %description @@ -123,7 +163,7 @@ Requires: leapp-repository-dependencies = %{leapp_repo_deps} # IMPORTANT: this is capability provided by the leapp framework rpm. # Check that 'version' instead of the real framework rpm version. -Requires: leapp-framework >= 5.0 +Requires: leapp-framework >= 6.0 # Since we provide sub-commands for the leapp utility, we expect the leapp # tool to be installed as well. @@ -214,6 +254,12 @@ Requires: dracut Requires: NetworkManager-libnm Requires: python3-gobject-base +%endif + +%if 0%{?rhel} && 0%{?rhel} == 9 +############# RHEL 9 dependencies (when the source system is RHEL 9) ########## +# Required to convert pam_userdb database from BerkeleyDB to GDBM +Requires: libdb-utils %endif ################################################## # end requirement @@ -229,9 +275,49 @@ Requires: python3-gobject-base %setup -q -n %{name}-%{version} -D -T -a 1 # APPLY PATCHES HERE -# %%patch0001 -p1 -%patch0001 -p1 -%patch0010 -p1 +# %%patch -P 0001 -p1 +%patch -P 0001 -p1 +%patch -P 0002 -p1 +%patch -P 0003 -p1 +%patch -P 0004 -p1 +%patch -P 0005 -p1 +# %patch -P 0006 -p1 # the patch is a part of Vendors support +%patch -P 0007 -p1 +%patch -P 0008 -p1 +%patch -P 0009 -p1 +%patch -P 0010 -p1 +%patch -P 0011 -p1 +%patch -P 0012 -p1 +%patch -P 0013 -p1 +%patch -P 0014 -p1 +%patch -P 0015 -p1 +%patch -P 0016 -p1 +%patch -P 0017 -p1 +%patch -P 0018 -p1 +%patch -P 0019 -p1 +%patch -P 0020 -p1 +%patch -P 0021 -p1 +%patch -P 0022 -p1 +%patch -P 0023 -p1 +%patch -P 0024 -p1 +%patch -P 0025 -p1 +%patch -P 0026 -p1 +%patch -P 0027 -p1 +%patch -P 0028 -p1 +%patch -P 0029 -p1 +%patch -P 0030 -p1 +%patch -P 0031 -p1 +%patch -P 0032 -p1 +%patch -P 0033 -p1 +%patch -P 0034 -p1 +%patch -P 0035 -p1 +%patch -P 0036 -p1 +%patch -P 0037 -p1 +%patch -P 0038 -p1 +# %patch -P 0039 -p1 # ELevate provides own upgrade_paths.json and version.py +%patch -P 0040 -p1 +%patch -P 0041 -p1 +%patch -P 0100 -p1 %build @@ -249,6 +335,9 @@ install -m 0755 -d %{buildroot}%{_sysconfdir}/leapp/files/ install -m 0644 etc/leapp/transaction/* %{buildroot}%{_sysconfdir}/leapp/transaction install -m 0644 etc/leapp/files/* %{buildroot}%{_sysconfdir}/leapp/files +# uncomment to install existing configs if any exists +#install -m 0644 etc/leapp/actor_conf.d/* %%{buildroot}%%{_sysconfdir}/leapp/actor_conf.d + # install CLI commands for the leapp utility on the expected path install -m 0755 -d %{buildroot}%{leapp_python_sitelib}/leapp/cli/ cp -r commands %{buildroot}%{leapp_python_sitelib}/leapp/cli/ @@ -267,6 +356,9 @@ find %{buildroot}%{repositorydir}/common -name "test.py" -delete rm -rf `find %{buildroot}%{repositorydir} -name "tests" -type d` find %{buildroot}%{repositorydir} -name "Makefile" -delete find %{buildroot} -name "*.py.orig" -delete +# .gitkeep file is used to have a directory in the repo. but we do not want these +# files in the resulting RPM +find %{buildroot} -name .gitkeep -delete for DIRECTORY in $(find %{buildroot}%{repositorydir}/ -mindepth 1 -maxdepth 1 -type d); do @@ -289,12 +381,17 @@ done; %doc README.md %license LICENSE %dir %{_sysconfdir}/leapp/transaction -%exclude %dir %{_sysconfdir}/leapp/files +%dir %{_sysconfdir}/leapp/files %dir %{leapp_datadir} %dir %{repositorydir} %dir %{custom_repositorydir} %dir %{leapp_python_sitelib}/leapp/cli/commands -%exclude %config %{_sysconfdir}/leapp/files/* +%config %{_sysconfdir}/leapp/files/* +%exclude %{_sysconfdir}/leapp/files/device_driver_deprecation_data.json +%exclude %{_sysconfdir}/leapp/files/pes-events.json +%exclude %{_sysconfdir}/leapp/files/repomap.json +# uncomment to package installed configs +#%%config %%{_sysconfdir}/leapp/actor_conf.d/* %{_sysconfdir}/leapp/repos.d/* %{_sysconfdir}/leapp/transaction/* %{repositorydir}/* @@ -305,10 +402,38 @@ done; # no files here %changelog +* Mon Nov 25 2024 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-4.elevate.1 +- Skip patches: + - 0006-ReadOfKernelArgsError-fix-the-error.patch + - 0039-Enable-IPU-for-EL-9.6-and-drop-EL-8.8-9.2.patch +- Exclude data files (from /etc/leapp/files) which are part of leapp-data-*: device_driver_deprecation_data.json, pes-events.json, repomap.json + +* Tue Nov 19 2024 Matej Matuska <mmatuska@redhat.com> - 0.21.0-4 +- Use net.naming-scheme by default +- Resolves: RHEL-23473 + * Tue Nov 19 2024 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-2.elevate.4 - Update ELevate patch: - extend update path for 8 and 8.10 with 9.5 target +* Mon Nov 18 2024 Petr Stodulka <pstodulk@redhat.com> - 0.21.0-3 +- Introduce upgrade path 8.10 -> 9.6 +- Require leapp-framework 6.0+ +- Update leapp-deps package to satisfy leapp-framework-dependencies 6 +- Add possibility to use net.naming-scheme during the upgrade +- Cap max size of the sparse files to 1TiB for storage with large amount of free space +- Enable upgrade for systems with LUKS bound to Clevis with TPM 2.0 token +- Adjust resource limitations for leapp to be able to perform the upgrade +- Fix problems with the bootloader when upgrading to RHEL 9.6 on ARM +- Fix the report when handling broken parsing of kernel cmdline +- Generate proper error message instead of ModelViolationError when parsing invalid repository definition +- Handle default kernel cmdline when multiple boot entries for the default kernel are defined +- Introduce a possibility to configure leapp actors covering RHUI on clouds +- Skip checking of (PKI) `directory-hash` dir to speedup the upgrade process and clean logs +- Update leapp upgrade data files +- Resolves: RHEL-67621, RHEL-57064, RHEL-56251, RHEL-50686, RHEL-41193 +- Resolves: RHEL-34570, RHEL-26459, RHEL-23473, RHEL-16881, RHEL-3294 + * Mon Oct 07 2024 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-2.elevate.3 - Update ELevate patch: - remove '9.5' target from upgrade path until it is not released @@ -317,7 +442,7 @@ done; * Thu Aug 29 2024 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-2.elevate.2 - Update ELevate patch: - make sure 'efi_finalization_fix' step runs before 'kernelcmdlineconfig' - - fix no attribute 'Hints' error for 'leapp.reporting' module + - fix no attribute 'Hints' error for 'leapp.reporting' module * Thu Aug 22 2024 Yuriy Kohut <ykohut@almalinux.org> - 0.21.0-2.elevate.1 - ELevate vendors support @@ -1077,4 +1202,3 @@ done; * Wed Nov 07 2018 Petr Stodulka <pstodulk@redhat.com> - 0.3-1 - Initial RPM Resolves: #1636481 -