API: add Fetch Job endpoint

This is made with plain sqlite. It's probably a good idea to move to
something like GORM instead.
This commit is contained in:
Sybren A. Stüvel 2022-01-11 18:38:14 +01:00
parent f0ae7d33e9
commit 54933d0262
8 changed files with 309 additions and 43 deletions

View File

@ -37,6 +37,7 @@ type Flamenco struct {
type JobPersistenceService interface { type JobPersistenceService interface {
// StoreJob stores a job in the persistence layer. // StoreJob stores a job in the persistence layer.
StoreJob(ctx context.Context, authoredJob job_compilers.AuthoredJob) error StoreJob(ctx context.Context, authoredJob job_compilers.AuthoredJob) error
FetchJob(ctx context.Context, jobID string) (*api.Job, error)
} }
type JobCompiler interface { type JobCompiler interface {

View File

@ -75,3 +75,22 @@ func (f *Flamenco) SubmitJob(e echo.Context) error {
return e.JSON(http.StatusOK, authoredJob) return e.JSON(http.StatusOK, authoredJob)
} }
func (f *Flamenco) FetchJob(e echo.Context, jobId string) error {
// TODO: move this into some middleware.
logger := log.With().
Str("ip", e.RealIP()).
Str("job_id", jobId).
Logger()
logger.Debug().Msg("fetching job")
ctx := e.Request().Context()
job, err := f.persist.FetchJob(ctx, jobId)
if err != nil {
logger.Warn().Err(err).Msg("cannot fetch job")
return sendAPIError(e, http.StatusNotFound, fmt.Sprintf("job %+v not found", jobId))
}
return e.JSON(http.StatusOK, job)
}

View File

@ -30,6 +30,7 @@ import (
_ "modernc.org/sqlite" _ "modernc.org/sqlite"
"gitlab.com/blender/flamenco-goja-test/internal/manager/job_compilers" "gitlab.com/blender/flamenco-goja-test/internal/manager/job_compilers"
"gitlab.com/blender/flamenco-goja-test/pkg/api"
) )
// TODO : have this configurable from the CLI. // TODO : have this configurable from the CLI.
@ -102,3 +103,61 @@ func (db *DB) StoreJob(ctx context.Context, authoredJob job_compilers.AuthoredJo
return tx.Commit() return tx.Commit()
} }
func (db *DB) FetchJob(ctx context.Context, jobID string) (*api.Job, error) {
job := api.Job{}
err := db.sqldb.
QueryRowContext(ctx, `SELECT * FROM jobs j where j.uuid=?`, jobID).
Scan(&job.Id, &job.Name, &job.Type, &job.Priority, &job.Created, &job.Updated)
if err != nil {
return nil, err
}
// TODO: make settings and metadata an explicit type.
settings := make(map[string]interface{})
metadata := make(map[string]interface{})
rows, err := db.sqldb.QueryContext(ctx, "SELECT key, value FROM job_settings WHERE job_id=?", jobID)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var key, value string
if err := rows.Scan(&key, &value); err != nil {
return nil, err
}
settings[key] = value
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
rows, err = db.sqldb.QueryContext(ctx, "SELECT key, value FROM job_metadata WHERE job_id=?", jobID)
if err != nil {
return nil, err
}
defer rows.Close()
for rows.Next() {
var key, value string
if err := rows.Scan(&key, &value); err != nil {
return nil, err
}
metadata[key] = value
}
if err := rows.Close(); err != nil {
return nil, err
}
if err := rows.Err(); err != nil {
return nil, err
}
job.Settings = &settings
job.Metadata = &metadata
return &job, nil
}

View File

@ -79,7 +79,6 @@ paths:
operationId: submitJob operationId: submitJob
summary: Submit a new job for Flamenco Manager to execute. summary: Submit a new job for Flamenco Manager to execute.
tags: [jobs] tags: [jobs]
# TODO: Security!
requestBody: requestBody:
description: Job to submit description: Job to submit
required: true required: true
@ -99,6 +98,24 @@ paths:
application/json: application/json:
schema: {$ref: "#/components/schemas/Error"} schema: {$ref: "#/components/schemas/Error"}
/api/jobs/{job_id}:
summary: Job info and management
get:
operationId: fetchJob
summary: Fetch info about the job.
tags: [jobs]
parameters:
- name: job_id
in: path
required: true
schema: {type: string}
responses:
"200":
description: Job info
content:
application/json:
schema: {$ref: "#/components/schemas/Job"}
tags: tags:
- name: jobs - name: jobs
description: Blablabla for users to get job metadata balbla description: Blablabla for users to get job metadata balbla
@ -242,7 +259,6 @@ components:
type: object type: object
description: Job definition submitted to Flamenco. description: Job definition submitted to Flamenco.
properties: properties:
"id": {type: string}
"name": {type: string} "name": {type: string}
"type": {type: string} "type": {type: string}
"status": {$ref: "#/components/schemas/JobStatus"} "status": {$ref: "#/components/schemas/JobStatus"}
@ -271,6 +287,22 @@ components:
"user.name": "Sybren Stüvel" "user.name": "Sybren Stüvel"
"user.email": "sybren@blender.org" "user.email": "sybren@blender.org"
project: "Sprite Fright" project: "Sprite Fright"
Job:
allOf:
- $ref: '#/components/schemas/SubmittedJob'
- properties:
id:
type: string
description: UUID of the Job
created:
type: string
format: date-time
description: Creation timestamp
updated:
type: string
format: date-time
description: Creation timestamp
required: [id, created, updated]
Error: Error:

View File

@ -13,6 +13,8 @@ import (
"net/http" "net/http"
"net/url" "net/url"
"strings" "strings"
"github.com/deepmap/oapi-codegen/pkg/runtime"
) )
// RequestEditorFn is the function signature for the RequestEditor callback function // RequestEditorFn is the function signature for the RequestEditor callback function
@ -96,6 +98,9 @@ type ClientInterface interface {
// GetJobTypes request // GetJobTypes request
GetJobTypes(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) GetJobTypes(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error)
// FetchJob request
FetchJob(ctx context.Context, jobId string, 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)
@ -141,6 +146,18 @@ func (c *Client) GetJobTypes(ctx context.Context, reqEditors ...RequestEditorFn)
return c.Client.Do(req) return c.Client.Do(req)
} }
func (c *Client) FetchJob(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*http.Response, error) {
req, err := NewFetchJobRequest(c.Server, jobId)
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 {
@ -244,6 +261,40 @@ func NewGetJobTypesRequest(server string) (*http.Request, error) {
return req, nil return req, nil
} }
// NewFetchJobRequest generates requests for FetchJob
func NewFetchJobRequest(server string, jobId string) (*http.Request, error) {
var err error
var pathParam0 string
pathParam0, err = runtime.StyleParamWithLocation("simple", false, "job_id", runtime.ParamLocationPath, jobId)
if err != nil {
return nil, err
}
serverURL, err := url.Parse(server)
if err != nil {
return nil, err
}
operationPath := fmt.Sprintf("/api/jobs/%s", pathParam0)
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
@ -362,6 +413,9 @@ type ClientWithResponsesInterface interface {
// GetJobTypes request // GetJobTypes request
GetJobTypesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetJobTypesResponse, error) GetJobTypesWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetJobTypesResponse, error)
// FetchJob request
FetchJobWithResponse(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*FetchJobResponse, 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)
@ -416,6 +470,28 @@ func (r GetJobTypesResponse) StatusCode() int {
return 0 return 0
} }
type FetchJobResponse struct {
Body []byte
HTTPResponse *http.Response
JSON200 *Job
}
// Status returns HTTPResponse.Status
func (r FetchJobResponse) Status() string {
if r.HTTPResponse != nil {
return r.HTTPResponse.Status
}
return http.StatusText(0)
}
// StatusCode returns HTTPResponse.StatusCode
func (r FetchJobResponse) 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
@ -488,6 +564,15 @@ func (c *ClientWithResponses) GetJobTypesWithResponse(ctx context.Context, reqEd
return ParseGetJobTypesResponse(rsp) return ParseGetJobTypesResponse(rsp)
} }
// FetchJobWithResponse request returning *FetchJobResponse
func (c *ClientWithResponses) FetchJobWithResponse(ctx context.Context, jobId string, reqEditors ...RequestEditorFn) (*FetchJobResponse, error) {
rsp, err := c.FetchJob(ctx, jobId, reqEditors...)
if err != nil {
return nil, err
}
return ParseFetchJobResponse(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...)
@ -573,6 +658,32 @@ func ParseGetJobTypesResponse(rsp *http.Response) (*GetJobTypesResponse, error)
return response, nil return response, nil
} }
// ParseFetchJobResponse parses an HTTP response from a FetchJobWithResponse call
func ParseFetchJobResponse(rsp *http.Response) (*FetchJobResponse, error) {
bodyBytes, err := ioutil.ReadAll(rsp.Body)
defer func() { _ = rsp.Body.Close() }()
if err != nil {
return nil, err
}
response := &FetchJobResponse{
Body: bodyBytes,
HTTPResponse: rsp,
}
switch {
case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200:
var dest Job
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

@ -4,6 +4,10 @@
package api package api
import ( import (
"fmt"
"net/http"
"github.com/deepmap/oapi-codegen/pkg/runtime"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
) )
@ -15,6 +19,9 @@ type ServerInterface interface {
// Get list of job types and their parameters. // Get list of job types and their parameters.
// (GET /api/jobs/types) // (GET /api/jobs/types)
GetJobTypes(ctx echo.Context) error GetJobTypes(ctx echo.Context) error
// Fetch info about the job.
// (GET /api/jobs/{job_id})
FetchJob(ctx echo.Context, jobId string) 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
@ -46,6 +53,22 @@ func (w *ServerInterfaceWrapper) GetJobTypes(ctx echo.Context) error {
return err return err
} }
// FetchJob converts echo context to params.
func (w *ServerInterfaceWrapper) FetchJob(ctx echo.Context) error {
var err error
// ------------- Path parameter "job_id" -------------
var jobId string
err = runtime.BindStyledParameterWithLocation("simple", false, "job_id", runtime.ParamLocationPath, ctx.Param("job_id"), &jobId)
if err != nil {
return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter job_id: %s", err))
}
// Invoke the callback with all the unmarshalled arguments
err = w.Handler.FetchJob(ctx, jobId)
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
@ -96,6 +119,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.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker) router.POST(baseURL+"/api/worker/register-worker", wrapper.RegisterWorker)
router.POST(baseURL+"/api/worker/task", wrapper.ScheduleTask) router.POST(baseURL+"/api/worker/task", wrapper.ScheduleTask)

View File

@ -18,46 +18,48 @@ 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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",
"HgAA", "y1XjziQ+IPwpmKr+PAElgHfaUY+CnUb0/TniWePNNwvHhIoB4LqWuCsSvOFs9KJp1z8vgllXOBz6vQlF",
"1pHivm0foz3xvzep/y6EkqzA+cJQDYVkweRCsg6eW3/VuFfKTk+6xT34x9NMdZ6XCv0RPyHvdwDjhnzU",
"e3e++28AAAD//9hZQfR1IQAA",
} }
// GetSwagger returns the content of the embedded swagger specification file // GetSwagger returns the content of the embedded swagger specification file

View File

@ -3,6 +3,10 @@
// Code generated by github.com/deepmap/oapi-codegen version v1.9.0 DO NOT EDIT. // Code generated by github.com/deepmap/oapi-codegen version v1.9.0 DO NOT EDIT.
package api package api
import (
"time"
)
const ( const (
Worker_authScopes = "worker_auth.Scopes" Worker_authScopes = "worker_auth.Scopes"
) )
@ -154,6 +158,21 @@ type Error struct {
Message string `json:"message"` Message string `json:"message"`
} }
// Job defines model for Job.
type Job struct {
// Embedded struct due to allOf(#/components/schemas/SubmittedJob)
SubmittedJob `yaml:",inline"`
// Embedded fields due to inline allOf schema
// Creation timestamp
Created time.Time `json:"created"`
// UUID of the Job
Id string `json:"id"`
// Creation timestamp
Updated time.Time `json:"updated"`
}
// JobStatus defines model for JobStatus. // JobStatus defines model for JobStatus.
type JobStatus string type JobStatus string
@ -176,7 +195,6 @@ type SecurityError struct {
// Job definition submitted to Flamenco. // Job definition submitted to Flamenco.
type SubmittedJob struct { type SubmittedJob struct {
Id *string `json:"id,omitempty"`
Metadata *map[string]interface{} `json:"metadata,omitempty"` Metadata *map[string]interface{} `json:"metadata,omitempty"`
Name string `json:"name"` Name string `json:"name"`
Priority int `json:"priority"` Priority int `json:"priority"`