Also adds new types to weldr/json.go to support them. ComposeEntry had to be duplicated instead of used as-is because it enforces image type strings that do not match what the API uses (the API types are all lower case, the internal names are capitalized).
188 lines
5.8 KiB
Go
188 lines
5.8 KiB
Go
// Package client - compose contains functions for the compose API
|
|
// Copyright (C) 2020 by Red Hat, Inc.
|
|
package client
|
|
|
|
import (
|
|
"encoding/json"
|
|
"io"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/osbuild/osbuild-composer/internal/weldr"
|
|
)
|
|
|
|
// PostComposeV0 sends a JSON compose string to the API
|
|
// and returns an APIResponse
|
|
func PostComposeV0(socket *http.Client, compose string) (*APIResponse, error) {
|
|
body, resp, err := PostJSON(socket, "/api/v0/compose", compose)
|
|
if resp != nil || err != nil {
|
|
return resp, err
|
|
}
|
|
return NewAPIResponse(body)
|
|
}
|
|
|
|
// NewComposeResponseV0 converts the response body to a status response
|
|
func NewComposeResponseV0(body []byte) (*weldr.ComposeResponseV0, error) {
|
|
var response weldr.ComposeResponseV0
|
|
err := json.Unmarshal(body, &response)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &response, nil
|
|
}
|
|
|
|
// GetFinishedComposesV0 returns a list of the finished composes
|
|
func GetFinishedComposesV0(socket *http.Client) ([]weldr.ComposeEntryV0, *APIResponse, error) {
|
|
body, resp, err := GetRaw(socket, "GET", "/api/v0/compose/finished")
|
|
if resp != nil || err != nil {
|
|
return []weldr.ComposeEntryV0{}, resp, err
|
|
}
|
|
var finished weldr.ComposeFinishedResponseV0
|
|
err = json.Unmarshal(body, &finished)
|
|
if err != nil {
|
|
return []weldr.ComposeEntryV0{}, nil, err
|
|
}
|
|
return finished.Finished, nil, nil
|
|
}
|
|
|
|
// GetFailedComposesV0 returns a list of the failed composes
|
|
func GetFailedComposesV0(socket *http.Client) ([]weldr.ComposeEntryV0, *APIResponse, error) {
|
|
body, resp, err := GetRaw(socket, "GET", "/api/v0/compose/failed")
|
|
if resp != nil || err != nil {
|
|
return []weldr.ComposeEntryV0{}, resp, err
|
|
}
|
|
var failed weldr.ComposeFailedResponseV0
|
|
err = json.Unmarshal(body, &failed)
|
|
if err != nil {
|
|
return []weldr.ComposeEntryV0{}, nil, err
|
|
}
|
|
return failed.Failed, nil, nil
|
|
}
|
|
|
|
// GetComposeStatusV0 returns a list of composes matching the optional filter parameters
|
|
func GetComposeStatusV0(socket *http.Client, uuids, blueprint, status, composeType string) ([]weldr.ComposeEntryV0, *APIResponse, error) {
|
|
// Build the query string
|
|
route := "/api/v0/compose/status/" + uuids
|
|
var filters []string
|
|
|
|
if len(blueprint) > 0 {
|
|
filters = append(filters, "blueprint="+blueprint)
|
|
}
|
|
if len(status) > 0 {
|
|
filters = append(filters, "status="+status)
|
|
}
|
|
if len(composeType) > 0 {
|
|
filters = append(filters, "type="+composeType)
|
|
}
|
|
|
|
if len(filters) > 0 {
|
|
route = route + "?" + strings.Join(filters, "&")
|
|
}
|
|
|
|
body, resp, err := GetRaw(socket, "GET", route)
|
|
if resp != nil || err != nil {
|
|
return []weldr.ComposeEntryV0{}, resp, err
|
|
}
|
|
var composes weldr.ComposeStatusResponseV0
|
|
err = json.Unmarshal(body, &composes)
|
|
if err != nil {
|
|
return []weldr.ComposeEntryV0{}, nil, err
|
|
}
|
|
return composes.UUIDs, nil, nil
|
|
}
|
|
|
|
// GetComposeTypesV0 returns a list of the failed composes
|
|
func GetComposesTypesV0(socket *http.Client) ([]weldr.ComposeTypeV0, *APIResponse, error) {
|
|
body, resp, err := GetRaw(socket, "GET", "/api/v0/compose/types")
|
|
if resp != nil || err != nil {
|
|
return []weldr.ComposeTypeV0{}, resp, err
|
|
}
|
|
var composeTypes weldr.ComposeTypesResponseV0
|
|
err = json.Unmarshal(body, &composeTypes)
|
|
if err != nil {
|
|
return []weldr.ComposeTypeV0{}, nil, err
|
|
}
|
|
return composeTypes.Types, nil, nil
|
|
}
|
|
|
|
// DeleteComposeV0 deletes one or more composes based on their uuid
|
|
func DeleteComposeV0(socket *http.Client, uuids string) (weldr.DeleteComposeResponseV0, *APIResponse, error) {
|
|
body, resp, err := DeleteRaw(socket, "/api/v0/compose/delete/"+uuids)
|
|
if resp != nil || err != nil {
|
|
return weldr.DeleteComposeResponseV0{}, resp, err
|
|
}
|
|
var deleteResponse weldr.DeleteComposeResponseV0
|
|
err = json.Unmarshal(body, &deleteResponse)
|
|
if err != nil {
|
|
return weldr.DeleteComposeResponseV0{}, nil, err
|
|
}
|
|
return deleteResponse, nil, nil
|
|
}
|
|
|
|
// GetComposeInfoV0 returns detailed information about the selected compose
|
|
func GetComposeInfoV0(socket *http.Client, uuid string) (weldr.ComposeInfoResponseV0, *APIResponse, error) {
|
|
body, resp, err := GetRaw(socket, "GET", "/api/v0/compose/info/"+uuid)
|
|
if resp != nil || err != nil {
|
|
return weldr.ComposeInfoResponseV0{}, resp, err
|
|
}
|
|
var info weldr.ComposeInfoResponseV0
|
|
err = json.Unmarshal(body, &info)
|
|
if err != nil {
|
|
return weldr.ComposeInfoResponseV0{}, nil, err
|
|
}
|
|
return info, nil, nil
|
|
}
|
|
|
|
// GetComposeQueueV0 returns the list of composes in the queue
|
|
func GetComposeQueueV0(socket *http.Client) (weldr.ComposeQueueResponseV0, *APIResponse, error) {
|
|
body, resp, err := GetRaw(socket, "GET", "/api/v0/compose/queue")
|
|
if resp != nil || err != nil {
|
|
return weldr.ComposeQueueResponseV0{}, resp, err
|
|
}
|
|
var queue weldr.ComposeQueueResponseV0
|
|
err = json.Unmarshal(body, &queue)
|
|
if err != nil {
|
|
return weldr.ComposeQueueResponseV0{}, nil, err
|
|
}
|
|
return queue, nil, nil
|
|
}
|
|
|
|
// Test compose metadata for unknown uuid
|
|
|
|
// Test compose results for unknown uuid
|
|
|
|
// WriteComposeImageV0 requests the image for a compose and writes it to an io.Writer
|
|
func WriteComposeImageV0(socket *http.Client, w io.Writer, uuid string) (*APIResponse, error) {
|
|
body, resp, err := GetRawBody(socket, "GET", "/api/v0/compose/image/"+uuid)
|
|
if resp != nil || err != nil {
|
|
return resp, err
|
|
}
|
|
_, err = io.Copy(w, body)
|
|
body.Close()
|
|
|
|
return nil, err
|
|
}
|
|
|
|
// WriteComposeLogsV0 requests the logs for a compose and writes it to an io.Writer
|
|
func WriteComposeLogsV0(socket *http.Client, w io.Writer, uuid string) (*APIResponse, error) {
|
|
body, resp, err := GetRawBody(socket, "GET", "/api/v0/compose/logs/"+uuid)
|
|
if resp != nil || err != nil {
|
|
return resp, err
|
|
}
|
|
_, err = io.Copy(w, body)
|
|
body.Close()
|
|
|
|
return nil, err
|
|
}
|
|
|
|
// WriteComposeLogV0 requests the log for a compose and writes it to an io.Writer
|
|
func WriteComposeLogV0(socket *http.Client, w io.Writer, uuid string) (*APIResponse, error) {
|
|
body, resp, err := GetRawBody(socket, "GET", "/api/v0/compose/log/"+uuid)
|
|
if resp != nil || err != nil {
|
|
return resp, err
|
|
}
|
|
_, err = io.Copy(w, body)
|
|
body.Close()
|
|
|
|
return nil, err
|
|
}
|