From 271d27a41df5121a9c4e949d033fb84aa6a6e41b Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 23 Mar 2020 16:53:59 -0700 Subject: [PATCH] client: Add /projects/ support --- internal/client/client.go | 3 +- internal/client/projects.go | 70 +++++++++++++++++++++++++++++++++++++ internal/weldr/json.go | 23 ++++++++++++ 3 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 internal/client/projects.go diff --git a/internal/client/client.go b/internal/client/client.go index f1ae7e1a0..996c92ab2 100644 --- a/internal/client/client.go +++ b/internal/client/client.go @@ -106,7 +106,8 @@ func GetRaw(socket *http.Client, method, path string) ([]byte, *APIResponse, err } // Convert the API's JSON error response to an error type and return it - if resp.StatusCode == 400 { + // lorax-composer (wrongly) returns 404 for some of its json responses + if resp.StatusCode == 400 || resp.StatusCode == 404 { apiResponse, err := apiError(resp) return nil, apiResponse, err } diff --git a/internal/client/projects.go b/internal/client/projects.go new file mode 100644 index 000000000..5a99343c4 --- /dev/null +++ b/internal/client/projects.go @@ -0,0 +1,70 @@ +// Package client - projects contains functions for the projects API +// Copyright (C) 2020 by Red Hat, Inc. +package client + +import ( + "encoding/json" + "fmt" + "net/http" + // "strings" + + "github.com/osbuild/osbuild-composer/internal/rpmmd" + "github.com/osbuild/osbuild-composer/internal/weldr" +) + +// ListAllProjectsV0 returns a list of all the available project names +func ListAllProjectsV0(socket *http.Client) ([]rpmmd.PackageInfo, *APIResponse, error) { + body, resp, err := GetJSONAll(socket, "/api/v0/projects/list") + if resp != nil || err != nil { + return nil, resp, err + } + var list weldr.ProjectsListV0 + err = json.Unmarshal(body, &list) + if err != nil { + return nil, nil, err + } + return list.Projects, nil, nil +} + +// ListSomeProjectsV0 returns a list of all the available project names +func ListSomeProjectsV0(socket *http.Client, offset, limit int) ([]rpmmd.PackageInfo, *APIResponse, error) { + path := fmt.Sprintf("/api/v0/projects/list?offset=%d&limit=%d", offset, limit) + body, resp, err := GetRaw(socket, "GET", path) + if resp != nil || err != nil { + return nil, resp, err + } + var list weldr.ProjectsListV0 + err = json.Unmarshal(body, &list) + if err != nil { + return nil, nil, err + } + return list.Projects, nil, nil +} + +// GetProjectsInfoV0 returns detailed project info on the named projects +func GetProjectsInfoV0(socket *http.Client, projNames string) ([]rpmmd.PackageInfo, *APIResponse, error) { + body, resp, err := GetRaw(socket, "GET", "/api/v0/projects/info/"+projNames) + if resp != nil || err != nil { + return nil, resp, err + } + var list weldr.ProjectsInfoV0 + err = json.Unmarshal(body, &list) + if err != nil { + return nil, nil, err + } + return list.Projects, nil, nil +} + +//DepsolveProjectsV0 returns the dependencies of the names projects +func DepsolveProjectsV0(socket *http.Client, projNames string) ([]rpmmd.PackageSpec, *APIResponse, error) { + body, resp, err := GetRaw(socket, "GET", "/api/v0/projects/depsolve/"+projNames) + if resp != nil || err != nil { + return nil, resp, err + } + var deps weldr.ProjectsDependenciesV0 + err = json.Unmarshal(body, &deps) + if err != nil { + return nil, nil, err + } + return deps.Projects, nil, nil +} diff --git a/internal/weldr/json.go b/internal/weldr/json.go index db11cc995..20fa9a641 100644 --- a/internal/weldr/json.go +++ b/internal/weldr/json.go @@ -121,3 +121,26 @@ func (s *SourceConfigV0) SourceConfig() (ssc store.SourceConfig) { return ssc } + +// ProjectsListV0 is the response to /projects/list request +type ProjectsListV0 struct { + Total uint `json:"total"` + Offset uint `json:"offset"` + Limit uint `json:"limit"` + Projects []rpmmd.PackageInfo `json:"projects"` +} + +// ProjectsInfoV0 is the response to /projects/info request +type ProjectsInfoV0 struct { + Projects []rpmmd.PackageInfo `json:"projects"` +} + +// ProjectsDependenciesV0 is the response to /projects/depsolve request +type ProjectsDependenciesV0 struct { + Projects []rpmmd.PackageSpec `json:"projects"` +} + +// ModulesInfoV0 is the response to /modules/info request +type ModulesInfoV0 struct { + Modules []rpmmd.PackageInfo `json:"modules"` +}