debian-forge-composer/cmd/osbuild-worker/jobimpl-depsolve.go
Tom Gundersen 0f90aa9c78 worker: Add a depsolve job type
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>
2021-10-11 13:16:51 +02:00

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
}