From 1abe97125c9fd521576b003d7357e3859328ec55 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 21 Jan 2025 18:16:14 +0100 Subject: [PATCH] manifestgen: add support for repos override This commit adds support to override the manifest generator with user-specified repositories. This is useful for e.g. the `cmd/build` command that has the ability to override the repostiory information via an arbitrary file. --- pkg/manifestgen/manifestgen.go | 21 +++++++++--- pkg/manifestgen/manifestgen_test.go | 51 ++++++++++++++++++++++++++--- 2 files changed, 63 insertions(+), 9 deletions(-) diff --git a/pkg/manifestgen/manifestgen.go b/pkg/manifestgen/manifestgen.go index 865eb73230..e9ffe90815 100644 --- a/pkg/manifestgen/manifestgen.go +++ b/pkg/manifestgen/manifestgen.go @@ -48,6 +48,10 @@ type Options struct { // useful for testing CustomSeed *int64 + // OverrideRepos overrides the default repository selection. + // This is mostly useful for testing + OverrideRepos []rpmmd.RepoConfig + // Custom "solver" functions, if unset the defaults will be // used. Only needed for specialized use-cases. Depsolver DepsolveFunc @@ -70,7 +74,8 @@ type Generator struct { rpmDownloader osbuild.RpmDownloader - customSeed *int64 + customSeed *int64 + overrideRepos []rpmmd.RepoConfig } // New will create a new manifest generator @@ -89,6 +94,7 @@ func New(reporegistry *reporegistry.RepoRegistry, opts *Options) (*Generator, er rpmDownloader: opts.RpmDownloader, sbomWriter: opts.SBOMWriter, customSeed: opts.CustomSeed, + overrideRepos: opts.OverrideRepos, } if mg.out == nil { mg.out = os.Stdout @@ -108,14 +114,19 @@ func New(reporegistry *reporegistry.RepoRegistry, opts *Options) (*Generator, er // Generate will generate a new manifest for the given distro/imageType/arch // combination. -func (mg *Generator) Generate(bp *blueprint.Blueprint, dist distro.Distro, imgType distro.ImageType, a distro.Arch, imgOpts *distro.ImageOptions) error { +func (mg *Generator) Generate(bp *blueprint.Blueprint, dist distro.Distro, imgType distro.ImageType, a distro.Arch, imgOpts *distro.ImageOptions) (err error) { if imgOpts == nil { imgOpts = &distro.ImageOptions{} } - repos, err := mg.reporegistry.ReposByImageTypeName(dist.Name(), a.Name(), imgType.Name()) - if err != nil { - return err + var repos []rpmmd.RepoConfig + if mg.overrideRepos != nil { + repos = mg.overrideRepos + } else { + repos, err = mg.reporegistry.ReposByImageTypeName(dist.Name(), a.Name(), imgType.Name()) + if err != nil { + return err + } } // To support "user" a.k.a. "3rd party" repositories, these // will have to be added to the repos with diff --git a/pkg/manifestgen/manifestgen_test.go b/pkg/manifestgen/manifestgen_test.go index b98e70bc58..408671e2b5 100644 --- a/pkg/manifestgen/manifestgen_test.go +++ b/pkg/manifestgen/manifestgen_test.go @@ -144,10 +144,11 @@ func fakeDepsolve(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d for _, pkgSet := range pkgSets { for _, pkgName := range pkgSet.Include { resolvedSet.Packages = append(resolvedSet.Packages, rpmmd.PackageSpec{ - Name: pkgName, - Checksum: sha256For(pkgName), - Path: fmt.Sprintf("path/%s.rpm", pkgName), - RepoID: repoId, + Name: pkgName, + Checksum: sha256For(pkgName), + Path: fmt.Sprintf("path/%s.rpm", pkgName), + RepoID: repoId, + RemoteLocation: fmt.Sprintf("%s/%s.rpm", pkgSet.Repositories[0].BaseURLs[0], pkgName), }) resolvedSet.Repos = append(resolvedSet.Repos, rpmmd.RepoConfig{ Id: repoId, @@ -330,3 +331,45 @@ func TestManifestGeneratorSeed(t *testing.T) { } } } + +func TestManifestGeneratorOverrideRepos(t *testing.T) { + repos, err := testrepos.New() + assert.NoError(t, err) + fac := distrofactory.NewDefault() + + filter, err := imagefilter.New(fac, repos) + assert.NoError(t, err) + res, err := filter.Filter("distro:centos-9", "type:qcow2", "arch:x86_64") + assert.NoError(t, err) + assert.Equal(t, 1, len(res)) + + for _, withOverrideRepos := range []bool{false, true} { + t.Run(fmt.Sprintf("withOverrideRepos: %v", withOverrideRepos), func(t *testing.T) { + var osbuildManifest bytes.Buffer + opts := &manifestgen.Options{ + Output: &osbuildManifest, + Depsolver: fakeDepsolve, + } + if withOverrideRepos { + opts.OverrideRepos = []rpmmd.RepoConfig{ + { + Name: "overriden_repo", + BaseURLs: []string{"http://example.com/overriden-repo"}, + }, + } + } + + mg, err := manifestgen.New(repos, opts) + assert.NoError(t, err) + + var bp blueprint.Blueprint + err = mg.Generate(&bp, res[0].Distro, res[0].ImgType, res[0].Arch, nil) + assert.NoError(t, err) + if withOverrideRepos { + assert.Contains(t, osbuildManifest.String(), "http://example.com/overriden-repo/kernel.rpm") + } else { + assert.NotContains(t, osbuildManifest.String(), "http://example.com/overriden-repo/kernel.rpm") + } + }) + } +}