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:
parent
44f27108b9
commit
d75bb4fa0a
2 changed files with 24 additions and 25 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue