Add API endpoint /api/version to get the Flamenco Manager version

This will be used in the auto-discovery, to check that a discovered URL can
actually be reached & points to a Flamenco Manager.
This commit is contained in:
Sybren A. Stüvel 2022-03-08 13:52:43 +01:00
parent 42407865eb
commit d0b677ffe3
7 changed files with 235 additions and 63 deletions

View File

@ -6,7 +6,9 @@ package api_impl
import ( import (
"context" "context"
"fmt" "fmt"
"net/http"
"git.blender.org/flamenco/internal/appinfo"
"git.blender.org/flamenco/internal/manager/job_compilers" "git.blender.org/flamenco/internal/manager/job_compilers"
"git.blender.org/flamenco/internal/manager/persistence" "git.blender.org/flamenco/internal/manager/persistence"
"git.blender.org/flamenco/internal/manager/task_state_machine" "git.blender.org/flamenco/internal/manager/task_state_machine"
@ -106,3 +108,10 @@ func sendAPIError(e echo.Context, code int, message string, args ...interface{})
} }
return e.JSON(code, petErr) return e.JSON(code, petErr)
} }
func (f *Flamenco) GetVersion(e echo.Context) error {
return e.JSON(http.StatusOK, api.FlamencoVersion{
Version: appinfo.ApplicationVersion,
Name: appinfo.ApplicationName,
})
}

View File

@ -76,6 +76,26 @@ func (mr *MockFlamencoClientMockRecorder) GetJobTypesWithResponse(arg0 interface
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetJobTypesWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetJobTypesWithResponse), varargs...) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetJobTypesWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetJobTypesWithResponse), varargs...)
} }
// GetVersionWithResponse mocks base method.
func (m *MockFlamencoClient) GetVersionWithResponse(arg0 context.Context, arg1 ...api.RequestEditorFn) (*api.GetVersionResponse, error) {
m.ctrl.T.Helper()
varargs := []interface{}{arg0}
for _, a := range arg1 {
varargs = append(varargs, a)
}
ret := m.ctrl.Call(m, "GetVersionWithResponse", varargs...)
ret0, _ := ret[0].(*api.GetVersionResponse)
ret1, _ := ret[1].(error)
return ret0, ret1
}
// GetVersionWithResponse indicates an expected call of GetVersionWithResponse.
func (mr *MockFlamencoClientMockRecorder) GetVersionWithResponse(arg0 interface{}, arg1 ...interface{}) *gomock.Call {
mr.mock.ctrl.T.Helper()
varargs := append([]interface{}{arg0}, arg1...)
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetVersionWithResponse", reflect.TypeOf((*MockFlamencoClient)(nil).GetVersionWithResponse), varargs...)
}
// RegisterWorkerWithBodyWithResponse mocks base method. // RegisterWorkerWithBodyWithResponse mocks base method.
func (m *MockFlamencoClient) RegisterWorkerWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.RegisterWorkerResponse, error) { func (m *MockFlamencoClient) RegisterWorkerWithBodyWithResponse(arg0 context.Context, arg1 string, arg2 io.Reader, arg3 ...api.RequestEditorFn) (*api.RegisterWorkerResponse, error) {
m.ctrl.T.Helper() m.ctrl.T.Helper()

View File

@ -12,6 +12,19 @@ info:
servers: servers:
- url: / - url: /
paths: paths:
/api/version:
summary: Workers can use this to check this is actually a Flamenco server.
get:
summary: Get the Flamenco version of this Manager
operationId: getVersion
responses:
"200":
description: normal response
content:
application/json:
schema:
$ref: "#/components/schemas/FlamencoVersion"
/api/worker/register-worker: /api/worker/register-worker:
summary: Registration of new workers summary: Registration of new workers
post: post:
@ -254,6 +267,13 @@ tags:
components: components:
schemas: schemas:
FlamencoVersion:
type: object
required: [version, name]
properties:
version: { type: string }
name: { type: string }
WorkerRegistration: WorkerRegistration:
type: object type: object
required: [secret, platform, supported_task_types, nickname] required: [secret, platform, supported_task_types, nickname]

View File

@ -101,6 +101,9 @@ type ClientInterface interface {
// FetchJob request // FetchJob request
FetchJob(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*http.Response, error) FetchJob(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*http.Response, error)
// GetVersion request
GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
// RegisterWorker request with any body // RegisterWorker request with any body
RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error)
@ -179,6 +182,18 @@ func (c *Client) FetchJob(ctx context.Context, jobId string, reqEditors ...Reque
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) GetVersion(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewGetVersionRequest(c.Server)
if err != nil {
return nil, err
}
req = req.WithContext(ctx)
if err := c.applyEditors(ctx, req, reqEditors); err != nil {
return nil, err
}
return c.Client.Do(req)
}
func (c *Client) RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { func (c *Client) RegisterWorkerWithBody(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewRegisterWorkerRequestWithBody(c.Server, contentType, body) req, err := NewRegisterWorkerRequestWithBody(c.Server, contentType, body)
if err != nil { if err != nil {
@ -412,6 +427,33 @@ func NewFetchJobRequest(server string, jobId string) (*http.Request, error) {
return req, nil return req, nil
} }
// NewGetVersionRequest generates requests for GetVersion
func NewGetVersionRequest(server string) (*http.Request, error) {
var err error
serverURL, err := url.Parse(server)
if err != nil {
return nil, err
}
operationPath := fmt.Sprintf("/api/version")
if operationPath[0] == '/' {
operationPath = "." + operationPath
}
queryURL, err := serverURL.Parse(operationPath)
if err != nil {
return nil, err
}
req, err := http.NewRequest("GET", queryURL.String(), nil)
if err != nil {
return nil, err
}
return req, nil
}
// NewRegisterWorkerRequest calls the generic RegisterWorker builder with application/json body // NewRegisterWorkerRequest calls the generic RegisterWorker builder with application/json body
func NewRegisterWorkerRequest(server string, body RegisterWorkerJSONRequestBody) (*http.Request, error) { func NewRegisterWorkerRequest(server string, body RegisterWorkerJSONRequestBody) (*http.Request, error) {
var bodyReader io.Reader var bodyReader io.Reader
@ -714,6 +756,9 @@ type ClientWithResponsesInterface interface {
// FetchJob request // FetchJob request
FetchJobWithResponse(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*FetchJobResponse, error) FetchJobWithResponse(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*FetchJobResponse, error)
// GetVersion request
GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error)
// RegisterWorker request with any body // RegisterWorker request with any body
RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error) RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error)
@ -811,6 +856,28 @@ func (r FetchJobResponse) StatusCode() int {
return 0 return 0
} }
type GetVersionResponse struct {
Body []byte
HTTPResponse *http.Response
JSON200 *FlamencoVersion
}
// Status returns HTTPResponse.Status
func (r GetVersionResponse) Status() string {
if r.HTTPResponse != nil {
return r.HTTPResponse.Status
}
return http.StatusText(0)
}
// StatusCode returns HTTPResponse.StatusCode
func (r GetVersionResponse) StatusCode() int {
if r.HTTPResponse != nil {
return r.HTTPResponse.StatusCode
}
return 0
}
type RegisterWorkerResponse struct { type RegisterWorkerResponse struct {
Body []byte Body []byte
HTTPResponse *http.Response HTTPResponse *http.Response
@ -1005,6 +1072,15 @@ func (c *ClientWithResponses) FetchJobWithResponse(ctx context.Context, jobId st
return ParseFetchJobResponse(rsp) return ParseFetchJobResponse(rsp)
} }
// GetVersionWithResponse request returning *GetVersionResponse
func (c *ClientWithResponses) GetVersionWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetVersionResponse, error) {
rsp, err := c.GetVersion(ctx, reqEditors...)
if err != nil {
return nil, err
}
return ParseGetVersionResponse(rsp)
}
// RegisterWorkerWithBodyWithResponse request with arbitrary body returning *RegisterWorkerResponse // RegisterWorkerWithBodyWithResponse request with arbitrary body returning *RegisterWorkerResponse
func (c *ClientWithResponses) RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error) { func (c *ClientWithResponses) RegisterWorkerWithBodyWithResponse(ctx context.Context, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*RegisterWorkerResponse, error) {
rsp, err := c.RegisterWorkerWithBody(ctx, contentType, body, reqEditors...) rsp, err := c.RegisterWorkerWithBody(ctx, contentType, body, reqEditors...)
@ -1185,6 +1261,32 @@ func ParseFetchJobResponse(rsp *http.Response) (*FetchJobResponse, error) {
return response, nil return response, nil
} }
// ParseGetVersionResponse parses an HTTP response from a GetVersionWithResponse call
func ParseGetVersionResponse(rsp *http.Response) (*GetVersionResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }()
if err != nil {
return nil, err
}
response := &GetVersionResponse{
Body: bodyBytes,
HTTPResponse: rsp,
}
switch {
case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
var dest FlamencoVersion
if err := json.Unmarshal(bodyBytes, &dest); err != nil {
return nil, err
}
response.JSON200 = &dest
}
return response, nil
}
// ParseRegisterWorkerResponse parses an HTTP response from a RegisterWorkerWithResponse call // ParseRegisterWorkerResponse parses an HTTP response from a RegisterWorkerWithResponse call
func ParseRegisterWorkerResponse(rsp *http.Response) (*RegisterWorkerResponse, error) { func ParseRegisterWorkerResponse(rsp *http.Response) (*RegisterWorkerResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body) bodyBytes, err := ioutil.ReadAll(rsp.Body)

View File

@ -22,6 +22,9 @@ type ServerInterface interface {
// Fetch info about the job. // Fetch info about the job.
// (GET /api/jobs/{job_id}) // (GET /api/jobs/{job_id})
FetchJob(ctx echo.Context, jobId string) error FetchJob(ctx echo.Context, jobId string) error
// Get the Flamenco version of this Manager
// (GET /api/version)
GetVersion(ctx echo.Context) error
// Register a new worker // Register a new worker
// (POST /api/worker/register-worker) // (POST /api/worker/register-worker)
RegisterWorker(ctx echo.Context) error RegisterWorker(ctx echo.Context) error
@ -84,6 +87,15 @@ func (w *ServerInterfaceWrapper) FetchJob(ctx echo.Context) error {
return err return err
} }
// GetVersion converts echo context to params.
func (w *ServerInterfaceWrapper) GetVersion(ctx echo.Context) error {
var err error
// Invoke the callback with all the unmarshalled arguments
err = w.Handler.GetVersion(ctx)
return err
}
// RegisterWorker converts echo context to params. // RegisterWorker converts echo context to params.
func (w *ServerInterfaceWrapper) RegisterWorker(ctx echo.Context) error { func (w *ServerInterfaceWrapper) RegisterWorker(ctx echo.Context) error {
var err error var err error
@ -197,6 +209,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL
router.POST(baseURL+"/api/jobs", wrapper.SubmitJob) router.POST(baseURL+"/api/jobs", wrapper.SubmitJob)
router.GET(baseURL+"/api/jobs/types", wrapper.GetJobTypes) router.GET(baseURL+"/api/jobs/types", wrapper.GetJobTypes)
router.GET(baseURL+"/api/jobs/:job_id", wrapper.FetchJob) router.GET(baseURL+"/api/jobs/:job_id", wrapper.FetchJob)
router.GET(baseURL+"/api/version", wrapper.GetVersion)
router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker) router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker)
router.POST(baseURL+"/api/worker/sign-off", wrapper.SignOff) router.POST(baseURL+"/api/worker/sign-off", wrapper.SignOff)
router.POST(baseURL+"/api/worker/sign-on", wrapper.SignOn) router.POST(baseURL+"/api/worker/sign-on", wrapper.SignOn)

View File

@ -18,62 +18,64 @@ import (
// Base64 encoded, gzipped, json marshaled Swagger object // Base64 encoded, gzipped, json marshaled Swagger object
var swaggerSpec = []string{ var swaggerSpec = []string{
"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",
"DgAA///4VeLtlTYAAA==",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file
@ -81,16 +83,16 @@ var swaggerSpec = []string{
func decodeSpec() ([]byte, error) { func decodeSpec() ([]byte, error) {
zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, "")) zipped, err := base64.StdEncoding.DecodeString(strings.Join(swaggerSpec, ""))
if err != nil { if err != nil {
return nil, fmt.Errorf("base64 decoding spec: %s", err) return nil, fmt.Errorf("error base64 decoding spec: %s", err)
} }
zr, err := gzip.NewReader(bytes.NewReader(zipped)) zr, err := gzip.NewReader(bytes.NewReader(zipped))
if err != nil { if err != nil {
return nil, fmt.Errorf("decompressing spec: %s", err) return nil, fmt.Errorf("error decompressing spec: %s", err)
} }
var buf bytes.Buffer var buf bytes.Buffer
_, err = buf.ReadFrom(zr) _, err = buf.ReadFrom(zr)
if err != nil { if err != nil {
return nil, fmt.Errorf("decompressing spec: %s", err) return nil, fmt.Errorf("error decompressing spec: %s", err)
} }
return buf.Bytes(), nil return buf.Bytes(), nil

View File

@ -172,6 +172,12 @@ type Error struct {
Message string `json:"message"` Message string `json:"message"`
} }
// FlamencoVersion defines model for FlamencoVersion.
type FlamencoVersion struct {
Name string `json:"name"`
Version string `json:"version"`
}
// Job defines model for Job. // Job defines model for Job.
type Job struct { type Job struct {
// Embedded struct due to allOf(#/components/schemas/SubmittedJob) // Embedded struct due to allOf(#/components/schemas/SubmittedJob)
@ -330,7 +336,7 @@ func (a *JobMetadata) UnmarshalJSON(b []byte) error {
var fieldVal string var fieldVal string
err := json.Unmarshal(fieldBuf, &fieldVal) err := json.Unmarshal(fieldBuf, &fieldVal)
if err != nil { if err != nil {
return fmt.Errorf("unmarshaling field %s: %w", fieldName, err) return fmt.Errorf("error unmarshaling field %s: %w", fieldName, err)
} }
a.AdditionalProperties[fieldName] = fieldVal a.AdditionalProperties[fieldName] = fieldVal
} }
@ -346,7 +352,7 @@ func (a JobMetadata) MarshalJSON() ([]byte, error) {
for fieldName, field := range a.AdditionalProperties { for fieldName, field := range a.AdditionalProperties {
object[fieldName], err = json.Marshal(field) object[fieldName], err = json.Marshal(field)
if err != nil { if err != nil {
return nil, fmt.Errorf("marshaling '%s': %w", fieldName, err) return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err)
} }
} }
return json.Marshal(object) return json.Marshal(object)
@ -383,7 +389,7 @@ func (a *JobSettings) UnmarshalJSON(b []byte) error {
var fieldVal interface{} var fieldVal interface{}
err := json.Unmarshal(fieldBuf, &fieldVal) err := json.Unmarshal(fieldBuf, &fieldVal)
if err != nil { if err != nil {
return fmt.Errorf("unmarshaling field %s: %w", fieldName, err) return fmt.Errorf("error unmarshaling field %s: %w", fieldName, err)
} }
a.AdditionalProperties[fieldName] = fieldVal a.AdditionalProperties[fieldName] = fieldVal
} }
@ -399,7 +405,7 @@ func (a JobSettings) MarshalJSON() ([]byte, error) {
for fieldName, field := range a.AdditionalProperties { for fieldName, field := range a.AdditionalProperties {
object[fieldName], err = json.Marshal(field) object[fieldName], err = json.Marshal(field)
if err != nil { if err != nil {
return nil, fmt.Errorf("marshaling '%s': %w", fieldName, err) return nil, fmt.Errorf("error marshaling '%s': %w", fieldName, err)
} }
} }
return json.Marshal(object) return json.Marshal(object)