debian-forge-composer/internal/worker/client.go
Lars Karlitski 783a88d8cc worker/api: give operations simpler names
The code generator uses the `operationID` field to generate server
handlers, client functions, and types. Use simpler names to make the
generated code easier to read.
2020-09-11 14:23:24 +01:00

131 lines
2.7 KiB
Go

package worker
import (
"context"
"crypto/tls"
"encoding/json"
"errors"
"fmt"
"io"
"net"
"net/http"
"github.com/google/uuid"
"github.com/osbuild/osbuild-composer/internal/common"
"github.com/osbuild/osbuild-composer/internal/distro"
"github.com/osbuild/osbuild-composer/internal/osbuild"
"github.com/osbuild/osbuild-composer/internal/target"
"github.com/osbuild/osbuild-composer/internal/worker/api"
)
type Client struct {
api *api.Client
}
type Job struct {
Id uuid.UUID
Manifest distro.Manifest
Targets []*target.Target
}
func NewClient(baseURL string, conf *tls.Config) (*Client, error) {
httpClient := http.Client{
Transport: &http.Transport{
TLSClientConfig: conf,
},
}
c, err := api.NewClient(baseURL, api.WithHTTPClient(&httpClient))
if err != nil {
return nil, err
}
return &Client{c}, nil
}
func NewClientUnix(path string) *Client {
httpClient := http.Client{
Transport: &http.Transport{
DialContext: func(context context.Context, network, addr string) (net.Conn, error) {
return net.Dial("unix", path)
},
},
}
c, err := api.NewClient("http://localhost", api.WithHTTPClient(&httpClient))
if err != nil {
panic(err)
}
return &Client{c}
}
func (c *Client) AddJob() (*Job, error) {
response, err := c.api.PostJob(context.Background(), api.PostJobJSONRequestBody{})
if err != nil {
return nil, err
}
defer response.Body.Close()
if response.StatusCode != http.StatusCreated {
var er errorResponse
_ = json.NewDecoder(response.Body).Decode(&er)
return nil, fmt.Errorf("couldn't create job, got %d: %s", response.StatusCode, er.Message)
}
var jr addJobResponse
err = json.NewDecoder(response.Body).Decode(&jr)
if err != nil {
return nil, err
}
return &Job{
jr.Id,
jr.Manifest,
jr.Targets,
}, nil
}
func (c *Client) JobCanceled(job *Job) bool {
response, err := c.api.GetJob(context.Background(), job.Id.String())
if err != nil {
return true
}
defer response.Body.Close()
if response.StatusCode != http.StatusOK {
return true
}
var jr jobResponse
err = json.NewDecoder(response.Body).Decode(&jr)
if err != nil {
return true
}
return jr.Canceled
}
func (c *Client) UpdateJob(job *Job, status common.ImageBuildState, result *osbuild.Result) error {
response, err := c.api.UpdateJob(context.Background(), job.Id.String(), api.UpdateJobJSONRequestBody{
Result: result,
Status: status.ToString(),
})
if err != nil {
return err
}
if response.StatusCode != http.StatusOK {
return errors.New("error setting job status")
}
return nil
}
func (c *Client) UploadImage(job uuid.UUID, name string, reader io.Reader) error {
_, err := c.api.PostJobArtifactWithBody(context.Background(),
job.String(), name, "application/octet-stream", reader)
return err
}