From 6f4a7bacd2492b8b4e477407a05b703fabb9ace5 Mon Sep 17 00:00:00 2001 From: Jacob Kozol Date: Wed, 6 Nov 2019 15:00:40 +0100 Subject: [PATCH] api: fetch packages from sources and base repo The package list is now generated from the base repo and the user-defined repos. This allows users to add packages not found in the base repo to their blueprints. --- internal/weldr/api.go | 71 ++++++++++++++++++++++++++++++++++++++----- 1 file changed, 63 insertions(+), 8 deletions(-) diff --git a/internal/weldr/api.go b/internal/weldr/api.go index 82551a99f..79f5dd101 100644 --- a/internal/weldr/api.go +++ b/internal/weldr/api.go @@ -312,13 +312,29 @@ func (api *API) modulesListAllHandler(writer http.ResponseWriter, request *http. return } - total := uint(len(api.packages)) + var repos []rpmmd.RepoConfig + repos = append(repos, api.repo) + for _, source := range api.store.GetAllSources() { + repos = append(repos, rpmmd.SourceToRepo(source)) + } + + packages, err := api.rpmmd.FetchPackageList(repos) + if err != nil { + errors := responseError{ + ID: "ModulesError", + Msg: fmt.Sprintf("msg: %s", err.Error()), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return + } + + total := uint(len(packages)) start := min(offset, total) n := min(limit, total-start) modules := make([]modulesListModule, n) for i := uint(0); i < n; i++ { - modules[i] = modulesListModule{api.packages[start+i].Name, "rpm"} + modules[i] = modulesListModule{packages[start+i].Name, "rpm"} } json.NewEncoder(writer).Encode(modulesListReply{ @@ -347,6 +363,22 @@ func (api *API) modulesListHandler(writer http.ResponseWriter, request *http.Req return } + var repos []rpmmd.RepoConfig + repos = append(repos, api.repo) + for _, source := range api.store.GetAllSources() { + repos = append(repos, rpmmd.SourceToRepo(source)) + } + + packages, err := api.rpmmd.FetchPackageList(repos) + if err != nil { + errors := responseError{ + ID: "ModulesError", + Msg: fmt.Sprintf("msg: %s", err.Error()), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return + } + // we don't support glob-matching, but cockpit-composer surrounds some // queries with asterisks; this is crude, but solves that case for i := range names { @@ -357,7 +389,7 @@ func (api *API) modulesListHandler(writer http.ResponseWriter, request *http.Req total := uint(0) end := offset + limit for i, name := range names { - for _, pkg := range api.packages { + for _, pkg := range packages { if strings.Contains(pkg.Name, name) { total++ if total > offset && total < end { @@ -432,6 +464,22 @@ func (api *API) modulesInfoHandler(writer http.ResponseWriter, request *http.Req return } + var repos []rpmmd.RepoConfig + repos = append(repos, api.repo) + for _, source := range api.store.GetAllSources() { + repos = append(repos, rpmmd.SourceToRepo(source)) + } + + packages, err := api.rpmmd.FetchPackageList(repos) + if err != nil { + errors := responseError{ + ID: "ModulesError", + Msg: fmt.Sprintf("msg: %s", err.Error()), + } + statusResponseError(writer, http.StatusBadRequest, errors) + return + } + projects := make([]project, 0) for i, name := range names { // remove leading / from first name @@ -439,7 +487,7 @@ func (api *API) modulesInfoHandler(writer http.ResponseWriter, request *http.Req name = name[1:] } - first, n := api.packages.Search(name) + first, n := packages.Search(name) if n == 0 { errors := responseError{ ID: "UnknownModule", @@ -451,7 +499,7 @@ func (api *API) modulesInfoHandler(writer http.ResponseWriter, request *http.Req // get basic info from the first package, but collect build // information from all that have the same name - pkg := api.packages[first] + pkg := packages[first] project := project{ Name: pkg.Name, Summary: pkg.Summary, @@ -460,7 +508,7 @@ func (api *API) modulesInfoHandler(writer http.ResponseWriter, request *http.Req } project.Builds = make([]build, n) - for i, pkg := range api.packages[first : first+n] { + for i, pkg := range packages[first : first+n] { project.Builds[i] = build{ Arch: pkg.Arch, BuildTime: pkg.BuildTime, @@ -471,7 +519,7 @@ func (api *API) modulesInfoHandler(writer http.ResponseWriter, request *http.Req } if modulesRequested { - project.Dependencies, _ = api.rpmmd.Depsolve([]string{pkg.Name}, []rpmmd.RepoConfig{api.repo}) + project.Dependencies, _ = api.rpmmd.Depsolve([]string{pkg.Name}, repos) } projects = append(projects, project) @@ -637,7 +685,14 @@ func (api *API) blueprintsDepsolveHandler(writer http.ResponseWriter, request *h specs[i] += "-*-*.*" } } - dependencies, _ := api.rpmmd.Depsolve(specs, []rpmmd.RepoConfig{api.repo}) + + var repos []rpmmd.RepoConfig + repos = append(repos, api.repo) + for _, source := range api.store.GetAllSources() { + repos = append(repos, rpmmd.SourceToRepo(source)) + } + + dependencies, _ := api.rpmmd.Depsolve(specs, repos) blueprints = append(blueprints, entry{blueprint, dependencies}) }