rcm: pass packages when pushing a compose

In the post-dnf-stage world, `Distro.Manifest` expects the full list of
depsolved packages.  This is similar to what weldr does, but much
simpler, because the rcm API only cares about base packages.
This commit is contained in:
Lars Karlitski 2020-03-16 23:47:45 +01:00 committed by msehnout
parent c2c8fae093
commit 15033faa81
2 changed files with 42 additions and 5 deletions

View file

@ -82,6 +82,42 @@ func notFoundHandler(writer http.ResponseWriter, request *http.Request) {
writer.WriteHeader(http.StatusNotFound)
}
// Depsolves packages and build packages for building an image for a given
// distro, in the given architecture
func depsolve(rpmmd rpmmd.RPMMD, distro distro.Distro, repos []rpmmd.RepoConfig, imageType common.ImageType, arch common.Architecture) ([]rpmmd.PackageSpec, []rpmmd.PackageSpec, error) {
archString, ok := arch.ToString()
if !ok {
panic("architecture was validated before")
}
imageTypeString, ok := imageType.ToString()
if !ok {
panic("image type was validated before")
}
specs, excludeSpecs, err := distro.BasePackages(imageTypeString, archString)
if err != nil {
return nil, nil, fmt.Errorf("Distro.BasePackages: %v", err)
}
packages, _, err := rpmmd.Depsolve(specs, excludeSpecs, repos, distro.ModulePlatformID())
if err != nil {
return nil, nil, fmt.Errorf("RPMMD.Depsolve: %v", err)
}
specs, err = distro.BuildPackages(archString)
if err != nil {
return nil, nil, fmt.Errorf("Distro.BuildPackages: %v", err)
}
buildPackages, _, err := rpmmd.Depsolve(specs, nil, repos, distro.ModulePlatformID())
if err != nil {
return nil, nil, fmt.Errorf("RPMMD.Depsolve: %v", err)
}
return packages, buildPackages, err
}
func (api *API) submit(writer http.ResponseWriter, request *http.Request, _ httprouter.Params) {
// Check some basic HTTP parameters
contentType := request.Header["Content-Type"]
@ -168,8 +204,7 @@ func (api *API) submit(writer http.ResponseWriter, request *http.Request, _ http
}
}
// map( repo-id => checksum )
_, checksums, err := api.rpmMetadata.FetchMetadata(repoConfigs, distro.ModulePlatformID())
packages, buildPackages, err := depsolve(api.rpmMetadata, distro, repoConfigs, composeRequest.ImageTypes[0], composeRequest.Architectures[0])
if err != nil {
writer.WriteHeader(http.StatusBadRequest)
_, err := writer.Write([]byte(err.Error()))
@ -187,7 +222,8 @@ func (api *API) submit(writer http.ResponseWriter, request *http.Request, _ http
Distro: distro,
Arch: composeRequest.Architectures[0],
Repositories: repoConfigs,
Checksums: checksums,
Packages: packages,
BuildPackages: buildPackages,
RequestedImages: requestedImages,
})
if err != nil {

View file

@ -76,7 +76,8 @@ type ComposeRequest struct {
Distro distro.Distro
Arch common.Architecture
Repositories []rpmmd.RepoConfig
Checksums map[string]string
Packages []rpmmd.PackageSpec
BuildPackages []rpmmd.PackageSpec
RequestedImages []common.ImageRequest
}
@ -679,7 +680,7 @@ func (s *Store) PushComposeRequest(request ComposeRequest) error {
if !exists {
panic("fatal error, image type should exist but it does not")
}
manifestStruct, err := request.Distro.Manifest(request.Blueprint.Customizations, request.Repositories, nil, nil, arch, imgTypeCompatStr, 0)
manifestStruct, err := request.Distro.Manifest(request.Blueprint.Customizations, request.Repositories, request.Packages, request.BuildPackages, arch, imgTypeCompatStr, 0)
if err != nil {
return err
}