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

View file

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