Skip to content

Commit

Permalink
manifestgen: add support for repos override
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
mvo5 authored and supakeen committed Jan 29, 2025
1 parent 6232f6b commit 1abe971
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 9 deletions.
21 changes: 16 additions & 5 deletions pkg/manifestgen/manifestgen.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -70,7 +74,8 @@ type Generator struct {

rpmDownloader osbuild.RpmDownloader

customSeed *int64
customSeed *int64
overrideRepos []rpmmd.RepoConfig
}

// New will create a new manifest generator
Expand All @@ -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
Expand All @@ -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
Expand Down
51 changes: 47 additions & 4 deletions pkg/manifestgen/manifestgen_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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")
}
})
}
}

0 comments on commit 1abe971

Please sign in to comment.