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>
This commit is contained in:
parent
e2f6dd7965
commit
0f90aa9c78
3 changed files with 64 additions and 0 deletions
45
cmd/osbuild-worker/jobimpl-depsolve.go
Normal file
45
cmd/osbuild-worker/jobimpl-depsolve.go
Normal file
|
|
@ -0,0 +1,45 @@
|
|||
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
|
||||
}
|
||||
|
|
@ -18,6 +18,7 @@ import (
|
|||
"github.com/sirupsen/logrus"
|
||||
|
||||
"github.com/osbuild/osbuild-composer/internal/common"
|
||||
"github.com/osbuild/osbuild-composer/internal/rpmmd"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/azure"
|
||||
"github.com/osbuild/osbuild-composer/internal/upload/koji"
|
||||
"github.com/osbuild/osbuild-composer/internal/worker"
|
||||
|
|
@ -136,6 +137,7 @@ func main() {
|
|||
logrus.Fatal("CACHE_DIRECTORY is not set. Is the service file missing CacheDirectory=?")
|
||||
}
|
||||
store := path.Join(cacheDirectory, "osbuild-store")
|
||||
rpmmd_cache := path.Join(cacheDirectory, "rpmmd")
|
||||
output := path.Join(cacheDirectory, "output")
|
||||
_ = os.Mkdir(output, os.ModeDir)
|
||||
|
||||
|
|
@ -242,6 +244,9 @@ func main() {
|
|||
"koji-finalize": &KojiFinalizeJobImpl{
|
||||
KojiServers: kojiServers,
|
||||
},
|
||||
"depsolve": &DepsolveJobImpl{
|
||||
RPMMD: rpmmd.NewRPMMD(rpmmd_cache, "/usr/libexec/osbuild-composer/dnf-json"),
|
||||
},
|
||||
}
|
||||
|
||||
acceptedJobTypes := []string{}
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package worker
|
|||
import (
|
||||
"github.com/osbuild/osbuild-composer/internal/distro"
|
||||
osbuild "github.com/osbuild/osbuild-composer/internal/osbuild1"
|
||||
"github.com/osbuild/osbuild-composer/internal/rpmmd"
|
||||
"github.com/osbuild/osbuild-composer/internal/target"
|
||||
)
|
||||
|
||||
|
|
@ -72,6 +73,19 @@ type KojiFinalizeJobResult struct {
|
|||
KojiError string `json:"koji_error"`
|
||||
}
|
||||
|
||||
type DepsolveJob struct {
|
||||
PackageSets map[string]rpmmd.PackageSet `json:"package_sets"`
|
||||
Repos []rpmmd.RepoConfig `json:"repos"`
|
||||
ModulePlatformID string `json:"module_platform_id"`
|
||||
Arch string `json:"arch"`
|
||||
Releasever string `json:"releasever"`
|
||||
}
|
||||
|
||||
type DepsolveJobResult struct {
|
||||
PackageSpecs map[string][]rpmmd.PackageSpec `json:"package_specs"`
|
||||
Error string `json:"error"`
|
||||
}
|
||||
|
||||
//
|
||||
// JSON-serializable types for the client
|
||||
//
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue