diff --git a/pkg/asset/registry/registriesconf.go b/pkg/asset/registry/registriesconf.go index 74c07d0c..f7322590 100644 --- a/pkg/asset/registry/registriesconf.go +++ b/pkg/asset/registry/registriesconf.go @@ -3,6 +3,7 @@ package registry import ( "context" "fmt" + "io/fs" "os" "path/filepath" "strings" @@ -11,10 +12,10 @@ import ( "github.com/openshift/appliance/pkg/asset/config" "github.com/openshift/appliance/pkg/consts" "github.com/openshift/installer/pkg/asset" + agentManifests "github.com/openshift/installer/pkg/asset/agent/manifests" "github.com/pelletier/go-toml" "github.com/pkg/errors" "github.com/sirupsen/logrus" - "gopkg.in/yaml.v2" ) const ( @@ -50,6 +51,8 @@ type ImageDigestMirror struct { type RegistriesConf struct { File *asset.File Config *sysregistriesv2.V2RegistriesConf + + fSys fs.FS } var _ asset.Asset = (*RegistriesConf)(nil) @@ -74,7 +77,11 @@ func (i *RegistriesConf) Generate(_ context.Context, dependencies asset.Parents) applianceConfig := &config.ApplianceConfig{} dependencies.Get(envConfig, applianceConfig) - releaseImagesLocation, releaseLocation := i.getEndpointLocations(envConfig.CacheDir) + if i.fSys == nil { + i.fSys = os.DirFS(envConfig.CacheDir) + } + + releaseImagesLocation, releaseLocation := i.getEndpointLocations() registries := &sysregistriesv2.V2RegistriesConf{ Registries: []sysregistriesv2.Registry{ { @@ -121,33 +128,36 @@ func (i *RegistriesConf) Generate(_ context.Context, dependencies asset.Parents) return nil } -func (i *RegistriesConf) getEndpointLocations(cacheDir string) (string, string) { +func (i *RegistriesConf) getEndpointLocations() (string, string) { releaseImagesLocation := "quay.io/openshift-release-dev/ocp-release" releaseLocation := "quay.io/openshift-release-dev/ocp-v4.0-art-dev" - idmsFile, err := os.ReadFile(filepath.Join(cacheDir, idmsFileName)) + idmsFile, err := fs.ReadFile(i.fSys, idmsFileName) if err != nil { logrus.Debugf("missing IDMS yaml (%v), fallback to defaults.", err) return releaseImagesLocation, releaseLocation } - var idms *ImageDigestMirrorSet - if err := yaml.UnmarshalStrict(idmsFile, &idms); err != nil { - logrus.Debugf("failed to unmarshal IDMS yaml (%v), fallback to defaults.", err) + + idmsManifests, err := agentManifests.GetMultipleYamls[ImageDigestMirrorSet](idmsFile) + if err != nil { + logrus.Debugf("could not decode YAML for %s (%v), fallback to defaults.", idmsFileName, err) return releaseImagesLocation, releaseLocation } - for _, digestMirrors := range idms.Spec.ImageDigestMirrors { - if len(digestMirrors.Mirrors) == 0 { - continue - } - location := digestMirrors.Mirrors[0] - if strings.HasSuffix(location, "release-images") { - releaseImagesLocation = digestMirrors.Source - } else if strings.HasSuffix(location, "release") { - releaseLocation = digestMirrors.Source + for _, idms := range idmsManifests { + for _, digestMirrors := range idms.Spec.ImageDigestMirrors { + if len(digestMirrors.Mirrors) == 0 { + continue + } + location := digestMirrors.Mirrors[0] + if strings.HasSuffix(location, "release-images") { + releaseImagesLocation = digestMirrors.Source + } else if strings.HasSuffix(location, "release") { + releaseLocation = digestMirrors.Source + } } } - + logrus.Debugf("endpoints locations: %s, %s", releaseImagesLocation, releaseLocation) return releaseImagesLocation, releaseLocation } diff --git a/pkg/asset/registry/registriesconf_test.go b/pkg/asset/registry/registriesconf_test.go new file mode 100644 index 00000000..4a7f689e --- /dev/null +++ b/pkg/asset/registry/registriesconf_test.go @@ -0,0 +1,110 @@ +package registry + +import ( + "context" + "testing" + "testing/fstest" + + . "github.com/onsi/ginkgo/v2/dsl/core" + . "github.com/onsi/gomega" + "github.com/openshift/appliance/pkg/asset/config" + "github.com/openshift/installer/pkg/asset" +) + +var _ = Describe("Test RegistriesConf", func() { + var ( + fakeFileSystem fstest.MapFS + deps asset.Parents + r RegistriesConf + ) + + BeforeEach(func() { + fakeFileSystem = fstest.MapFS{} + deps = asset.Parents{} + + deps.Add(&config.EnvConfig{}, &config.ApplianceConfig{}) + r = RegistriesConf{ + fSys: fakeFileSystem, + } + }) + + It("Single Yaml", func() { + fakeFileSystem[idmsFileName] = createSingleYamlIDMSMirrorFile() + + err := r.Generate(context.Background(), deps) + Expect(err).NotTo(HaveOccurred()) + Expect(string(r.File.Data)).To(Equal("unqualified-search-registries = []\n\n[[registry]]\n location = \"registry.ci.openshift.org/ocp/release\"\n prefix = \"\"\n\n [[registry.mirror]]\n location = \"registry.appliance.openshift.com:5000/openshift/release-images\"\n\n [[registry.mirror]]\n location = \"registry.appliance.openshift.com:5001/openshift/release-images\"\n\n[[registry]]\n location = \"quay.io/openshift-release-dev/ocp-v4.0-art-dev\"\n prefix = \"\"\n\n [[registry.mirror]]\n location = \"registry.appliance.openshift.com:5000/openshift/release\"\n\n [[registry.mirror]]\n location = \"registry.appliance.openshift.com:5001/openshift/release\"\n")) + }) + + It("Multiple Yaml", func() { + fakeFileSystem[idmsFileName] = createMultipleYamlIDMSMirrorFile() + + err := r.Generate(context.Background(), deps) + Expect(err).NotTo(HaveOccurred()) + Expect(string(r.File.Data)).Should(ContainSubstring("registry.ci.openshift.org")) + }) + +}) + +func TestRegistriesConf(t *testing.T) { + RegisterFailHandler(Fail) + RunSpecs(t, "registriesconf_test") +} + +func createSingleYamlIDMSMirrorFile() *fstest.MapFile { + return &fstest.MapFile{ + Data: []byte( + `apiVersion: config.openshift.io/v1 +kind: ImageDigestMirrorSet +metadata: + name: idms-release-0 +spec: + imageDigestMirrors: + - mirrors: + - registry.appliance.openshift.com:5000/openshift/release-images + source: registry.ci.openshift.org/ocp/release + - mirrors: + - registry.appliance.openshift.com:5000/openshift/release + source: quay.io/openshift-release-dev/ocp-v4.0-art-dev +status: {}`)} +} + +func createMultipleYamlIDMSMirrorFile() *fstest.MapFile { + return &fstest.MapFile{ + Data: []byte( + `kind: ImageDigestMirrorSet +metadata: + name: idms-operator-0 +spec: + imageDigestMirrors: + - mirrors: + - registry.appliance.openshift.com:5000/container-native-virtualization + source: registry.redhat.io/container-native-virtualization + - mirrors: + - registry.appliance.openshift.com:5000/openshift4 + source: registry.redhat.io/openshift4 + - mirrors: + - registry.appliance.openshift.com:5000/workload-availability + source: registry.redhat.io/workload-availability + - mirrors: + - registry.appliance.openshift.com:5000/migration-toolkit-virtualization + source: registry.redhat.io/migration-toolkit-virtualization + - mirrors: + - registry.appliance.openshift.com:5000/kube-descheduler-operator + source: registry.redhat.io/kube-descheduler-operator +status: {} +--- +apiVersion: config.openshift.io/v1 +kind: ImageDigestMirrorSet +metadata: + name: idms-release-0 +spec: + imageDigestMirrors: + - mirrors: + - registry.appliance.openshift.com:5000/openshift/release-images + source: registry.ci.openshift.org/ocp/release + - mirrors: + - registry.appliance.openshift.com:5000/openshift/release + source: quay.io/openshift-release-dev/ocp-v4.0-art-dev +status: {}`)} +}