From 51aad416ad023e702242d889031854719906a48c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Thu, 7 Dec 2023 13:25:45 +0100 Subject: [PATCH 01/23] pkg: add distrofactory as a replacement for distroregistry MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `distrofactory.Factory` can generate arbitrary versions of supported distributions. It is created by passing a slice of distro generator functions to it. Each distro is responsible for implementing the factory function on its own from, which returns the proper distro.Distro instance based on the provided distro ID string. The only requirement is that no two distro factory functions can return a distro.Distro instance for the same distro ID string. The plan is to eventually replace the distroregistry with distrofactory. Cover all the added code and generators with unit tests. The commit is based on https://github.com/osbuild/images/pull/104/commits/9a1a1f0a6cdfdf82c382747b9619ee95ac8885ce Signed-off-by: Tomáš Hozza Co-authored-by: Ondřej Budai --- pkg/distro/fedora/distro.go | 17 ++++ pkg/distro/fedora/distro_test.go | 50 +++++++++ pkg/distro/id.go | 74 ++++++++++++++ pkg/distro/id_test.go | 107 ++++++++++++++++++++ pkg/distro/rhel7/distro.go | 23 ++++- pkg/distro/rhel7/distro_test.go | 62 ++++++++++++ pkg/distro/rhel8/distro.go | 36 +++++++ pkg/distro/rhel8/distro_internal_test.go | 98 ++++++++++++++++++ pkg/distro/rhel9/distro.go | 33 ++++++ pkg/distro/rhel9/distro_internal_test.go | 123 +++++++++++++++++++++++ pkg/distrofactory/distrofactory.go | 54 ++++++++++ pkg/distrofactory/distrofactory_test.go | 60 +++++++++++ 12 files changed, 736 insertions(+), 1 deletion(-) create mode 100644 pkg/distro/id.go create mode 100644 pkg/distro/id_test.go create mode 100644 pkg/distro/rhel9/distro_internal_test.go create mode 100644 pkg/distrofactory/distrofactory.go create mode 100644 pkg/distrofactory/distrofactory_test.go diff --git a/pkg/distro/fedora/distro.go b/pkg/distro/fedora/distro.go index 4a4d66ba4d..3cbbe4024f 100644 --- a/pkg/distro/fedora/distro.go +++ b/pkg/distro/fedora/distro.go @@ -973,3 +973,20 @@ func newDistro(version int) distro.Distro { rd.addArches(x86_64, aarch64, ppc64le, s390x) return &rd } + +func DistroFactory(idStr string) distro.Distro { + id, err := distro.DistroIDParser(idStr) + if err != nil { + return nil + } + + if id.Name != "fedora" { + return nil + } + + if id.MinorVersion != -1 { + return nil + } + + return newDistro(id.MajorVersion) +} diff --git a/pkg/distro/fedora/distro_test.go b/pkg/distro/fedora/distro_test.go index 9928be96e2..59bc9873b8 100644 --- a/pkg/distro/fedora/distro_test.go +++ b/pkg/distro/fedora/distro_test.go @@ -911,3 +911,53 @@ func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { } } } + +func TestDistroFactory(t *testing.T) { + type testCase struct { + strID string + expected distro.Distro + } + + testCases := []testCase{ + { + strID: "fedora-37", + expected: fedora.NewF37(), + }, + { + strID: "fedora-38.1", + expected: nil, + }, + { + strID: "fedora", + expected: nil, + }, + { + strID: "rhel-9", + expected: nil, + }, + { + strID: "rhel-8.4", + expected: nil, + }, + { + strID: "rhel-810", + expected: nil, + }, + { + strID: "rhel-8.4.1", + expected: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + d := fedora.DistroFactory(tc.strID) + if tc.expected == nil { + assert.Nil(t, d) + } else { + assert.NotNil(t, d) + assert.Equal(t, tc.expected.Name(), d.Name()) + } + }) + } +} diff --git a/pkg/distro/id.go b/pkg/distro/id.go new file mode 100644 index 0000000000..03cb556ca8 --- /dev/null +++ b/pkg/distro/id.go @@ -0,0 +1,74 @@ +package distro + +import ( + "fmt" + "strconv" + "strings" +) + +// ID represents a distro name and version +type ID struct { + Name string + MajorVersion int + // MinorVersion is -1 if not specified + MinorVersion int +} + +type ParseError struct { + ToParse string + Msg string + Inner error +} + +func (e ParseError) Error() string { + msg := fmt.Sprintf("error when parsing distro name (%s): %v", e.ToParse, e.Msg) + + if e.Inner != nil { + msg += fmt.Sprintf(", inner error:\n%v", e.Inner) + } + + return msg +} + +// ParseID parses a distro name and version from a Distro ID string. +// This is the generic parser, which is used by all distros as the base parser. +// +// Limitations: +// - the distro name must not contain a dash +func ParseID(idStr string) (*ID, error) { + idParts := strings.Split(idStr, "-") + + if len(idParts) < 2 { + return nil, ParseError{ToParse: idStr, Msg: "A dash is expected to separate distro name and version"} + } + + name := strings.Join(idParts[:len(idParts)-1], "-") + version := idParts[len(idParts)-1] + + versionParts := strings.Split(version, ".") + + if len(versionParts) > 2 { + return nil, ParseError{ToParse: idStr, Msg: fmt.Sprintf("too many dots in the version (%d)", len(versionParts)-1)} + } + + majorVersion, err := strconv.Atoi(versionParts[0]) + if err != nil { + return nil, ParseError{ToParse: idStr, Msg: "parsing major version failed", Inner: err} + } + + minorVersion := -1 + + if len(versionParts) > 1 { + minorVersion, err = strconv.Atoi(versionParts[1]) + + if err != nil { + return nil, ParseError{ToParse: idStr, Msg: "parsing minor version failed", Inner: err} + } + } + + return &ID{ + Name: name, + MajorVersion: majorVersion, + MinorVersion: minorVersion, + }, nil +} diff --git a/pkg/distro/id_test.go b/pkg/distro/id_test.go new file mode 100644 index 0000000000..8e0afdfb52 --- /dev/null +++ b/pkg/distro/id_test.go @@ -0,0 +1,107 @@ +package distro + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestDistroIDParser(t *testing.T) { + type testCase struct { + stringID string + expected *ID + err bool + } + + testCases := []testCase{ + { + stringID: "fedora-39", + expected: &ID{ + Name: "fedora", + MajorVersion: 39, + MinorVersion: -1, + }, + }, + { + stringID: "fedora-39.0", + expected: &ID{ + Name: "fedora", + MajorVersion: 39, + MinorVersion: 0, + }, + }, + { + stringID: "rhel-8.4", + expected: &ID{ + Name: "rhel", + MajorVersion: 8, + MinorVersion: 4, + }, + }, + { + stringID: "rhel-8", + expected: &ID{ + Name: "rhel", + MajorVersion: 8, + MinorVersion: -1, + }, + }, + { + stringID: "rhel-84", + expected: &ID{ + Name: "rhel", + MajorVersion: 84, + MinorVersion: -1, + }, + }, + { + stringID: "rhel-810", + expected: &ID{ + Name: "rhel", + MajorVersion: 810, + MinorVersion: -1, + }, + }, + { + stringID: "centos-stream-8", + expected: &ID{ + Name: "centos-stream", + MajorVersion: 8, + MinorVersion: -1, + }, + }, + { + stringID: "rhel-8.4.1", + err: true, + }, + { + stringID: "rhel", + err: true, + }, + { + stringID: "rhel-", + err: true, + }, + { + stringID: "centos-stream", + err: true, + }, + } + + for _, tc := range testCases { + t.Run(tc.stringID, func(t *testing.T) { + id, err := ParseID(tc.stringID) + + if tc.err { + assert.Error(t, err) + assert.Nil(t, id) + return + } + + assert.NoError(t, err) + assert.NotNil(t, id) + assert.Equal(t, tc.expected, id) + }) + } + +} diff --git a/pkg/distro/rhel7/distro.go b/pkg/distro/rhel7/distro.go index 797058d19a..662a4cb133 100644 --- a/pkg/distro/rhel7/distro.go +++ b/pkg/distro/rhel7/distro.go @@ -51,7 +51,7 @@ var defaultDistroImageConfig = &distro.ImageConfig{ // distribution objects without the arches > image types var distroMap = map[string]distribution{ "rhel-7": { - name: "rhel-7", + name: "rhel-7", // TODO: this should be "rhel-7.9" product: "Red Hat Enterprise Linux", osVersion: "7.9", nick: "Maipo", @@ -237,3 +237,24 @@ func newDistro(distroName string) distro.Distro { return &rd } + +func DistroFactory(idStr string) distro.Distro { + id, err := distro.DistroIDParser(idStr) + if err != nil { + return nil + } + if id.Name != "rhel" { + return nil + } + + if id.MajorVersion != 7 { + return nil + } + + // TODO: we should probably support also the minor version, specifically "7.9" + if id.MinorVersion != -1 { + return nil + } + + return newDistro("rhel-7") +} diff --git a/pkg/distro/rhel7/distro_test.go b/pkg/distro/rhel7/distro_test.go index 73075b3099..d7b6098fa4 100644 --- a/pkg/distro/rhel7/distro_test.go +++ b/pkg/distro/rhel7/distro_test.go @@ -424,3 +424,65 @@ func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { } } } + +func TestDistroFactory(t *testing.T) { + type testCase struct { + strID string + expected distro.Distro + } + + testCases := []testCase{ + { + strID: "rhel-7", + expected: rhel7.New(), + }, + { + strID: "rhel-79", // TODO: this should be supported + expected: nil, + }, + { + strID: "rhel-7.9", // TODO: this should be supported + expected: nil, + }, + { + strID: "fedora-37", + expected: nil, + }, + { + strID: "fedora-38.1", + expected: nil, + }, + { + strID: "fedora", + expected: nil, + }, + { + strID: "rhel-9", + expected: nil, + }, + { + strID: "rhel-8.4", + expected: nil, + }, + { + strID: "rhel-810", + expected: nil, + }, + { + strID: "rhel-8.4.1", + expected: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + d := rhel7.DistroFactory(tc.strID) + if tc.expected == nil { + assert.Nil(t, d) + } else { + assert.NotNil(t, d) + assert.Equal(t, tc.expected.Name(), d.Name()) + } + }) + } +} diff --git a/pkg/distro/rhel8/distro.go b/pkg/distro/rhel8/distro.go index fb14324c40..3737d4b629 100644 --- a/pkg/distro/rhel8/distro.go +++ b/pkg/distro/rhel8/distro.go @@ -517,3 +517,39 @@ func newDistro(name string, minor int) *distribution { rd.addArches(x86_64, aarch64, ppc64le) return &rd } + +func DistroFactory(idStr string) distro.Distro { + id, err := distro.DistroIDParser(idStr) + if err != nil { + return nil + } + + // Backward compatibility layer for "rhel-84" or "rhel-810" + if id.Name == "rhel" && id.MinorVersion == -1 { + if id.MajorVersion/10 == 8 { + // handle single digit minor version + id.MinorVersion = id.MajorVersion % 10 + id.MajorVersion = 8 + } else if id.MajorVersion/100 == 8 { + // handle two digit minor version + id.MinorVersion = id.MajorVersion % 100 + id.MajorVersion = 8 + } + } + + if id.MajorVersion != 8 { + return nil + } + + // CentOS does not use minor version + if id.Name == "centos" && id.MinorVersion == -1 { + return NewCentos() + } + + // RHEL uses minor version + if id.Name != "rhel" || id.MinorVersion == -1 { + return nil + } + + return newDistro("rhel", id.MinorVersion) +} diff --git a/pkg/distro/rhel8/distro_internal_test.go b/pkg/distro/rhel8/distro_internal_test.go index 15f11031da..acfc0f3645 100644 --- a/pkg/distro/rhel8/distro_internal_test.go +++ b/pkg/distro/rhel8/distro_internal_test.go @@ -71,3 +71,101 @@ func TestDistro_Ec2PartitionTables(t *testing.T) { } } } + +func TestDistroFactory(t *testing.T) { + type testCase struct { + strID string + expected distro.Distro + } + + testCases := []testCase{ + { + strID: "rhel-8.0", + expected: newDistro("rhel", 0), + }, + { + strID: "rhel-80", + expected: newDistro("rhel", 0), + }, + { + strID: "rhel-8.4", + expected: NewRHEL84(), + }, + { + strID: "rhel-84", + expected: NewRHEL84(), + }, + { + strID: "rhel-8.10", + expected: NewRHEL810(), + }, + { + strID: "rhel-810", + expected: NewRHEL810(), + }, + { + strID: "centos-8", + expected: NewCentos(), + }, + { + strID: "centos-8.4", + expected: nil, + }, + { + strID: "rhel-8", + expected: nil, + }, + { + strID: "rhel-8.4.1", + expected: nil, + }, + { + strID: "rhel-7", + expected: nil, + }, + { + strID: "rhel-79", + expected: nil, + }, + { + strID: "rhel-7.9", + expected: nil, + }, + { + strID: "fedora-37", + expected: nil, + }, + { + strID: "fedora-38.1", + expected: nil, + }, + { + strID: "fedora", + expected: nil, + }, + { + strID: "rhel-9", + expected: nil, + }, + { + strID: "rhel-910", + expected: nil, + }, + { + strID: "rhel-9.10", + expected: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + d := DistroFactory(tc.strID) + if tc.expected == nil { + assert.Nil(t, d) + } else { + assert.NotNil(t, d) + assert.Equal(t, tc.expected.Name(), d.Name()) + } + }) + } +} diff --git a/pkg/distro/rhel9/distro.go b/pkg/distro/rhel9/distro.go index 9d98d09def..f1ce85e7bf 100644 --- a/pkg/distro/rhel9/distro.go +++ b/pkg/distro/rhel9/distro.go @@ -494,3 +494,36 @@ func newDistro(name string, minor int) *distribution { rd.addArches(x86_64, aarch64, ppc64le, s390x) return &rd } + +func DistroFactory(idStr string) distro.Distro { + id, err := distro.DistroIDParser(idStr) + if err != nil { + return nil + } + + // Backward compatibility layer for "rhel-93" and friends + if id.Name == "rhel" && id.MinorVersion == -1 { + if id.MajorVersion/10 == 9 { + // handle single digit minor version + id.MinorVersion = id.MajorVersion % 10 + id.MajorVersion = 9 + } + // two digit minor versions in the old format are not supported + } + + if id.MajorVersion != 9 { + return nil + } + + // CentOS does not use minor version + if id.Name == "centos" && id.MinorVersion == -1 { + return NewCentOS9() + } + + // RHEL uses minor version + if id.Name != "rhel" || id.MinorVersion == -1 { + return nil + } + + return newDistro("rhel", id.MinorVersion) +} diff --git a/pkg/distro/rhel9/distro_internal_test.go b/pkg/distro/rhel9/distro_internal_test.go new file mode 100644 index 0000000000..6cd6e7f81f --- /dev/null +++ b/pkg/distro/rhel9/distro_internal_test.go @@ -0,0 +1,123 @@ +package rhel9 + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + "github.com/osbuild/images/pkg/distro" +) + +func TestDistroFactory(t *testing.T) { + type testCase struct { + strID string + expected distro.Distro + } + + testCases := []testCase{ + { + strID: "rhel-90", + expected: NewRHEL90(), + }, + { + strID: "rhel-9.0", + expected: NewRHEL90(), + }, + { + strID: "rhel-93", + expected: NewRHEL93(), + }, + { + strID: "rhel-9.3", + expected: NewRHEL93(), + }, + { + strID: "rhel-910", // this is intentionally not supported for el9 + expected: nil, + }, + { + strID: "rhel-9.10", + expected: newDistro("rhel", 10), + }, + { + strID: "centos-9", + expected: NewCentOS9(), + }, + { + strID: "centos-9.0", + expected: nil, + }, + { + strID: "rhel-9", + expected: nil, + }, + { + strID: "rhel-8.0", + expected: nil, + }, + { + strID: "rhel-80", + expected: nil, + }, + { + strID: "rhel-8.4", + expected: nil, + }, + { + strID: "rhel-84", + expected: nil, + }, + { + strID: "rhel-8.10", + expected: nil, + }, + { + strID: "rhel-810", + expected: nil, + }, + { + strID: "rhel-8", + expected: nil, + }, + { + strID: "rhel-8.4.1", + expected: nil, + }, + { + strID: "rhel-7", + expected: nil, + }, + { + strID: "rhel-79", + expected: nil, + }, + { + strID: "rhel-7.9", + expected: nil, + }, + { + strID: "fedora-37", + expected: nil, + }, + { + strID: "fedora-38.1", + expected: nil, + }, + { + strID: "fedora", + expected: nil, + }, + } + + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + d := DistroFactory(tc.strID) + if tc.expected == nil { + assert.Nil(t, d) + } else { + assert.NotNil(t, d) + assert.Equal(t, tc.expected.Name(), d.Name()) + } + }) + } +} diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go new file mode 100644 index 0000000000..5e1baaa30d --- /dev/null +++ b/pkg/distrofactory/distrofactory.go @@ -0,0 +1,54 @@ +package distrofactory + +import ( + "fmt" + + "github.com/osbuild/images/pkg/distro" + "github.com/osbuild/images/pkg/distro/fedora" + "github.com/osbuild/images/pkg/distro/rhel7" + "github.com/osbuild/images/pkg/distro/rhel8" + "github.com/osbuild/images/pkg/distro/rhel9" +) + +// FactoryFunc is a function that returns a distro.Distro for a given distro +// represented as a string. If the string does not represent a distro, that can +// be detected by the factory, it should return nil. +type FactoryFunc func(idStr string) distro.Distro + +// Factory is a list of distro.Distro factories. +type Factory struct { + factories []FactoryFunc +} + +// GetDistro returns the distro.Distro that matches the given distro ID. If no +// distro.Distro matches the given distro ID, it returns nil. If multiple distro +// factories match the given distro ID, it panics. +func (f *Factory) GetDistro(name string) distro.Distro { + var match distro.Distro + for _, f := range f.factories { + if d := f(name); d != nil { + if match != nil { + panic(fmt.Sprintf("distro ID was matched by multiple distro factories: %v, %v", match, d)) + } + match = d + } + } + + return match +} + +// New returns a Factory of distro.Distro factories for the given distros. +func New(factories ...FactoryFunc) *Factory { + return &Factory{factories: factories} +} + +// NewDefault returns a Factory of distro.Distro factories for all supported +// distros. +func NewDefault() *Factory { + return New( + fedora.DistroFactory, + rhel7.DistroFactory, + rhel8.DistroFactory, + rhel9.DistroFactory, + ) +} diff --git a/pkg/distrofactory/distrofactory_test.go b/pkg/distrofactory/distrofactory_test.go new file mode 100644 index 0000000000..dc53a0a76e --- /dev/null +++ b/pkg/distrofactory/distrofactory_test.go @@ -0,0 +1,60 @@ +package distrofactory + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestGetDistroDefaultList(t *testing.T) { + type testCase struct { + strID string + expectedDistroName string + } + + testCases := []testCase{ + { + strID: "rhel-7", + expectedDistroName: "rhel-7", + }, + { + strID: "rhel-89", + expectedDistroName: "rhel-89", + }, + { + strID: "rhel-8.9", + expectedDistroName: "rhel-89", + }, + { + strID: "rhel-810", + expectedDistroName: "rhel-810", + }, + { + strID: "rhel-8.10", + expectedDistroName: "rhel-810", + }, + { + strID: "rhel-91", + expectedDistroName: "rhel-91", + }, + { + strID: "rhel-9.1", + expectedDistroName: "rhel-91", + }, + { + strID: "fedora-38", + expectedDistroName: "fedora-38", + }, + } + + df := NewDefault() + + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + d := df.GetDistro(tc.strID) + assert.NotNil(t, d) + assert.Equal(t, tc.expectedDistroName, d.Name()) + }) + } + +} From dddb55d5ae9bc460bf590f2ad4addb783a4c807e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Mon, 11 Dec 2023 14:27:46 +0100 Subject: [PATCH 02/23] distro/test_distro: adjust to the distrofactory approach MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adjust the test_distro implementation to provide the FactoryFunc in the same way as the regular disto implementation. Consolidate the implementation to ensure that the distro Name always contains a release version. In addition, reduce the exported symbols to limit the unwanted use of them in other packages. Modify affected unit tests, which previously relied on some of the exported symbols from the test_distro. Signed-off-by: Tomáš Hozza --- internal/reporegistry/reporegistry_test.go | 21 ++++++----- pkg/distro/test_distro/distro.go | 43 +++++++++++++++------- pkg/distrofactory/distrofactory.go | 8 ++++ pkg/rpmmd/test/repository_test.go | 17 ++++++--- 4 files changed, 60 insertions(+), 29 deletions(-) diff --git a/internal/reporegistry/reporegistry_test.go b/internal/reporegistry/reporegistry_test.go index 32a4cdf050..127b564670 100644 --- a/internal/reporegistry/reporegistry_test.go +++ b/internal/reporegistry/reporegistry_test.go @@ -11,9 +11,10 @@ import ( ) func getTestingRepoRegistry() *RepoRegistry { + testDistro := test_distro.New() return &RepoRegistry{ map[string]map[string][]rpmmd.RepoConfig{ - test_distro.TestDistroName: { + testDistro.Name(): { test_distro.TestArchName: { { Name: "baseos", @@ -135,6 +136,7 @@ func TestInvalidReposByImageType(t *testing.T) { // TestInvalidreposByImageTypeName tests return values from reposByImageTypeName // for invalid distro name, arch and image type func TestInvalidreposByImageTypeName(t *testing.T) { + testDistro := test_distro.New() rr := getTestingRepoRegistry() type args struct { @@ -150,7 +152,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { { name: "invalid distro, valid arch and image type", args: args{ - distro: test_distro.TestDistroName + "-invalid", + distro: testDistro.Name() + "-invalid", arch: test_distro.TestArchName, imageType: test_distro.TestImageTypeName, }, @@ -165,7 +167,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { { name: "invalid arch, valid distro and image type", args: args{ - distro: test_distro.TestDistroName, + distro: testDistro.Name(), arch: test_distro.TestArchName + "-invalid", imageType: test_distro.TestImageTypeName, }, @@ -180,7 +182,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { { name: "invalid image type, valid distro and arch, without tagged repos", args: args{ - distro: test_distro.TestDistroName, + distro: testDistro.Name(), arch: test_distro.TestArchName, imageType: test_distro.TestImageTypeName + "-invalid", }, @@ -200,7 +202,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { { name: "invalid image type, valid distro and arch, with tagged repos", args: args{ - distro: test_distro.TestDistroName, + distro: testDistro.Name(), arch: test_distro.TestArch2Name, imageType: test_distro.TestImageTypeName + "-invalid", }, @@ -311,6 +313,7 @@ func TestInvalidReposByArch(t *testing.T) { // TestInvalidReposByArchName tests return values from ReposByArchName // for invalid distro name and arch func TestInvalidReposByArchName(t *testing.T) { + testDistro := test_distro.New() rr := getTestingRepoRegistry() type args struct { @@ -326,7 +329,7 @@ func TestInvalidReposByArchName(t *testing.T) { { name: "invalid distro, valid arch, without tagged repos", args: args{ - distro: test_distro.TestDistroName + "-invalid", + distro: testDistro.Name() + "-invalid", arch: test_distro.TestArch2Name, taggedRepos: false, }, @@ -341,7 +344,7 @@ func TestInvalidReposByArchName(t *testing.T) { { name: "invalid distro, valid arch, with tagged repos", args: args{ - distro: test_distro.TestDistroName + "-invalid", + distro: testDistro.Name() + "-invalid", arch: test_distro.TestArch2Name, taggedRepos: true, }, @@ -356,7 +359,7 @@ func TestInvalidReposByArchName(t *testing.T) { { name: "invalid arch, valid distro, without tagged repos", args: args{ - distro: test_distro.TestDistroName, + distro: testDistro.Name(), arch: test_distro.TestArch2Name + "-invalid", taggedRepos: false, }, @@ -371,7 +374,7 @@ func TestInvalidReposByArchName(t *testing.T) { { name: "invalid arch, valid distro, with tagged repos", args: args{ - distro: test_distro.TestDistroName, + distro: testDistro.Name(), arch: test_distro.TestArch2Name + "-invalid", taggedRepos: true, }, diff --git a/pkg/distro/test_distro/distro.go b/pkg/distro/test_distro/distro.go index 27b4366b8c..2342642950 100644 --- a/pkg/distro/test_distro/distro.go +++ b/pkg/distro/test_distro/distro.go @@ -46,12 +46,10 @@ type TestImageType struct { } const ( - TestDistroName = "test-distro" - TestDistro2Name = "test-distro-2" - TestDistroReleasever = "1" - TestDistro2Releasever = "2" - TestDistroModulePlatformID = "platform:test" - TestDistro2ModulePlatformID = "platform:test-2" + // The Test Distro name base. It can't be used to get a distro.Distro + // instance from the DistroFactory(), because it does not include any + // release version. + TestDistroNameBase = "test-distro" TestArchName = "test_arch" TestArch2Name = "test_arch2" @@ -294,18 +292,18 @@ func (t *TestImageType) Manifest(b *blueprint.Blueprint, options distro.ImageOpt return m, nil, nil } -// NewTestDistro returns a new instance of TestDistro with the -// given name and modulePlatformID. +// newTestDistro returns a new instance of TestDistro with the +// given release version. // // It contains two architectures "test_arch" and "test_arch2". // "test_arch" contains one image type "test_type". // "test_arch2" contains two image types "test_type" and "test_type2". -func NewTestDistro(name, modulePlatformID, releasever string) *TestDistro { +func newTestDistro(releasever string) *TestDistro { td := TestDistro{ - name: name, + name: fmt.Sprintf("%s-%s", TestDistroNameBase, releasever), releasever: releasever, - modulePlatformID: modulePlatformID, - ostreeRef: "test/13/x86_64/edge", + modulePlatformID: fmt.Sprintf("platform:%s-%s", TestDistroNameBase, releasever), + ostreeRef: fmt.Sprintf("test/%s/x86_64/edge", releasever), } ta1 := TestArch{ @@ -373,9 +371,26 @@ func NewTestDistro(name, modulePlatformID, releasever string) *TestDistro { return &td } -// New returns new instance of TestDistro named "test-distro". +func DistroFactory(idStr string) distro.Distro { + id, err := distro.ParseID(idStr) + if err != nil { + return nil + } + + if id.Name != TestDistroNameBase { + return nil + } + + if id.MinorVersion != -1 { + return nil + } + + return newTestDistro(fmt.Sprint(id.MajorVersion)) +} + +// New returns new instance of TestDistro named "test-distro-1". func New() *TestDistro { - return NewTestDistro(TestDistroName, TestDistroModulePlatformID, TestDistroReleasever) + return newTestDistro("1") } func NewRegistry() *distroregistry.Registry { diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go index 5e1baaa30d..4183904488 100644 --- a/pkg/distrofactory/distrofactory.go +++ b/pkg/distrofactory/distrofactory.go @@ -8,6 +8,7 @@ import ( "github.com/osbuild/images/pkg/distro/rhel7" "github.com/osbuild/images/pkg/distro/rhel8" "github.com/osbuild/images/pkg/distro/rhel9" + "github.com/osbuild/images/pkg/distro/test_distro" ) // FactoryFunc is a function that returns a distro.Distro for a given distro @@ -52,3 +53,10 @@ func NewDefault() *Factory { rhel9.DistroFactory, ) } + +// NewTestDefault returns a Factory of distro.Distro factory for the test_distro. +func NewTestDefault() *Factory { + return New( + test_distro.DistroFactory, + ) +} diff --git a/pkg/rpmmd/test/repository_test.go b/pkg/rpmmd/test/repository_test.go index 58f0b9bbd0..77a7a390cd 100644 --- a/pkg/rpmmd/test/repository_test.go +++ b/pkg/rpmmd/test/repository_test.go @@ -12,6 +12,11 @@ import ( "github.com/stretchr/testify/assert" ) +const ( + testDistroName = "test-distro" + testDistro2Name = "test-distro-2" +) + func getConfPaths(t *testing.T) []string { confPaths := []string{ "./confpaths/priority1", @@ -41,7 +46,7 @@ func TestLoadRepositoriesExisting(t *testing.T) { { name: "duplicate distro definition, load first encounter", args: args{ - distro: test_distro.TestDistroName, + distro: testDistroName, }, want: map[string][]string{ test_distro.TestArchName: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, @@ -51,7 +56,7 @@ func TestLoadRepositoriesExisting(t *testing.T) { { name: "single distro definition", args: args{ - distro: test_distro.TestDistro2Name, + distro: testDistro2Name, }, want: map[string][]string{ test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, @@ -98,7 +103,7 @@ func Test_LoadAllRepositories(t *testing.T) { assert.Equal(t, len(distroReposMap), 2) // test-distro - testDistroRepos, exists := distroReposMap[test_distro.TestDistroName] + testDistroRepos, exists := distroReposMap[testDistroName] assert.True(t, exists) assert.Equal(t, len(testDistroRepos), 2) @@ -116,12 +121,12 @@ func Test_LoadAllRepositories(t *testing.T) { wantRepos := []string{"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"} if !reflect.DeepEqual(repoNames, wantRepos) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", test_distro.TestDistroName, arch, repoNames, wantRepos) + t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistroName, arch, repoNames, wantRepos) } } // test-distro-2 - testDistro2Repos, exists := distroReposMap[test_distro.TestDistro2Name] + testDistro2Repos, exists := distroReposMap[testDistro2Name] assert.True(t, exists) assert.Equal(t, len(testDistro2Repos), 2) @@ -141,7 +146,7 @@ func Test_LoadAllRepositories(t *testing.T) { } if !reflect.DeepEqual(repoNames, wantRepos[arch]) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", test_distro.TestDistro2Name, arch, repoNames, wantRepos[arch]) + t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistro2Name, arch, repoNames, wantRepos[arch]) } } } From 6b0c864fcbbb77763566405474606cab42b8211d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Mon, 11 Dec 2023 16:41:11 +0100 Subject: [PATCH 03/23] distrofactory: add FromHost() method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add `FromHost()` method, which was previously provided by the distroregistry to get a `distro.Distro` instance representing the host distribution. Signed-off-by: Tomáš Hozza --- pkg/distrofactory/distrofactory.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go index 4183904488..33e64972db 100644 --- a/pkg/distrofactory/distrofactory.go +++ b/pkg/distrofactory/distrofactory.go @@ -3,6 +3,7 @@ package distrofactory import ( "fmt" + "github.com/osbuild/images/internal/common" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distro/fedora" "github.com/osbuild/images/pkg/distro/rhel7" @@ -38,6 +39,13 @@ func (f *Factory) GetDistro(name string) distro.Distro { return match } +// FromHost returns a distro.Distro instance, that is specific to the host. +// If the host distro is not supported, nil is returned. +func (f *Factory) FromHost() distro.Distro { + hostDistroName, _, _, _ := common.GetHostDistroName() + return f.GetDistro(hostDistroName) +} + // New returns a Factory of distro.Distro factories for the given distros. func New(factories ...FactoryFunc) *Factory { return &Factory{factories: factories} From f8df7ddebe07b9871605b0bff615970cbb618823 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Mon, 11 Dec 2023 16:52:48 +0100 Subject: [PATCH 04/23] Replace distroregistry with distrofactory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove the distroregistry package and modify all places which depended on it to use distrofactory. To support listing explicitly supported distros in the reporegistry. Specifically add `NewTestedDefault()` to get reporegistry from testing repositories and `ListDistros()` to list distributions with repositories in a reporegistry. Signed-off-by: Tomáš Hozza --- cmd/build/main.go | 6 +- cmd/gen-manifests/main.go | 21 ++- cmd/list-images/main.go | 17 +- .../main.go | 21 ++- cmd/osbuild-dnf-json-tests/main_test.go | 32 ++-- cmd/osbuild-package-sets/main.go | 6 +- cmd/osbuild-playground/main.go | 8 +- internal/reporegistry/reporegistry.go | 17 ++ pkg/distro/distro_test.go | 35 +++-- .../distro_test_common/distro_test_common.go | 18 ++- pkg/distro/test_distro/distro.go | 13 -- pkg/distroregistry/distroregistry.go | 147 ------------------ pkg/distroregistry/distroregistry_test.go | 122 --------------- 13 files changed, 125 insertions(+), 338 deletions(-) delete mode 100644 pkg/distroregistry/distroregistry.go delete mode 100644 pkg/distroregistry/distroregistry_test.go diff --git a/cmd/build/main.go b/cmd/build/main.go index f1ae760b44..28ca722b3f 100644 --- a/cmd/build/main.go +++ b/cmd/build/main.go @@ -15,7 +15,7 @@ import ( "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/osbuild" @@ -250,7 +250,7 @@ func main() { rngSeed, err := cmdutil.NewRNGSeed() check(err) darm := readRepos() - distroReg := distroregistry.NewDefault() + distroFac := distrofactory.NewDefault() config := loadConfig(configFile) @@ -258,7 +258,7 @@ func main() { fail(fmt.Sprintf("failed to create target directory: %s", err.Error())) } - distribution := distroReg.GetDistro(distroName) + distribution := distroFac.GetDistro(distroName) if distribution == nil { fail(fmt.Sprintf("invalid or unsupported distribution: %q", distroName)) } diff --git a/cmd/gen-manifests/main.go b/cmd/gen-manifests/main.go index a2f474b8ce..dc2756e019 100644 --- a/cmd/gen-manifests/main.go +++ b/cmd/gen-manifests/main.go @@ -21,7 +21,7 @@ import ( "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/ostree" @@ -293,6 +293,14 @@ func makeManifestJob( type DistroArchRepoMap map[string]map[string][]rpmmd.RepoConfig +func (d DistroArchRepoMap) ListDistros() []string { + distros := make([]string, 0, len(d)) + for distro := range d { + distros = append(distros, distro) + } + return distros +} + func readRepos() DistroArchRepoMap { reposDir := "./test/data/repositories/" darm := make(DistroArchRepoMap) @@ -560,7 +568,7 @@ func main() { panic(err) } darm := readRepos() - distroReg := distroregistry.NewDefault() + distroFac := distrofactory.NewDefault() jobs := make([]manifestJob, 0) contentResolve := map[string]bool{ @@ -582,12 +590,17 @@ func main() { } fmt.Println("Collecting jobs") - distros, invalidDistros := resolveArgValues(distros, distroReg.List()) + + distros, invalidDistros := resolveArgValues(distros, darm.ListDistros()) if len(invalidDistros) > 0 { fmt.Fprintf(os.Stderr, "WARNING: invalid distro names: [%s]\n", strings.Join(invalidDistros, ",")) } for _, distroName := range distros { - distribution := distroReg.GetDistro(distroName) + distribution := distroFac.GetDistro(distroName) + if distribution == nil { + fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q\n", distroName) + continue + } distroArches, invalidArches := resolveArgValues(arches, distribution.ListArches()) if len(invalidArches) > 0 { diff --git a/cmd/list-images/main.go b/cmd/list-images/main.go index d240dde4b9..9be56fad06 100644 --- a/cmd/list-images/main.go +++ b/cmd/list-images/main.go @@ -10,7 +10,8 @@ import ( "strings" "github.com/gobwas/glob" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/internal/reporegistry" + "github.com/osbuild/images/pkg/distrofactory" ) type multiValue []string @@ -74,15 +75,23 @@ func main() { flag.BoolVar(&json, "json", false, "print configs as json") flag.Parse() - distroReg := distroregistry.NewDefault() - distros, invalidDistros := resolveArgValues(distros, distroReg.List()) + testedRepoRegistry, err := reporegistry.NewTestedDefault() + if err != nil { + panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err)) + } + distroFac := distrofactory.NewDefault() + distros, invalidDistros := resolveArgValues(distros, testedRepoRegistry.ListDistros()) if len(invalidDistros) > 0 { fmt.Fprintf(os.Stderr, "WARNING: invalid distro names: [%s]\n", strings.Join(invalidDistros, ",")) } configs := make([]config, 0) for _, distroName := range distros { - distribution := distroReg.GetDistro(distroName) + distribution := distroFac.GetDistro(distroName) + if distribution == nil { + fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q", distroName) + continue + } distroArches, invalidArches := resolveArgValues(arches, distribution.ListArches()) if len(invalidArches) > 0 { diff --git a/cmd/osbuild-composer-image-definitions/main.go b/cmd/osbuild-composer-image-definitions/main.go index 6e8022bf37..09f4d6b252 100644 --- a/cmd/osbuild-composer-image-definitions/main.go +++ b/cmd/osbuild-composer-image-definitions/main.go @@ -5,15 +5,26 @@ import ( "fmt" "os" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/internal/reporegistry" + "github.com/osbuild/images/pkg/distrofactory" ) func main() { definitions := map[string]map[string][]string{} - distroRegistry := distroregistry.NewDefault() + distroFac := distrofactory.NewDefault() + + testedRepoRegistry, err := reporegistry.NewTestedDefault() + if err != nil { + panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err)) + } + + for _, distroName := range testedRepoRegistry.ListDistros() { + distro := distroFac.GetDistro(distroName) + if distro == nil { + fmt.Fprintf(os.Stderr, "WARNING: invalid distro name %q", distroName) + continue + } - for _, distroName := range distroRegistry.List() { - distro := distroRegistry.GetDistro(distroName) for _, archName := range distro.ListArches() { arch, err := distro.GetArch(archName) if err != nil { @@ -28,7 +39,7 @@ func main() { } encoder := json.NewEncoder(os.Stdout) - err := encoder.Encode(definitions) + err = encoder.Encode(definitions) if err != nil { panic(err) } diff --git a/cmd/osbuild-dnf-json-tests/main_test.go b/cmd/osbuild-dnf-json-tests/main_test.go index 5e4d80dd7c..a119f24319 100644 --- a/cmd/osbuild-dnf-json-tests/main_test.go +++ b/cmd/osbuild-dnf-json-tests/main_test.go @@ -13,7 +13,7 @@ import ( "github.com/osbuild/images/pkg/arch" "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/distro" - rhel "github.com/osbuild/images/pkg/distro/rhel8" + "github.com/osbuild/images/pkg/distro/rhel9" "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/ostree" "github.com/osbuild/images/pkg/rpmmd" @@ -27,20 +27,20 @@ func TestCrossArchDepsolve(t *testing.T) { repoDir := "/usr/share/tests/osbuild-composer" // NOTE: we can add RHEL, but don't make it hard requirement because it will fail outside of VPN - cs9 := rhel.NewCentos() + c9s := rhel9.DistroFactory("centos-9") // Set up temporary directory for rpm/dnf cache dir := t.TempDir() baseSolver := dnfjson.NewBaseSolver(dir) - repos, err := rpmmd.LoadRepositories([]string{repoDir}, cs9.Name()) - require.NoErrorf(t, err, "Failed to LoadRepositories %v", cs9.Name()) + repos, err := rpmmd.LoadRepositories([]string{repoDir}, c9s.Name()) + require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name()) - for _, archStr := range cs9.ListArches() { + for _, archStr := range c9s.ListArches() { t.Run(archStr, func(t *testing.T) { - arch, err := cs9.GetArch(archStr) + arch, err := c9s.GetArch(archStr) require.NoError(t, err) - solver := baseSolver.NewWithConfig(cs9.ModulePlatformID(), cs9.Releasever(), archStr, cs9.Name()) + solver := baseSolver.NewWithConfig(c9s.ModulePlatformID(), c9s.Releasever(), archStr, c9s.Name()) for _, imgTypeStr := range arch.ListImageTypes() { t.Run(imgTypeStr, func(t *testing.T) { imgType, err := arch.GetImageType(imgTypeStr) @@ -81,26 +81,26 @@ func TestDepsolvePackageSets(t *testing.T) { repoDir := "/usr/share/tests/osbuild-composer" // NOTE: we can add RHEL, but don't make it hard requirement because it will fail outside of VPN - cs9 := rhel.NewCentos() + c9s := rhel9.DistroFactory("centos-9") // Set up temporary directory for rpm/dnf cache dir := t.TempDir() - solver := dnfjson.NewSolver(cs9.ModulePlatformID(), cs9.Releasever(), arch.ARCH_X86_64.String(), cs9.Name(), dir) + solver := dnfjson.NewSolver(c9s.ModulePlatformID(), c9s.Releasever(), arch.ARCH_X86_64.String(), c9s.Name(), dir) - repos, err := rpmmd.LoadRepositories([]string{repoDir}, cs9.Name()) - require.NoErrorf(t, err, "Failed to LoadRepositories %v", cs9.Name()) + repos, err := rpmmd.LoadRepositories([]string{repoDir}, c9s.Name()) + require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name()) x86Repos, ok := repos[arch.ARCH_X86_64.String()] - require.Truef(t, ok, "failed to get %q repos for %q", arch.ARCH_X86_64.String(), cs9.Name()) + require.Truef(t, ok, "failed to get %q repos for %q", arch.ARCH_X86_64.String(), c9s.Name()) - x86Arch, err := cs9.GetArch(arch.ARCH_X86_64.String()) - require.Nilf(t, err, "failed to get %q arch of %q distro", arch.ARCH_X86_64.String(), cs9.Name()) + x86Arch, err := c9s.GetArch(arch.ARCH_X86_64.String()) + require.Nilf(t, err, "failed to get %q arch of %q distro", arch.ARCH_X86_64.String(), c9s.Name()) qcow2ImageTypeName := "qcow2" qcow2Image, err := x86Arch.GetImageType(qcow2ImageTypeName) - require.Nilf(t, err, "failed to get %q image type of %q/%q distro/arch", qcow2ImageTypeName, cs9.Name(), arch.ARCH_X86_64.String()) + require.Nilf(t, err, "failed to get %q image type of %q/%q distro/arch", qcow2ImageTypeName, c9s.Name(), arch.ARCH_X86_64.String()) manifestSource, _, err := qcow2Image.Manifest(&blueprint.Blueprint{Packages: []blueprint.Package{{Name: "bind"}}}, distro.ImageOptions{}, x86Repos, 0) - require.Nilf(t, err, "failed to initialise manifest for %q image type of %q/%q distro/arch", qcow2ImageTypeName, cs9.Name(), arch.ARCH_X86_64.String()) + require.Nilf(t, err, "failed to initialise manifest for %q image type of %q/%q distro/arch", qcow2ImageTypeName, c9s.Name(), arch.ARCH_X86_64.String()) imagePkgSets := manifestSource.GetPackageSetChains() gotPackageSpecsSets := make(map[string][]rpmmd.PackageSpec, len(imagePkgSets)) diff --git a/cmd/osbuild-package-sets/main.go b/cmd/osbuild-package-sets/main.go index 760c24c5c4..2289e1ec15 100644 --- a/cmd/osbuild-package-sets/main.go +++ b/cmd/osbuild-package-sets/main.go @@ -10,7 +10,7 @@ import ( "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/ostree" ) @@ -29,9 +29,9 @@ func main() { os.Exit(1) } - dr := distroregistry.NewDefault() + df := distrofactory.NewDefault() - d := dr.GetDistro(distroName) + d := df.GetDistro(distroName) if d == nil { panic(fmt.Errorf("Distro %q does not exist", distroName)) } diff --git a/cmd/osbuild-playground/main.go b/cmd/osbuild-playground/main.go index 19854832d5..73521ba8f6 100644 --- a/cmd/osbuild-playground/main.go +++ b/cmd/osbuild-playground/main.go @@ -10,7 +10,7 @@ import ( "github.com/osbuild/images/pkg/arch" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/image" "github.com/osbuild/images/pkg/rpmmd" ) @@ -55,15 +55,15 @@ func main() { } } - distros := distroregistry.NewDefault() + distroFac := distrofactory.NewDefault() var d distro.Distro if distroArg == "host" { - d = distros.FromHost() + d = distroFac.FromHost() if d == nil { panic("host distro not supported") } } else { - d = distros.GetDistro(distroArg) + d = distroFac.GetDistro(distroArg) if d == nil { panic(fmt.Sprintf("distro '%s' not supported\n", distroArg)) } diff --git a/internal/reporegistry/reporegistry.go b/internal/reporegistry/reporegistry.go index 304f879b71..29b9a81a9c 100644 --- a/internal/reporegistry/reporegistry.go +++ b/internal/reporegistry/reporegistry.go @@ -26,6 +26,13 @@ func New(repoConfigPaths []string) (*RepoRegistry, error) { return &RepoRegistry{repositories}, nil } +// NewTestedDefault returns a new RepoRegistry instance with the data +// loaded from the default test repositories +func NewTestedDefault() (*RepoRegistry, error) { + testReposPath := []string{"./test/data"} + return New(testReposPath) +} + func NewFromDistrosRepoConfigs(distrosRepoConfigs rpmmd.DistrosRepoConfigs) *RepoRegistry { return &RepoRegistry{distrosRepoConfigs} } @@ -112,3 +119,13 @@ func (r *RepoRegistry) DistroHasRepos(distro, arch string) (repos []rpmmd.RepoCo return repos, found } + +// ListDistros returns a list of all distros which have a repository defined +// in the registry. +func (r *RepoRegistry) ListDistros() []string { + distros := make([]string, 0, len(r.repos)) + for name := range r.repos { + distros = append(distros, name) + } + return distros +} diff --git a/pkg/distro/distro_test.go b/pkg/distro/distro_test.go index 2e2c64f402..06223d7973 100644 --- a/pkg/distro/distro_test.go +++ b/pkg/distro/distro_test.go @@ -11,7 +11,8 @@ import ( "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/container" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" + "github.com/osbuild/images/pkg/distro/distro_test_common" + "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/ostree" "github.com/osbuild/images/pkg/rpmmd" "github.com/stretchr/testify/assert" @@ -21,9 +22,10 @@ import ( // Ensure that all package sets defined in the package set chains are defined for the image type func TestImageType_PackageSetsChains(t *testing.T) { - distros := distroregistry.NewDefault() - for _, distroName := range distros.List() { - d := distros.GetDistro(distroName) + distroFactory := distrofactory.NewDefault() + distros := distro_test_common.ListTestedDistros(t) + for _, distroName := range distros { + d := distroFactory.GetDistro(distroName) for _, archName := range d.ListArches() { arch, err := d.GetArch(archName) require.Nil(t, err) @@ -96,9 +98,10 @@ func TestImageTypePipelineNames(t *testing.T) { } assert := assert.New(t) - distros := distroregistry.NewDefault() - for _, distroName := range distros.List() { - d := distros.GetDistro(distroName) + distroFactory := distrofactory.NewDefault() + distros := distro_test_common.ListTestedDistros(t) + for _, distroName := range distros { + d := distroFactory.GetDistro(distroName) for _, archName := range d.ListArches() { arch, err := d.GetArch(archName) assert.Nil(err) @@ -407,11 +410,12 @@ func TestPipelineRepositories(t *testing.T) { }, } - distros := distroregistry.NewDefault() + distroFactory := distrofactory.NewDefault() + distros := distro_test_common.ListTestedDistros(t) for tName, tCase := range testCases { t.Run(tName, func(t *testing.T) { - for _, distroName := range distros.List() { - d := distros.GetDistro(distroName) + for _, distroName := range distros { + d := distroFactory.GetDistro(distroName) for _, archName := range d.ListArches() { arch, err := d.GetArch(archName) require.Nil(err) @@ -571,13 +575,18 @@ func TestDistro_ManifestFIPSWarning(t *testing.T) { "live-installer", "azure-eap7-rhui", } - distros := distroregistry.NewDefault() - for _, distroName := range distros.List() { + + distroFactory, err := distrofactory.NewDefault(nil) + require.NoError(t, err) + distros := distro_test_common.ListTestedDistros(t) + for _, distroName := range distros { // FIPS blueprint customization is not supported for RHEL 7 images if distroName == "rhel-7" { continue } - d := distros.GetDistro(distroName) + d := distroFactory.GetDistro(distroName) + require.NotNil(t, d) + fips_enabled := true msg := common.FIPSEnabledImageWarning + "\n" diff --git a/pkg/distro/distro_test_common/distro_test_common.go b/pkg/distro/distro_test_common/distro_test_common.go index 8e1744d836..32520b5c71 100644 --- a/pkg/distro/distro_test_common/distro_test_common.go +++ b/pkg/distro/distro_test_common/distro_test_common.go @@ -6,7 +6,9 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "github.com/osbuild/images/internal/reporegistry" "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/ostree" @@ -161,10 +163,11 @@ func TestDistro_KernelOption(t *testing.T, d distro.Distro) { func TestDistro_OSTreeOptions(t *testing.T, d distro.Distro) { // test that ostree parameters are properly resolved by image functions that should support them typesWithParent := map[string]bool{ // image types that support specifying a parent commit - "edge-commit": true, - "edge-container": true, - "iot-commit": true, - "iot-container": true, + "edge-commit": true, + "edge-container": true, + "iot-commit": true, + "iot-container": true, + "iot-bootable-container": true, } typesWithPayload := map[string]bool{ @@ -457,3 +460,10 @@ func TestDistro_OSTreeOptions(t *testing.T, d distro.Distro) { } } } + +// ListTestedDistros returns a list of distro names that are explicitly tested +func ListTestedDistros(t *testing.T) []string { + testRepoRegistry, err := reporegistry.NewTestedDefault() + require.Nil(t, err) + return testRepoRegistry.ListDistros() +} diff --git a/pkg/distro/test_distro/distro.go b/pkg/distro/test_distro/distro.go index 2342642950..5affa65812 100644 --- a/pkg/distro/test_distro/distro.go +++ b/pkg/distro/test_distro/distro.go @@ -7,7 +7,6 @@ import ( "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distroregistry" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/ostree" "github.com/osbuild/images/pkg/rpmmd" @@ -392,15 +391,3 @@ func DistroFactory(idStr string) distro.Distro { func New() *TestDistro { return newTestDistro("1") } - -func NewRegistry() *distroregistry.Registry { - td := New() - registry, err := distroregistry.New(td, td) - if err != nil { - panic(err) - } - - // Override the host's architecture name with the test's name - registry.SetHostArchName(TestArchName) - return registry -} diff --git a/pkg/distroregistry/distroregistry.go b/pkg/distroregistry/distroregistry.go deleted file mode 100644 index 67ed2e3060..0000000000 --- a/pkg/distroregistry/distroregistry.go +++ /dev/null @@ -1,147 +0,0 @@ -package distroregistry - -import ( - "fmt" - "sort" - "strings" - - "github.com/osbuild/images/internal/common" - "github.com/osbuild/images/pkg/arch" - "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distro/fedora" - "github.com/osbuild/images/pkg/distro/rhel7" - "github.com/osbuild/images/pkg/distro/rhel8" - "github.com/osbuild/images/pkg/distro/rhel9" -) - -// When adding support for a new distribution, add it here. -// Note that this is a constant, do not write to this array. -var supportedDistros = []func() distro.Distro{ - fedora.NewF37, - fedora.NewF38, - fedora.NewF39, - fedora.NewF40, - - rhel7.New, - - rhel8.New, - rhel8.NewRHEL84, - rhel8.NewRHEL85, - rhel8.NewRHEL86, - rhel8.NewRHEL87, - rhel8.NewRHEL88, - rhel8.NewRHEL89, - rhel8.NewRHEL810, - rhel8.NewCentos, - - rhel9.New, - rhel9.NewRHEL90, - rhel9.NewRHEL91, - rhel9.NewRHEL92, - rhel9.NewRHEL93, - rhel9.NewRHEL94, - rhel9.NewCentOS9, -} - -type Registry struct { - distros map[string]distro.Distro - hostDistro distro.Distro - hostArchName string -} - -func New(hostDistro distro.Distro, distros ...distro.Distro) (*Registry, error) { - reg := &Registry{ - distros: make(map[string]distro.Distro), - hostDistro: hostDistro, - hostArchName: arch.Current().String(), - } - for _, d := range distros { - name := d.Name() - if _, exists := reg.distros[name]; exists { - return nil, fmt.Errorf("New: passed two distros with the same name: %s", d.Name()) - } - reg.distros[name] = d - } - return reg, nil -} - -// NewDefault creates a Registry with all distributions supported by -// osbuild-composer. If you need to add a distribution here, see the -// supportedDistros variable. -func NewDefault() *Registry { - var distros []distro.Distro - var hostDistro distro.Distro - - // First determine the name of the Host Distro - // If there was an error, then the hostDistroName will be an empty string - // and as a result, the hostDistro will have a nil value when calling New(). - // Getting the host distro later using FromHost() will return nil as well. - hostDistroName, _, _, _ := common.GetHostDistroName() - for _, supportedDistro := range supportedDistros { - distro := supportedDistro() - if distro.Name() == hostDistroName { - hostDistro = supportedDistro() - } - distros = append(distros, distro) - } - - registry, err := New(hostDistro, distros...) - if err != nil { - panic(fmt.Sprintf("two supported distros have the same name, this is a programming error: %v", err)) - } - - return registry -} - -func (r *Registry) GetDistro(name string) distro.Distro { - d, ok := r.distros[name] - if !ok { - return nil - } - - return d -} - -// List returns the names of all distros in a Registry, sorted alphabetically. -func (r *Registry) List() []string { - list := []string{} - for _, d := range r.distros { - list = append(list, d.Name()) - } - sort.Strings(list) - return list -} - -func mangleHostDistroName(name string, isBeta, isStream bool) string { - hostDistroName := name - if strings.HasPrefix(hostDistroName, "rhel-8") { - hostDistroName = "rhel-8" - } - if isBeta { - hostDistroName += "-beta" - } - - // override repository for centos stream, remove when CentOS 8 is EOL - if isStream && hostDistroName == "centos-8" { - hostDistroName = "centos-stream-8" - } - - return hostDistroName -} - -// FromHost returns a distro instance, that is specific to the host. -// Its name may differ from other supported distros, if the host version -// is e.g. a Beta or a Stream. -func (r *Registry) FromHost() distro.Distro { - return r.hostDistro -} - -// HostArchName returns the host's arch name -func (r *Registry) HostArchName() string { - return r.hostArchName -} - -// SetHostArchName can be used to override the host's arch name for testing -func (r *Registry) SetHostArchName(name string) { - r.hostArchName = name -} diff --git a/pkg/distroregistry/distroregistry_test.go b/pkg/distroregistry/distroregistry_test.go deleted file mode 100644 index f5ccff668a..0000000000 --- a/pkg/distroregistry/distroregistry_test.go +++ /dev/null @@ -1,122 +0,0 @@ -package distroregistry - -import ( - "fmt" - "testing" - - "github.com/stretchr/testify/require" - - "github.com/osbuild/images/pkg/distro" - "github.com/osbuild/images/pkg/distro/rhel8" -) - -// Test that all distros are registered properly and that Registry.List() works. -func TestRegistry_List(t *testing.T) { - // build expected distros - var expected []string - for _, supportedDistro := range supportedDistros { - d := supportedDistro() - expected = append(expected, d.Name()) - } - - distros := NewDefault() - - require.ElementsMatch(t, expected, distros.List(), "unexpected list of distros") -} - -func TestRegistry_GetDistro(t *testing.T) { - distros := NewDefault() - - t.Run("distro exists", func(t *testing.T) { - expectedDistro := rhel8.New() - require.Equal(t, expectedDistro.Name(), distros.GetDistro(expectedDistro.Name()).Name()) - }) - - t.Run("distro doesn't exist", func(t *testing.T) { - require.Nil(t, distros.GetDistro("toucan-os")) - }) -} - -func TestRegistry_mangleHostDistroName(t *testing.T) { - - type args struct { - name string - isBeta bool - isStream bool - } - - tests := []struct { - name string - args args - want string - }{ - {"fedora-33", args{"fedora-33", false, false}, "fedora-33"}, - {"fedora-33 beta", args{"fedora-33", true, false}, "fedora-33-beta"}, - {"fedora-33 stream", args{"fedora-33", false, true}, "fedora-33"}, - {"fedora-33 beta stream", args{"fedora-33", true, true}, "fedora-33-beta"}, - - {"rhel-8", args{"rhel-8", false, false}, "rhel-8"}, - {"rhel-8 beta", args{"rhel-8", true, false}, "rhel-8-beta"}, - {"rhel-8 stream", args{"rhel-8", false, true}, "rhel-8"}, - {"rhel-8 beta stream", args{"rhel-8", true, true}, "rhel-8-beta"}, - - {"rhel-84", args{"rhel-84", false, false}, "rhel-8"}, - {"rhel-84 beta", args{"rhel-84", true, false}, "rhel-8-beta"}, - {"rhel-84 stream", args{"rhel-84", false, true}, "rhel-8"}, - {"rhel-84 beta stream", args{"rhel-84", true, true}, "rhel-8-beta"}, - - {"centos-8", args{"centos-8", false, false}, "centos-8"}, - {"centos-8 beta", args{"centos-8", true, false}, "centos-8-beta"}, - {"centos-8 stream", args{"centos-8", false, true}, "centos-stream-8"}, - {"centos-8 beta stream", args{"centos-8", true, true}, "centos-8-beta"}, - - {"rhel-90", args{"rhel-90", false, false}, "rhel-90"}, - {"rhel-90 beta", args{"rhel-90", true, false}, "rhel-90-beta"}, - {"rhel-90 stream", args{"rhel-90", false, true}, "rhel-90"}, - {"rhel-90 beta stream", args{"rhel-90", true, true}, "rhel-90-beta"}, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - mangledName := mangleHostDistroName(tt.args.name, tt.args.isBeta, tt.args.isStream) - require.Equalf( - t, - tt.want, - mangledName, - "mangleHostDistroName() name:%s, isBeta:%s, isStream:%s =\nExpected: %s\nGot: %s\n", - tt.args.name, - tt.args.isBeta, - tt.args.isStream, - tt.want, - mangledName, - ) - }) - } -} - -func TestRegistry_FromHost(t *testing.T) { - // expected distros - var distros []distro.Distro - for _, supportedDistro := range supportedDistros { - distros = append(distros, supportedDistro()) - } - - t.Run("host distro is nil", func(t *testing.T) { - registry, err := New(nil, distros...) - require.Nil(t, err) - require.NotNil(t, registry) - require.Nil(t, registry.FromHost()) - }) - - t.Run("host distro not nil", func(t *testing.T) { - hostDistro := rhel8.New() - fmt.Println(hostDistro.Name()) - registry, err := New(hostDistro, distros...) - require.Nil(t, err) - require.NotNil(t, registry) - - gotDistro := registry.FromHost() - require.NotNil(t, gotDistro) - require.Equal(t, gotDistro.Name(), hostDistro.Name()) - }) -} From 74562d01d9e1ec8dc37990eef7215c454de83327 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 12:39:54 +0100 Subject: [PATCH 05/23] common.GetHostDistroName(): return only distro name with dot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplify the `common.GetHostDistroName()` function to return only distro name (including release version), since the `isBeta` and `isStream` values are not really used by any caller. In addition, keep the dot in the distro name to separate major and minor version. Signed-off-by: Tomáš Hozza --- internal/boot/context-managers.go | 2 +- internal/common/distro.go | 17 +++++++---------- pkg/distrofactory/distrofactory.go | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/internal/boot/context-managers.go b/internal/boot/context-managers.go index fb3a9dc1cc..7f390c8ec7 100644 --- a/internal/boot/context-managers.go +++ b/internal/boot/context-managers.go @@ -112,7 +112,7 @@ func WithBootedQemuImage(image string, ns NetNS, f func() error) error { var qemuCmd *exec.Cmd if arch.IsX86_64() { - hostDistroName, _, _, err := common.GetHostDistroName() + hostDistroName, err := common.GetHostDistroName() if err != nil { return fmt.Errorf("cannot determing the current distro: %v", err) } diff --git a/internal/common/distro.go b/internal/common/distro.go index 5cf1cc096f..c93017c72f 100644 --- a/internal/common/distro.go +++ b/internal/common/distro.go @@ -10,25 +10,22 @@ import ( "github.com/hashicorp/go-version" ) -func GetHostDistroName() (string, bool, bool, error) { +// GetHostDistroName returns the name of the host distribution, such as +// "fedora-32" or "rhel-8.2". It does so by reading the /etc/os-release file. +func GetHostDistroName() (string, error) { f, err := os.Open("/etc/os-release") if err != nil { - return "", false, false, err + return "", err } defer f.Close() osrelease, err := readOSRelease(f) if err != nil { - return "", false, false, err + return "", err } - isStream := osrelease["NAME"] == "CentOS Stream" + name := osrelease["ID"] + "-" + osrelease["VERSION_ID"] - version := strings.Split(osrelease["VERSION_ID"], ".") - name := osrelease["ID"] + "-" + strings.Join(version, "") - - // TODO: We should probably index these things by the full CPE - beta := strings.Contains(osrelease["CPE_NAME"], "beta") - return name, beta, isStream, nil + return name, nil } func readOSRelease(r io.Reader) (map[string]string, error) { diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go index 33e64972db..8e3ace9539 100644 --- a/pkg/distrofactory/distrofactory.go +++ b/pkg/distrofactory/distrofactory.go @@ -42,7 +42,7 @@ func (f *Factory) GetDistro(name string) distro.Distro { // FromHost returns a distro.Distro instance, that is specific to the host. // If the host distro is not supported, nil is returned. func (f *Factory) FromHost() distro.Distro { - hostDistroName, _, _, _ := common.GetHostDistroName() + hostDistroName, _ := common.GetHostDistroName() return f.GetDistro(hostDistroName) } From b6181c20fa105b80ee31cb915846d0f20531c841 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 13:05:45 +0100 Subject: [PATCH 06/23] Make `reporegistry` public, so that it can be used by osbuild-composer MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some logic related to `reporegistry` will need to change due to introduction of dot to separate major and minor release version in distro names. Both, `images` and `osbuild-composer` have their own copy of the code, which does not scale. In general, the `images` repo needs to handle repositories to generate testing manifests, so it makes sense to keep the authoritative copy of `reporegistry` in this repository and then just use it in `osbuild-composer`. Signed-off-by: Tomáš Hozza --- cmd/list-images/main.go | 2 +- cmd/osbuild-composer-image-definitions/main.go | 2 +- pkg/distro/distro_test_common/distro_test_common.go | 2 +- {internal => pkg}/reporegistry/reporegistry.go | 0 {internal => pkg}/reporegistry/reporegistry_test.go | 0 5 files changed, 3 insertions(+), 3 deletions(-) rename {internal => pkg}/reporegistry/reporegistry.go (100%) rename {internal => pkg}/reporegistry/reporegistry_test.go (100%) diff --git a/cmd/list-images/main.go b/cmd/list-images/main.go index 9be56fad06..1ac7ae634e 100644 --- a/cmd/list-images/main.go +++ b/cmd/list-images/main.go @@ -10,8 +10,8 @@ import ( "strings" "github.com/gobwas/glob" - "github.com/osbuild/images/internal/reporegistry" "github.com/osbuild/images/pkg/distrofactory" + "github.com/osbuild/images/pkg/reporegistry" ) type multiValue []string diff --git a/cmd/osbuild-composer-image-definitions/main.go b/cmd/osbuild-composer-image-definitions/main.go index 09f4d6b252..89573aeb03 100644 --- a/cmd/osbuild-composer-image-definitions/main.go +++ b/cmd/osbuild-composer-image-definitions/main.go @@ -5,8 +5,8 @@ import ( "fmt" "os" - "github.com/osbuild/images/internal/reporegistry" "github.com/osbuild/images/pkg/distrofactory" + "github.com/osbuild/images/pkg/reporegistry" ) func main() { diff --git a/pkg/distro/distro_test_common/distro_test_common.go b/pkg/distro/distro_test_common/distro_test_common.go index 32520b5c71..2afb35d2bf 100644 --- a/pkg/distro/distro_test_common/distro_test_common.go +++ b/pkg/distro/distro_test_common/distro_test_common.go @@ -8,10 +8,10 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "github.com/osbuild/images/internal/reporegistry" "github.com/osbuild/images/pkg/blueprint" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/ostree" + "github.com/osbuild/images/pkg/reporegistry" ) const RandomTestSeed = 0 diff --git a/internal/reporegistry/reporegistry.go b/pkg/reporegistry/reporegistry.go similarity index 100% rename from internal/reporegistry/reporegistry.go rename to pkg/reporegistry/reporegistry.go diff --git a/internal/reporegistry/reporegistry_test.go b/pkg/reporegistry/reporegistry_test.go similarity index 100% rename from internal/reporegistry/reporegistry_test.go rename to pkg/reporegistry/reporegistry_test.go From 879c4a6d2ac54b5aafef116b88e3c95c2f08c32f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 13:26:19 +0100 Subject: [PATCH 07/23] Move `GetHostDistroName()` to `distro` package MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This will allow to use the function also in `osbuild-composer`, while maintaining only a single copy of the code. I chose this approach instead of making the whole `internal/common` package public. The function is related to distros, so this move also makes some sense. Signed-off-by: Tomáš Hozza --- internal/boot/context-managers.go | 4 +-- internal/common/distro.go | 47 -------------------------- internal/common/distro_test.go | 49 --------------------------- pkg/distro/host.go | 50 +++++++++++++++++++++++++++ pkg/distro/host_test.go | 54 ++++++++++++++++++++++++++++++ pkg/distrofactory/distrofactory.go | 3 +- 6 files changed, 107 insertions(+), 100 deletions(-) create mode 100644 pkg/distro/host.go create mode 100644 pkg/distro/host_test.go diff --git a/internal/boot/context-managers.go b/internal/boot/context-managers.go index 7f390c8ec7..6cd4876a38 100644 --- a/internal/boot/context-managers.go +++ b/internal/boot/context-managers.go @@ -12,8 +12,8 @@ import ( "time" "github.com/osbuild/images/cmd/osbuild-image-tests/constants" - "github.com/osbuild/images/internal/common" "github.com/osbuild/images/pkg/arch" + "github.com/osbuild/images/pkg/distro" ) // WithNetworkNamespace provides the function f with a new network namespace @@ -112,7 +112,7 @@ func WithBootedQemuImage(image string, ns NetNS, f func() error) error { var qemuCmd *exec.Cmd if arch.IsX86_64() { - hostDistroName, err := common.GetHostDistroName() + hostDistroName, err := distro.GetHostDistroName() if err != nil { return fmt.Errorf("cannot determing the current distro: %v", err) } diff --git a/internal/common/distro.go b/internal/common/distro.go index c93017c72f..54fc2b05b4 100644 --- a/internal/common/distro.go +++ b/internal/common/distro.go @@ -1,56 +1,9 @@ package common import ( - "bufio" - "errors" - "io" - "os" - "strings" - "github.com/hashicorp/go-version" ) -// GetHostDistroName returns the name of the host distribution, such as -// "fedora-32" or "rhel-8.2". It does so by reading the /etc/os-release file. -func GetHostDistroName() (string, error) { - f, err := os.Open("/etc/os-release") - if err != nil { - return "", err - } - defer f.Close() - osrelease, err := readOSRelease(f) - if err != nil { - return "", err - } - - name := osrelease["ID"] + "-" + osrelease["VERSION_ID"] - - return name, nil -} - -func readOSRelease(r io.Reader) (map[string]string, error) { - osrelease := make(map[string]string) - scanner := bufio.NewScanner(r) - for scanner.Scan() { - line := strings.TrimSpace(scanner.Text()) - if len(line) == 0 { - continue - } - - parts := strings.SplitN(line, "=", 2) - if len(parts) != 2 { - return nil, errors.New("readOSRelease: invalid input") - } - - key := strings.TrimSpace(parts[0]) - // drop all surrounding whitespace and double-quotes - value := strings.Trim(strings.TrimSpace(parts[1]), "\"") - osrelease[key] = value - } - - return osrelease, nil -} - // Returns true if the version represented by the first argument is // semantically older than the second. // diff --git a/internal/common/distro_test.go b/internal/common/distro_test.go index 537b86e56b..a4de1d2789 100644 --- a/internal/common/distro_test.go +++ b/internal/common/distro_test.go @@ -1,58 +1,9 @@ package common import ( - "reflect" - "strings" "testing" ) -func TestOSRelease(t *testing.T) { - var cases = []struct { - Input string - OSRelease map[string]string - }{ - { - ``, - map[string]string{}, - }, - { - `NAME=Fedora -VERSION="30 (Workstation Edition)" -ID=fedora -VERSION_ID=30 -VERSION_CODENAME="" -PLATFORM_ID="platform:f30" -PRETTY_NAME="Fedora 30 (Workstation Edition)" -VARIANT="Workstation Edition" -VARIANT_ID=workstation`, - map[string]string{ - "NAME": "Fedora", - "VERSION": "30 (Workstation Edition)", - "ID": "fedora", - "VERSION_ID": "30", - "VERSION_CODENAME": "", - "PLATFORM_ID": "platform:f30", - "PRETTY_NAME": "Fedora 30 (Workstation Edition)", - "VARIANT": "Workstation Edition", - "VARIANT_ID": "workstation", - }, - }, - } - - for i, c := range cases { - r := strings.NewReader(c.Input) - - osrelease, err := readOSRelease(r) - if err != nil { - t.Fatalf("%d: readOSRelease: %v", i, err) - } - - if !reflect.DeepEqual(osrelease, c.OSRelease) { - t.Fatalf("%d: readOSRelease returned unexpected result: %#v", i, osrelease) - } - } -} - func TestVersionLessThan(t *testing.T) { type testCases struct { Name string diff --git a/pkg/distro/host.go b/pkg/distro/host.go new file mode 100644 index 0000000000..294e9109f4 --- /dev/null +++ b/pkg/distro/host.go @@ -0,0 +1,50 @@ +package distro + +import ( + "bufio" + "errors" + "io" + "os" + "strings" +) + +// GetHostDistroName returns the name of the host distribution, such as +// "fedora-32" or "rhel-8.2". It does so by reading the /etc/os-release file. +func GetHostDistroName() (string, error) { + f, err := os.Open("/etc/os-release") + if err != nil { + return "", err + } + defer f.Close() + osrelease, err := readOSRelease(f) + if err != nil { + return "", err + } + + name := osrelease["ID"] + "-" + osrelease["VERSION_ID"] + + return name, nil +} + +func readOSRelease(r io.Reader) (map[string]string, error) { + osrelease := make(map[string]string) + scanner := bufio.NewScanner(r) + for scanner.Scan() { + line := strings.TrimSpace(scanner.Text()) + if len(line) == 0 { + continue + } + + parts := strings.SplitN(line, "=", 2) + if len(parts) != 2 { + return nil, errors.New("readOSRelease: invalid input") + } + + key := strings.TrimSpace(parts[0]) + // drop all surrounding whitespace and double-quotes + value := strings.Trim(strings.TrimSpace(parts[1]), "\"") + osrelease[key] = value + } + + return osrelease, nil +} diff --git a/pkg/distro/host_test.go b/pkg/distro/host_test.go new file mode 100644 index 0000000000..490040bf32 --- /dev/null +++ b/pkg/distro/host_test.go @@ -0,0 +1,54 @@ +package distro + +import ( + "reflect" + "strings" + "testing" +) + +func TestOSRelease(t *testing.T) { + var cases = []struct { + Input string + OSRelease map[string]string + }{ + { + ``, + map[string]string{}, + }, + { + `NAME=Fedora +VERSION="30 (Workstation Edition)" +ID=fedora +VERSION_ID=30 +VERSION_CODENAME="" +PLATFORM_ID="platform:f30" +PRETTY_NAME="Fedora 30 (Workstation Edition)" +VARIANT="Workstation Edition" +VARIANT_ID=workstation`, + map[string]string{ + "NAME": "Fedora", + "VERSION": "30 (Workstation Edition)", + "ID": "fedora", + "VERSION_ID": "30", + "VERSION_CODENAME": "", + "PLATFORM_ID": "platform:f30", + "PRETTY_NAME": "Fedora 30 (Workstation Edition)", + "VARIANT": "Workstation Edition", + "VARIANT_ID": "workstation", + }, + }, + } + + for i, c := range cases { + r := strings.NewReader(c.Input) + + osrelease, err := readOSRelease(r) + if err != nil { + t.Fatalf("%d: readOSRelease: %v", i, err) + } + + if !reflect.DeepEqual(osrelease, c.OSRelease) { + t.Fatalf("%d: readOSRelease returned unexpected result: %#v", i, osrelease) + } + } +} diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go index 8e3ace9539..e06b499390 100644 --- a/pkg/distrofactory/distrofactory.go +++ b/pkg/distrofactory/distrofactory.go @@ -3,7 +3,6 @@ package distrofactory import ( "fmt" - "github.com/osbuild/images/internal/common" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distro/fedora" "github.com/osbuild/images/pkg/distro/rhel7" @@ -42,7 +41,7 @@ func (f *Factory) GetDistro(name string) distro.Distro { // FromHost returns a distro.Distro instance, that is specific to the host. // If the host distro is not supported, nil is returned. func (f *Factory) FromHost() distro.Distro { - hostDistroName, _ := common.GetHostDistroName() + hostDistroName, _ := distro.GetHostDistroName() return f.GetDistro(hostDistroName) } From 51366d3c84942f20bebcbf909c156743344166d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 15:12:19 +0100 Subject: [PATCH 08/23] Introduce `distroidparser` package for parsing distro ID strings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Factor out the distro-specific ID String parsers into a separate functions in each distro implementation. This allows to introduce the `distroidparser` to have a common and consistent way to parse distro ID Strings, including the use of distro-specific parsers. This will be crucial for backward compatibility of distro names without the dot separator as used by APIs and distro configurations. The parser needs to be a separate package, because adding it to the `distro` package, where the `distro.ID` struct is defined, would result in an import loop. In addition adjust the logic of the RHEL parsing code a bit, to enable returning more sensible errors from the parser function. Cover the newly added code with unit tests. Signed-off-by: Tomáš Hozza --- pkg/distro/fedora/distro.go | 17 ++- pkg/distro/rhel7/distro.go | 19 ++- pkg/distro/rhel8/distro.go | 31 +++- pkg/distro/rhel8/distro_internal_test.go | 4 + pkg/distro/rhel9/distro.go | 31 +++- pkg/distro/rhel9/distro_internal_test.go | 4 + pkg/distroidparser/idparser.go | 57 ++++++++ pkg/distroidparser/idparser_test.go | 171 +++++++++++++++++++++++ 8 files changed, 311 insertions(+), 23 deletions(-) create mode 100644 pkg/distroidparser/idparser.go create mode 100644 pkg/distroidparser/idparser_test.go diff --git a/pkg/distro/fedora/distro.go b/pkg/distro/fedora/distro.go index 3cbbe4024f..8515ab61e4 100644 --- a/pkg/distro/fedora/distro.go +++ b/pkg/distro/fedora/distro.go @@ -974,17 +974,26 @@ func newDistro(version int) distro.Distro { return &rd } -func DistroFactory(idStr string) distro.Distro { - id, err := distro.DistroIDParser(idStr) +func ParseID(idStr string) (*distro.ID, error) { + id, err := distro.ParseID(idStr) if err != nil { - return nil + return nil, err } if id.Name != "fedora" { - return nil + return nil, fmt.Errorf("invalid distro name: %s", id.Name) } if id.MinorVersion != -1 { + return nil, fmt.Errorf("fedora distro does not support minor versions") + } + + return id, nil +} + +func DistroFactory(idStr string) distro.Distro { + id, err := ParseID(idStr) + if err != nil { return nil } diff --git a/pkg/distro/rhel7/distro.go b/pkg/distro/rhel7/distro.go index 662a4cb133..5f7a083ecf 100644 --- a/pkg/distro/rhel7/distro.go +++ b/pkg/distro/rhel7/distro.go @@ -238,21 +238,30 @@ func newDistro(distroName string) distro.Distro { return &rd } -func DistroFactory(idStr string) distro.Distro { - id, err := distro.DistroIDParser(idStr) +func ParseID(idStr string) (*distro.ID, error) { + id, err := distro.ParseID(idStr) if err != nil { - return nil + return nil, err } if id.Name != "rhel" { - return nil + return nil, fmt.Errorf("invalid distro name: %s", id.Name) } if id.MajorVersion != 7 { - return nil + return nil, fmt.Errorf("invalid distro major version: %d", id.MajorVersion) } // TODO: we should probably support also the minor version, specifically "7.9" if id.MinorVersion != -1 { + return nil, fmt.Errorf("invalid distro minor version: %d", id.MinorVersion) + } + + return id, nil +} + +func DistroFactory(idStr string) distro.Distro { + _, err := ParseID(idStr) + if err != nil { return nil } diff --git a/pkg/distro/rhel8/distro.go b/pkg/distro/rhel8/distro.go index 3737d4b629..a3ee31244d 100644 --- a/pkg/distro/rhel8/distro.go +++ b/pkg/distro/rhel8/distro.go @@ -518,10 +518,14 @@ func newDistro(name string, minor int) *distribution { return &rd } -func DistroFactory(idStr string) distro.Distro { - id, err := distro.DistroIDParser(idStr) +func ParseID(idStr string) (*distro.ID, error) { + id, err := distro.ParseID(idStr) if err != nil { - return nil + return nil, err + } + + if id.Name != "rhel" && id.Name != "centos" { + return nil, fmt.Errorf("invalid distro name: %s", id.Name) } // Backward compatibility layer for "rhel-84" or "rhel-810" @@ -538,18 +542,31 @@ func DistroFactory(idStr string) distro.Distro { } if id.MajorVersion != 8 { - return nil + return nil, fmt.Errorf("invalid distro major version: %d", id.MajorVersion) } // CentOS does not use minor version - if id.Name == "centos" && id.MinorVersion == -1 { - return NewCentos() + if id.Name == "centos" && id.MinorVersion != -1 { + return nil, fmt.Errorf("centos does not use minor version, but got: %d", id.MinorVersion) } // RHEL uses minor version - if id.Name != "rhel" || id.MinorVersion == -1 { + if id.Name == "rhel" && id.MinorVersion == -1 { + return nil, fmt.Errorf("rhel requires minor version, but got: %d", id.MinorVersion) + } + + return id, nil +} + +func DistroFactory(idStr string) distro.Distro { + id, err := ParseID(idStr) + if err != nil { return nil } + if id.Name == "centos" { + return NewCentos() + } + return newDistro("rhel", id.MinorVersion) } diff --git a/pkg/distro/rhel8/distro_internal_test.go b/pkg/distro/rhel8/distro_internal_test.go index acfc0f3645..04b5b49dc4 100644 --- a/pkg/distro/rhel8/distro_internal_test.go +++ b/pkg/distro/rhel8/distro_internal_test.go @@ -131,6 +131,10 @@ func TestDistroFactory(t *testing.T) { strID: "rhel-7.9", expected: nil, }, + { + strID: "fedora-8", + expected: nil, + }, { strID: "fedora-37", expected: nil, diff --git a/pkg/distro/rhel9/distro.go b/pkg/distro/rhel9/distro.go index f1ce85e7bf..3d4c01047e 100644 --- a/pkg/distro/rhel9/distro.go +++ b/pkg/distro/rhel9/distro.go @@ -495,10 +495,14 @@ func newDistro(name string, minor int) *distribution { return &rd } -func DistroFactory(idStr string) distro.Distro { - id, err := distro.DistroIDParser(idStr) +func ParseID(idStr string) (*distro.ID, error) { + id, err := distro.ParseID(idStr) if err != nil { - return nil + return nil, err + } + + if id.Name != "rhel" && id.Name != "centos" { + return nil, fmt.Errorf("invalid distro name: %s", id.Name) } // Backward compatibility layer for "rhel-93" and friends @@ -512,18 +516,31 @@ func DistroFactory(idStr string) distro.Distro { } if id.MajorVersion != 9 { - return nil + return nil, fmt.Errorf("invalid distro major version: %d", id.MajorVersion) } // CentOS does not use minor version - if id.Name == "centos" && id.MinorVersion == -1 { - return NewCentOS9() + if id.Name == "centos" && id.MinorVersion != -1 { + return nil, fmt.Errorf("centos does not use minor version, but got: %d", id.MinorVersion) } // RHEL uses minor version - if id.Name != "rhel" || id.MinorVersion == -1 { + if id.Name == "rhel" && id.MinorVersion == -1 { + return nil, fmt.Errorf("rhel requires minor version, but got: %d", id.MinorVersion) + } + + return id, nil +} + +func DistroFactory(idStr string) distro.Distro { + id, err := ParseID(idStr) + if err != nil { return nil } + if id.Name == "centos" { + return NewCentOS9() + } + return newDistro("rhel", id.MinorVersion) } diff --git a/pkg/distro/rhel9/distro_internal_test.go b/pkg/distro/rhel9/distro_internal_test.go index 6cd6e7f81f..d9dfd38a16 100644 --- a/pkg/distro/rhel9/distro_internal_test.go +++ b/pkg/distro/rhel9/distro_internal_test.go @@ -95,6 +95,10 @@ func TestDistroFactory(t *testing.T) { strID: "rhel-7.9", expected: nil, }, + { + strID: "fedora-9", + expected: nil, + }, { strID: "fedora-37", expected: nil, diff --git a/pkg/distroidparser/idparser.go b/pkg/distroidparser/idparser.go new file mode 100644 index 0000000000..f3da48dc0e --- /dev/null +++ b/pkg/distroidparser/idparser.go @@ -0,0 +1,57 @@ +package distroidparser + +import ( + "github.com/osbuild/images/pkg/distro" + "github.com/osbuild/images/pkg/distro/fedora" + "github.com/osbuild/images/pkg/distro/rhel7" + "github.com/osbuild/images/pkg/distro/rhel8" + "github.com/osbuild/images/pkg/distro/rhel9" +) + +type ParserFunc func(idStr string) (*distro.ID, error) + +// Parser is a list of distro-specific idStr parsers. +type Parser struct { + parsers []ParserFunc +} + +func New(parsers ...ParserFunc) *Parser { + return &Parser{parsers: parsers} +} + +// Parse returns the distro.ID that matches the given distro ID string. If no +// distro.ID matches the given distro ID string, it returns nil. If multiple +// distro.IDs match the given distro ID string, it panics. +// If no distro-specific parser matches the given distro ID string, it falls back +// to the default parser. +// +// The fact that the Parser returns a distro.ID does not mean that the distro is +// actually supported or implemented. This functionality is provided as an easy +// and consistent way to parse distro IDs, while allowing distro-specific parsers. +func (p *Parser) Parse(idStr string) (*distro.ID, error) { + var match *distro.ID + for _, f := range p.parsers { + if d, err := f(idStr); err == nil { + if match != nil { + panic("distro ID was matched by multiple parsers") + } + match = d + } + } + + // Fall back to the default parser + if match == nil { + return distro.ParseID(idStr) + } + + return match, nil +} + +func NewDefaultParser() *Parser { + return New( + fedora.ParseID, + rhel7.ParseID, + rhel8.ParseID, + rhel9.ParseID, + ) +} diff --git a/pkg/distroidparser/idparser_test.go b/pkg/distroidparser/idparser_test.go new file mode 100644 index 0000000000..f46f11edb1 --- /dev/null +++ b/pkg/distroidparser/idparser_test.go @@ -0,0 +1,171 @@ +package distroidparser + +import ( + "testing" + + "github.com/osbuild/images/pkg/distro" + "github.com/osbuild/images/pkg/distro/fedora" + "github.com/stretchr/testify/require" +) + +func TestDefaltParser(t *testing.T) { + type testCase struct { + idStr string + expected *distro.ID + err bool + } + + testCases := []testCase{ + // Fedora + { + idStr: "fedora-39", + expected: &distro.ID{Name: "fedora", MajorVersion: 39, MinorVersion: -1}, + }, + { + idStr: "fedora-39.1", + expected: &distro.ID{Name: "fedora", MajorVersion: 39, MinorVersion: 1}, + }, + { + idStr: "fedora-39.1.1", + err: true, + }, + // RHEL-7 + { + idStr: "rhel-7", + expected: &distro.ID{Name: "rhel", MajorVersion: 7, MinorVersion: -1}, + }, + { + idStr: "rhel-79", + expected: &distro.ID{Name: "rhel", MajorVersion: 79, MinorVersion: -1}, + }, + { + idStr: "rhel-7.9", + expected: &distro.ID{Name: "rhel", MajorVersion: 7, MinorVersion: 9}, + }, + // RHEL-8 + { + idStr: "rhel-8", + expected: &distro.ID{Name: "rhel", MajorVersion: 8, MinorVersion: -1}, + }, + { + idStr: "rhel-80", + expected: &distro.ID{Name: "rhel", MajorVersion: 8, MinorVersion: 0}, + }, + { + idStr: "rhel-8.0", + expected: &distro.ID{Name: "rhel", MajorVersion: 8, MinorVersion: 0}, + }, + { + idStr: "rhel-810", + expected: &distro.ID{Name: "rhel", MajorVersion: 8, MinorVersion: 10}, + }, + { + idStr: "rhel-8.10", + expected: &distro.ID{Name: "rhel", MajorVersion: 8, MinorVersion: 10}, + }, + { + idStr: "rhel-8100", + expected: &distro.ID{Name: "rhel", MajorVersion: 8100, MinorVersion: -1}, + }, + { + idStr: "rhel-8.1.1", + err: true, + }, + // CentOS-8 + { + idStr: "centos-8", + expected: &distro.ID{Name: "centos", MajorVersion: 8, MinorVersion: -1}, + }, + { + idStr: "centos-8.2", + expected: &distro.ID{Name: "centos", MajorVersion: 8, MinorVersion: 2}, + }, + { + idStr: "centos-8.2.2", + err: true, + }, + // RHEL-9 + { + idStr: "rhel-9", + expected: &distro.ID{Name: "rhel", MajorVersion: 9, MinorVersion: -1}, + }, + { + idStr: "rhel-90", + expected: &distro.ID{Name: "rhel", MajorVersion: 9, MinorVersion: 0}, + }, + { + idStr: "rhel-9.0", + expected: &distro.ID{Name: "rhel", MajorVersion: 9, MinorVersion: 0}, + }, + { + idStr: "rhel-910", + expected: &distro.ID{Name: "rhel", MajorVersion: 910, MinorVersion: -1}, + }, + { + idStr: "rhel-9.10", + expected: &distro.ID{Name: "rhel", MajorVersion: 9, MinorVersion: 10}, + }, + { + idStr: "rhel-9100", + expected: &distro.ID{Name: "rhel", MajorVersion: 9100, MinorVersion: -1}, + }, + { + idStr: "rhel-9.1.1", + err: true, + }, + // CentOS-9 + { + idStr: "centos-9", + expected: &distro.ID{Name: "centos", MajorVersion: 9, MinorVersion: -1}, + }, + { + idStr: "centos-9.2", + expected: &distro.ID{Name: "centos", MajorVersion: 9, MinorVersion: 2}, + }, + { + idStr: "centos-9.2.2", + err: true, + }, + // Non-existing distro + { + idStr: "tuxdistro-1", + expected: &distro.ID{Name: "tuxdistro", MajorVersion: 1, MinorVersion: -1}, + }, + { + idStr: "tuxdistro-1.2", + expected: &distro.ID{Name: "tuxdistro", MajorVersion: 1, MinorVersion: 2}, + }, + { + idStr: "tuxdistro-123.321", + expected: &distro.ID{Name: "tuxdistro", MajorVersion: 123, MinorVersion: 321}, + }, + { + idStr: "tuxdistro-1.2.3", + err: true, + }, + } + + parser := NewDefaultParser() + for _, tc := range testCases { + t.Run(tc.idStr, func(t *testing.T) { + id, err := parser.Parse(tc.idStr) + + if tc.err { + require.Error(t, err) + require.Nil(t, id) + return + } + + require.NoError(t, err) + require.Equal(t, tc.expected, id) + }) + } +} + +func TestParserDoubleMatch(t *testing.T) { + Parser := New(fedora.ParseID, fedora.ParseID) + + require.Panics(t, func() { + _, _ = Parser.Parse("fedora-33") + }, "Parser should panic when fedora-33 is matched by multiple parsers") +} From 80e27da8ebe0ce8f1eb781f04347cbbacea696aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 11:03:53 +0100 Subject: [PATCH 09/23] distro/fedora: delete version-specific distro constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit These should not be used any more. The distro factory should be used instead. Adjust all distro unit tests. Signed-off-by: Tomáš Hozza --- pkg/distro/fedora/distro.go | 14 -- pkg/distro/fedora/distro_test.go | 283 +++++++++++++++++-------------- 2 files changed, 158 insertions(+), 139 deletions(-) diff --git a/pkg/distro/fedora/distro.go b/pkg/distro/fedora/distro.go index 8515ab61e4..743ab48a7b 100644 --- a/pkg/distro/fedora/distro.go +++ b/pkg/distro/fedora/distro.go @@ -533,20 +533,6 @@ func (a *architecture) Distro() distro.Distro { return a.distro } -// New creates a new distro object, defining the supported architectures and image types -func NewF37() distro.Distro { - return newDistro(37) -} -func NewF38() distro.Distro { - return newDistro(38) -} -func NewF39() distro.Distro { - return newDistro(39) -} -func NewF40() distro.Distro { - return newDistro(40) -} - func newDistro(version int) distro.Distro { rd := getDistro(version) diff --git a/pkg/distro/fedora/distro_test.go b/pkg/distro/fedora/distro_test.go index 59bc9873b8..fe4e74e53c 100644 --- a/pkg/distro/fedora/distro_test.go +++ b/pkg/distro/fedora/distro_test.go @@ -21,20 +21,20 @@ type fedoraFamilyDistro struct { var fedoraFamilyDistros = []fedoraFamilyDistro{ { - name: "fedora", - distro: fedora.NewF37(), + name: "fedora-37", + distro: fedora.DistroFactory("fedora-37"), }, { - name: "fedora", - distro: fedora.NewF38(), + name: "fedora-38", + distro: fedora.DistroFactory("fedora-38"), }, { - name: "fedora", - distro: fedora.NewF39(), + name: "fedora-39", + distro: fedora.DistroFactory("fedora-39"), }, { - name: "fedora", - distro: fedora.NewF40(), + name: "fedora-40", + distro: fedora.DistroFactory("fedora-40"), }, } @@ -497,7 +497,6 @@ func TestImageTypeAliases(t *testing.T) { func TestDistro_ManifestError(t *testing.T) { // Currently, the only unsupported configuration is OSTree commit types // with Kernel boot options - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Kernel: &blueprint.KernelCustomization{ @@ -506,29 +505,32 @@ func TestDistro_ManifestError(t *testing.T) { }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - t.Run(fmt.Sprintf("%s/%s", archName, imgTypeName), func(t *testing.T) { - imgType, _ := arch.GetImageType(imgTypeName) - imgOpts := distro.ImageOptions{ - Size: imgType.Size(0), - } - _, _, err := imgType.Manifest(&bp, imgOpts, nil, 0) - if imgTypeName == "iot-commit" || imgTypeName == "iot-container" { - assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") - } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" { - assert.EqualError(t, err, fmt.Sprintf("boot ISO image type \"%s\" requires specifying a URL from which to retrieve the OSTree commit", imgTypeName)) - } else if imgTypeName == "image-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, FIPS")) - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { - assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) - } else { - assert.NoError(t, err) - } - }) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + t.Run(fmt.Sprintf("%s/%s", archName, imgTypeName), func(t *testing.T) { + imgType, _ := arch.GetImageType(imgTypeName) + imgOpts := distro.ImageOptions{ + Size: imgType.Size(0), + } + _, _, err := imgType.Manifest(&bp, imgOpts, nil, 0) + if imgTypeName == "iot-commit" || imgTypeName == "iot-container" || imgTypeName == "iot-bootable-container" { + assert.EqualError(t, err, "kernel boot parameter customizations are not supported for ostree types") + } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" { + assert.EqualError(t, err, fmt.Sprintf("boot ISO image type \"%s\" requires specifying a URL from which to retrieve the OSTree commit", imgTypeName)) + } else if imgTypeName == "image-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, FIPS")) + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { + assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) + } else { + assert.NoError(t, err) + } + }) + } } } } @@ -651,8 +653,13 @@ func TestArchitecture_ListImageTypes(t *testing.T) { } func TestFedora_ListArches(t *testing.T) { - arches := fedora.NewF37().ListArches() - assert.Equal(t, []string{"aarch64", "ppc64le", "s390x", "x86_64"}, arches) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + t.Run(dist.name, func(t *testing.T) { + arches := fedoraDistro.ListArches() + assert.Equal(t, []string{"aarch64", "ppc64le", "s390x", "x86_64"}, arches) + }) + } } func TestFedora37_GetArch(t *testing.T) { @@ -695,21 +702,34 @@ func TestFedora37_GetArch(t *testing.T) { } } -func TestFedora37_Name(t *testing.T) { - distro := fedora.NewF37() - assert.Equal(t, "fedora-37", distro.Name()) +func TestFedora_Name(t *testing.T) { + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + t.Run(dist.name, func(t *testing.T) { + assert.Equal(t, dist.name, fedoraDistro.Name()) + }) + } } -func TestFedora37_KernelOption(t *testing.T) { - distro_test_common.TestDistro_KernelOption(t, fedora.NewF37()) +func TestFedora_KernelOption(t *testing.T) { + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + t.Run(dist.name, func(t *testing.T) { + distro_test_common.TestDistro_KernelOption(t, fedoraDistro) + }) + } } func TestFedora_OSTreeOptions(t *testing.T) { - distro_test_common.TestDistro_OSTreeOptions(t, fedora.NewF37()) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + t.Run(dist.name, func(t *testing.T) { + distro_test_common.TestDistro_OSTreeOptions(t, fedoraDistro) + }) + } } func TestDistro_CustomFileSystemManifestError(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -720,28 +740,30 @@ func TestDistro_CustomFileSystemManifestError(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if imgTypeName == "iot-commit" || imgTypeName == "iot-container" { - assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { - assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) - } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.EqualError(t, err, "The following custom mountpoints are not supported [\"/etc\"]") + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if imgTypeName == "iot-commit" || imgTypeName == "iot-container" || imgTypeName == "iot-bootable-container" { + assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") + } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { + assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) + } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.EqualError(t, err, "The following custom mountpoints are not supported [\"/etc\"]") + } } } } } func TestDistro_TestRootMountPoint(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -752,28 +774,30 @@ func TestDistro_TestRootMountPoint(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if imgTypeName == "iot-commit" || imgTypeName == "iot-container" { - assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { - assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) - } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.NoError(t, err) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if imgTypeName == "iot-commit" || imgTypeName == "iot-container" || imgTypeName == "iot-bootable-container" { + assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") + } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { + assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) + } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.NoError(t, err) + } } } } } func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -788,24 +812,26 @@ func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.NoError(t, err) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.NoError(t, err) + } } } } } func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -828,24 +854,26 @@ func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.NoError(t, err) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.NoError(t, err) + } } } } } func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -864,24 +892,26 @@ func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.EqualError(t, err, "The following custom mountpoints are not supported [\"//\" \"/var//\" \"/var//log/audit/\"]") + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if strings.HasPrefix(imgTypeName, "iot-") || strings.HasPrefix(imgTypeName, "image-") { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.EqualError(t, err, "The following custom mountpoints are not supported [\"//\" \"/var//\" \"/var//log/audit/\"]") + } } } } } func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { - fedoraDistro := fedora.NewF37() bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -892,21 +922,24 @@ func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { }, }, } - for _, archName := range fedoraDistro.ListArches() { - arch, _ := fedoraDistro.GetArch(archName) - for _, imgTypeName := range arch.ListImageTypes() { - imgType, _ := arch.GetImageType(imgTypeName) - _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) - if imgTypeName == "iot-commit" || imgTypeName == "iot-container" { - assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") - } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { - assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) - } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { - continue - } else if imgTypeName == "live-installer" { - assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) - } else { - assert.NoError(t, err) + for _, dist := range fedoraFamilyDistros { + fedoraDistro := dist.distro + for _, archName := range fedoraDistro.ListArches() { + arch, _ := fedoraDistro.GetArch(archName) + for _, imgTypeName := range arch.ListImageTypes() { + imgType, _ := arch.GetImageType(imgTypeName) + _, _, err := imgType.Manifest(&bp, distro.ImageOptions{}, nil, 0) + if imgTypeName == "iot-commit" || imgTypeName == "iot-container" || imgTypeName == "iot-bootable-container" { + assert.EqualError(t, err, "Custom mountpoints are not supported for ostree types") + } else if imgTypeName == "iot-raw-image" || imgTypeName == "iot-qcow2-image" { + assert.EqualError(t, err, fmt.Sprintf(distro.UnsupportedCustomizationError, imgTypeName, "User, Group, Directories, Files, Services, FIPS")) + } else if imgTypeName == "iot-installer" || imgTypeName == "iot-simplified-installer" || imgTypeName == "image-installer" { + continue + } else if imgTypeName == "live-installer" { + assert.EqualError(t, err, fmt.Sprintf(distro.NoCustomizationsAllowedError, imgTypeName)) + } else { + assert.NoError(t, err) + } } } } @@ -921,7 +954,7 @@ func TestDistroFactory(t *testing.T) { testCases := []testCase{ { strID: "fedora-37", - expected: fedora.NewF37(), + expected: fedora.DistroFactory("fedora-37"), }, { strID: "fedora-38.1", From 724f5897f931b9ba586b2df580453973b6dd8192 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 11:03:53 +0100 Subject: [PATCH 10/23] distro/rhel7: delete version-specific distro constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Most importantly, modify the RHEL-7 distro definition to use the minor version in its name. The 'rhel-7' distro name will be defined as an alias to 'rhel-79' in higher layers (osbuild-composer). Adjust all places affected by this change. The distro-specific constructors should not be used any more. The distro factory should be used instead. Adjust all distro unit tests. Signed-off-by: Tomáš Hozza --- pkg/distro/rhel7/distro.go | 51 +++++++++---------- pkg/distro/rhel7/distro_test.go | 36 ++++++------- pkg/distrofactory/distrofactory_test.go | 4 +- test/config-map.json | 2 +- .../{rhel-7.json => rhel-79.json} | 0 5 files changed, 44 insertions(+), 49 deletions(-) rename test/data/repositories/{rhel-7.json => rhel-79.json} (100%) diff --git a/pkg/distro/rhel7/distro.go b/pkg/distro/rhel7/distro.go index 5f7a083ecf..1614c310e8 100644 --- a/pkg/distro/rhel7/distro.go +++ b/pkg/distro/rhel7/distro.go @@ -48,21 +48,6 @@ var defaultDistroImageConfig = &distro.ImageConfig{ }, } -// distribution objects without the arches > image types -var distroMap = map[string]distribution{ - "rhel-7": { - name: "rhel-7", // TODO: this should be "rhel-7.9" - product: "Red Hat Enterprise Linux", - osVersion: "7.9", - nick: "Maipo", - releaseVersion: "7", - modulePlatformID: "platform:el7", - vendor: "redhat", - runner: &runner.RHEL{Major: uint64(7), Minor: uint64(9)}, - defaultImageConfig: defaultDistroImageConfig, - }, -} - // --- Distribution --- type distribution struct { name string @@ -193,14 +178,24 @@ func (a *architecture) Distro() distro.Distro { return a.distro } -// New creates a new distro object, defining the supported architectures and image types -func New() distro.Distro { - return newDistro("rhel-7") -} - -func newDistro(distroName string) distro.Distro { - - rd := distroMap[distroName] +func newDistro(name string, minor int) *distribution { + var rd distribution + switch name { + case "rhel": + rd = distribution{ + name: fmt.Sprintf("rhel-7%d", minor), + product: "Red Hat Enterprise Linux", + osVersion: fmt.Sprintf("7.%d", minor), + nick: "Maipo", + releaseVersion: "7", + modulePlatformID: "platform:el7", + vendor: "redhat", + runner: &runner.RHEL{Major: uint64(7), Minor: uint64(minor)}, + defaultImageConfig: defaultDistroImageConfig, + } + default: + panic(fmt.Sprintf("unknown distro name: %s", name)) + } // Architecture definitions x86_64 := architecture{ @@ -251,19 +246,19 @@ func ParseID(idStr string) (*distro.ID, error) { return nil, fmt.Errorf("invalid distro major version: %d", id.MajorVersion) } - // TODO: we should probably support also the minor version, specifically "7.9" - if id.MinorVersion != -1 { - return nil, fmt.Errorf("invalid distro minor version: %d", id.MinorVersion) + // RHEL uses minor version + if id.Name == "rhel" && id.MinorVersion == -1 { + return nil, fmt.Errorf("rhel requires minor version, but got: %d", id.MinorVersion) } return id, nil } func DistroFactory(idStr string) distro.Distro { - _, err := ParseID(idStr) + id, err := ParseID(idStr) if err != nil { return nil } - return newDistro("rhel-7") + return newDistro(id.Name, id.MinorVersion) } diff --git a/pkg/distro/rhel7/distro_test.go b/pkg/distro/rhel7/distro_test.go index d7b6098fa4..35238679a0 100644 --- a/pkg/distro/rhel7/distro_test.go +++ b/pkg/distro/rhel7/distro_test.go @@ -19,8 +19,8 @@ type rhelFamilyDistro struct { var rhelFamilyDistros = []rhelFamilyDistro{ { - name: "rhel", - distro: rhel7.New(), + name: "rhel-79", + distro: rhel7.DistroFactory("rhel-7.9"), }, } @@ -163,7 +163,7 @@ func TestImageType_Name(t *testing.T) { // Check that Manifest() function returns an error for unsupported // configurations. func TestDistro_ManifestError(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Kernel: &blueprint.KernelCustomization{ @@ -220,7 +220,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { } func TestRhel7_ListArches(t *testing.T) { - arches := rhel7.New().ListArches() + arches := rhelFamilyDistros[0].distro.ListArches() assert.Equal(t, []string{"x86_64"}, arches) } @@ -256,21 +256,21 @@ func TestRhel7_GetArch(t *testing.T) { } func TestRhel7_Name(t *testing.T) { - distro := rhel7.New() - assert.Equal(t, "rhel-7", distro.Name()) + distro := rhelFamilyDistros[0].distro + assert.Equal(t, "rhel-79", distro.Name()) } func TestRhel7_ModulePlatformID(t *testing.T) { - distro := rhel7.New() + distro := rhelFamilyDistros[0].distro assert.Equal(t, "platform:el7", distro.ModulePlatformID()) } func TestRhel7_KernelOption(t *testing.T) { - distro_test_common.TestDistro_KernelOption(t, rhel7.New()) + distro_test_common.TestDistro_KernelOption(t, rhelFamilyDistros[0].distro) } func TestDistro_CustomFileSystemManifestError(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -292,7 +292,7 @@ func TestDistro_CustomFileSystemManifestError(t *testing.T) { } func TestDistro_TestRootMountPoint(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -314,7 +314,7 @@ func TestDistro_TestRootMountPoint(t *testing.T) { } func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -340,7 +340,7 @@ func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { } func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -374,7 +374,7 @@ func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { } func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -404,7 +404,7 @@ func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { } func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { - r7distro := rhel7.New() + r7distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -434,15 +434,15 @@ func TestDistroFactory(t *testing.T) { testCases := []testCase{ { strID: "rhel-7", - expected: rhel7.New(), + expected: nil, }, { - strID: "rhel-79", // TODO: this should be supported + strID: "rhel-79", // this is intentionally not supported for el7 expected: nil, }, { - strID: "rhel-7.9", // TODO: this should be supported - expected: nil, + strID: "rhel-7.9", + expected: rhel7.DistroFactory("rhel-7.9"), }, { strID: "fedora-37", diff --git a/pkg/distrofactory/distrofactory_test.go b/pkg/distrofactory/distrofactory_test.go index dc53a0a76e..a6e54f4e24 100644 --- a/pkg/distrofactory/distrofactory_test.go +++ b/pkg/distrofactory/distrofactory_test.go @@ -14,8 +14,8 @@ func TestGetDistroDefaultList(t *testing.T) { testCases := []testCase{ { - strID: "rhel-7", - expectedDistroName: "rhel-7", + strID: "rhel-7.9", + expectedDistroName: "rhel-79", }, { strID: "rhel-89", diff --git a/test/config-map.json b/test/config-map.json index eaca1d725e..41eaa628ee 100644 --- a/test/config-map.json +++ b/test/config-map.json @@ -188,7 +188,7 @@ "fedora-38", "fedora-39", "fedora-40", - "rhel-7", + "rhel-79", "rhel-8", "rhel-810", "rhel-85", diff --git a/test/data/repositories/rhel-7.json b/test/data/repositories/rhel-79.json similarity index 100% rename from test/data/repositories/rhel-7.json rename to test/data/repositories/rhel-79.json From 7198517680fe49907716cc4fd6cb6fdce3d7f416 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 11:03:53 +0100 Subject: [PATCH 11/23] distro/rhel8: delete version-specific distro constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'rhel-8' distro name will be defined as an alias to the latest GA release in higher layers (osbuild-composer). Adjust all places affected by this change, including deleting the `rhel-8.json` repo definition. The distro-specific constructors should not be used any more. The distro factory should be used instead. Adjust all distro unit tests. Signed-off-by: Tomáš Hozza --- pkg/distro/rhel8/distro.go | 47 +---- pkg/distro/rhel8/distro_internal_test.go | 26 ++- pkg/distro/rhel8/distro_test.go | 30 ++-- test/config-map.json | 1 - test/data/repositories/rhel-8.json | 215 ----------------------- 5 files changed, 35 insertions(+), 284 deletions(-) delete mode 100644 test/data/repositories/rhel-8.json diff --git a/pkg/distro/rhel8/distro.go b/pkg/distro/rhel8/distro.go index a3ee31244d..42a31abc23 100644 --- a/pkg/distro/rhel8/distro.go +++ b/pkg/distro/rhel8/distro.go @@ -123,47 +123,6 @@ func (d *distribution) getDefaultImageConfig() *distro.ImageConfig { return d.defaultImageConfig } -// New creates a new distro object, defining the supported architectures and image types -func New() distro.Distro { - // default minor: create default minor version (current GA) and rename it - d := newDistro("rhel", 10) - d.name = "rhel-8" - return d - -} - -func NewRHEL84() distro.Distro { - return newDistro("rhel", 4) -} - -func NewRHEL85() distro.Distro { - return newDistro("rhel", 5) -} - -func NewRHEL86() distro.Distro { - return newDistro("rhel", 6) -} - -func NewRHEL87() distro.Distro { - return newDistro("rhel", 7) -} - -func NewRHEL88() distro.Distro { - return newDistro("rhel", 8) -} - -func NewRHEL89() distro.Distro { - return newDistro("rhel", 9) -} - -func NewRHEL810() distro.Distro { - return newDistro("rhel", 10) -} - -func NewCentos() distro.Distro { - return newDistro("centos", 0) -} - func newDistro(name string, minor int) *distribution { var rd distribution switch name { @@ -564,9 +523,5 @@ func DistroFactory(idStr string) distro.Distro { return nil } - if id.Name == "centos" { - return NewCentos() - } - - return newDistro("rhel", id.MinorVersion) + return newDistro(id.Name, id.MinorVersion) } diff --git a/pkg/distro/rhel8/distro_internal_test.go b/pkg/distro/rhel8/distro_internal_test.go index 04b5b49dc4..b62d891054 100644 --- a/pkg/distro/rhel8/distro_internal_test.go +++ b/pkg/distro/rhel8/distro_internal_test.go @@ -28,6 +28,18 @@ var mountpoints = []blueprint.FilesystemCustomization{ }, } +type rhelFamilyDistro struct { + name string + distro distro.Distro +} + +var rhelFamilyDistros = []rhelFamilyDistro{ + { + name: "rhel-810", + distro: DistroFactory("rhel-810"), + }, +} + // math/rand is good enough in this case /* #nosec G404 */ var rng = rand.New(rand.NewSource(0)) @@ -41,7 +53,7 @@ func TestDistro_UnsupportedArch(t *testing.T) { } func TestDistro_DefaultPartitionTables(t *testing.T) { - rhel8distro := New() + rhel8distro := rhelFamilyDistros[0].distro for _, archName := range rhel8distro.ListArches() { testBasicImageType.arch = &architecture{ name: archName, @@ -55,7 +67,7 @@ func TestDistro_DefaultPartitionTables(t *testing.T) { } func TestDistro_Ec2PartitionTables(t *testing.T) { - rhel8distro := New() + rhel8distro := rhelFamilyDistros[0].distro for _, archName := range rhel8distro.ListArches() { testEc2ImageType.arch = &architecture{ name: archName, @@ -89,23 +101,23 @@ func TestDistroFactory(t *testing.T) { }, { strID: "rhel-8.4", - expected: NewRHEL84(), + expected: newDistro("rhel", 4), }, { strID: "rhel-84", - expected: NewRHEL84(), + expected: newDistro("rhel", 4), }, { strID: "rhel-8.10", - expected: NewRHEL810(), + expected: newDistro("rhel", 10), }, { strID: "rhel-810", - expected: NewRHEL810(), + expected: newDistro("rhel", 10), }, { strID: "centos-8", - expected: NewCentos(), + expected: newDistro("centos", -1), }, { strID: "centos-8.4", diff --git a/pkg/distro/rhel8/distro_test.go b/pkg/distro/rhel8/distro_test.go index 5cf4111057..5baffe047e 100644 --- a/pkg/distro/rhel8/distro_test.go +++ b/pkg/distro/rhel8/distro_test.go @@ -21,8 +21,8 @@ type rhelFamilyDistro struct { var rhelFamilyDistros = []rhelFamilyDistro{ { - name: "rhel", - distro: rhel8.New(), + name: "rhel-810", + distro: rhel8.DistroFactory("rhel-810"), }, } @@ -469,7 +469,7 @@ func TestImageTypeAliases(t *testing.T) { func TestDistro_ManifestError(t *testing.T) { // Currently, the only unsupported configuration is OSTree commit types // with Kernel boot options - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Kernel: &blueprint.KernelCustomization{ @@ -592,7 +592,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { } func TestRHEL8_ListArches(t *testing.T) { - arches := rhel8.New().ListArches() + arches := rhelFamilyDistros[0].distro.ListArches() assert.Equal(t, []string{"aarch64", "ppc64le", "s390x", "x86_64"}, arches) } @@ -637,25 +637,25 @@ func TestRHEL8_GetArch(t *testing.T) { } func TestRhel8_Name(t *testing.T) { - distro := rhel8.New() - assert.Equal(t, "rhel-8", distro.Name()) + distro := rhelFamilyDistros[0].distro + assert.Equal(t, "rhel-810", distro.Name()) } func TestRhel8_ModulePlatformID(t *testing.T) { - distro := rhel8.New() + distro := rhelFamilyDistros[0].distro assert.Equal(t, "platform:el8", distro.ModulePlatformID()) } func TestRhel86_KernelOption(t *testing.T) { - distro_test_common.TestDistro_KernelOption(t, rhel8.New()) + distro_test_common.TestDistro_KernelOption(t, rhelFamilyDistros[0].distro) } func TestRhel8_OSTreeOptions(t *testing.T) { - distro_test_common.TestDistro_OSTreeOptions(t, rhel8.New()) + distro_test_common.TestDistro_OSTreeOptions(t, rhelFamilyDistros[0].distro) } func TestDistro_CustomFileSystemManifestError(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -689,7 +689,7 @@ func TestDistro_CustomFileSystemManifestError(t *testing.T) { } func TestDistro_TestRootMountPoint(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -723,7 +723,7 @@ func TestDistro_TestRootMountPoint(t *testing.T) { } func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -761,7 +761,7 @@ func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { } func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -807,7 +807,7 @@ func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { } func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -849,7 +849,7 @@ func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { } func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { - r8distro := rhel8.New() + r8distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ diff --git a/test/config-map.json b/test/config-map.json index 41eaa628ee..4de94c34c9 100644 --- a/test/config-map.json +++ b/test/config-map.json @@ -189,7 +189,6 @@ "fedora-39", "fedora-40", "rhel-79", - "rhel-8", "rhel-810", "rhel-85", "rhel-86", diff --git a/test/data/repositories/rhel-8.json b/test/data/repositories/rhel-8.json deleted file mode 100644 index 70ebf1b238..0000000000 --- a/test/data/repositories/rhel-8.json +++ /dev/null @@ -1,215 +0,0 @@ -{ - "x86_64": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-baseos-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-appstream-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rt", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-rt-n8.8-20230808", - "image_type_tags": [ - "edge-commit" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "ha", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-ha-n8.8-20230808", - "image_type_tags": [ - "ec2-ha", - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "sap", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-sap-n8.8-20230808", - "image_type_tags": [ - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "saphana", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-saphana-n8.8-20230808", - "image_type_tags": [ - "ec2-sap", - "azure-sap-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "sap-rhui-azure", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-sap-rhui-azure-20240101", - "image_type_tags": [ - "azure-sap-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "ansible", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-ansible-2-20240101", - "image_type_tags": [ - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-rhui-3-20240101", - "image_type_tags": [ - "ec2", - "ec2-ha", - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui-azure", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-rhui-azure-20240101", - "image_type_tags": [ - "azure-rhui", - "azure-eap7-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "google-compute-engine", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el8/el8-x86_64-google-compute-engine-20240101", - "check_gpg": false, - "image_type_tags": [ - "gce", - "gce-rhui" - ] - }, - { - "name": "google-cloud-sdk", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el8/el8-x86_64-google-cloud-sdk-20240101", - "check_gpg": false, - "image_type_tags": [ - "gce", - "gce-rhui" - ] - }, - { - "name": "jbeap7", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-jbeap7-20240101", - "check_gpg": false, - "image_type_tags": [ - "azure-eap7-rhui" - ] - } - ], - "aarch64": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-aarch64-baseos-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-aarch64-appstream-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-aarch64-rhui-3-20240101", - "image_type_tags": [ - "ec2" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui-azure", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-x86_64-rhui-azure-20240101", - "image_type_tags": [ - "azure-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ], - "s390x": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-s390x-baseos-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-s390x-appstream-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ], - "ppc64le": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-ppc64le-baseos-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el8/el8-ppc64le-appstream-n8.8-20230808", - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ] -} \ No newline at end of file From a791dcdc3f691f8294ccc5f8c139861950c46ab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 11:03:53 +0100 Subject: [PATCH 12/23] distro/rhel9: delete version-specific distro constructors MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The 'rhel-9' distro name will be defined as an alias to the latest GA release in higher layers (osbuild-composer). Adjust all places affected by this change, including deleting the `rhel-9.json` repo definition. The distro-specific constructors should not be used any more. The distro factory should be used instead. Adjust all distro unit tests. Signed-off-by: Tomáš Hozza --- pkg/distro/rhel9/distro.go | 37 +--- pkg/distro/rhel9/distro_internal_test.go | 10 +- pkg/distro/rhel9/distro_test.go | 30 ++-- test/config-map.json | 1 - test/data/repositories/rhel-9.json | 209 ----------------------- 5 files changed, 21 insertions(+), 266 deletions(-) delete mode 100644 test/data/repositories/rhel-9.json diff --git a/pkg/distro/rhel9/distro.go b/pkg/distro/rhel9/distro.go index 3d4c01047e..7859d6998e 100644 --- a/pkg/distro/rhel9/distro.go +++ b/pkg/distro/rhel9/distro.go @@ -125,37 +125,6 @@ func (d *distribution) getDefaultImageConfig() *distro.ImageConfig { return d.defaultImageConfig } -func New() distro.Distro { - // default minor: create default minor version (current GA) and rename it - d := newDistro("rhel", 4) - d.name = "rhel-9" - return d -} - -func NewCentOS9() distro.Distro { - return newDistro("centos", 0) -} - -func NewRHEL90() distro.Distro { - return newDistro("rhel", 0) -} - -func NewRHEL91() distro.Distro { - return newDistro("rhel", 1) -} - -func NewRHEL92() distro.Distro { - return newDistro("rhel", 2) -} - -func NewRHEL93() distro.Distro { - return newDistro("rhel", 3) -} - -func NewRHEL94() distro.Distro { - return newDistro("rhel", 4) -} - func newDistro(name string, minor int) *distribution { var rd distribution switch name { @@ -538,9 +507,5 @@ func DistroFactory(idStr string) distro.Distro { return nil } - if id.Name == "centos" { - return NewCentOS9() - } - - return newDistro("rhel", id.MinorVersion) + return newDistro(id.Name, id.MinorVersion) } diff --git a/pkg/distro/rhel9/distro_internal_test.go b/pkg/distro/rhel9/distro_internal_test.go index d9dfd38a16..cb80aec326 100644 --- a/pkg/distro/rhel9/distro_internal_test.go +++ b/pkg/distro/rhel9/distro_internal_test.go @@ -17,19 +17,19 @@ func TestDistroFactory(t *testing.T) { testCases := []testCase{ { strID: "rhel-90", - expected: NewRHEL90(), + expected: newDistro("rhel", 0), }, { strID: "rhel-9.0", - expected: NewRHEL90(), + expected: newDistro("rhel", 0), }, { strID: "rhel-93", - expected: NewRHEL93(), + expected: newDistro("rhel", 3), }, { strID: "rhel-9.3", - expected: NewRHEL93(), + expected: newDistro("rhel", 3), }, { strID: "rhel-910", // this is intentionally not supported for el9 @@ -41,7 +41,7 @@ func TestDistroFactory(t *testing.T) { }, { strID: "centos-9", - expected: NewCentOS9(), + expected: newDistro("centos", -1), }, { strID: "centos-9.0", diff --git a/pkg/distro/rhel9/distro_test.go b/pkg/distro/rhel9/distro_test.go index 83acc99af3..152763d94d 100644 --- a/pkg/distro/rhel9/distro_test.go +++ b/pkg/distro/rhel9/distro_test.go @@ -22,8 +22,8 @@ type rhelFamilyDistro struct { var rhelFamilyDistros = []rhelFamilyDistro{ { - name: "rhel", - distro: rhel9.New(), + name: "rhel-94", + distro: rhel9.DistroFactory("rhel-94"), }, } @@ -468,7 +468,7 @@ func TestImageTypeAliases(t *testing.T) { func TestDistro_ManifestError(t *testing.T) { // Currently, the only unsupported configuration is OSTree commit types // with Kernel boot options - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Kernel: &blueprint.KernelCustomization{ @@ -592,7 +592,7 @@ func TestArchitecture_ListImageTypes(t *testing.T) { } func TestRhel9_ListArches(t *testing.T) { - arches := rhel9.New().ListArches() + arches := rhelFamilyDistros[0].distro.ListArches() assert.Equal(t, []string{"aarch64", "ppc64le", "s390x", "x86_64"}, arches) } @@ -637,25 +637,25 @@ func TestRhel9_GetArch(t *testing.T) { } func TestRhel9_Name(t *testing.T) { - distro := rhel9.New() - assert.Equal(t, "rhel-9", distro.Name()) + distro := rhelFamilyDistros[0].distro + assert.Equal(t, "rhel-94", distro.Name()) } func TestRhel9_ModulePlatformID(t *testing.T) { - distro := rhel9.New() + distro := rhelFamilyDistros[0].distro assert.Equal(t, "platform:el9", distro.ModulePlatformID()) } func TestRhel9_KernelOption(t *testing.T) { - distro_test_common.TestDistro_KernelOption(t, rhel9.New()) + distro_test_common.TestDistro_KernelOption(t, rhelFamilyDistros[0].distro) } func TestRhel9_OSTreeOptions(t *testing.T) { - distro_test_common.TestDistro_OSTreeOptions(t, rhel9.New()) + distro_test_common.TestDistro_OSTreeOptions(t, rhelFamilyDistros[0].distro) } func TestDistro_CustomFileSystemManifestError(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -683,7 +683,7 @@ func TestDistro_CustomFileSystemManifestError(t *testing.T) { } func TestDistro_TestRootMountPoint(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -711,7 +711,7 @@ func TestDistro_TestRootMountPoint(t *testing.T) { } func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -741,7 +741,7 @@ func TestDistro_CustomFileSystemSubDirectories(t *testing.T) { } func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -779,7 +779,7 @@ func TestDistro_MountpointsWithArbitraryDepthAllowed(t *testing.T) { } func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ @@ -813,7 +813,7 @@ func TestDistro_DirtyMountpointsNotAllowed(t *testing.T) { } func TestDistro_CustomUsrPartitionNotLargeEnough(t *testing.T) { - r9distro := rhel9.New() + r9distro := rhelFamilyDistros[0].distro bp := blueprint.Blueprint{ Customizations: &blueprint.Customizations{ Filesystem: []blueprint.FilesystemCustomization{ diff --git a/test/config-map.json b/test/config-map.json index 4de94c34c9..23529afa66 100644 --- a/test/config-map.json +++ b/test/config-map.json @@ -195,7 +195,6 @@ "rhel-87", "rhel-88", "rhel-89", - "rhel-9", "rhel-90", "rhel-91", "rhel-92", diff --git a/test/data/repositories/rhel-9.json b/test/data/repositories/rhel-9.json deleted file mode 100644 index 432d339f46..0000000000 --- a/test/data/repositories/rhel-9.json +++ /dev/null @@ -1,209 +0,0 @@ -{ - "aarch64": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-aarch64-baseos-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-aarch64-appstream-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-aarch64-rhui-4-20240101", - "check_gpg": true, - "image_type_tags": [ - "ec2" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui-azure", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rhui-azure-20240101", - "image_type_tags": [ - "azure-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ], - "ppc64le": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-ppc64le-baseos-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-ppc64le-appstream-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ], - "s390x": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-s390x-baseos-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-s390x-appstream-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - } - ], - "x86_64": [ - { - "name": "baseos", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-baseos-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "appstream", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-appstream-n9.2-20230808", - "check_gpg": true, - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rt", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rt-n9.2-20230808", - "check_gpg": true, - "image_type_tags": [ - "edge-commit" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "ha", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-ha-n9.2-20230808", - "check_gpg": true, - "image_type_tags": [ - "ec2-ha", - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "sap", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-sap-n9.2-20230808", - "check_gpg": true, - "image_type_tags": [ - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "saphana", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-saphana-n9.2-20230808", - "check_gpg": true, - "image_type_tags": [ - "ec2-sap", - "azure-sap-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rhui-4-20240101", - "check_gpg": true, - "image_type_tags": [ - "ec2", - "ec2-ha", - "ec2-sap" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui-azure", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/rhvpn/el9/el9-x86_64-rhui-azure-20240101", - "image_type_tags": [ - "azure-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "rhui-azure-sap", - "baseurl": "http://download.eng.bos.redhat.com/devel/stratosphere-rhui-sync/rhui-microsoft-azure-rhel9-sap-ha/", - "image_type_tags": [ - "azure-sap-rhui" - ], - "gpgkeys": [ - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----", - "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niA==\n=+Gxh\n-----END PGP PUBLIC KEY BLOCK-----" - ] - }, - { - "name": "google-compute-engine", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/el9-x86_64-google-compute-engine-20240101", - "check_gpg": false, - "image_type_tags": [ - "gce", - "gce-rhui" - ] - }, - { - "name": "google-cloud-sdk", - "baseurl": "https://rpmrepo.osbuild.org/v2/mirror/public/el9/el9-x86_64-google-cloud-sdk-20240101", - "check_gpg": false, - "image_type_tags": [ - "gce", - "gce-rhui" - ] - } - ] -} \ No newline at end of file From dcd74cd52332374e1357ae3dec7994e133c12ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 18:01:59 +0100 Subject: [PATCH 13/23] Move `rpmmd.Load*Repositories()` to `reporegistry` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The `LoadAllRepositories()` will need to be extended with a compatibility layer to eventually support loading distro configurations with and without a dot in their name, under the same distro name. This is to allow us to use dots in new distro config files, while not breaking any existing repo overrides, that the user can have on their system. IOW `rhel-84.json` and `rhel-8.4.json` should both correspond to `rhel-8.4` distro. This will require using the common `distroidstrparser` to parse distro ID string. However, the parser uses distro-specific parsers, which results in an import loop when importing `distroidstrparser` in `rpmmd` package. To break this future import loop, let's move the `Load*Repositories()` with their tests to the `reporegistry` package. This makes some sense, since these are higher-level functions, than just those for loading the actual data from the JSON file. Make necessary adjustments in code which used these functions. The `loadRepositoriesFromFile()` in `rpmmd` is now made public and it is used to load a single repo config from a specific JSON file. Signed-off-by: Tomáš Hozza --- cmd/osbuild-dnf-json-tests/main_test.go | 5 +- cmd/osbuild-playground/main.go | 4 +- pkg/reporegistry/reporegistry.go | 2 +- pkg/reporegistry/repository.go | 88 ++++++ pkg/reporegistry/repository_test.go | 149 ++++++++++ .../priority1/repositories/test-distro.json | 0 .../priority2/repositories/test-distro-2.json | 0 .../priority2/repositories/test-distro.json | 0 pkg/rpmmd/repository.go | 81 +----- pkg/rpmmd/repository_test.go | 104 +++++++ pkg/rpmmd/test/repository_test.go | 255 ------------------ 11 files changed, 348 insertions(+), 340 deletions(-) create mode 100644 pkg/reporegistry/repository.go create mode 100644 pkg/reporegistry/repository_test.go rename pkg/{rpmmd => reporegistry}/test/confpaths/priority1/repositories/test-distro.json (100%) rename pkg/{rpmmd => reporegistry}/test/confpaths/priority2/repositories/test-distro-2.json (100%) rename pkg/{rpmmd => reporegistry}/test/confpaths/priority2/repositories/test-distro.json (100%) delete mode 100644 pkg/rpmmd/test/repository_test.go diff --git a/cmd/osbuild-dnf-json-tests/main_test.go b/cmd/osbuild-dnf-json-tests/main_test.go index a119f24319..2a698890de 100644 --- a/cmd/osbuild-dnf-json-tests/main_test.go +++ b/cmd/osbuild-dnf-json-tests/main_test.go @@ -16,6 +16,7 @@ import ( "github.com/osbuild/images/pkg/distro/rhel9" "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/ostree" + "github.com/osbuild/images/pkg/reporegistry" "github.com/osbuild/images/pkg/rpmmd" ) @@ -33,7 +34,7 @@ func TestCrossArchDepsolve(t *testing.T) { dir := t.TempDir() baseSolver := dnfjson.NewBaseSolver(dir) - repos, err := rpmmd.LoadRepositories([]string{repoDir}, c9s.Name()) + repos, err := reporegistry.LoadRepositories([]string{repoDir}, c9s.Name()) require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name()) for _, archStr := range c9s.ListArches() { @@ -87,7 +88,7 @@ func TestDepsolvePackageSets(t *testing.T) { dir := t.TempDir() solver := dnfjson.NewSolver(c9s.ModulePlatformID(), c9s.Releasever(), arch.ARCH_X86_64.String(), c9s.Name(), dir) - repos, err := rpmmd.LoadRepositories([]string{repoDir}, c9s.Name()) + repos, err := reporegistry.LoadRepositories([]string{repoDir}, c9s.Name()) require.NoErrorf(t, err, "Failed to LoadRepositories %v", c9s.Name()) x86Repos, ok := repos[arch.ARCH_X86_64.String()] require.Truef(t, ok, "failed to get %q repos for %q", arch.ARCH_X86_64.String(), c9s.Name()) diff --git a/cmd/osbuild-playground/main.go b/cmd/osbuild-playground/main.go index 73521ba8f6..a4cdc96ea3 100644 --- a/cmd/osbuild-playground/main.go +++ b/cmd/osbuild-playground/main.go @@ -12,7 +12,7 @@ import ( "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distrofactory" "github.com/osbuild/images/pkg/image" - "github.com/osbuild/images/pkg/rpmmd" + "github.com/osbuild/images/pkg/reporegistry" ) var ImageTypes = make(map[string]image.ImageKind) @@ -74,7 +74,7 @@ func main() { panic(fmt.Sprintf("arch '%s' not supported\n", archArg)) } - repos, err := rpmmd.LoadRepositories([]string{"./"}, d.Name()) + repos, err := reporegistry.LoadRepositories([]string{"./"}, d.Name()) if err != nil { panic("could not load repositories for distro " + d.Name()) } diff --git a/pkg/reporegistry/reporegistry.go b/pkg/reporegistry/reporegistry.go index 29b9a81a9c..6dac4b196f 100644 --- a/pkg/reporegistry/reporegistry.go +++ b/pkg/reporegistry/reporegistry.go @@ -18,7 +18,7 @@ type RepoRegistry struct { // New returns a new RepoRegistry instance with the data // loaded from the given repoConfigPaths func New(repoConfigPaths []string) (*RepoRegistry, error) { - repositories, err := rpmmd.LoadAllRepositories(repoConfigPaths) + repositories, err := LoadAllRepositories(repoConfigPaths) if err != nil { return nil, err } diff --git a/pkg/reporegistry/repository.go b/pkg/reporegistry/repository.go new file mode 100644 index 0000000000..af4dd430c9 --- /dev/null +++ b/pkg/reporegistry/repository.go @@ -0,0 +1,88 @@ +package reporegistry + +import ( + "fmt" + "log" + "os" + "path/filepath" + "strings" + + "github.com/osbuild/images/pkg/rpmmd" +) + +// LoadAllRepositories loads all repositories for given distros from the given list of paths. +// Behavior is the same as with the LoadRepositories() method. +func LoadAllRepositories(confPaths []string) (rpmmd.DistrosRepoConfigs, error) { + distrosRepoConfigs := rpmmd.DistrosRepoConfigs{} + + for _, confPath := range confPaths { + reposPath := filepath.Join(confPath, "repositories") + + fileEntries, err := os.ReadDir(reposPath) + if os.IsNotExist(err) { + continue + } else if err != nil { + return nil, err + } + + for _, fileEntry := range fileEntries { + // Skip all directories + if fileEntry.IsDir() { + continue + } + + // distro repositories definition is expected to be named ".json" + if strings.HasSuffix(fileEntry.Name(), ".json") { + distro := strings.TrimSuffix(fileEntry.Name(), ".json") + + // skip the distro repos definition, if it has been already read + _, ok := distrosRepoConfigs[distro] + if ok { + continue + } + + configFile := filepath.Join(reposPath, fileEntry.Name()) + distroRepos, err := rpmmd.LoadRepositoriesFromFile(configFile) + if err != nil { + return nil, err + } + + log.Println("Loaded repository configuration file:", configFile) + + distrosRepoConfigs[distro] = distroRepos + } + } + } + + return distrosRepoConfigs, nil +} + +// LoadRepositories loads distribution repositories from the given list of paths. +// If there are duplicate distro repositories definitions found in multiple paths, the first +// encounter is preferred. For this reason, the order of paths in the passed list should +// reflect the desired preference. +func LoadRepositories(confPaths []string, distro string) (map[string][]rpmmd.RepoConfig, error) { + var repoConfigs map[string][]rpmmd.RepoConfig + path := "/repositories/" + distro + ".json" + + for _, confPath := range confPaths { + var err error + repoConfigs, err = rpmmd.LoadRepositoriesFromFile(confPath + path) + if os.IsNotExist(err) { + continue + } else if err != nil { + return nil, err + } + + // Found the distro repository configs in the current path + if repoConfigs != nil { + break + } + } + + if repoConfigs == nil { + return nil, fmt.Errorf("LoadRepositories failed: none of the provided paths contain distro configuration") + } + + return repoConfigs, nil +} diff --git a/pkg/reporegistry/repository_test.go b/pkg/reporegistry/repository_test.go new file mode 100644 index 0000000000..ae011fa291 --- /dev/null +++ b/pkg/reporegistry/repository_test.go @@ -0,0 +1,149 @@ +package reporegistry + +import ( + "path/filepath" + "reflect" + "testing" + + "github.com/osbuild/images/pkg/distro/test_distro" + "github.com/stretchr/testify/assert" +) + +const ( + testDistroName = "test-distro" + testDistro2Name = "test-distro-2" +) + +func getConfPaths(t *testing.T) []string { + confPaths := []string{ + "./test/confpaths/priority1", + "./test/confpaths/priority2", + } + var absConfPaths []string + + for _, path := range confPaths { + absPath, err := filepath.Abs(path) + assert.Nil(t, err) + absConfPaths = append(absConfPaths, absPath) + } + + return absConfPaths +} + +func TestLoadRepositoriesExisting(t *testing.T) { + confPaths := getConfPaths(t) + type args struct { + distro string + } + tests := []struct { + name string + args args + want map[string][]string + }{ + { + name: "duplicate distro definition, load first encounter", + args: args{ + distro: testDistroName, + }, + want: map[string][]string{ + test_distro.TestArchName: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, + test_distro.TestArch2Name: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, + }, + }, + { + name: "single distro definition", + args: args{ + distro: testDistro2Name, + }, + want: map[string][]string{ + test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, + test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := LoadRepositories(confPaths, tt.args.distro) + assert.Nil(t, err) + + for wantArch, wantRepos := range tt.want { + gotArchRepos, exists := got[wantArch] + assert.True(t, exists, "Expected '%s' arch in repos definition for '%s', but it does not exist", wantArch, tt.args.distro) + + var gotNames []string + for _, r := range gotArchRepos { + gotNames = append(gotNames, r.Name) + } + + if !reflect.DeepEqual(gotNames, wantRepos) { + t.Errorf("LoadRepositories() for %s/%s =\n got: %#v\n want: %#v", tt.args.distro, wantArch, gotNames, wantRepos) + } + } + + }) + } +} + +func TestLoadRepositoriesNonExisting(t *testing.T) { + confPaths := getConfPaths(t) + repos, err := LoadRepositories(confPaths, "my-imaginary-distro") + assert.Nil(t, repos) + assert.NotNil(t, err) +} + +func Test_LoadAllRepositories(t *testing.T) { + confPaths := getConfPaths(t) + + distroReposMap, err := LoadAllRepositories(confPaths) + assert.NotNil(t, distroReposMap) + assert.Nil(t, err) + assert.Equal(t, len(distroReposMap), 2) + + // test-distro + testDistroRepos, exists := distroReposMap[testDistroName] + assert.True(t, exists) + assert.Equal(t, len(testDistroRepos), 2) + + // test-distro - arches + for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { + testDistroArchRepos, exists := testDistroRepos[arch] + assert.True(t, exists) + assert.Equal(t, len(testDistroArchRepos), 4) + + var repoNames []string + for _, r := range testDistroArchRepos { + repoNames = append(repoNames, r.Name) + } + + wantRepos := []string{"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"} + + if !reflect.DeepEqual(repoNames, wantRepos) { + t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistroName, arch, repoNames, wantRepos) + } + } + + // test-distro-2 + testDistro2Repos, exists := distroReposMap[testDistro2Name] + assert.True(t, exists) + assert.Equal(t, len(testDistro2Repos), 2) + + // test-distro-2 - arches + wantRepos := map[string][]string{ + test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, + test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, + } + for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { + testDistro2ArchRepos, exists := testDistro2Repos[arch] + assert.True(t, exists) + assert.Equal(t, len(testDistro2ArchRepos), len(wantRepos[arch])) + + var repoNames []string + for _, r := range testDistro2ArchRepos { + repoNames = append(repoNames, r.Name) + } + + if !reflect.DeepEqual(repoNames, wantRepos[arch]) { + t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistro2Name, arch, repoNames, wantRepos[arch]) + } + } +} diff --git a/pkg/rpmmd/test/confpaths/priority1/repositories/test-distro.json b/pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json similarity index 100% rename from pkg/rpmmd/test/confpaths/priority1/repositories/test-distro.json rename to pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json diff --git a/pkg/rpmmd/test/confpaths/priority2/repositories/test-distro-2.json b/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json similarity index 100% rename from pkg/rpmmd/test/confpaths/priority2/repositories/test-distro-2.json rename to pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json diff --git a/pkg/rpmmd/test/confpaths/priority2/repositories/test-distro.json b/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json similarity index 100% rename from pkg/rpmmd/test/confpaths/priority2/repositories/test-distro.json rename to pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json diff --git a/pkg/rpmmd/repository.go b/pkg/rpmmd/repository.go index b2e207730c..13158b40bf 100644 --- a/pkg/rpmmd/repository.go +++ b/pkg/rpmmd/repository.go @@ -4,9 +4,7 @@ import ( "crypto/sha256" "encoding/json" "fmt" - "log" "os" - "path/filepath" "sort" "strings" "time" @@ -216,7 +214,7 @@ func GetVerStrFromPackageSpecListPanic(pkgs []PackageSpec, packageName string) s return pkgVerStr } -func loadRepositoriesFromFile(filename string) (map[string][]RepoConfig, error) { +func LoadRepositoriesFromFile(filename string) (map[string][]RepoConfig, error) { f, err := os.Open(filename) if err != nil { return nil, err @@ -262,83 +260,6 @@ func loadRepositoriesFromFile(filename string) (map[string][]RepoConfig, error) return repoConfigs, nil } -// LoadAllRepositories loads all repositories for given distros from the given list of paths. -// Behavior is the same as with the LoadRepositories() method. -func LoadAllRepositories(confPaths []string) (DistrosRepoConfigs, error) { - distrosRepoConfigs := DistrosRepoConfigs{} - - for _, confPath := range confPaths { - reposPath := filepath.Join(confPath, "repositories") - - fileEntries, err := os.ReadDir(reposPath) - if os.IsNotExist(err) { - continue - } else if err != nil { - return nil, err - } - - for _, fileEntry := range fileEntries { - // Skip all directories - if fileEntry.IsDir() { - continue - } - - // distro repositories definition is expected to be named ".json" - if strings.HasSuffix(fileEntry.Name(), ".json") { - distro := strings.TrimSuffix(fileEntry.Name(), ".json") - - // skip the distro repos definition, if it has been already read - _, ok := distrosRepoConfigs[distro] - if ok { - continue - } - - configFile := filepath.Join(reposPath, fileEntry.Name()) - distroRepos, err := loadRepositoriesFromFile(configFile) - if err != nil { - return nil, err - } - - log.Println("Loaded repository configuration file:", configFile) - - distrosRepoConfigs[distro] = distroRepos - } - } - } - - return distrosRepoConfigs, nil -} - -// LoadRepositories loads distribution repositories from the given list of paths. -// If there are duplicate distro repositories definitions found in multiple paths, the first -// encounter is preferred. For this reason, the order of paths in the passed list should -// reflect the desired preference. -func LoadRepositories(confPaths []string, distro string) (map[string][]RepoConfig, error) { - var repoConfigs map[string][]RepoConfig - path := "/repositories/" + distro + ".json" - - for _, confPath := range confPaths { - var err error - repoConfigs, err = loadRepositoriesFromFile(confPath + path) - if os.IsNotExist(err) { - continue - } else if err != nil { - return nil, err - } - - // Found the distro repository configs in the current path - if repoConfigs != nil { - break - } - } - - if repoConfigs == nil { - return nil, fmt.Errorf("LoadRepositories failed: none of the provided paths contain distro configuration") - } - - return repoConfigs, nil -} - func (packages PackageList) Search(globPatterns ...string) (PackageList, error) { var globs []glob.Glob diff --git a/pkg/rpmmd/repository_test.go b/pkg/rpmmd/repository_test.go index 38d9cab663..7ff4516c90 100644 --- a/pkg/rpmmd/repository_test.go +++ b/pkg/rpmmd/repository_test.go @@ -4,6 +4,7 @@ import ( "encoding/json" "testing" + "github.com/osbuild/images/internal/common" "github.com/stretchr/testify/assert" ) @@ -56,3 +57,106 @@ func TestRepoConfigMarshalEmpty(t *testing.T) { js, _ := json.Marshal(repoCfg) assert.Equal(t, string(js), `{}`) } + +func TestOldWorkerRepositoryCompatUnmarshal(t *testing.T) { + testCases := []struct { + repoJSON []byte + repo RepoConfig + }{ + { + repoJSON: []byte(`{"name":"fedora","baseurl":"http://example.com/fedora"}`), + repo: RepoConfig{ + Name: "fedora", + BaseURLs: []string{"http://example.com/fedora"}, + }, + }, + { + repoJSON: []byte(`{"name":"multiple","baseurl":"http://example.com/one,http://example.com/two"}`), + repo: RepoConfig{ + Name: "multiple", + BaseURLs: []string{"http://example.com/one", "http://example.com/two"}, + }, + }, + { + repoJSON: []byte(`{"id":"all","name":"all","baseurls":["http://example.com/all"],"metalink":"http://example.com/metalink","mirrorlist":"http://example.com/mirrorlist","gpgkeys":["key1","key2"],"check_gpg":true,"check_repo_gpg":true,"ignore_ssl":true,"priority":10,"metadata_expire":"test","rhsm":true,"enabled":true,"image_type_tags":["one","two"],"package_sets":["1","2"],"baseurl":"http://example.com/all"}`), + repo: RepoConfig{ + Id: "all", + Name: "all", + BaseURLs: []string{"http://example.com/all"}, + Metalink: "http://example.com/metalink", + MirrorList: "http://example.com/mirrorlist", + GPGKeys: []string{"key1", "key2"}, + CheckGPG: common.ToPtr(true), + CheckRepoGPG: common.ToPtr(true), + IgnoreSSL: common.ToPtr(true), + Priority: common.ToPtr(10), + MetadataExpire: "test", + RHSM: true, + Enabled: common.ToPtr(true), + ImageTypeTags: []string{"one", "two"}, + PackageSets: []string{"1", "2"}, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.repo.Name, func(t *testing.T) { + var repo RepoConfig + err := json.Unmarshal(tc.repoJSON, &repo) + assert.Nil(t, err) + assert.Equal(t, tc.repo, repo) + }) + } +} + +func TestOldWorkerRepositoryCompatMarshal(t *testing.T) { + testCases := []struct { + repoJSON []byte + repo RepoConfig + }{ + { + repoJSON: []byte(`{"id":"fedora","name":"fedora","baseurls":["http://example.com/fedora"],"baseurl":"http://example.com/fedora"}`), + repo: RepoConfig{ + Id: "fedora", + Name: "fedora", + BaseURLs: []string{"http://example.com/fedora"}, + }, + }, + { + repoJSON: []byte(`{"id":"multiple","name":"multiple","baseurls":["http://example.com/one","http://example.com/two"],"baseurl":"http://example.com/one,http://example.com/two"}`), + repo: RepoConfig{ + Id: "multiple", + Name: "multiple", + BaseURLs: []string{"http://example.com/one", "http://example.com/two"}, + }, + }, + { + repoJSON: []byte(`{"id":"all","name":"all","baseurls":["http://example.com/all"],"metalink":"http://example.com/metalink","mirrorlist":"http://example.com/mirrorlist","gpgkeys":["key1","key2"],"check_gpg":true,"check_repo_gpg":true,"priority":10,"ignore_ssl":true,"metadata_expire":"test","rhsm":true,"enabled":true,"image_type_tags":["one","two"],"package_sets":["1","2"],"baseurl":"http://example.com/all"}`), + repo: RepoConfig{ + Id: "all", + Name: "all", + BaseURLs: []string{"http://example.com/all"}, + Metalink: "http://example.com/metalink", + MirrorList: "http://example.com/mirrorlist", + GPGKeys: []string{"key1", "key2"}, + CheckGPG: common.ToPtr(true), + CheckRepoGPG: common.ToPtr(true), + Priority: common.ToPtr(10), + IgnoreSSL: common.ToPtr(true), + MetadataExpire: "test", + RHSM: true, + Enabled: common.ToPtr(true), + ImageTypeTags: []string{"one", "two"}, + PackageSets: []string{"1", "2"}, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.repo.Name, func(t *testing.T) { + gotJson, err := json.Marshal(tc.repo) + assert.Nil(t, err) + assert.Equal(t, tc.repoJSON, gotJson) + }) + } +} diff --git a/pkg/rpmmd/test/repository_test.go b/pkg/rpmmd/test/repository_test.go deleted file mode 100644 index 77a7a390cd..0000000000 --- a/pkg/rpmmd/test/repository_test.go +++ /dev/null @@ -1,255 +0,0 @@ -package rpmmdtests - -import ( - "encoding/json" - "path/filepath" - "reflect" - "testing" - - "github.com/osbuild/images/internal/common" - "github.com/osbuild/images/pkg/distro/test_distro" - "github.com/osbuild/images/pkg/rpmmd" - "github.com/stretchr/testify/assert" -) - -const ( - testDistroName = "test-distro" - testDistro2Name = "test-distro-2" -) - -func getConfPaths(t *testing.T) []string { - confPaths := []string{ - "./confpaths/priority1", - "./confpaths/priority2", - } - var absConfPaths []string - - for _, path := range confPaths { - absPath, err := filepath.Abs(path) - assert.Nil(t, err) - absConfPaths = append(absConfPaths, absPath) - } - - return absConfPaths -} - -func TestLoadRepositoriesExisting(t *testing.T) { - confPaths := getConfPaths(t) - type args struct { - distro string - } - tests := []struct { - name string - args args - want map[string][]string - }{ - { - name: "duplicate distro definition, load first encounter", - args: args{ - distro: testDistroName, - }, - want: map[string][]string{ - test_distro.TestArchName: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, - test_distro.TestArch2Name: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, - }, - }, - { - name: "single distro definition", - args: args{ - distro: testDistro2Name, - }, - want: map[string][]string{ - test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, - test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - got, err := rpmmd.LoadRepositories(confPaths, tt.args.distro) - assert.Nil(t, err) - - for wantArch, wantRepos := range tt.want { - gotArchRepos, exists := got[wantArch] - assert.True(t, exists, "Expected '%s' arch in repos definition for '%s', but it does not exist", wantArch, tt.args.distro) - - var gotNames []string - for _, r := range gotArchRepos { - gotNames = append(gotNames, r.Name) - } - - if !reflect.DeepEqual(gotNames, wantRepos) { - t.Errorf("LoadRepositories() for %s/%s =\n got: %#v\n want: %#v", tt.args.distro, wantArch, gotNames, wantRepos) - } - } - - }) - } -} - -func TestLoadRepositoriesNonExisting(t *testing.T) { - confPaths := getConfPaths(t) - repos, err := rpmmd.LoadRepositories(confPaths, "my-imaginary-distro") - assert.Nil(t, repos) - assert.NotNil(t, err) -} - -func Test_LoadAllRepositories(t *testing.T) { - confPaths := getConfPaths(t) - - distroReposMap, err := rpmmd.LoadAllRepositories(confPaths) - assert.NotNil(t, distroReposMap) - assert.Nil(t, err) - assert.Equal(t, len(distroReposMap), 2) - - // test-distro - testDistroRepos, exists := distroReposMap[testDistroName] - assert.True(t, exists) - assert.Equal(t, len(testDistroRepos), 2) - - // test-distro - arches - for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { - testDistroArchRepos, exists := testDistroRepos[arch] - assert.True(t, exists) - assert.Equal(t, len(testDistroArchRepos), 4) - - var repoNames []string - for _, r := range testDistroArchRepos { - repoNames = append(repoNames, r.Name) - } - - wantRepos := []string{"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"} - - if !reflect.DeepEqual(repoNames, wantRepos) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistroName, arch, repoNames, wantRepos) - } - } - - // test-distro-2 - testDistro2Repos, exists := distroReposMap[testDistro2Name] - assert.True(t, exists) - assert.Equal(t, len(testDistro2Repos), 2) - - // test-distro-2 - arches - wantRepos := map[string][]string{ - test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, - test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, - } - for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { - testDistro2ArchRepos, exists := testDistro2Repos[arch] - assert.True(t, exists) - assert.Equal(t, len(testDistro2ArchRepos), len(wantRepos[arch])) - - var repoNames []string - for _, r := range testDistro2ArchRepos { - repoNames = append(repoNames, r.Name) - } - - if !reflect.DeepEqual(repoNames, wantRepos[arch]) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistro2Name, arch, repoNames, wantRepos[arch]) - } - } -} - -func TestOldWorkerRepositoryCompatUnmarshal(t *testing.T) { - testCases := []struct { - repoJSON []byte - repo rpmmd.RepoConfig - }{ - { - repoJSON: []byte(`{"name":"fedora","baseurl":"http://example.com/fedora"}`), - repo: rpmmd.RepoConfig{ - Name: "fedora", - BaseURLs: []string{"http://example.com/fedora"}, - }, - }, - { - repoJSON: []byte(`{"name":"multiple","baseurl":"http://example.com/one,http://example.com/two"}`), - repo: rpmmd.RepoConfig{ - Name: "multiple", - BaseURLs: []string{"http://example.com/one", "http://example.com/two"}, - }, - }, - { - repoJSON: []byte(`{"id":"all","name":"all","baseurls":["http://example.com/all"],"metalink":"http://example.com/metalink","mirrorlist":"http://example.com/mirrorlist","gpgkeys":["key1","key2"],"check_gpg":true,"check_repo_gpg":true,"ignore_ssl":true,"priority":10,"metadata_expire":"test","rhsm":true,"enabled":true,"image_type_tags":["one","two"],"package_sets":["1","2"],"baseurl":"http://example.com/all"}`), - repo: rpmmd.RepoConfig{ - Id: "all", - Name: "all", - BaseURLs: []string{"http://example.com/all"}, - Metalink: "http://example.com/metalink", - MirrorList: "http://example.com/mirrorlist", - GPGKeys: []string{"key1", "key2"}, - CheckGPG: common.ToPtr(true), - CheckRepoGPG: common.ToPtr(true), - IgnoreSSL: common.ToPtr(true), - Priority: common.ToPtr(10), - MetadataExpire: "test", - RHSM: true, - Enabled: common.ToPtr(true), - ImageTypeTags: []string{"one", "two"}, - PackageSets: []string{"1", "2"}, - }, - }, - } - - for _, tc := range testCases { - t.Run(tc.repo.Name, func(t *testing.T) { - var repo rpmmd.RepoConfig - err := json.Unmarshal(tc.repoJSON, &repo) - assert.Nil(t, err) - assert.Equal(t, tc.repo, repo) - }) - } -} - -func TestOldWorkerRepositoryCompatMarshal(t *testing.T) { - testCases := []struct { - repoJSON []byte - repo rpmmd.RepoConfig - }{ - { - repoJSON: []byte(`{"id":"fedora","name":"fedora","baseurls":["http://example.com/fedora"],"baseurl":"http://example.com/fedora"}`), - repo: rpmmd.RepoConfig{ - Id: "fedora", - Name: "fedora", - BaseURLs: []string{"http://example.com/fedora"}, - }, - }, - { - repoJSON: []byte(`{"id":"multiple","name":"multiple","baseurls":["http://example.com/one","http://example.com/two"],"baseurl":"http://example.com/one,http://example.com/two"}`), - repo: rpmmd.RepoConfig{ - Id: "multiple", - Name: "multiple", - BaseURLs: []string{"http://example.com/one", "http://example.com/two"}, - }, - }, - { - repoJSON: []byte(`{"id":"all","name":"all","baseurls":["http://example.com/all"],"metalink":"http://example.com/metalink","mirrorlist":"http://example.com/mirrorlist","gpgkeys":["key1","key2"],"check_gpg":true,"check_repo_gpg":true,"priority":10,"ignore_ssl":true,"metadata_expire":"test","rhsm":true,"enabled":true,"image_type_tags":["one","two"],"package_sets":["1","2"],"baseurl":"http://example.com/all"}`), - repo: rpmmd.RepoConfig{ - Id: "all", - Name: "all", - BaseURLs: []string{"http://example.com/all"}, - Metalink: "http://example.com/metalink", - MirrorList: "http://example.com/mirrorlist", - GPGKeys: []string{"key1", "key2"}, - CheckGPG: common.ToPtr(true), - CheckRepoGPG: common.ToPtr(true), - Priority: common.ToPtr(10), - IgnoreSSL: common.ToPtr(true), - MetadataExpire: "test", - RHSM: true, - Enabled: common.ToPtr(true), - ImageTypeTags: []string{"one", "two"}, - PackageSets: []string{"1", "2"}, - }, - }, - } - - for _, tc := range testCases { - t.Run(tc.repo.Name, func(t *testing.T) { - gotJson, err := json.Marshal(tc.repo) - assert.Nil(t, err) - assert.Equal(t, tc.repoJSON, gotJson) - }) - } -} From 7cb19201993b1cac3efb3adeb9c61cb10a5d1a89 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 12 Dec 2023 18:09:27 +0100 Subject: [PATCH 14/23] distro: implement `String()` for the `ID` struct. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tomáš Hozza --- pkg/distro/id.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pkg/distro/id.go b/pkg/distro/id.go index 03cb556ca8..aec979b7d3 100644 --- a/pkg/distro/id.go +++ b/pkg/distro/id.go @@ -14,6 +14,14 @@ type ID struct { MinorVersion int } +func (id ID) String() string { + if id.MinorVersion == -1 { + return fmt.Sprintf("%s-%d", id.Name, id.MajorVersion) + } + + return fmt.Sprintf("%s-%d.%d", id.Name, id.MajorVersion, id.MinorVersion) +} + type ParseError struct { ToParse string Msg string From 9d11e2a7182a14c17b51ac32753ed10f942be7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 15:33:43 +0100 Subject: [PATCH 15/23] reporegistry: handle distro ID strings with and without the dot MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rework the reporegistry and loading to of all repo configurations to support distro ID strings with dot to separate minor version. This is done in a backward compatible way, so that e.g. `rhel-89.json` and `rhel-8.9.json` repo configs are considered to be for the same `RHEL-8.9` distro. The backward compatibility is achieved by always using the `distroidstrparser` to first parse any external distro ID string and then transforming the `distro.ID` back to its string representation (which always uses dot to separate minor release version if set). Rework unit tests to verify that repositories with and without a dot in their filename override each other in case they get parsed to the same `distro.ID`. Signed-off-by: Tomáš Hozza --- pkg/distroidparser/idparser.go | 13 + pkg/reporegistry/reporegistry.go | 27 +- pkg/reporegistry/repository.go | 10 +- pkg/reporegistry/repository_test.go | 262 ++++++++++++++---- .../priority1/repositories/fedora-33.json | 30 ++ .../priority1/repositories/rhel-8.10.json | 30 ++ .../priority1/repositories/rhel-87.json | 30 ++ .../priority1/repositories/rhel-88.json | 30 ++ .../priority1/repositories/test-distro.json | 56 ---- .../priority2/repositories/fedora-33.json | 30 ++ .../priority2/repositories/fedora-34.json | 30 ++ .../priority2/repositories/rhel-8.8.json | 30 ++ .../priority2/repositories/rhel-8.9.json | 30 ++ .../priority2/repositories/rhel-810.json | 30 ++ .../priority2/repositories/test-distro-2.json | 38 --- .../priority2/repositories/test-distro.json | 56 ---- 16 files changed, 516 insertions(+), 216 deletions(-) create mode 100644 pkg/reporegistry/test/confpaths/priority1/repositories/fedora-33.json create mode 100644 pkg/reporegistry/test/confpaths/priority1/repositories/rhel-8.10.json create mode 100644 pkg/reporegistry/test/confpaths/priority1/repositories/rhel-87.json create mode 100644 pkg/reporegistry/test/confpaths/priority1/repositories/rhel-88.json delete mode 100644 pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json create mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/fedora-33.json create mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/fedora-34.json create mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.8.json create mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.9.json create mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/rhel-810.json delete mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json delete mode 100644 pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json diff --git a/pkg/distroidparser/idparser.go b/pkg/distroidparser/idparser.go index f3da48dc0e..b1e78458a1 100644 --- a/pkg/distroidparser/idparser.go +++ b/pkg/distroidparser/idparser.go @@ -8,6 +8,8 @@ import ( "github.com/osbuild/images/pkg/distro/rhel9" ) +var DefaultParser = NewDefaultParser() + type ParserFunc func(idStr string) (*distro.ID, error) // Parser is a list of distro-specific idStr parsers. @@ -47,6 +49,17 @@ func (p *Parser) Parse(idStr string) (*distro.ID, error) { return match, nil } +// Standardize returns the standardized distro ID string for the given distro ID +// string. If the given distro ID string is not valid, it returns an error. +func (p *Parser) Standardize(idStr string) (string, error) { + id, err := p.Parse(idStr) + if err != nil { + return "", err + } + + return id.String(), nil +} + func NewDefaultParser() *Parser { return New( fedora.ParseID, diff --git a/pkg/reporegistry/reporegistry.go b/pkg/reporegistry/reporegistry.go index 6dac4b196f..43db679373 100644 --- a/pkg/reporegistry/reporegistry.go +++ b/pkg/reporegistry/reporegistry.go @@ -5,6 +5,7 @@ import ( "reflect" "github.com/osbuild/images/pkg/distro" + "github.com/osbuild/images/pkg/distroidparser" "github.com/osbuild/images/pkg/rpmmd" ) @@ -92,9 +93,9 @@ func (r *RepoRegistry) reposByImageTypeName(distro, arch, imageType string) ([]r func (r *RepoRegistry) ReposByArchName(distro, arch string, includeTagged bool) ([]rpmmd.RepoConfig, error) { repositories := []rpmmd.RepoConfig{} - archRepos, found := r.DistroHasRepos(distro, arch) - if !found { - return nil, fmt.Errorf("there are no repositories for distribution '%s' and architecture '%s'", distro, arch) + archRepos, err := r.DistroHasRepos(distro, arch) + if err != nil { + return nil, fmt.Errorf("Failed to get repositories for distribution '%s' and architecture '%s': %v", distro, arch, err) } for _, repo := range archRepos { @@ -110,14 +111,24 @@ func (r *RepoRegistry) ReposByArchName(distro, arch string, includeTagged bool) } // DistroHasRepos returns the repositories for the distro+arch, and a found flag -func (r *RepoRegistry) DistroHasRepos(distro, arch string) (repos []rpmmd.RepoConfig, found bool) { - distroRepos, found := r.repos[distro] +func (r *RepoRegistry) DistroHasRepos(distro, arch string) ([]rpmmd.RepoConfig, error) { + // compatibility layer to support old repository definition filenames + // without a dot to separate major and minor release versions + stdDistroName, err := distroidparser.DefaultParser.Standardize(distro) + if err != nil { + return nil, fmt.Errorf("failed to parse distro ID string: %v", err) + } + + distroRepos, found := r.repos[stdDistroName] + if !found { + return nil, fmt.Errorf("there are no repositories for distribution '%s'", stdDistroName) + } + repos, found := distroRepos[arch] if !found { - return repos, false + return nil, fmt.Errorf("there are no repositories for distribution '%s' and architecture '%s'", stdDistroName, arch) } - repos, found = distroRepos[arch] - return repos, found + return repos, nil } // ListDistros returns a list of all distros which have a repository defined diff --git a/pkg/reporegistry/repository.go b/pkg/reporegistry/repository.go index af4dd430c9..c7d3dbb858 100644 --- a/pkg/reporegistry/repository.go +++ b/pkg/reporegistry/repository.go @@ -7,6 +7,7 @@ import ( "path/filepath" "strings" + "github.com/osbuild/images/pkg/distroidparser" "github.com/osbuild/images/pkg/rpmmd" ) @@ -33,7 +34,14 @@ func LoadAllRepositories(confPaths []string) (rpmmd.DistrosRepoConfigs, error) { // distro repositories definition is expected to be named ".json" if strings.HasSuffix(fileEntry.Name(), ".json") { - distro := strings.TrimSuffix(fileEntry.Name(), ".json") + distroIDStr := strings.TrimSuffix(fileEntry.Name(), ".json") + + // compatibility layer to support old repository definition filenames + // without a dot to separate major and minor release versions + distro, err := distroidparser.DefaultParser.Standardize(distroIDStr) + if err != nil { + return nil, fmt.Errorf("failed to parse distro ID string: %v", err) + } // skip the distro repos definition, if it has been already read _, ok := distrosRepoConfigs[distro] diff --git a/pkg/reporegistry/repository_test.go b/pkg/reporegistry/repository_test.go index ae011fa291..ad24e9c9d6 100644 --- a/pkg/reporegistry/repository_test.go +++ b/pkg/reporegistry/repository_test.go @@ -5,15 +5,12 @@ import ( "reflect" "testing" + "github.com/osbuild/images/internal/common" "github.com/osbuild/images/pkg/distro/test_distro" + "github.com/osbuild/images/pkg/rpmmd" "github.com/stretchr/testify/assert" ) -const ( - testDistroName = "test-distro" - testDistro2Name = "test-distro-2" -) - func getConfPaths(t *testing.T) []string { confPaths := []string{ "./test/confpaths/priority1", @@ -43,21 +40,21 @@ func TestLoadRepositoriesExisting(t *testing.T) { { name: "duplicate distro definition, load first encounter", args: args{ - distro: testDistroName, + distro: "fedora-33", }, want: map[string][]string{ - test_distro.TestArchName: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, - test_distro.TestArch2Name: {"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"}, + test_distro.TestArchName: {"fedora-33-p1", "updates-33-p1"}, + test_distro.TestArch2Name: {"fedora-33-p1", "updates-33-p1"}, }, }, { name: "single distro definition", args: args{ - distro: testDistro2Name, + distro: "fedora-34", }, want: map[string][]string{ - test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, - test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, + test_distro.TestArchName: {"fedora-34-p2", "updates-34-p2"}, + test_distro.TestArch2Name: {"fedora-34-p2", "updates-34-p2"}, }, }, } @@ -92,58 +89,209 @@ func TestLoadRepositoriesNonExisting(t *testing.T) { } func Test_LoadAllRepositories(t *testing.T) { + expectedReposMap := rpmmd.DistrosRepoConfigs{ + "fedora-33": { + test_distro.TestArchName: { + { + Name: "fedora-33-p1", + BaseURLs: []string{"https://example.com/fedora-33-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "updates-33-p1", + BaseURLs: []string{"https://example.com/updates-33-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "fedora-33-p1", + BaseURLs: []string{"https://example.com/fedora-33-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "updates-33-p1", + BaseURLs: []string{"https://example.com/updates-33-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + "fedora-34": { + test_distro.TestArchName: { + { + Name: "fedora-34-p2", + BaseURLs: []string{"https://example.com/fedora-34-p2/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "updates-34-p2", + BaseURLs: []string{"https://example.com/updates-34-p2/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "fedora-34-p2", + BaseURLs: []string{"https://example.com/fedora-34-p2/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "updates-34-p2", + BaseURLs: []string{"https://example.com/updates-34-p2/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + "rhel-8.7": { + test_distro.TestArchName: { + { + Name: "rhel-8.7-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.7-baseos-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.7-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.7-appstream-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "rhel-8.7-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.7-baseos-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.7-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.7-appstream-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + "rhel-8.8": { + test_distro.TestArchName: { + { + Name: "rhel-8.8-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.8-baseos-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.8-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.8-appstream-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "rhel-8.8-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.8-baseos-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.8-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.8-appstream-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + "rhel-8.9": { + test_distro.TestArchName: { + { + Name: "rhel-8.9-baseos-p2", + BaseURLs: []string{"https://example.com/rhel-8.9-baseos-p2/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.9-appstream-p2", + BaseURLs: []string{"https://example.com/rhel-8.9-appstream-p2/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "rhel-8.9-baseos-p2", + BaseURLs: []string{"https://example.com/rhel-8.9-baseos-p2/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.9-appstream-p2", + BaseURLs: []string{"https://example.com/rhel-8.9-appstream-p2/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + "rhel-8.10": { + test_distro.TestArchName: { + { + Name: "rhel-8.10-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.10-baseos-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.10-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.10-appstream-p1/test_arch"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + test_distro.TestArch2Name: { + { + Name: "rhel-8.10-baseos-p1", + BaseURLs: []string{"https://example.com/rhel-8.10-baseos-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + { + Name: "rhel-8.10-appstream-p1", + BaseURLs: []string{"https://example.com/rhel-8.10-appstream-p1/test_arch2"}, + GPGKeys: []string{"FAKE-GPG-KEY"}, + CheckGPG: common.ToPtr(true), + }, + }, + }, + } + confPaths := getConfPaths(t) distroReposMap, err := LoadAllRepositories(confPaths) assert.NotNil(t, distroReposMap) assert.Nil(t, err) - assert.Equal(t, len(distroReposMap), 2) - - // test-distro - testDistroRepos, exists := distroReposMap[testDistroName] - assert.True(t, exists) - assert.Equal(t, len(testDistroRepos), 2) - - // test-distro - arches - for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { - testDistroArchRepos, exists := testDistroRepos[arch] - assert.True(t, exists) - assert.Equal(t, len(testDistroArchRepos), 4) + assert.Equal(t, len(distroReposMap), len(expectedReposMap)) - var repoNames []string - for _, r := range testDistroArchRepos { - repoNames = append(repoNames, r.Name) - } + for expectedDistroName, expectedDistroArchRepos := range expectedReposMap { + t.Run(expectedDistroName, func(t *testing.T) { + distroArchRepos, exists := distroReposMap[expectedDistroName] + assert.True(t, exists) + assert.Equal(t, len(distroArchRepos), len(expectedDistroArchRepos)) - wantRepos := []string{"fedora-p1", "updates-p1", "fedora-modular-p1", "updates-modular-p1"} - - if !reflect.DeepEqual(repoNames, wantRepos) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistroName, arch, repoNames, wantRepos) - } - } - - // test-distro-2 - testDistro2Repos, exists := distroReposMap[testDistro2Name] - assert.True(t, exists) - assert.Equal(t, len(testDistro2Repos), 2) - - // test-distro-2 - arches - wantRepos := map[string][]string{ - test_distro.TestArchName: {"baseos-p2", "appstream-p2"}, - test_distro.TestArch2Name: {"baseos-p2", "appstream-p2", "google-compute-engine", "google-cloud-sdk"}, - } - for _, arch := range []string{test_distro.TestArchName, test_distro.TestArch2Name} { - testDistro2ArchRepos, exists := testDistro2Repos[arch] - assert.True(t, exists) - assert.Equal(t, len(testDistro2ArchRepos), len(wantRepos[arch])) - - var repoNames []string - for _, r := range testDistro2ArchRepos { - repoNames = append(repoNames, r.Name) - } - - if !reflect.DeepEqual(repoNames, wantRepos[arch]) { - t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", testDistro2Name, arch, repoNames, wantRepos[arch]) - } + for expectedArch, expectedRepos := range expectedDistroArchRepos { + repos, exists := distroArchRepos[expectedArch] + assert.True(t, exists) + if !reflect.DeepEqual(repos, expectedRepos) { + t.Errorf("LoadAllRepositories() for %s/%s =\n got: %#v\n want: %#v", expectedDistroName, expectedArch, repos, expectedRepos) + } + } + }) } } diff --git a/pkg/reporegistry/test/confpaths/priority1/repositories/fedora-33.json b/pkg/reporegistry/test/confpaths/priority1/repositories/fedora-33.json new file mode 100644 index 0000000000..81c4ea9898 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority1/repositories/fedora-33.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "fedora-33-p1", + "baseurl": "https://example.com/fedora-33-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-33-p1", + "baseurl": "https://example.com/updates-33-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "fedora-33-p1", + "baseurl": "https://example.com/fedora-33-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-33-p1", + "baseurl": "https://example.com/updates-33-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-8.10.json b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-8.10.json new file mode 100644 index 0000000000..dd1a394eff --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-8.10.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.10-baseos-p1", + "baseurl": "https://example.com/rhel-8.10-baseos-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.10-appstream-p1", + "baseurl": "https://example.com/rhel-8.10-appstream-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.10-baseos-p1", + "baseurl": "https://example.com/rhel-8.10-baseos-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.10-appstream-p1", + "baseurl": "https://example.com/rhel-8.10-appstream-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-87.json b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-87.json new file mode 100644 index 0000000000..5561973e6a --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-87.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.7-baseos-p1", + "baseurl": "https://example.com/rhel-8.7-baseos-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.7-appstream-p1", + "baseurl": "https://example.com/rhel-8.7-appstream-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.7-baseos-p1", + "baseurl": "https://example.com/rhel-8.7-baseos-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.7-appstream-p1", + "baseurl": "https://example.com/rhel-8.7-appstream-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-88.json b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-88.json new file mode 100644 index 0000000000..5f7de1d488 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority1/repositories/rhel-88.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.8-baseos-p1", + "baseurl": "https://example.com/rhel-8.8-baseos-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.8-appstream-p1", + "baseurl": "https://example.com/rhel-8.8-appstream-p1/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.8-baseos-p1", + "baseurl": "https://example.com/rhel-8.8-baseos-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.8-appstream-p1", + "baseurl": "https://example.com/rhel-8.8-appstream-p1/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json b/pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json deleted file mode 100644 index 96007b1f32..0000000000 --- a/pkg/reporegistry/test/confpaths/priority1/repositories/test-distro.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "test_arch": [ - { - "name": "fedora-p1", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-fedora-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-p1", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-fedora-modular-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "fedora-modular-p1", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-updates-released-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-modular-p1", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-updates-released-modular-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - } - ], - "test_arch2": [ - { - "name": "fedora-p1", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-33&arch=aarch64", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-p1", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f33&arch=aarch64", - "metadata_expire": "6h", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "fedora-modular-p1", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-modular-33&arch=aarch64", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-modular-p1", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=updates-released-modular-f33&arch=aarch64", - "metadata_expire": "6h", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - } - ] -} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-33.json b/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-33.json new file mode 100644 index 0000000000..2ead72ddc3 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-33.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "fedora-33-p2", + "baseurl": "https://example.com/fedora-33-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-33-p2", + "baseurl": "https://example.com/updates-33-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "fedora-33-p2", + "baseurl": "https://example.com/fedora-33-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-33-p2", + "baseurl": "https://example.com/updates-33-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-34.json b/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-34.json new file mode 100644 index 0000000000..bb574c4107 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority2/repositories/fedora-34.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "fedora-34-p2", + "baseurl": "https://example.com/fedora-34-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-34-p2", + "baseurl": "https://example.com/updates-34-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "fedora-34-p2", + "baseurl": "https://example.com/fedora-34-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "updates-34-p2", + "baseurl": "https://example.com/updates-34-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.8.json b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.8.json new file mode 100644 index 0000000000..13f4165d81 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.8.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.8-baseos-p2", + "baseurl": "https://example.com/rhel-8.8-baseos-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.8-appstream-p2", + "baseurl": "https://example.com/rhel-8.8-appstream-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.8-baseos-p2", + "baseurl": "https://example.com/rhel-8.8-baseos-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.8-appstream-p2", + "baseurl": "https://example.com/rhel-8.8-appstream-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.9.json b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.9.json new file mode 100644 index 0000000000..7970ea4cfc --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-8.9.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.9-baseos-p2", + "baseurl": "https://example.com/rhel-8.9-baseos-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.9-appstream-p2", + "baseurl": "https://example.com/rhel-8.9-appstream-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.9-baseos-p2", + "baseurl": "https://example.com/rhel-8.9-baseos-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.9-appstream-p2", + "baseurl": "https://example.com/rhel-8.9-appstream-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-810.json b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-810.json new file mode 100644 index 0000000000..8747dcffd8 --- /dev/null +++ b/pkg/reporegistry/test/confpaths/priority2/repositories/rhel-810.json @@ -0,0 +1,30 @@ +{ + "test_arch": [ + { + "name": "rhel-8.10-baseos-p2", + "baseurl": "https://example.com/rhel-8.10-baseos-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.10-appstream-p2", + "baseurl": "https://example.com/rhel-8.10-appstream-p2/test_arch", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ], + "test_arch2": [ + { + "name": "rhel-8.10-baseos-p2", + "baseurl": "https://example.com/rhel-8.10-baseos-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + }, + { + "name": "rhel-8.10-appstream-p2", + "baseurl": "https://example.com/rhel-8.10-appstream-p2/test_arch2", + "gpgkey": "FAKE-GPG-KEY", + "check_gpg": true + } + ] +} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json b/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json deleted file mode 100644 index 69eadc9609..0000000000 --- a/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro-2.json +++ /dev/null @@ -1,38 +0,0 @@ -{ - "test_arch": [ - { - "name": "baseos-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-baseos-8.4.0.n-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niLkCDQRbMtt1ARAA1lNsWklhS9LoBdolTVtg65FfdFJr47pzKRGYIoGLbcJ155ND\nG+P8UrM06E/ah06EEWuvu2YyyYAz1iYGsCwHAXtbEJh+1tF0iOVx2vnZPgtIGE9V\nP95V5ZvWvB3bdke1z8HadDA+/Ve7fbwXXLa/z9QhSQgsJ8NS8KYnDDjI4EvQtv0i\nPVLY8+u8z6VyiV9RJyn8UEZEJdbFDF9AZAT8103w8SEo/cvIoUbVKZLGcXdAIjCa\ny04u6jsrMp9UGHZX7+srT+9YHDzQixei4IdmxUcqtiNR2/bFHpHCu1pzYjXj968D\n8Ng2txBXDgs16BF/9l++GWKz2dOSH0jdS6sFJ/Dmg7oYnJ2xKSJEmcnV8Z0M1n4w\nXR1t/KeKZe3aR+RXCAEVC5dQ3GbRW2+WboJ6ldgFcVcOv6iOSWP9TrLzFPOpCsIr\nnHE+cMBmPHq3dUm7KeYXQ6wWWmtXlw6widf7cBcGFeELpuU9klzqdKze8qo2oMkf\nrfxIq8zdciPxZXb/75dGWs6dLHQmDpo4MdQVskw5vvwHicMpUpGpxkX7X1XAfdQf\nyIHLGT4ZXuMLIMUPdzJE0Vwt/RtJrZ+feLSv/+0CkkpGHORYroGwIBrJ2RikgcV2\nbc98V/27Kz2ngUCEwnmlhIcrY4IGAAZzUAl0GLHSevPbAREu4fDW4Y+ztOsAEQEA\nAYkCHwQYAQIACQUCWzLbdQIbDAAKCRD3b2bD1AgnkusfD/9U4sPtZfMw6cII167A\nXRZOO195G7oiAnBUw5AW6EK0SAHVZcuW0LMMXnGe9f4UsEUgCNwo5mvLWPxzKqFq\n6/G3kEZVFwZ0qrlLoJPeHNbOcfkeZ9NgD/OhzQmdylM0IwGM9DMrm2YS4EVsmm2b\n53qKIfIyysp1yAGcTnBwBbZ85osNBl2KRDIPhMs0bnmGB7IAvwlSb+xm6vWKECkO\nlwQDO5Kg8YZ8+Z3pn/oS688t/fPXvWLZYUqwR63oWfIaPJI7Ahv2jJmgw1ofL81r\n2CE3T/OydtUeGLzqWJAB8sbUgT3ug0cjtxsHuroQBSYBND3XDb/EQh5GeVVnGKKH\ngESLFAoweoNjDSXrlIu1gFjCDHF4CqBRmNYKrNQjLmhCrSfwkytXESJwlLzFKY8P\nK1yZyTpDC9YK0G7qgrk7EHmH9JAZTQ5V65pp0vR9KvqTU5ewkQDIljD2f3FIqo2B\nSKNCQE+N6NjWaTeNlU75m+yZocKObSPg0zS8FAuSJetNtzXA7ouqk34OoIMQj4gq\nUnh/i1FcZAd4U6Dtr9aRZ6PeLlm6MJ/h582L6fJLNEu136UWDtJj5eBYEzX13l+d\nSC4PEHx7ZZRwQKptl9NkinLZGJztg175paUu8C34sAv+SQnM20c0pdOXAq9GKKhi\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" - }, - { - "name": "appstream-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-x86_64-appstream-8.4.0.n-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niLkCDQRbMtt1ARAA1lNsWklhS9LoBdolTVtg65FfdFJr47pzKRGYIoGLbcJ155ND\nG+P8UrM06E/ah06EEWuvu2YyyYAz1iYGsCwHAXtbEJh+1tF0iOVx2vnZPgtIGE9V\nP95V5ZvWvB3bdke1z8HadDA+/Ve7fbwXXLa/z9QhSQgsJ8NS8KYnDDjI4EvQtv0i\nPVLY8+u8z6VyiV9RJyn8UEZEJdbFDF9AZAT8103w8SEo/cvIoUbVKZLGcXdAIjCa\ny04u6jsrMp9UGHZX7+srT+9YHDzQixei4IdmxUcqtiNR2/bFHpHCu1pzYjXj968D\n8Ng2txBXDgs16BF/9l++GWKz2dOSH0jdS6sFJ/Dmg7oYnJ2xKSJEmcnV8Z0M1n4w\nXR1t/KeKZe3aR+RXCAEVC5dQ3GbRW2+WboJ6ldgFcVcOv6iOSWP9TrLzFPOpCsIr\nnHE+cMBmPHq3dUm7KeYXQ6wWWmtXlw6widf7cBcGFeELpuU9klzqdKze8qo2oMkf\nrfxIq8zdciPxZXb/75dGWs6dLHQmDpo4MdQVskw5vvwHicMpUpGpxkX7X1XAfdQf\nyIHLGT4ZXuMLIMUPdzJE0Vwt/RtJrZ+feLSv/+0CkkpGHORYroGwIBrJ2RikgcV2\nbc98V/27Kz2ngUCEwnmlhIcrY4IGAAZzUAl0GLHSevPbAREu4fDW4Y+ztOsAEQEA\nAYkCHwQYAQIACQUCWzLbdQIbDAAKCRD3b2bD1AgnkusfD/9U4sPtZfMw6cII167A\nXRZOO195G7oiAnBUw5AW6EK0SAHVZcuW0LMMXnGe9f4UsEUgCNwo5mvLWPxzKqFq\n6/G3kEZVFwZ0qrlLoJPeHNbOcfkeZ9NgD/OhzQmdylM0IwGM9DMrm2YS4EVsmm2b\n53qKIfIyysp1yAGcTnBwBbZ85osNBl2KRDIPhMs0bnmGB7IAvwlSb+xm6vWKECkO\nlwQDO5Kg8YZ8+Z3pn/oS688t/fPXvWLZYUqwR63oWfIaPJI7Ahv2jJmgw1ofL81r\n2CE3T/OydtUeGLzqWJAB8sbUgT3ug0cjtxsHuroQBSYBND3XDb/EQh5GeVVnGKKH\ngESLFAoweoNjDSXrlIu1gFjCDHF4CqBRmNYKrNQjLmhCrSfwkytXESJwlLzFKY8P\nK1yZyTpDC9YK0G7qgrk7EHmH9JAZTQ5V65pp0vR9KvqTU5ewkQDIljD2f3FIqo2B\nSKNCQE+N6NjWaTeNlU75m+yZocKObSPg0zS8FAuSJetNtzXA7ouqk34OoIMQj4gq\nUnh/i1FcZAd4U6Dtr9aRZ6PeLlm6MJ/h582L6fJLNEu136UWDtJj5eBYEzX13l+d\nSC4PEHx7ZZRwQKptl9NkinLZGJztg175paUu8C34sAv+SQnM20c0pdOXAq9GKKhi\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" - } - ], - "test_arch2": [ - { - "name": "baseos-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-baseos-8.4.0.n-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niLkCDQRbMtt1ARAA1lNsWklhS9LoBdolTVtg65FfdFJr47pzKRGYIoGLbcJ155ND\nG+P8UrM06E/ah06EEWuvu2YyyYAz1iYGsCwHAXtbEJh+1tF0iOVx2vnZPgtIGE9V\nP95V5ZvWvB3bdke1z8HadDA+/Ve7fbwXXLa/z9QhSQgsJ8NS8KYnDDjI4EvQtv0i\nPVLY8+u8z6VyiV9RJyn8UEZEJdbFDF9AZAT8103w8SEo/cvIoUbVKZLGcXdAIjCa\ny04u6jsrMp9UGHZX7+srT+9YHDzQixei4IdmxUcqtiNR2/bFHpHCu1pzYjXj968D\n8Ng2txBXDgs16BF/9l++GWKz2dOSH0jdS6sFJ/Dmg7oYnJ2xKSJEmcnV8Z0M1n4w\nXR1t/KeKZe3aR+RXCAEVC5dQ3GbRW2+WboJ6ldgFcVcOv6iOSWP9TrLzFPOpCsIr\nnHE+cMBmPHq3dUm7KeYXQ6wWWmtXlw6widf7cBcGFeELpuU9klzqdKze8qo2oMkf\nrfxIq8zdciPxZXb/75dGWs6dLHQmDpo4MdQVskw5vvwHicMpUpGpxkX7X1XAfdQf\nyIHLGT4ZXuMLIMUPdzJE0Vwt/RtJrZ+feLSv/+0CkkpGHORYroGwIBrJ2RikgcV2\nbc98V/27Kz2ngUCEwnmlhIcrY4IGAAZzUAl0GLHSevPbAREu4fDW4Y+ztOsAEQEA\nAYkCHwQYAQIACQUCWzLbdQIbDAAKCRD3b2bD1AgnkusfD/9U4sPtZfMw6cII167A\nXRZOO195G7oiAnBUw5AW6EK0SAHVZcuW0LMMXnGe9f4UsEUgCNwo5mvLWPxzKqFq\n6/G3kEZVFwZ0qrlLoJPeHNbOcfkeZ9NgD/OhzQmdylM0IwGM9DMrm2YS4EVsmm2b\n53qKIfIyysp1yAGcTnBwBbZ85osNBl2KRDIPhMs0bnmGB7IAvwlSb+xm6vWKECkO\nlwQDO5Kg8YZ8+Z3pn/oS688t/fPXvWLZYUqwR63oWfIaPJI7Ahv2jJmgw1ofL81r\n2CE3T/OydtUeGLzqWJAB8sbUgT3ug0cjtxsHuroQBSYBND3XDb/EQh5GeVVnGKKH\ngESLFAoweoNjDSXrlIu1gFjCDHF4CqBRmNYKrNQjLmhCrSfwkytXESJwlLzFKY8P\nK1yZyTpDC9YK0G7qgrk7EHmH9JAZTQ5V65pp0vR9KvqTU5ewkQDIljD2f3FIqo2B\nSKNCQE+N6NjWaTeNlU75m+yZocKObSPg0zS8FAuSJetNtzXA7ouqk34OoIMQj4gq\nUnh/i1FcZAd4U6Dtr9aRZ6PeLlm6MJ/h582L6fJLNEu136UWDtJj5eBYEzX13l+d\nSC4PEHx7ZZRwQKptl9NkinLZGJztg175paUu8C34sAv+SQnM20c0pdOXAq9GKKhi\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" - }, - { - "name": "appstream-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/psi/el8/el8-aarch64-appstream-8.4.0.n-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBErgSTsBEACh2A4b0O9t+vzC9VrVtL1AKvUWi9OPCjkvR7Xd8DtJxeeMZ5eF\n0HtzIG58qDRybwUe89FZprB1ffuUKzdE+HcL3FbNWSSOXVjZIersdXyH3NvnLLLF\n0DNRB2ix3bXG9Rh/RXpFsNxDp2CEMdUvbYCzE79K1EnUTVh1L0Of023FtPSZXX0c\nu7Pb5DI5lX5YeoXO6RoodrIGYJsVBQWnrWw4xNTconUfNPk0EGZtEnzvH2zyPoJh\nXGF+Ncu9XwbalnYde10OCvSWAZ5zTCpoLMTvQjWpbCdWXJzCm6G+/hx9upke546H\n5IjtYm4dTIVTnc3wvDiODgBKRzOl9rEOCIgOuGtDxRxcQkjrC+xvg5Vkqn7vBUyW\n9pHedOU+PoF3DGOM+dqv+eNKBvh9YF9ugFAQBkcG7viZgvGEMGGUpzNgN7XnS1gj\n/DPo9mZESOYnKceve2tIC87p2hqjrxOHuI7fkZYeNIcAoa83rBltFXaBDYhWAKS1\nPcXS1/7JzP0ky7d0L6Xbu/If5kqWQpKwUInXtySRkuraVfuK3Bpa+X1XecWi24JY\nHVtlNX025xx1ewVzGNCTlWn1skQN2OOoQTV4C8/qFpTW6DTWYurd4+fE0OJFJZQF\nbuhfXYwmRlVOgN5i77NTIJZJQfYFj38c/Iv5vZBPokO6mffrOTv3MHWVgQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChyZWxlYXNlIGtleSAyKSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjYEEwECACAFAkrgSTsCGwMGCwkIBwMCBBUCCAMEFgIDAQIeAQIXgAAK\nCRAZni+R/UMdUWzpD/9s5SFR/ZF3yjY5VLUFLMXIKUztNN3oc45fyLdTI3+UClKC\n2tEruzYjqNHhqAEXa2sN1fMrsuKec61Ll2NfvJjkLKDvgVIh7kM7aslNYVOP6BTf\nC/JJ7/ufz3UZmyViH/WDl+AYdgk3JqCIO5w5ryrC9IyBzYv2m0HqYbWfphY3uHw5\nun3ndLJcu8+BGP5F+ONQEGl+DRH58Il9Jp3HwbRa7dvkPgEhfFR+1hI+Btta2C7E\n0/2NKzCxZw7Lx3PBRcU92YKyaEihfy/aQKZCAuyfKiMvsmzs+4poIX7I9NQCJpyE\nIGfINoZ7VxqHwRn/d5mw2MZTJjbzSf+Um9YJyA0iEEyD6qjriWQRbuxpQXmlAJbh\n8okZ4gbVFv1F8MzK+4R8VvWJ0XxgtikSo72fHjwha7MAjqFnOq6eo6fEC/75g3NL\nGht5VdpGuHk0vbdENHMC8wS99e5qXGNDued3hlTavDMlEAHl34q2H9nakTGRF5Ki\nJUfNh3DVRGhg8cMIti21njiRh7gyFI2OccATY7bBSr79JhuNwelHuxLrCFpY7V25\nOFktl15jZJaMxuQBqYdBgSay2G0U6D1+7VsWufpzd/Abx1/c3oi9ZaJvW22kAggq\ndzdA27UUYjWvx42w9menJwh/0jeQcTecIUd0d0rFcw/c1pvgMMl/Q73yzKgKYw==\n=zbHE\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBFsy23UBEACUKSphFEIEvNpy68VeW4Dt6qv+mU6am9a2AAl10JANLj1oqWX+\noYk3en1S6cVe2qehSL5DGVa3HMUZkP3dtbD4SgzXzxPodebPcr4+0QNWigkUisri\nXGL5SCEcOP30zDhZvg+4mpO2jMi7Kc1DLPzBBkgppcX91wa0L1pQzBcvYMPyV/Dh\nKbQHR75WdkP6OA2JXdfC94nxYq+2e0iPqC1hCP3Elh+YnSkOkrawDPmoB1g4+ft/\nxsiVGVy/W0ekXmgvYEHt6si6Y8NwXgnTMqxeSXQ9YUgVIbTpsxHQKGy76T5lMlWX\n4LCOmEVomBJg1SqF6yi9Vu8TeNThaDqT4/DddYInd0OO69s0kGIXalVgGYiW2HOD\nx2q5R1VGCoJxXomz+EbOXY+HpKPOHAjU0DB9MxbU3S248LQ69nIB5uxysy0PSco1\nsdZ8sxRNQ9Dw6on0Nowx5m6Thefzs5iK3dnPGBqHTT43DHbnWc2scjQFG+eZhe98\nEll/kb6vpBoY4bG9/wCG9qu7jj9Z+BceCNKeHllbezVLCU/Hswivr7h2dnaEFvPD\nO4GqiWiwOF06XaBMVgxA8p2HRw0KtXqOpZk+o+sUvdPjsBw42BB96A1yFX4jgFNA\nPyZYnEUdP6OOv9HSjnl7k/iEkvHq/jGYMMojixlvXpGXhnt5jNyc4GSUJQARAQAB\ntDNSZWQgSGF0LCBJbmMuIChhdXhpbGlhcnkga2V5KSA8c2VjdXJpdHlAcmVkaGF0\nLmNvbT6JAjkEEwECACMFAlsy23UCGwMHCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIX\ngAAKCRD3b2bD1AgnknqOD/9fB2ASuG2aJIiap4kK58R+RmOVM4qgclAnaG57+vjI\nnKvyfV3NH/keplGNRxwqHekfPCqvkpABwhdGEXIE8ILqnPewIMr6PZNZWNJynZ9i\neSMzVuCG7jDoGyQ5/6B0f6xeBtTeBDiRl7+Alehet1twuGL1BJUYG0QuLgcEzkaE\n/gkuumeVcazLzz7L12D22nMk66GxmgXfqS5zcbqOAuZwaA6VgSEgFdV2X2JU79zS\nBQJXv7NKc+nDXFG7M7EHjY3Rma3HXkDbkT8bzh9tJV7Z7TlpT829pStWQyoxKCVq\nsEX8WsSapTKA3P9YkYCwLShgZu4HKRFvHMaIasSIZWzLu+RZH/4yyHOhj0QB7XMY\neHQ6fGSbtJ+K6SrpHOOsKQNAJ0hVbSrnA1cr5+2SDfel1RfYt0W9FA6DoH/S5gAR\ndzT1u44QVwwp3U+eFpHphFy//uzxNMtCjjdkpzhYYhOCLNkDrlRPb+bcoL/6ePSr\n016PA7eEnuC305YU1Ml2WcCn7wQV8x90o33klJmEkWtXh3X39vYtI4nCPIvZn1eP\nVy+F+wWt4vN2b8oOdlzc2paOembbCo2B+Wapv5Y9peBvlbsDSgqtJABfK8KQq/jK\nYl3h5elIa1I3uNfczeHOnf1enLOUOlq630yeM/yHizz99G1g+z/guMh5+x/OHraW\niLkCDQRbMtt1ARAA1lNsWklhS9LoBdolTVtg65FfdFJr47pzKRGYIoGLbcJ155ND\nG+P8UrM06E/ah06EEWuvu2YyyYAz1iYGsCwHAXtbEJh+1tF0iOVx2vnZPgtIGE9V\nP95V5ZvWvB3bdke1z8HadDA+/Ve7fbwXXLa/z9QhSQgsJ8NS8KYnDDjI4EvQtv0i\nPVLY8+u8z6VyiV9RJyn8UEZEJdbFDF9AZAT8103w8SEo/cvIoUbVKZLGcXdAIjCa\ny04u6jsrMp9UGHZX7+srT+9YHDzQixei4IdmxUcqtiNR2/bFHpHCu1pzYjXj968D\n8Ng2txBXDgs16BF/9l++GWKz2dOSH0jdS6sFJ/Dmg7oYnJ2xKSJEmcnV8Z0M1n4w\nXR1t/KeKZe3aR+RXCAEVC5dQ3GbRW2+WboJ6ldgFcVcOv6iOSWP9TrLzFPOpCsIr\nnHE+cMBmPHq3dUm7KeYXQ6wWWmtXlw6widf7cBcGFeELpuU9klzqdKze8qo2oMkf\nrfxIq8zdciPxZXb/75dGWs6dLHQmDpo4MdQVskw5vvwHicMpUpGpxkX7X1XAfdQf\nyIHLGT4ZXuMLIMUPdzJE0Vwt/RtJrZ+feLSv/+0CkkpGHORYroGwIBrJ2RikgcV2\nbc98V/27Kz2ngUCEwnmlhIcrY4IGAAZzUAl0GLHSevPbAREu4fDW4Y+ztOsAEQEA\nAYkCHwQYAQIACQUCWzLbdQIbDAAKCRD3b2bD1AgnkusfD/9U4sPtZfMw6cII167A\nXRZOO195G7oiAnBUw5AW6EK0SAHVZcuW0LMMXnGe9f4UsEUgCNwo5mvLWPxzKqFq\n6/G3kEZVFwZ0qrlLoJPeHNbOcfkeZ9NgD/OhzQmdylM0IwGM9DMrm2YS4EVsmm2b\n53qKIfIyysp1yAGcTnBwBbZ85osNBl2KRDIPhMs0bnmGB7IAvwlSb+xm6vWKECkO\nlwQDO5Kg8YZ8+Z3pn/oS688t/fPXvWLZYUqwR63oWfIaPJI7Ahv2jJmgw1ofL81r\n2CE3T/OydtUeGLzqWJAB8sbUgT3ug0cjtxsHuroQBSYBND3XDb/EQh5GeVVnGKKH\ngESLFAoweoNjDSXrlIu1gFjCDHF4CqBRmNYKrNQjLmhCrSfwkytXESJwlLzFKY8P\nK1yZyTpDC9YK0G7qgrk7EHmH9JAZTQ5V65pp0vR9KvqTU5ewkQDIljD2f3FIqo2B\nSKNCQE+N6NjWaTeNlU75m+yZocKObSPg0zS8FAuSJetNtzXA7ouqk34OoIMQj4gq\nUnh/i1FcZAd4U6Dtr9aRZ6PeLlm6MJ/h582L6fJLNEu136UWDtJj5eBYEzX13l+d\nSC4PEHx7ZZRwQKptl9NkinLZGJztg175paUu8C34sAv+SQnM20c0pdOXAq9GKKhi\nvt61kpkXoRGxjTlc6h+69aidSg==\n=ls8J\n-----END PGP PUBLIC KEY BLOCK-----\n" - }, - { - "name": "google-compute-engine", - "baseurl": "https://packages.cloud.google.com/yum/repos/google-compute-engine-el8-x86_64-stable", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBGA9EFkBCAC1ilzST0wns+uwZyEA5IVtYeyAuXTaQUEAd70SqIlQpDd4EyVi\nx3SCanQIu8dG9Zq3+x28WBb2OuXP9oc06ybOWdu2m7N5PY0BUT4COA36JV/YrxmN\ns+5/M+YnDHppv63jgRIOkzXzXNo6SwTsl2xG9fKB3TS0IMvBkWdw5PGrBM5GghRc\necgoSAAwRbWJXORHGKVwlV6tOxQZ/xqA08hPJneMfsMFPOXsitgGRHoXjlUWLVeJ\n70mmIYsC/pBglIwCzmdD8Ee39MrlSXbuXVQiz38iHfnvXYpLEmgNXKzI0DH9tKg8\n323kALzqaJlLFOLJm/uVJXRUEfKS3LhVZQMzABEBAAG0UVJhcHR1cmUgQXV0b21h\ndGljIFNpZ25pbmcgS2V5IChjbG91ZC1yYXB0dXJlLXNpZ25pbmcta2V5LTIwMjEt\nMDMtMDEtMDhfMDFfMDkucHViKYkBKAQTAQgAHAUCYD0QWQkQ/uqRaTB+oHECGwMF\nCQPDCrACGQEAAHtlCACxSWMp3yRcLmsHhxGDt59nhSNXhouWiNePSMe5vETQA/lh\nip9Zx/NPRCa4q5jpIDBlEYOg67YanztcjSWGSI35Xblq43H4uLSxh4PtKzZMo+Uj\n8n2VNHOZXBdGcsODcU3ynF64r7eTQevUe2aU0KN2o656O3HrE4itOVKYwnnkmNsk\nG45b9b7DJnsQ6WPszUc8lNhsa2gBI6vfLl68vjj7PlWw030BM/RoMEPpoOApohHo\nsfnNhxJmE1AxwBkMEzyo2kZhPZGh85LDnDbAvjSFKqYSPReKmRFjLlo3DPVHZ/de\nQn6noHbgUChLo21FefhlZO6tysrb283MWMIyY/YSuQENBGA9EFkBCADcdO/Aw1qu\ndZORZCNLz3vTiQSFcUFYyScfJJnwUsg8fy0kgg9olFY0GK5icT6n/shc1RlIpuqr\nOQYBZgtK3dSZfOAXE2N20HUvC+nrKKuXXX+jcM/X1kHxwX5tG6fB1fyNH0p/Qqsz\nEfYRHJu0Y4PonTYIslITnEzlN4hUN6/mx1+mWPl4P4R7/h6+p7Q2jtaClEtddF0e\neOf16Ma5S8fff80uZCLJoVu3lOXCT22oCf7qmH2XddmqGisUScqwmbmuv30tdQed\nn+8njKo2pfpVF1Oa67CWRXdKTknuZybxI9Ipcivy8CISL2Do0uzij7SR7keVf7G1\nQ3K3iJ0wn6mDABEBAAGJAR8EGAEIABMFAmA9EFkJEP7qkWkwfqBxAhsMAAA/3Af9\nFJ2hEp2144fzgtNWHOVFv27hsrO7wYFZwoic9lHSl4iEw8mJc/3kEXdg9Vf9m1zb\nG/kZ6slmzpfv7zDAdN3h3HT0B1yrb3xXzRX0zhOYAbQSUnc6DemhDZoDWt/wVceK\nfzvebB9VTDzRBUVzxCduvY6ij0p2APZpnTrznvCPoCHkfzBMC3Zyk1FueiPTPoP1\n9M0BProMy8qDVSkFr0uX3PM54hQN6mGRQg5HVVBxUNaMnn2yOQcxbQ/T/dKlojdp\nRmvpGyYjfrvyExE8owYn8L7ly2N76GcY6kiN1CmTnCgdrbU0SPacm7XbxTYlQHwJ\nCEa9Hf4/nuiBaxwXKuc/y5kBDQRfyX5eAQgA0z1F3ZDbtOe1/j90k1cQsyaVNjJ/\nrVGpinUnVWpmxnmBSDXKfxBsDRoXW9GtQWx7NUlmGW88IeHevqd5OAAc1TDvkaTL\nv2gcfROWjp+XPBsx42f1RGoXqiy4UlHEgswoUmXDeY89IUxoZgBmr4jLekTM0n2y\nIWT49ZA8wYhndEMHf6zj5ya+LWj67kd3nAY4R7YtfwTBnf5Y9Be80Jwo6ez66oKR\nDwU/I6PcF9sLzsl7MEiPxrH2xYmjiXw52Hp4GhIPLBfrt1jrNGdtHEq+pEu+ih6U\n32tyY2LHx7fDQ8PMOHtx/D8EMzYkT/bV3jAEikM93pjI/3pOh8Y4oWPahQARAQAB\ntLpnTGludXggUmFwdHVyZSBBdXRvbWF0aWMgU2lnbmluZyBLZXkgKC8vZGVwb3Qv\nZ29vZ2xlMy9wcm9kdWN0aW9uL2JvcmcvY2xvdWQtcmFwdHVyZS9rZXlzL2Nsb3Vk\nLXJhcHR1cmUtcHVia2V5cy9jbG91ZC1yYXB0dXJlLXNpZ25pbmcta2V5LTIwMjAt\nMTItMDMtMTZfMDhfMDUucHViKSA8Z2xpbnV4LXRlYW1AZ29vZ2xlLmNvbT6JASgE\nEwEIABwFAl/Jfl4JEItXxcKDb0vrAhsDBQkDwwqwAhkBAABBeggAmnpK6OmlCSXd\n5lba7SzjnsFfHrdY3qeXsJqTq3sP6Wo0VQXiG1dWsFZ9P/BHHpxXo5j+lhXHQlqL\ng1SEv0JkRUFfTemFzfD4sGpa0Vd20yhQR5MGtXBB+AGnwhqNHA7yW/DdyZzP0Zm9\nSkhiq+2V6ZpC7WFaq+h4M5frJ65R9F8LJea90sr6gYL0WE0CmaSqpgRHdbnYnlaC\n0hffPJCnjQ4xWvkNUo2Txlvl7pIBPJAVG0g8fGPKugrM4d1VWPuSVHqopkYCdgA2\nNv95RLQGTrZsHAZYWNHD1laoGteBO5ExkligulvejX8vSuy+GKafJ0zBK7rNfNWq\nsMDXzKp6Z7kBDQRfyX5eAQgAw0ofinQXjYyHJVVZ0SrdEE+efd8heFlWbf04Dbmh\nGebypJ6KFVSKvnCSH2P95VKqvE3uHRI6HbRcinuV7noKOqo87PE2BXQgB16V0aFK\nJU9eJvqpCfK4Uq6TdE8SI1iWyXZtzZa4E2puUSicN0ocqTVMcqJZx3pV8asigwpM\nQUg5kesXHX7d8HUJeSJCAMMXup8sJklLaZ3Ri0SXSa2iYmlhdiAYxTYN70xGI+Hq\nHoWXeF67xMi1azGymeZun9aOkFEbs0q1B/SU/4r2agpoT6aLApV119G24vStGf/r\nlcpOr++prNzudKyKtC9GHoTPBvvqphjuNtftKgi5HQ+f4wARAQABiQEfBBgBCAAT\nBQJfyX5eCRCLV8XCg29L6wIbDAAAGxoIAMO5YUlhJWaRldUiNm9itujwfd31SNbU\nGFd+1iBJQibGoxfv2Q3ySdnep3LkEpXh+VkXHHOIWXysMrAP3qaqwp8HO8irE6Ge\nLMPMbCRdVLUORDbZHQK1YgSR0uGNlWeQxFJq+RIIRrWRYfWumi6HjFTP562Qi7LQ\n1aDyhKS6JB7v4HmwsH0/5/VNXaJRSKL4OnigApecTsfq83AFae0eD+du4337nc93\nSjHS4T67LRtMOWG8nzz8FjDj6fpFBeOXmHUe5CipNPVayTZBBidCkEOopqkdU59J\nMruHL5H6pwlBdK65+wnQai0gr9UEYYK+kwoUH+8p1rD8+YBnVY4d7SM=\n=UVi6\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1\n\nmQENBFWKtqgBCADmKQWYQF9YoPxLEQZ5XA6DFVg9ZHG4HIuehsSJETMPQ+W9K5c5\nUs5assCZBjG/k5i62SmWb09eHtWsbbEgexURBWJ7IxA8kM3kpTo7bx+LqySDsSC3\n/8JRkiyibVV0dDNv/EzRQsGDxmk5Xl8SbQJ/C2ECSUT2ok225f079m2VJsUGHG+5\nRpyHHgoMaRNedYP8ksYBPSD6sA3Xqpsh/0cF4sm8QtmsxkBmCCIjBa0B0LybDtdX\nXIq5kPJsIrC2zvERIPm1ez/9FyGmZKEFnBGeFC45z5U//pHdB1z03dYKGrKdDpID\n17kNbC5wl24k/IeYyTY9IutMXvuNbVSXaVtRABEBAAG0Okdvb2dsZSBDbG91ZCBQ\nYWNrYWdlcyBSUE0gU2lnbmluZyBLZXkgPGdjLXRlYW1AZ29vZ2xlLmNvbT6JATgE\nEwECACIFAlWKtqgCGy8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPCcOUw+\nG6jV+QwH/0wRH+XovIwLGfkg6kYLEvNPvOIYNQWnrT6zZ+XcV47WkJ+i5SR+QpUI\nudMSWVf4nkv+XVHruxydafRIeocaXY0E8EuIHGBSB2KR3HxG6JbgUiWlCVRNt4Qd\n6udC6Ep7maKEIpO40M8UHRuKrp4iLGIhPm3ELGO6uc8rks8qOBMH4ozU+3PB9a0b\nGnPBEsZdOBI1phyftLyyuEvG8PeUYD+uzSx8jp9xbMg66gQRMP9XGzcCkD+b8w1o\n7v3J3juKKpgvx5Lqwvwv2ywqn/Wr5d5OBCHEw8KtU/tfxycz/oo6XUIshgEbS/+P\n6yKDuYhRp6qxrYXjmAszIT25cftb4d4=\n=/PbX\n-----END PGP PUBLIC KEY BLOCK-----", - "image_type_tags": ["test_type2"] - }, - { - "name": "google-cloud-sdk", - "baseurl": "https://packages.cloud.google.com/yum/repos/cloud-sdk-el8-x86_64", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQENBGA9EFkBCAC1ilzST0wns+uwZyEA5IVtYeyAuXTaQUEAd70SqIlQpDd4EyVi\nx3SCanQIu8dG9Zq3+x28WBb2OuXP9oc06ybOWdu2m7N5PY0BUT4COA36JV/YrxmN\ns+5/M+YnDHppv63jgRIOkzXzXNo6SwTsl2xG9fKB3TS0IMvBkWdw5PGrBM5GghRc\necgoSAAwRbWJXORHGKVwlV6tOxQZ/xqA08hPJneMfsMFPOXsitgGRHoXjlUWLVeJ\n70mmIYsC/pBglIwCzmdD8Ee39MrlSXbuXVQiz38iHfnvXYpLEmgNXKzI0DH9tKg8\n323kALzqaJlLFOLJm/uVJXRUEfKS3LhVZQMzABEBAAG0UVJhcHR1cmUgQXV0b21h\ndGljIFNpZ25pbmcgS2V5IChjbG91ZC1yYXB0dXJlLXNpZ25pbmcta2V5LTIwMjEt\nMDMtMDEtMDhfMDFfMDkucHViKYkBKAQTAQgAHAUCYD0QWQkQ/uqRaTB+oHECGwMF\nCQPDCrACGQEAAHtlCACxSWMp3yRcLmsHhxGDt59nhSNXhouWiNePSMe5vETQA/lh\nip9Zx/NPRCa4q5jpIDBlEYOg67YanztcjSWGSI35Xblq43H4uLSxh4PtKzZMo+Uj\n8n2VNHOZXBdGcsODcU3ynF64r7eTQevUe2aU0KN2o656O3HrE4itOVKYwnnkmNsk\nG45b9b7DJnsQ6WPszUc8lNhsa2gBI6vfLl68vjj7PlWw030BM/RoMEPpoOApohHo\nsfnNhxJmE1AxwBkMEzyo2kZhPZGh85LDnDbAvjSFKqYSPReKmRFjLlo3DPVHZ/de\nQn6noHbgUChLo21FefhlZO6tysrb283MWMIyY/YSuQENBGA9EFkBCADcdO/Aw1qu\ndZORZCNLz3vTiQSFcUFYyScfJJnwUsg8fy0kgg9olFY0GK5icT6n/shc1RlIpuqr\nOQYBZgtK3dSZfOAXE2N20HUvC+nrKKuXXX+jcM/X1kHxwX5tG6fB1fyNH0p/Qqsz\nEfYRHJu0Y4PonTYIslITnEzlN4hUN6/mx1+mWPl4P4R7/h6+p7Q2jtaClEtddF0e\neOf16Ma5S8fff80uZCLJoVu3lOXCT22oCf7qmH2XddmqGisUScqwmbmuv30tdQed\nn+8njKo2pfpVF1Oa67CWRXdKTknuZybxI9Ipcivy8CISL2Do0uzij7SR7keVf7G1\nQ3K3iJ0wn6mDABEBAAGJAR8EGAEIABMFAmA9EFkJEP7qkWkwfqBxAhsMAAA/3Af9\nFJ2hEp2144fzgtNWHOVFv27hsrO7wYFZwoic9lHSl4iEw8mJc/3kEXdg9Vf9m1zb\nG/kZ6slmzpfv7zDAdN3h3HT0B1yrb3xXzRX0zhOYAbQSUnc6DemhDZoDWt/wVceK\nfzvebB9VTDzRBUVzxCduvY6ij0p2APZpnTrznvCPoCHkfzBMC3Zyk1FueiPTPoP1\n9M0BProMy8qDVSkFr0uX3PM54hQN6mGRQg5HVVBxUNaMnn2yOQcxbQ/T/dKlojdp\nRmvpGyYjfrvyExE8owYn8L7ly2N76GcY6kiN1CmTnCgdrbU0SPacm7XbxTYlQHwJ\nCEa9Hf4/nuiBaxwXKuc/y5kBDQRfyX5eAQgA0z1F3ZDbtOe1/j90k1cQsyaVNjJ/\nrVGpinUnVWpmxnmBSDXKfxBsDRoXW9GtQWx7NUlmGW88IeHevqd5OAAc1TDvkaTL\nv2gcfROWjp+XPBsx42f1RGoXqiy4UlHEgswoUmXDeY89IUxoZgBmr4jLekTM0n2y\nIWT49ZA8wYhndEMHf6zj5ya+LWj67kd3nAY4R7YtfwTBnf5Y9Be80Jwo6ez66oKR\nDwU/I6PcF9sLzsl7MEiPxrH2xYmjiXw52Hp4GhIPLBfrt1jrNGdtHEq+pEu+ih6U\n32tyY2LHx7fDQ8PMOHtx/D8EMzYkT/bV3jAEikM93pjI/3pOh8Y4oWPahQARAQAB\ntLpnTGludXggUmFwdHVyZSBBdXRvbWF0aWMgU2lnbmluZyBLZXkgKC8vZGVwb3Qv\nZ29vZ2xlMy9wcm9kdWN0aW9uL2JvcmcvY2xvdWQtcmFwdHVyZS9rZXlzL2Nsb3Vk\nLXJhcHR1cmUtcHVia2V5cy9jbG91ZC1yYXB0dXJlLXNpZ25pbmcta2V5LTIwMjAt\nMTItMDMtMTZfMDhfMDUucHViKSA8Z2xpbnV4LXRlYW1AZ29vZ2xlLmNvbT6JASgE\nEwEIABwFAl/Jfl4JEItXxcKDb0vrAhsDBQkDwwqwAhkBAABBeggAmnpK6OmlCSXd\n5lba7SzjnsFfHrdY3qeXsJqTq3sP6Wo0VQXiG1dWsFZ9P/BHHpxXo5j+lhXHQlqL\ng1SEv0JkRUFfTemFzfD4sGpa0Vd20yhQR5MGtXBB+AGnwhqNHA7yW/DdyZzP0Zm9\nSkhiq+2V6ZpC7WFaq+h4M5frJ65R9F8LJea90sr6gYL0WE0CmaSqpgRHdbnYnlaC\n0hffPJCnjQ4xWvkNUo2Txlvl7pIBPJAVG0g8fGPKugrM4d1VWPuSVHqopkYCdgA2\nNv95RLQGTrZsHAZYWNHD1laoGteBO5ExkligulvejX8vSuy+GKafJ0zBK7rNfNWq\nsMDXzKp6Z7kBDQRfyX5eAQgAw0ofinQXjYyHJVVZ0SrdEE+efd8heFlWbf04Dbmh\nGebypJ6KFVSKvnCSH2P95VKqvE3uHRI6HbRcinuV7noKOqo87PE2BXQgB16V0aFK\nJU9eJvqpCfK4Uq6TdE8SI1iWyXZtzZa4E2puUSicN0ocqTVMcqJZx3pV8asigwpM\nQUg5kesXHX7d8HUJeSJCAMMXup8sJklLaZ3Ri0SXSa2iYmlhdiAYxTYN70xGI+Hq\nHoWXeF67xMi1azGymeZun9aOkFEbs0q1B/SU/4r2agpoT6aLApV119G24vStGf/r\nlcpOr++prNzudKyKtC9GHoTPBvvqphjuNtftKgi5HQ+f4wARAQABiQEfBBgBCAAT\nBQJfyX5eCRCLV8XCg29L6wIbDAAAGxoIAMO5YUlhJWaRldUiNm9itujwfd31SNbU\nGFd+1iBJQibGoxfv2Q3ySdnep3LkEpXh+VkXHHOIWXysMrAP3qaqwp8HO8irE6Ge\nLMPMbCRdVLUORDbZHQK1YgSR0uGNlWeQxFJq+RIIRrWRYfWumi6HjFTP562Qi7LQ\n1aDyhKS6JB7v4HmwsH0/5/VNXaJRSKL4OnigApecTsfq83AFae0eD+du4337nc93\nSjHS4T67LRtMOWG8nzz8FjDj6fpFBeOXmHUe5CipNPVayTZBBidCkEOopqkdU59J\nMruHL5H6pwlBdK65+wnQai0gr9UEYYK+kwoUH+8p1rD8+YBnVY4d7SM=\n=UVi6\n-----END PGP PUBLIC KEY BLOCK-----\n-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1\n\nmQENBFWKtqgBCADmKQWYQF9YoPxLEQZ5XA6DFVg9ZHG4HIuehsSJETMPQ+W9K5c5\nUs5assCZBjG/k5i62SmWb09eHtWsbbEgexURBWJ7IxA8kM3kpTo7bx+LqySDsSC3\n/8JRkiyibVV0dDNv/EzRQsGDxmk5Xl8SbQJ/C2ECSUT2ok225f079m2VJsUGHG+5\nRpyHHgoMaRNedYP8ksYBPSD6sA3Xqpsh/0cF4sm8QtmsxkBmCCIjBa0B0LybDtdX\nXIq5kPJsIrC2zvERIPm1ez/9FyGmZKEFnBGeFC45z5U//pHdB1z03dYKGrKdDpID\n17kNbC5wl24k/IeYyTY9IutMXvuNbVSXaVtRABEBAAG0Okdvb2dsZSBDbG91ZCBQ\nYWNrYWdlcyBSUE0gU2lnbmluZyBLZXkgPGdjLXRlYW1AZ29vZ2xlLmNvbT6JATgE\nEwECACIFAlWKtqgCGy8GCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEPCcOUw+\nG6jV+QwH/0wRH+XovIwLGfkg6kYLEvNPvOIYNQWnrT6zZ+XcV47WkJ+i5SR+QpUI\nudMSWVf4nkv+XVHruxydafRIeocaXY0E8EuIHGBSB2KR3HxG6JbgUiWlCVRNt4Qd\n6udC6Ep7maKEIpO40M8UHRuKrp4iLGIhPm3ELGO6uc8rks8qOBMH4ozU+3PB9a0b\nGnPBEsZdOBI1phyftLyyuEvG8PeUYD+uzSx8jp9xbMg66gQRMP9XGzcCkD+b8w1o\n7v3J3juKKpgvx5Lqwvwv2ywqn/Wr5d5OBCHEw8KtU/tfxycz/oo6XUIshgEbS/+P\n6yKDuYhRp6qxrYXjmAszIT25cftb4d4=\n=/PbX\n-----END PGP PUBLIC KEY BLOCK-----", - "image_type_tags": ["test_type2"] - } - ] -} diff --git a/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json b/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json deleted file mode 100644 index d67105aacd..0000000000 --- a/pkg/reporegistry/test/confpaths/priority2/repositories/test-distro.json +++ /dev/null @@ -1,56 +0,0 @@ -{ - "test_arch": [ - { - "name": "fedora-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-fedora-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-fedora-modular-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "fedora-modular-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-updates-released-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-modular-p2", - "baseurl": "https://rpmrepo.osbuild.org/v1/anon/f33/f33-x86_64-updates-released-modular-20201108/", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - } - ], - "test_arch2": [ - { - "name": "fedora-p2", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-33&arch=aarch64", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-p2", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=updates-released-f33&arch=aarch64", - "metadata_expire": "6h", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "fedora-modular-p2", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=fedora-modular-33&arch=aarch64", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - }, - { - "name": "updates-modular-p2", - "metalink": "https://mirrors.fedoraproject.org/metalink?repo=updates-released-modular-f33&arch=aarch64", - "metadata_expire": "6h", - "gpgkey": "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\nmQINBF4wBvsBEADQmcGbVUbDRUoXADReRmOOEMeydHghtKC9uRs9YNpGYZIB+bie\nbGYZmflQayfh/wEpO2W/IZfGpHPL42V7SbyvqMjwNls/fnXsCtf4LRofNK8Qd9fN\nkYargc9R7BEz/mwXKMiRQVx+DzkmqGWy2gq4iD0/mCyf5FdJCE40fOWoIGJXaOI1\nTz1vWqKwLS5T0dfmi9U4Tp/XsKOZGvN8oi5h0KmqFk7LEZr1MXarhi2Va86sgxsF\nQcZEKfu5tgD0r00vXzikoSjn3qA5JW5FW07F1pGP4bF5f9J3CZbQyOjTSWMmmfTm\n2d2BURWzaDiJN9twY2yjzkoOMuPdXXvovg7KxLcQerKT+FbKbq8DySJX2rnOA77k\nUG4c9BGf/L1uBkAT8dpHLk6Uf5BfmypxUkydSWT1xfTDnw1MqxO0MsLlAHOR3J7c\noW9kLcOLuCQn1hBEwfZv7VSWBkGXSmKfp0LLIxAFgRtv+Dh+rcMMRdJgKr1V3FU+\nrZ1+ZAfYiBpQJFPjv70vx+rGEgS801D3PJxBZUEy4Ic4ZYaKNhK9x9PRQuWcIBuW\n6eTe/6lKWZeyxCumLLdiS75mF2oTcBaWeoc3QxrPRV15eDKeYJMbhnUai/7lSrhs\nEWCkKR1RivgF4slYmtNE5ZPGZ/d61zjwn2xi4xNJVs8q9WRPMpHp0vCyMwARAQAB\ntDFGZWRvcmEgKDMzKSA8ZmVkb3JhLTMzLXByaW1hcnlAZmVkb3JhcHJvamVjdC5v\ncmc+iQI4BBMBAgAiBQJeMAb7AhsPBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAK\nCRBJ/XdJlXD/MZm2D/9kriL43vd3+0DNMeA82n2v9mSR2PQqKny39xNlYPyy/1yZ\nP/KXoa4NYSCA971LSd7lv4n/h5bEKgGHxZfttfOzOnWMVSSTfjRyM/df/NNzTUEV\n7ORA5GW18g8PEtS7uRxVBf3cLvWu5q+8jmqES5HqTAdGVcuIFQeBXFN8Gy1Jinuz\nAH8rJSdkUeZ0cehWbERq80BWM9dhad5dW+/+Gv0foFBvP15viwhWqajr8V0B8es+\n2/tHI0k86FAujV5i0rrXl5UOoLilO57QQNDZH/qW9GsHwVI+2yecLstpUNLq+EZC\nGqTZCYoxYRpl0gAMbDLztSL/8Bc0tJrCRG3tavJotFYlgUK60XnXlQzRkh9rgsfT\nEXbQifWdQMMogzjCJr0hzJ+V1d0iozdUxB2ZEgTjukOvatkB77DY1FPZRkSFIQs+\nfdcjazDIBLIxwJu5QwvTNW8lOLnJ46g4sf1WJoUdNTbR0BaC7HHj1inVWi0p7IuN\n66EPGzJOSjLK+vW+J0ncPDEgLCV74RF/0nR5fVTdrmiopPrzFuguHf9S9gYI3Zun\nYl8FJUu4kRO6JPPTicUXWX+8XZmE94aK14RCJL23nOSi8T1eW8JLW43dCBRO8QUE\nAso1t2pypm/1zZexJdOV8yGME3g5l2W6PLgpz58DBECgqc/kda+VWgEAp7rO2A==\n=EPL3\n-----END PGP PUBLIC KEY BLOCK-----\n", - "check_gpg": true - } - ] -} From 9ea83e46dc9e93e7b4c7e0f52746c9ef3cabf24a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 15:45:18 +0100 Subject: [PATCH 16/23] distro/rhel: use dot to separate minor version in distro name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's be consistent and use the dot in the distro name to separate major and minor version. Signed-off-by: Tomáš Hozza --- pkg/distro/rhel7/distro.go | 2 +- pkg/distro/rhel7/distro_test.go | 2 +- pkg/distro/rhel8/distro.go | 2 +- pkg/distro/rhel8/distro_test.go | 2 +- pkg/distro/rhel9/distro.go | 2 +- pkg/distro/rhel9/distro_test.go | 2 +- pkg/distrofactory/distrofactory_test.go | 14 ++--- test/config-map.json | 62 +++++++++---------- .../{rhel-79.json => rhel-7.9.json} | 0 .../{rhel-810.json => rhel-8.10.json} | 0 .../{rhel-84.json => rhel-8.4.json} | 0 .../{rhel-85.json => rhel-8.5.json} | 0 .../{rhel-86.json => rhel-8.6.json} | 0 .../{rhel-87.json => rhel-8.7.json} | 0 .../{rhel-88.json => rhel-8.8.json} | 0 .../{rhel-89.json => rhel-8.9.json} | 0 .../{rhel-90.json => rhel-9.0.json} | 0 .../{rhel-91.json => rhel-9.1.json} | 0 .../{rhel-92.json => rhel-9.2.json} | 0 .../{rhel-93.json => rhel-9.3.json} | 0 .../{rhel-94.json => rhel-9.4.json} | 0 21 files changed, 44 insertions(+), 44 deletions(-) rename test/data/repositories/{rhel-79.json => rhel-7.9.json} (100%) rename test/data/repositories/{rhel-810.json => rhel-8.10.json} (100%) rename test/data/repositories/{rhel-84.json => rhel-8.4.json} (100%) rename test/data/repositories/{rhel-85.json => rhel-8.5.json} (100%) rename test/data/repositories/{rhel-86.json => rhel-8.6.json} (100%) rename test/data/repositories/{rhel-87.json => rhel-8.7.json} (100%) rename test/data/repositories/{rhel-88.json => rhel-8.8.json} (100%) rename test/data/repositories/{rhel-89.json => rhel-8.9.json} (100%) rename test/data/repositories/{rhel-90.json => rhel-9.0.json} (100%) rename test/data/repositories/{rhel-91.json => rhel-9.1.json} (100%) rename test/data/repositories/{rhel-92.json => rhel-9.2.json} (100%) rename test/data/repositories/{rhel-93.json => rhel-9.3.json} (100%) rename test/data/repositories/{rhel-94.json => rhel-9.4.json} (100%) diff --git a/pkg/distro/rhel7/distro.go b/pkg/distro/rhel7/distro.go index 1614c310e8..7e10fa259a 100644 --- a/pkg/distro/rhel7/distro.go +++ b/pkg/distro/rhel7/distro.go @@ -183,7 +183,7 @@ func newDistro(name string, minor int) *distribution { switch name { case "rhel": rd = distribution{ - name: fmt.Sprintf("rhel-7%d", minor), + name: fmt.Sprintf("rhel-7.%d", minor), product: "Red Hat Enterprise Linux", osVersion: fmt.Sprintf("7.%d", minor), nick: "Maipo", diff --git a/pkg/distro/rhel7/distro_test.go b/pkg/distro/rhel7/distro_test.go index 35238679a0..351d32cecf 100644 --- a/pkg/distro/rhel7/distro_test.go +++ b/pkg/distro/rhel7/distro_test.go @@ -257,7 +257,7 @@ func TestRhel7_GetArch(t *testing.T) { func TestRhel7_Name(t *testing.T) { distro := rhelFamilyDistros[0].distro - assert.Equal(t, "rhel-79", distro.Name()) + assert.Equal(t, "rhel-7.9", distro.Name()) } func TestRhel7_ModulePlatformID(t *testing.T) { diff --git a/pkg/distro/rhel8/distro.go b/pkg/distro/rhel8/distro.go index 42a31abc23..c20d26aaef 100644 --- a/pkg/distro/rhel8/distro.go +++ b/pkg/distro/rhel8/distro.go @@ -128,7 +128,7 @@ func newDistro(name string, minor int) *distribution { switch name { case "rhel": rd = distribution{ - name: fmt.Sprintf("rhel-8%d", minor), + name: fmt.Sprintf("rhel-8.%d", minor), product: "Red Hat Enterprise Linux", osVersion: fmt.Sprintf("8.%d", minor), releaseVersion: "8", diff --git a/pkg/distro/rhel8/distro_test.go b/pkg/distro/rhel8/distro_test.go index 5baffe047e..440660de9c 100644 --- a/pkg/distro/rhel8/distro_test.go +++ b/pkg/distro/rhel8/distro_test.go @@ -638,7 +638,7 @@ func TestRHEL8_GetArch(t *testing.T) { func TestRhel8_Name(t *testing.T) { distro := rhelFamilyDistros[0].distro - assert.Equal(t, "rhel-810", distro.Name()) + assert.Equal(t, "rhel-8.10", distro.Name()) } func TestRhel8_ModulePlatformID(t *testing.T) { diff --git a/pkg/distro/rhel9/distro.go b/pkg/distro/rhel9/distro.go index 7859d6998e..58e91acba5 100644 --- a/pkg/distro/rhel9/distro.go +++ b/pkg/distro/rhel9/distro.go @@ -130,7 +130,7 @@ func newDistro(name string, minor int) *distribution { switch name { case "rhel": rd = distribution{ - name: fmt.Sprintf("rhel-9%d", minor), + name: fmt.Sprintf("rhel-9.%d", minor), product: "Red Hat Enterprise Linux", osVersion: fmt.Sprintf("9.%d", minor), releaseVersion: "9", diff --git a/pkg/distro/rhel9/distro_test.go b/pkg/distro/rhel9/distro_test.go index 152763d94d..7c1f9b4687 100644 --- a/pkg/distro/rhel9/distro_test.go +++ b/pkg/distro/rhel9/distro_test.go @@ -638,7 +638,7 @@ func TestRhel9_GetArch(t *testing.T) { func TestRhel9_Name(t *testing.T) { distro := rhelFamilyDistros[0].distro - assert.Equal(t, "rhel-94", distro.Name()) + assert.Equal(t, "rhel-9.4", distro.Name()) } func TestRhel9_ModulePlatformID(t *testing.T) { diff --git a/pkg/distrofactory/distrofactory_test.go b/pkg/distrofactory/distrofactory_test.go index a6e54f4e24..a23c8a6c8b 100644 --- a/pkg/distrofactory/distrofactory_test.go +++ b/pkg/distrofactory/distrofactory_test.go @@ -15,31 +15,31 @@ func TestGetDistroDefaultList(t *testing.T) { testCases := []testCase{ { strID: "rhel-7.9", - expectedDistroName: "rhel-79", + expectedDistroName: "rhel-7.9", }, { strID: "rhel-89", - expectedDistroName: "rhel-89", + expectedDistroName: "rhel-8.9", }, { strID: "rhel-8.9", - expectedDistroName: "rhel-89", + expectedDistroName: "rhel-8.9", }, { strID: "rhel-810", - expectedDistroName: "rhel-810", + expectedDistroName: "rhel-8.10", }, { strID: "rhel-8.10", - expectedDistroName: "rhel-810", + expectedDistroName: "rhel-8.10", }, { strID: "rhel-91", - expectedDistroName: "rhel-91", + expectedDistroName: "rhel-9.1", }, { strID: "rhel-9.1", - expectedDistroName: "rhel-91", + expectedDistroName: "rhel-9.1", }, { strID: "fedora-38", diff --git a/test/config-map.json b/test/config-map.json index 23529afa66..a104c88023 100644 --- a/test/config-map.json +++ b/test/config-map.json @@ -12,11 +12,11 @@ }, "./configs/all-with-oscap.json": { "distros": [ - "rhel-91", - "rhel-92", - "rhel-87", - "rhel-88", - "rhel-89", + "rhel-9.1", + "rhel-9.2", + "rhel-8.7", + "rhel-8.8", + "rhel-8.9", "centos*", "fedora*" ], @@ -26,10 +26,10 @@ }, "./configs/all-with-fips.json": { "distros": [ - "rhel-93", - "rhel-94", - "rhel-89", - "rhel-810", + "rhel-9.3", + "rhel-9.4", + "rhel-8.9", + "rhel-8.10", "centos*", "fedora*" ], @@ -39,7 +39,7 @@ }, "./configs/disable-lm_sensors.json": { "distros": [ - "rhel-84" + "rhel-8.4" ], "image-types": [ "ec2-sap" @@ -52,8 +52,8 @@ }, "./configs/edge-ostree-pull-device-fips.json": { "distros": [ - "rhel-93", - "rhel-94" + "rhel-9.3", + "rhel-9.4" ], "image-types": [ "edge-simplified-installer" @@ -68,8 +68,8 @@ }, "./configs/edge-ostree-pull-fips.json": { "distros": [ - "rhel-93", - "rhel-94" + "rhel-9.3", + "rhel-9.4" ], "image-types": [ "edge-installer", @@ -84,8 +84,8 @@ }, "./configs/edge-ostree-pull-user-fips.json": { "distros": [ - "rhel-93", - "rhel-94" + "rhel-9.3", + "rhel-9.4" ], "image-types": [ "edge-ami" @@ -188,18 +188,18 @@ "fedora-38", "fedora-39", "fedora-40", - "rhel-79", - "rhel-810", - "rhel-85", - "rhel-86", - "rhel-87", - "rhel-88", - "rhel-89", - "rhel-90", - "rhel-91", - "rhel-92", - "rhel-93", - "rhel-94" + "rhel-7.9", + "rhel-8.10", + "rhel-8.5", + "rhel-8.6", + "rhel-8.7", + "rhel-8.8", + "rhel-8.9", + "rhel-9.0", + "rhel-9.1", + "rhel-9.2", + "rhel-9.3", + "rhel-9.4" ], "image-types": [ "ec2-sap" @@ -213,9 +213,9 @@ "simplified-installer" ], "distros": [ - "rhel-92", - "rhel-93", - "rhel-94" + "rhel-9.2", + "rhel-9.3", + "rhel-9.4" ] } } diff --git a/test/data/repositories/rhel-79.json b/test/data/repositories/rhel-7.9.json similarity index 100% rename from test/data/repositories/rhel-79.json rename to test/data/repositories/rhel-7.9.json diff --git a/test/data/repositories/rhel-810.json b/test/data/repositories/rhel-8.10.json similarity index 100% rename from test/data/repositories/rhel-810.json rename to test/data/repositories/rhel-8.10.json diff --git a/test/data/repositories/rhel-84.json b/test/data/repositories/rhel-8.4.json similarity index 100% rename from test/data/repositories/rhel-84.json rename to test/data/repositories/rhel-8.4.json diff --git a/test/data/repositories/rhel-85.json b/test/data/repositories/rhel-8.5.json similarity index 100% rename from test/data/repositories/rhel-85.json rename to test/data/repositories/rhel-8.5.json diff --git a/test/data/repositories/rhel-86.json b/test/data/repositories/rhel-8.6.json similarity index 100% rename from test/data/repositories/rhel-86.json rename to test/data/repositories/rhel-8.6.json diff --git a/test/data/repositories/rhel-87.json b/test/data/repositories/rhel-8.7.json similarity index 100% rename from test/data/repositories/rhel-87.json rename to test/data/repositories/rhel-8.7.json diff --git a/test/data/repositories/rhel-88.json b/test/data/repositories/rhel-8.8.json similarity index 100% rename from test/data/repositories/rhel-88.json rename to test/data/repositories/rhel-8.8.json diff --git a/test/data/repositories/rhel-89.json b/test/data/repositories/rhel-8.9.json similarity index 100% rename from test/data/repositories/rhel-89.json rename to test/data/repositories/rhel-8.9.json diff --git a/test/data/repositories/rhel-90.json b/test/data/repositories/rhel-9.0.json similarity index 100% rename from test/data/repositories/rhel-90.json rename to test/data/repositories/rhel-9.0.json diff --git a/test/data/repositories/rhel-91.json b/test/data/repositories/rhel-9.1.json similarity index 100% rename from test/data/repositories/rhel-91.json rename to test/data/repositories/rhel-9.1.json diff --git a/test/data/repositories/rhel-92.json b/test/data/repositories/rhel-9.2.json similarity index 100% rename from test/data/repositories/rhel-92.json rename to test/data/repositories/rhel-9.2.json diff --git a/test/data/repositories/rhel-93.json b/test/data/repositories/rhel-9.3.json similarity index 100% rename from test/data/repositories/rhel-93.json rename to test/data/repositories/rhel-9.3.json diff --git a/test/data/repositories/rhel-94.json b/test/data/repositories/rhel-9.4.json similarity index 100% rename from test/data/repositories/rhel-94.json rename to test/data/repositories/rhel-9.4.json From 95f2141fb3926addd14e458059f276c9b986358a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Fri, 22 Dec 2023 11:52:53 +0100 Subject: [PATCH 17/23] pkg/rpmmd: support 'gpgkeys' array in JSON format of `RepoConfig` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is a follow-up to https://github.com/osbuild/images/commit/81cc5e2d287d3c4ae1d073c3c672ece72a0d5cca Signed-off-by: Tomáš Hozza --- pkg/rpmmd/repository.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pkg/rpmmd/repository.go b/pkg/rpmmd/repository.go index 13158b40bf..64591a2e53 100644 --- a/pkg/rpmmd/repository.go +++ b/pkg/rpmmd/repository.go @@ -18,6 +18,7 @@ type repository struct { Metalink string `json:"metalink,omitempty"` MirrorList string `json:"mirrorlist,omitempty"` GPGKey string `json:"gpgkey,omitempty"` + GPGKeys []string `json:"gpgkeys,omitempty"` CheckGPG bool `json:"check_gpg,omitempty"` IgnoreSSL bool `json:"ignore_ssl,omitempty"` RHSM bool `json:"rhsm,omitempty"` @@ -240,6 +241,9 @@ func LoadRepositoriesFromFile(filename string) (map[string][]RepoConfig, error) if repo.GPGKey != "" { keys = []string{repo.GPGKey} } + if len(repo.GPGKeys) > 0 { + keys = append(keys, repo.GPGKeys...) + } config := RepoConfig{ Name: repo.Name, BaseURLs: urls, From da287da91beb9138815d4119b74c8d053f8a6c65 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 17:12:48 +0100 Subject: [PATCH 18/23] cmd/gen-manifests: use reporegistry instead of a custom code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rework the gen-manifests to use reporegistry for loading repo configs, instead of own custom implementation. Signed-off-by: Tomáš Hozza --- cmd/gen-manifests/main.go | 57 +++++++++------------------------------ 1 file changed, 12 insertions(+), 45 deletions(-) diff --git a/cmd/gen-manifests/main.go b/cmd/gen-manifests/main.go index dc2756e019..bb76311ce5 100644 --- a/cmd/gen-manifests/main.go +++ b/cmd/gen-manifests/main.go @@ -25,6 +25,7 @@ import ( "github.com/osbuild/images/pkg/dnfjson" "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/ostree" + "github.com/osbuild/images/pkg/reporegistry" "github.com/osbuild/images/pkg/rhsm/facts" "github.com/osbuild/images/pkg/rpmmd" ) @@ -291,48 +292,6 @@ func makeManifestJob( return job } -type DistroArchRepoMap map[string]map[string][]rpmmd.RepoConfig - -func (d DistroArchRepoMap) ListDistros() []string { - distros := make([]string, 0, len(d)) - for distro := range d { - distros = append(distros, distro) - } - return distros -} - -func readRepos() DistroArchRepoMap { - reposDir := "./test/data/repositories/" - darm := make(DistroArchRepoMap) - filelist, err := os.ReadDir(reposDir) - if err != nil { - panic(err) - } - for _, file := range filelist { - filename := file.Name() - if !strings.HasSuffix(filename, ".json") { - continue - } - reposFilepath := filepath.Join(reposDir, filename) - fp, err := os.Open(reposFilepath) - if err != nil { - panic(err) - } - defer fp.Close() - data, err := io.ReadAll(fp) - if err != nil { - panic(err) - } - repos := make(map[string][]rpmmd.RepoConfig) - if err := json.Unmarshal(data, &repos); err != nil { - panic(err) - } - distro := strings.TrimSuffix(filename, filepath.Ext(filename)) - darm[distro] = repos - } - return darm -} - func resolveContainers(containers []container.SourceSpec, archName string) ([]container.Spec, error) { resolver := container.NewResolver(archName) @@ -567,7 +526,12 @@ func main() { if err != nil { panic(err) } - darm := readRepos() + + testedRepoRegistry, err := reporegistry.NewTestedDefault() + if err != nil { + panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err)) + } + distroFac := distrofactory.NewDefault() jobs := make([]manifestJob, 0) @@ -591,7 +555,7 @@ func main() { fmt.Println("Collecting jobs") - distros, invalidDistros := resolveArgValues(distros, darm.ListDistros()) + distros, invalidDistros := resolveArgValues(distros, testedRepoRegistry.ListDistros()) if len(invalidDistros) > 0 { fmt.Fprintf(os.Stderr, "WARNING: invalid distro names: [%s]\n", strings.Join(invalidDistros, ",")) } @@ -625,7 +589,10 @@ func main() { } // get repositories - repos := darm[distroName][archName] + repos, err := testedRepoRegistry.ReposByArchName(distroName, archName, true) + if err != nil { + panic(fmt.Sprintf("failed to get repositories for %s/%s: %v", distroName, archName, err)) + } repos = filterRepos(repos, imgTypeName) if len(repos) == 0 { fmt.Printf("no repositories defined for %s/%s/%s\n", distroName, archName, imgTypeName) From 587009147c0ea03c9acd16f350a177994bc1e61d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 20 Dec 2023 17:12:48 +0100 Subject: [PATCH 19/23] cmd/build: use reporegistry instead of a custom code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Rework the cmd/build to use reporegistry for loading repo configs, instead of own custom implementation. Signed-off-by: Tomáš Hozza --- cmd/build/main.go | 40 +++++++++++----------------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/cmd/build/main.go b/cmd/build/main.go index 28ca722b3f..67c039e501 100644 --- a/cmd/build/main.go +++ b/cmd/build/main.go @@ -5,7 +5,6 @@ import ( "encoding/json" "flag" "fmt" - "io" "os" "path/filepath" "strings" @@ -20,6 +19,7 @@ import ( "github.com/osbuild/images/pkg/manifest" "github.com/osbuild/images/pkg/osbuild" "github.com/osbuild/images/pkg/ostree" + "github.com/osbuild/images/pkg/reporegistry" "github.com/osbuild/images/pkg/rhsm/facts" "github.com/osbuild/images/pkg/rpmmd" ) @@ -112,32 +112,6 @@ func makeManifest(imgType distro.ImageType, config BuildConfig, distribution dis return mf, nil } -type DistroArchRepoMap map[string]map[string][]rpmmd.RepoConfig - -func readRepos() DistroArchRepoMap { - reposDir := "./test/data/repositories/" - darm := make(DistroArchRepoMap) - filelist, err := os.ReadDir(reposDir) - check(err) - for _, file := range filelist { - filename := file.Name() - if !strings.HasSuffix(filename, ".json") { - continue - } - reposFilepath := filepath.Join(reposDir, filename) - fp, err := os.Open(reposFilepath) - check(err) - defer fp.Close() - data, err := io.ReadAll(fp) - check(err) - repos := make(map[string][]rpmmd.RepoConfig) - check(json.Unmarshal(data, &repos)) - distro := strings.TrimSuffix(filename, filepath.Ext(filename)) - darm[distro] = repos - } - return darm -} - func resolveContainers(containers []container.SourceSpec, archName string) ([]container.Spec, error) { resolver := container.NewResolver(archName) @@ -249,7 +223,11 @@ func main() { rngSeed, err := cmdutil.NewRNGSeed() check(err) - darm := readRepos() + + testedRepoRegistry, err := reporegistry.NewTestedDefault() + if err != nil { + panic(fmt.Sprintf("failed to create repo registry with tested distros: %v", err)) + } distroFac := distrofactory.NewDefault() config := loadConfig(configFile) @@ -281,7 +259,11 @@ func main() { } // get repositories - repos := filterRepos(darm[distroName][archName], imgTypeName) + repos, err := testedRepoRegistry.ReposByArchName(distroName, archName, true) + if err != nil { + panic(fmt.Sprintf("failed to get repositories for %s/%s: %v", distroName, archName, err)) + } + repos = filterRepos(repos, imgTypeName) if len(repos) == 0 { fail(fmt.Sprintf("no repositories defined for %s/%s\n", distroName, archName)) } From 240d8c765eb90c8b29d1561e43ee513b2d47ea76 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Fri, 5 Jan 2024 18:43:11 +0100 Subject: [PATCH 20/23] distro/test_distro: remove New() in favor of DistroFactory() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The New() function can be replaced by DistroFactory() in all places. Let's delete it to be consistent with regular distros. Introduce and export `TestDistro1Name` for convenience, because all original callers of `New()` would have to construct the distro ID string on their own. Signed-off-by: Tomáš Hozza --- pkg/distro/test_distro/distro.go | 8 +++----- pkg/reporegistry/reporegistry_test.go | 10 +++++----- 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/pkg/distro/test_distro/distro.go b/pkg/distro/test_distro/distro.go index 5affa65812..9b319dc500 100644 --- a/pkg/distro/test_distro/distro.go +++ b/pkg/distro/test_distro/distro.go @@ -50,6 +50,9 @@ const ( // release version. TestDistroNameBase = "test-distro" + // An ID string for a Test Distro instance with release version 1. + TestDistro1Name = TestDistroNameBase + "-1" + TestArchName = "test_arch" TestArch2Name = "test_arch2" TestArch3Name = "test_arch3" @@ -386,8 +389,3 @@ func DistroFactory(idStr string) distro.Distro { return newTestDistro(fmt.Sprint(id.MajorVersion)) } - -// New returns new instance of TestDistro named "test-distro-1". -func New() *TestDistro { - return newTestDistro("1") -} diff --git a/pkg/reporegistry/reporegistry_test.go b/pkg/reporegistry/reporegistry_test.go index 127b564670..8e58bd3841 100644 --- a/pkg/reporegistry/reporegistry_test.go +++ b/pkg/reporegistry/reporegistry_test.go @@ -11,7 +11,7 @@ import ( ) func getTestingRepoRegistry() *RepoRegistry { - testDistro := test_distro.New() + testDistro := test_distro.DistroFactory(test_distro.TestDistro1Name) return &RepoRegistry{ map[string]map[string][]rpmmd.RepoConfig{ testDistro.Name(): { @@ -53,7 +53,7 @@ func getTestingRepoRegistry() *RepoRegistry { func TestReposByImageType_reposByImageTypeName(t *testing.T) { rr := getTestingRepoRegistry() - testDistro := test_distro.New() + testDistro := test_distro.DistroFactory(test_distro.TestDistro1Name) ta, _ := testDistro.GetArch(test_distro.TestArchName) ta2, _ := testDistro.GetArch(test_distro.TestArch2Name) @@ -136,7 +136,7 @@ func TestInvalidReposByImageType(t *testing.T) { // TestInvalidreposByImageTypeName tests return values from reposByImageTypeName // for invalid distro name, arch and image type func TestInvalidreposByImageTypeName(t *testing.T) { - testDistro := test_distro.New() + testDistro := test_distro.DistroFactory(test_distro.TestDistro1Name) rr := getTestingRepoRegistry() type args struct { @@ -230,7 +230,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { func TestReposByArch(t *testing.T) { rr := getTestingRepoRegistry() - testDistro := test_distro.New() + testDistro := test_distro.DistroFactory(test_distro.TestDistro1Name) ta, _ := testDistro.GetArch(test_distro.TestArchName) ta2, _ := testDistro.GetArch(test_distro.TestArch2Name) @@ -313,7 +313,7 @@ func TestInvalidReposByArch(t *testing.T) { // TestInvalidReposByArchName tests return values from ReposByArchName // for invalid distro name and arch func TestInvalidReposByArchName(t *testing.T) { - testDistro := test_distro.New() + testDistro := test_distro.DistroFactory(test_distro.TestDistro1Name) rr := getTestingRepoRegistry() type args struct { From 44c54a54ad498469b5052460b5b6f7b9abd2dc33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Tue, 9 Jan 2024 17:16:33 +0100 Subject: [PATCH 21/23] distrofactory: support specifying distro name aliases MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some users of the `distrofactory.Factory` have a need to support getting distro instances using distro ID string, which does not correspond to a valid distro. For example, osbuild-composer has the need to allow users to specify RHEL distro names without the minor version (e.g. `rhel-9`), while maintaining the mapping on their side. There are a few limitations: - An alias can't mask explicitly supported distro. - The target of an alias must map to a valid distro. Signed-off-by: Tomáš Hozza --- pkg/distro/distro_test.go | 3 +- pkg/distrofactory/distrofactory.go | 60 ++++++++++++++++++++++-- pkg/distrofactory/distrofactory_test.go | 62 +++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 5 deletions(-) diff --git a/pkg/distro/distro_test.go b/pkg/distro/distro_test.go index 06223d7973..772685d6e7 100644 --- a/pkg/distro/distro_test.go +++ b/pkg/distro/distro_test.go @@ -576,8 +576,7 @@ func TestDistro_ManifestFIPSWarning(t *testing.T) { "azure-eap7-rhui", } - distroFactory, err := distrofactory.NewDefault(nil) - require.NoError(t, err) + distroFactory := distrofactory.NewDefault() distros := distro_test_common.ListTestedDistros(t) for _, distroName := range distros { // FIPS blueprint customization is not supported for RHEL 7 images diff --git a/pkg/distrofactory/distrofactory.go b/pkg/distrofactory/distrofactory.go index e06b499390..223583b18e 100644 --- a/pkg/distrofactory/distrofactory.go +++ b/pkg/distrofactory/distrofactory.go @@ -2,6 +2,7 @@ package distrofactory import ( "fmt" + "sort" "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distro/fedora" @@ -19,12 +20,15 @@ type FactoryFunc func(idStr string) distro.Distro // Factory is a list of distro.Distro factories. type Factory struct { factories []FactoryFunc + + // distro ID string aliases + aliases map[string]string } -// GetDistro returns the distro.Distro that matches the given distro ID. If no +// getDistro returns the distro.Distro that matches the given distro ID. If no // distro.Distro matches the given distro ID, it returns nil. If multiple distro // factories match the given distro ID, it panics. -func (f *Factory) GetDistro(name string) distro.Distro { +func (f *Factory) getDistro(name string) distro.Distro { var match distro.Distro for _, f := range f.factories { if d := f(name); d != nil { @@ -38,6 +42,21 @@ func (f *Factory) GetDistro(name string) distro.Distro { return match } +// GetDistro returns the distro.Distro that matches the given distro ID. If no +// distro.Distro matches the given distro ID, it tries to translate the given +// distro ID using the aliases map and tries again. If no distro.Distro matches +// the given distro ID, it returns nil. If multiple distro factories match the +// given distro ID, it panics. +func (f *Factory) GetDistro(name string) distro.Distro { + match := f.getDistro(name) + + if alias, ok := f.aliases[name]; match == nil && ok { + match = f.getDistro(alias) + } + + return match +} + // FromHost returns a distro.Distro instance, that is specific to the host. // If the host distro is not supported, nil is returned. func (f *Factory) FromHost() distro.Distro { @@ -45,9 +64,44 @@ func (f *Factory) FromHost() distro.Distro { return f.GetDistro(hostDistroName) } +// RegisterAliases configures the factory with aliases for distro names. +// The provided aliases map has the following constraints: +// - An alias must not mask an existing distro. +// - An alias target must map to an existing distro. +func (f *Factory) RegisterAliases(aliases map[string]string) error { + var errors []string + for alias, target := range aliases { + var targetExists bool + for _, factory := range f.factories { + if factory(alias) != nil { + errors = append(errors, fmt.Sprintf("alias '%s' masks an existing distro", alias)) + } + if factory(target) != nil { + targetExists = true + } + } + if !targetExists { + errors = append(errors, fmt.Sprintf("alias '%s' targets a non-existing distro '%s'", alias, target)) + } + } + + // NB: iterating over a map of aliases is not deterministic, so sort the + // errors to make the output deterministic + sort.Strings(errors) + + if len(errors) > 0 { + return fmt.Errorf("invalid aliases: %q", errors) + } + + f.aliases = aliases + return nil +} + // New returns a Factory of distro.Distro factories for the given distros. func New(factories ...FactoryFunc) *Factory { - return &Factory{factories: factories} + return &Factory{ + factories: factories, + } } // NewDefault returns a Factory of distro.Distro factories for all supported diff --git a/pkg/distrofactory/distrofactory_test.go b/pkg/distrofactory/distrofactory_test.go index a23c8a6c8b..b81c93aec1 100644 --- a/pkg/distrofactory/distrofactory_test.go +++ b/pkg/distrofactory/distrofactory_test.go @@ -58,3 +58,65 @@ func TestGetDistroDefaultList(t *testing.T) { } } + +func TestGetDistroDefaultListWithAliases(t *testing.T) { + type testCase struct { + aliases map[string]string + strID string + expectedDistroName string + fail bool + errorMsg string + } + + testCases := []testCase{ + { + aliases: map[string]string{ + "rhel-9": "rhel-9.1", + }, + strID: "rhel-9", + expectedDistroName: "rhel-9.1", + }, + { + aliases: map[string]string{ + "best_distro-123": "rhel-9.1", + }, + strID: "best_distro-123", + expectedDistroName: "rhel-9.1", + }, + { + aliases: map[string]string{ + "rhel-9.3": "rhel-9.1", + "rhel-9.2": "rhel-9.1", + }, + fail: true, + errorMsg: `invalid aliases: ["alias 'rhel-9.2' masks an existing distro" "alias 'rhel-9.3' masks an existing distro"]`, + }, + { + aliases: map[string]string{ + "rhel-12": "rhel-12.12", + "rhel-13": "rhel-13.13", + }, + fail: true, + errorMsg: `invalid aliases: ["alias 'rhel-12' targets a non-existing distro 'rhel-12.12'" "alias 'rhel-13' targets a non-existing distro 'rhel-13.13'"]`, + }, + } + + df := NewDefault() + for _, tc := range testCases { + t.Run(tc.strID, func(t *testing.T) { + err := df.RegisterAliases(tc.aliases) + + if tc.fail { + assert.Error(t, err) + assert.Equal(t, tc.errorMsg, err.Error()) + return + } + + assert.NoError(t, err) + d := df.GetDistro(tc.strID) + assert.NotNil(t, d) + assert.Equal(t, tc.expectedDistroName, d.Name()) + }) + } + +} From 37b9dff1fc4e0d6e7fae6e07e48e3ca668a6fd15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Wed, 10 Jan 2024 16:45:45 +0100 Subject: [PATCH 22/23] reporegistry: export ReposByImageTypeName instead of ReposByImageType MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Let's export ReposByImageTypeName(), which accepts distro, arch and image type names as strings, instead of just `distro.ImageType`. This has the advantage, that the caller may actually use a distro name alias to get repositories, instead of the actual distro name that the image type is associated with. The ReposByImageType() is removed in favor of ReposByImageTypeName(). Signed-off-by: Tomáš Hozza --- pkg/reporegistry/reporegistry.go | 20 ++---------------- pkg/reporegistry/reporegistry_test.go | 30 +++------------------------ 2 files changed, 5 insertions(+), 45 deletions(-) diff --git a/pkg/reporegistry/reporegistry.go b/pkg/reporegistry/reporegistry.go index 43db679373..aab3594817 100644 --- a/pkg/reporegistry/reporegistry.go +++ b/pkg/reporegistry/reporegistry.go @@ -2,9 +2,7 @@ package reporegistry import ( "fmt" - "reflect" - "github.com/osbuild/images/pkg/distro" "github.com/osbuild/images/pkg/distroidparser" "github.com/osbuild/images/pkg/rpmmd" ) @@ -38,26 +36,12 @@ func NewFromDistrosRepoConfigs(distrosRepoConfigs rpmmd.DistrosRepoConfigs) *Rep return &RepoRegistry{distrosRepoConfigs} } -// ReposByImageType returns a slice of rpmmd.RepoConfig instances, which should be used for building the specific -// image type. All repositories for the associated distribution and architecture, without any ImageTypeTags set, -// are always part of the returned slice. In addition, if there are repositories tagged with the specific image -// type name, these are added to the returned slice as well. -func (r *RepoRegistry) ReposByImageType(imageType distro.ImageType) ([]rpmmd.RepoConfig, error) { - if imageType.Arch() == nil || reflect.ValueOf(imageType.Arch()).IsNil() { - return nil, fmt.Errorf("there is no architecture associated with the provided image type") - } - if imageType.Arch().Distro() == nil || reflect.ValueOf(imageType.Arch().Distro()).IsNil() { - return nil, fmt.Errorf("there is no distribution associated with the architecture associated with the provided image type") - } - return r.reposByImageTypeName(imageType.Arch().Distro().Name(), imageType.Arch().Name(), imageType.Name()) -} - -// reposByImageTypeName returns a slice of rpmmd.RepoConfig instances, which should be used for building the specific +// ReposByImageTypeName returns a slice of rpmmd.RepoConfig instances, which should be used for building the specific // image type name (of a given distribution and architecture). The method does not verify // if the given image type name is actually part of the architecture definition of the provided name. // Therefore in general, all common distro-arch-specific repositories are returned for any image type name, // even for non-existing ones. -func (r *RepoRegistry) reposByImageTypeName(distro, arch, imageType string) ([]rpmmd.RepoConfig, error) { +func (r *RepoRegistry) ReposByImageTypeName(distro, arch, imageType string) ([]rpmmd.RepoConfig, error) { repositories := []rpmmd.RepoConfig{} archRepos, err := r.ReposByArchName(distro, arch, true) diff --git a/pkg/reporegistry/reporegistry_test.go b/pkg/reporegistry/reporegistry_test.go index 8e58bd3841..7124f42cad 100644 --- a/pkg/reporegistry/reporegistry_test.go +++ b/pkg/reporegistry/reporegistry_test.go @@ -95,21 +95,9 @@ func TestReposByImageType_reposByImageTypeName(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := rr.ReposByImageType(tt.args.input) + got, err := rr.ReposByImageTypeName(tt.args.input.Arch().Distro().Name(), tt.args.input.Arch().Name(), tt.args.input.Name()) assert.Nil(t, err) - - var gotNames []string - for _, r := range got { - gotNames = append(gotNames, r.Name) - } - - if !reflect.DeepEqual(gotNames, tt.want) { - t.Errorf("ReposByImageType() =\n got: %#v\n want: %#v", gotNames, tt.want) - } - - got, err = rr.reposByImageTypeName(tt.args.input.Arch().Distro().Name(), tt.args.input.Arch().Name(), tt.args.input.Name()) - assert.Nil(t, err) - gotNames = []string{} + gotNames := []string{} for _, r := range got { gotNames = append(gotNames, r.Name) } @@ -121,18 +109,6 @@ func TestReposByImageType_reposByImageTypeName(t *testing.T) { } } -// TestInvalidReposByImageType tests return values from ReposByImageType -// for invalid values -func TestInvalidReposByImageType(t *testing.T) { - rr := getTestingRepoRegistry() - - ti := test_distro.TestImageType{} - - repos, err := rr.ReposByImageType(&ti) - assert.Nil(t, repos) - assert.NotNil(t, err) -} - // TestInvalidreposByImageTypeName tests return values from reposByImageTypeName // for invalid distro name, arch and image type func TestInvalidreposByImageTypeName(t *testing.T) { @@ -222,7 +198,7 @@ func TestInvalidreposByImageTypeName(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - got, err := rr.reposByImageTypeName(tt.args.distro, tt.args.arch, tt.args.imageType) + got, err := rr.ReposByImageTypeName(tt.args.distro, tt.args.arch, tt.args.imageType) assert.True(t, tt.want(got, err)) }) } From 49a7e6a4e2aed21b5cd1dff00affd5618d6b7e08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Hozza?= Date: Thu, 11 Jan 2024 15:49:31 +0100 Subject: [PATCH 23/23] LoadAllRepositories: don't fail on filenames which can't be parsed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, the `LoadAllRepositories()` function used repo file filename as the distro name, without inspecting it. Now that we parse it, the failure to parse the filename as the distro ID string was considered an error. This may cause osbuild-composer fail to start due to failure while loading repositories. Let's use the repo file filename as is as the distro name, if parsing it fails. Signed-off-by: Tomáš Hozza --- pkg/reporegistry/repository.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/reporegistry/repository.go b/pkg/reporegistry/repository.go index c7d3dbb858..a65e194681 100644 --- a/pkg/reporegistry/repository.go +++ b/pkg/reporegistry/repository.go @@ -40,7 +40,11 @@ func LoadAllRepositories(confPaths []string) (rpmmd.DistrosRepoConfigs, error) { // without a dot to separate major and minor release versions distro, err := distroidparser.DefaultParser.Standardize(distroIDStr) if err != nil { - return nil, fmt.Errorf("failed to parse distro ID string: %v", err) + log.Printf("failed to parse distro ID string, using it as is: %v", err) + // NB: Before the introduction of distro ID standardization, the filename + // was used as the distro ID. This is kept for backward compatibility + // if the filename can't be parsed. + distro = distroIDStr } // skip the distro repos definition, if it has been already read