// Package client - compose contains functions for the compose API // Copyright (C) 2020 by Red Hat, Inc. package client import ( "encoding/json" "io" "net/http" "net/url" "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 params := url.Values{} if len(blueprint) > 0 { params.Add("blueprint", blueprint) } if len(status) > 0 { params.Add("status", status) } if len(composeType) > 0 { params.Add("type", composeType) } if len(params) > 0 { route = route + "?" + params.Encode() } 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 } // WriteComposeMetadataV0 requests the metadata for a compose and writes it to an io.Writer func WriteComposeMetadataV0(socket *http.Client, w io.Writer, uuid string) (*APIResponse, error) { body, resp, err := GetRawBody(socket, "GET", "/api/v0/compose/metadata/"+uuid) if resp != nil || err != nil { return resp, err } _, err = io.Copy(w, body) body.Close() return nil, err } // WriteComposeResultsV0 requests the results for a compose and writes it to an io.Writer func WriteComposeResultsV0(socket *http.Client, w io.Writer, uuid string) (*APIResponse, error) { body, resp, err := GetRawBody(socket, "GET", "/api/v0/compose/metadata/"+uuid) if resp != nil || err != nil { return resp, err } _, err = io.Copy(w, body) body.Close() return nil, err }