distro: set the repository checksum dynamically

Instead of having a static repository checksum, set it dynamically from
the metadata that osbuild-composer last saw. This is implemented in
dnf-json, which returns the checksums for each repository on every call.

This enables the use of repositories that change over time, such as
fedora-updates. Note that the osbuild pipeline will break when such a
repository changes. This is intentional: pipelines have to be
reproducible.
This commit is contained in:
Lars Karlitski 2019-12-07 23:01:44 +01:00
parent 75218ad2d9
commit d3a0b788a2
20 changed files with 184 additions and 95 deletions

View file

@ -610,7 +610,7 @@ func (api *API) projectsDepsolveHandler(writer http.ResponseWriter, request *htt
names := strings.Split(params.ByName("projects"), ",")
packages, err := api.rpmmd.Depsolve(names, api.distro.Repositories())
packages, _, err := api.rpmmd.Depsolve(names, api.distro.Repositories())
if err != nil {
errors := responseError{
@ -792,27 +792,7 @@ func (api *API) blueprintsDepsolveHandler(writer http.ResponseWriter, request *h
return
}
specs := make([]string, len(blueprint.Packages))
for i, pkg := range blueprint.Packages {
specs[i] = pkg.Name
// If a package has version "*" the package name suffix must be equal to "-*-*.*"
// Using just "-*" would find any other package containing the package name
if pkg.Version != "" && pkg.Version != "*" {
specs[i] += "-" + pkg.Version
} else if pkg.Version == "*" {
specs[i] += "-*-*.*"
}
}
var repos []rpmmd.RepoConfig
for _, repo := range api.distro.Repositories() {
repos = append(repos, repo)
}
for _, source := range api.store.GetAllSources() {
repos = append(repos, source.RepoConfig())
}
dependencies, err := api.rpmmd.Depsolve(specs, repos)
dependencies, _, err := api.depsolveBlueprint(blueprint)
if err != nil {
errors := responseError{
@ -866,36 +846,24 @@ func (api *API) blueprintsFreezeHandler(writer http.ResponseWriter, request *htt
}
blueprint, _ := api.store.GetBlueprint(name)
if blueprint == nil {
err := responseError{
rerr := responseError{
ID: "UnknownBlueprint",
Msg: fmt.Sprintf("%s: blueprint_not_found", name),
}
errors = append(errors, err)
return
errors = append(errors, rerr)
break
}
specs := make([]string, len(blueprint.Packages))
for i, pkg := range blueprint.Packages {
specs[i] = pkg.Name
// If a package has version "*" the package name suffix must be equal to "-*-*.*"
// Using just "-*" would find any other package containing the package name
if pkg.Version != "" && pkg.Version != "*" {
specs[i] += "-" + pkg.Version
} else if pkg.Version == "*" {
specs[i] += "-*-*.*"
dependencies, _, err := api.depsolveBlueprint(blueprint)
if err != nil {
rerr := responseError{
ID: "BlueprintsError",
Msg: fmt.Sprintf("%s: %s", name, err.Error()),
}
errors = append(errors, rerr)
break
}
var repos []rpmmd.RepoConfig
for _, repo := range api.distro.Repositories() {
repos = append(repos, repo)
}
for _, source := range api.store.GetAllSources() {
repos = append(repos, source.RepoConfig())
}
dependencies, _ := api.rpmmd.Depsolve(specs, repos)
for pkgIndex, pkg := range blueprint.Packages {
i := sort.Search(len(dependencies), func(i int) bool {
return dependencies[i].Name >= pkg.Name
@ -1243,7 +1211,17 @@ func (api *API) composeHandler(writer http.ResponseWriter, request *http.Request
bp := api.store.GetBlueprintCommitted(cr.BlueprintName)
if bp != nil {
err := api.store.PushCompose(reply.BuildID, bp, cr.ComposeType, uploadTarget)
_, checksums, err := api.depsolveBlueprint(bp)
if err != nil {
errors := responseError{
ID: "DepsolveError",
Msg: err.Error(),
}
statusResponseError(writer, http.StatusInternalServerError, errors)
return
}
err = api.store.PushCompose(reply.BuildID, bp, checksums, cr.ComposeType, uploadTarget)
// TODO: we should probably do some kind of blueprint validation in future
// for now, let's just 500 and bail out
@ -1630,7 +1608,32 @@ func (api *API) fetchPackageList() (rpmmd.PackageList, error) {
repos = append(repos, source.RepoConfig())
}
return api.rpmmd.FetchPackageList(repos)
packages, _, err := api.rpmmd.FetchPackageList(repos)
return packages, err
}
func (api *API) depsolveBlueprint(bp *blueprint.Blueprint) ([]rpmmd.PackageSpec, map[string]string, error) {
specs := make([]string, len(bp.Packages))
for i, pkg := range bp.Packages {
specs[i] = pkg.Name
// If a package has version "*" the package name suffix must be equal to "-*-*.*"
// Using just "-*" would find any other package containing the package name
if pkg.Version != "" && pkg.Version != "*" {
specs[i] += "-" + pkg.Version
} else if pkg.Version == "*" {
specs[i] += "-*-*.*"
}
}
var repos []rpmmd.RepoConfig
for _, repo := range api.distro.Repositories() {
repos = append(repos, repo)
}
for _, source := range api.store.GetAllSources() {
repos = append(repos, source.RepoConfig())
}
return api.rpmmd.Depsolve(specs, repos)
}
func (api *API) uploadsScheduleHandler(writer http.ResponseWriter, request *http.Request, params httprouter.Params) {