manifestgen: make depsolve return the full dnfjson.DepsolveResult

This commit changes the signature of depsolve in `manifestgen`
to return the full `dnfjson.DepsolveResult`. This gives us
access to the sbom and also is a preparation for images PR#1142
where we will need this anyway.
This commit is contained in:
Michael Vogt 2025-01-16 13:37:56 +01:00 committed by Simon de Vlieger
parent 44f27108b9
commit d75bb4fa0a
2 changed files with 24 additions and 25 deletions

View file

@ -10,6 +10,7 @@ import (
"github.com/osbuild/images/pkg/container"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/dnfjson"
"github.com/osbuild/images/pkg/manifest"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/ostree"
"github.com/osbuild/images/pkg/reporegistry"
@ -21,30 +22,26 @@ import (
// cmd/build/main.go:depsolve (and probably more places) should go
// into a common helper in "images" or images should do this on its
// own
func defaultDepsolver(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string][]rpmmd.PackageSpec, map[string][]rpmmd.RepoConfig, error) {
func defaultDepsolver(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string]dnfjson.DepsolveResult, error) {
if cacheDir == "" {
var err error
cacheDir, err = os.MkdirTemp("", "manifestgen")
if err != nil {
return nil, nil, fmt.Errorf("cannot create temporary directory: %w", err)
return nil, fmt.Errorf("cannot create temporary directory: %w", err)
}
defer os.RemoveAll(cacheDir)
}
solver := dnfjson.NewSolver(d.ModulePlatformID(), d.Releasever(), arch, d.Name(), cacheDir)
depsolvedSets := make(map[string][]rpmmd.PackageSpec)
repoSets := make(map[string][]rpmmd.RepoConfig)
depsolvedSets := make(map[string]dnfjson.DepsolveResult)
for name, pkgSet := range packageSets {
res, err := solver.Depsolve(pkgSet, sbom.StandardTypeNone)
if err != nil {
return nil, nil, fmt.Errorf("error depsolving: %w", err)
return nil, fmt.Errorf("error depsolving: %w", err)
}
depsolvedSets[name] = res.Packages
repoSets[name] = res.Repos
// the depsolve result also contains SBOM information,
// it is currently not used here though
depsolvedSets[name] = *res
}
return depsolvedSets, repoSets, nil
return depsolvedSets, nil
}
func resolveContainers(containers []container.SourceSpec, archName string) ([]container.Spec, error) {
@ -86,7 +83,7 @@ func defaultCommitResolver(commitSources map[string][]ostree.SourceSpec) (map[st
}
type (
DepsolveFunc func(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string][]rpmmd.PackageSpec, map[string][]rpmmd.RepoConfig, error)
DepsolveFunc func(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string]dnfjson.DepsolveResult, error)
ContainerResolverFunc func(containerSources map[string][]container.SourceSpec, archName string) (map[string][]container.Spec, error)
@ -171,7 +168,7 @@ func (mg *Generator) Generate(bp *blueprint.Blueprint, dist distro.Distro, imgTy
// what are these warnings?
return fmt.Errorf("warnings during manifest creation: %v", strings.Join(warnings, "\n"))
}
packageSpecs, repoConfig, err := mg.depsolver(mg.cacheDir, preManifest.GetPackageSetChains(), dist, a.Name())
depsolved, err := mg.depsolver(mg.cacheDir, preManifest.GetPackageSetChains(), dist, a.Name())
if err != nil {
return err
}
@ -183,7 +180,11 @@ func (mg *Generator) Generate(bp *blueprint.Blueprint, dist distro.Distro, imgTy
if err != nil {
return err
}
mf, err := preManifest.Serialize(packageSpecs, containerSpecs, commitSpecs, repoConfig, mg.rpmDownloader)
opts := &manifest.SerializeOptions{
RpmDownloader: mg.rpmDownloader,
}
mf, err := preManifest.Serialize(depsolved, containerSpecs, commitSpecs, opts)
if err != nil {
return err
}

View file

@ -15,6 +15,7 @@ import (
"github.com/osbuild/images/pkg/container"
"github.com/osbuild/images/pkg/distro"
"github.com/osbuild/images/pkg/distrofactory"
"github.com/osbuild/images/pkg/dnfjson"
"github.com/osbuild/images/pkg/imagefilter"
"github.com/osbuild/images/pkg/osbuild"
"github.com/osbuild/images/pkg/ostree"
@ -133,31 +134,28 @@ func TestManifestGeneratorWithOstreeCommit(t *testing.T) {
assert.Contains(t, osbuildManifest.String(), expectedSha256)
}
func fakeDepsolve(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string][]rpmmd.PackageSpec, map[string][]rpmmd.RepoConfig, error) {
depsolvedSets := make(map[string][]rpmmd.PackageSpec)
repoSets := make(map[string][]rpmmd.RepoConfig)
func fakeDepsolve(cacheDir string, packageSets map[string][]rpmmd.PackageSet, d distro.Distro, arch string) (map[string]dnfjson.DepsolveResult, error) {
depsolvedSets := make(map[string]dnfjson.DepsolveResult)
for name, pkgSets := range packageSets {
repoId := fmt.Sprintf("repo_id_%s", name)
var resolvedSet []rpmmd.PackageSpec
var resolvedSet dnfjson.DepsolveResult
for _, pkgSet := range pkgSets {
for _, pkgName := range pkgSet.Include {
resolvedSet = append(resolvedSet, rpmmd.PackageSpec{
resolvedSet.Packages = append(resolvedSet.Packages, rpmmd.PackageSpec{
Name: pkgName,
Checksum: sha256For(pkgName),
Path: fmt.Sprintf("path/%s.rpm", pkgName),
RepoID: repoId,
})
resolvedSet.Repos = append(resolvedSet.Repos, rpmmd.RepoConfig{
Id: repoId,
Metalink: "https://example.com/metalink",
})
}
}
depsolvedSets[name] = resolvedSet
repoSets[name] = []rpmmd.RepoConfig{
{
Id: repoId,
Metalink: "http://example.com/metalink",
},
}
}
return depsolvedSets, repoSets, nil
return depsolvedSets, nil
}
func fakeCommitResolver(commitSources map[string][]ostree.SourceSpec) (map[string][]ostree.CommitSpec, error) {