diff --git a/cmd/osbuild-worker/jobimpl-depsolve.go b/cmd/osbuild-worker/jobimpl-depsolve.go new file mode 100644 index 000000000..74d58eb7e --- /dev/null +++ b/cmd/osbuild-worker/jobimpl-depsolve.go @@ -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 +} diff --git a/cmd/osbuild-worker/main.go b/cmd/osbuild-worker/main.go index f8451b942..c511896d3 100644 --- a/cmd/osbuild-worker/main.go +++ b/cmd/osbuild-worker/main.go @@ -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{} diff --git a/internal/worker/json.go b/internal/worker/json.go index 0d074220c..718a555a3 100644 --- a/internal/worker/json.go +++ b/internal/worker/json.go @@ -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 //