Allow depsolving to be done in a worker through the job queue rather than synchronously in composer. The benefit this might unlock include: - no more blocking calls in the cloud/koji APIs - only workers accessing repositoires - no VPN access from composer - composer not needing to be subscribed to CDN, etc - no dnf cache managment in composer Potential problems: - the version of composer (so the distro definitions) that triggered a depsolve, may not be the same that uses the result to generate a manfiset Signed-off-by: Tom Gundersen <teg@jklm.no> Signed-off-by: Ondřej Budai <ondrej@budai.cz>
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/osbuild/osbuild-composer/internal/rpmmd"
|
|
"github.com/osbuild/osbuild-composer/internal/worker"
|
|
)
|
|
|
|
type DepsolveJobImpl struct {
|
|
RPMMD rpmmd.RPMMD
|
|
}
|
|
|
|
func (impl *DepsolveJobImpl) depsolve(packageSets map[string]rpmmd.PackageSet, repos []rpmmd.RepoConfig, modulePlatformID, arch, releasever string) (map[string][]rpmmd.PackageSpec, error) {
|
|
packageSpecs := make(map[string][]rpmmd.PackageSpec)
|
|
for name, packageSet := range packageSets {
|
|
packageSpec, _, err := impl.RPMMD.Depsolve(packageSet, repos, modulePlatformID, arch, releasever)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
packageSpecs[name] = packageSpec
|
|
}
|
|
return packageSpecs, nil
|
|
}
|
|
|
|
func (impl *DepsolveJobImpl) Run(job worker.Job) error {
|
|
var args worker.DepsolveJob
|
|
err := job.Args(&args)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var result worker.DepsolveJobResult
|
|
result.PackageSpecs, err = impl.depsolve(args.PackageSets, args.Repos, args.ModulePlatformID, args.Arch, args.Releasever)
|
|
if err != nil {
|
|
result.Error = err.Error()
|
|
}
|
|
|
|
err = job.Update(&result)
|
|
if err != nil {
|
|
return fmt.Errorf("Error reporting job result: %v", err)
|
|
}
|
|
|
|
return nil
|
|
}
|