Manager: implement job check endpoint
This commit is contained in:
parent
c439bc3a1e
commit
7a60bb70e0
@ -3,6 +3,7 @@ package api_impl
|
|||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"math"
|
"math"
|
||||||
@ -76,25 +77,10 @@ func (f *Flamenco) SubmitJob(e echo.Context) error {
|
|||||||
logger.Info().Msg("new Flamenco job received")
|
logger.Info().Msg("new Flamenco job received")
|
||||||
|
|
||||||
ctx := e.Request().Context()
|
ctx := e.Request().Context()
|
||||||
submittedJob := api.SubmittedJob(job)
|
authoredJob, err := f.compileSubmittedJob(ctx, logger, api.SubmittedJob(job))
|
||||||
|
|
||||||
// Replace the special "manager" platform with the Manager's actual platform.
|
|
||||||
if submittedJob.SubmitterPlatform == "manager" {
|
|
||||||
submittedJob.SubmitterPlatform = runtime.GOOS
|
|
||||||
}
|
|
||||||
|
|
||||||
if submittedJob.TypeEtag == nil || *submittedJob.TypeEtag == "" {
|
|
||||||
logger.Warn().Msg("job submitted without job type etag, refresh the job types in the Blender add-on")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Before compiling the job, replace the two-way variables. This ensures all
|
|
||||||
// the tasks also use those.
|
|
||||||
replaceTwoWayVariables(f.config, &submittedJob)
|
|
||||||
|
|
||||||
authoredJob, err := f.jobCompiler.Compile(ctx, submittedJob)
|
|
||||||
switch {
|
switch {
|
||||||
case errors.Is(err, job_compilers.ErrJobTypeBadEtag):
|
case errors.Is(err, job_compilers.ErrJobTypeBadEtag):
|
||||||
logger.Warn().Err(err).Msg("rejecting submitted job because its settings are outdated, refresh the job type")
|
logger.Info().Err(err).Msg("rejecting submitted job because its settings are outdated, refresh the job type")
|
||||||
return sendAPIError(e, http.StatusPreconditionFailed, "rejecting job because its settings are outdated, refresh the job type")
|
return sendAPIError(e, http.StatusPreconditionFailed, "rejecting job because its settings are outdated, refresh the job type")
|
||||||
case err != nil:
|
case err != nil:
|
||||||
logger.Warn().Err(err).Msg("error compiling job")
|
logger.Warn().Err(err).Msg("error compiling job")
|
||||||
@ -125,6 +111,55 @@ func (f *Flamenco) SubmitJob(e echo.Context) error {
|
|||||||
return e.JSON(http.StatusOK, apiJob)
|
return e.JSON(http.StatusOK, apiJob)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *Flamenco) SubmitJobCheck(e echo.Context) error {
|
||||||
|
logger := requestLogger(e)
|
||||||
|
|
||||||
|
var job api.SubmitJobCheckJSONRequestBody
|
||||||
|
if err := e.Bind(&job); err != nil {
|
||||||
|
logger.Warn().Err(err).Msg("bad request received")
|
||||||
|
return sendAPIError(e, http.StatusBadRequest, "invalid format")
|
||||||
|
}
|
||||||
|
|
||||||
|
logger = logger.With().
|
||||||
|
Str("type", job.Type).
|
||||||
|
Str("name", job.Name).
|
||||||
|
Logger()
|
||||||
|
logger.Info().Msg("checking Flamenco job")
|
||||||
|
|
||||||
|
ctx := e.Request().Context()
|
||||||
|
submittedJob := api.SubmittedJob(job)
|
||||||
|
_, err := f.compileSubmittedJob(ctx, logger, submittedJob)
|
||||||
|
switch {
|
||||||
|
case errors.Is(err, job_compilers.ErrJobTypeBadEtag):
|
||||||
|
logger.Warn().Err(err).Msg("rejecting submitted job because its settings are outdated, refresh the job type")
|
||||||
|
return sendAPIError(e, http.StatusPreconditionFailed, "rejecting job because its settings are outdated, refresh the job type")
|
||||||
|
case err != nil:
|
||||||
|
logger.Warn().Err(err).Msg("error compiling job")
|
||||||
|
// TODO: make this a more specific error object for this API call.
|
||||||
|
return sendAPIError(e, http.StatusBadRequest, err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
return e.NoContent(http.StatusNoContent)
|
||||||
|
}
|
||||||
|
|
||||||
|
// compileSubmittedJob performs some processing of the job and compiles it.
|
||||||
|
func (f *Flamenco) compileSubmittedJob(ctx context.Context, logger zerolog.Logger, submittedJob api.SubmittedJob) (*job_compilers.AuthoredJob, error) {
|
||||||
|
// Replace the special "manager" platform with the Manager's actual platform.
|
||||||
|
if submittedJob.SubmitterPlatform == "manager" {
|
||||||
|
submittedJob.SubmitterPlatform = runtime.GOOS
|
||||||
|
}
|
||||||
|
|
||||||
|
if submittedJob.TypeEtag == nil || *submittedJob.TypeEtag == "" {
|
||||||
|
logger.Warn().Msg("job submitted without job type etag, refresh the job types in the Blender add-on")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Before compiling the job, replace the two-way variables. This ensures all
|
||||||
|
// the tasks also use those.
|
||||||
|
replaceTwoWayVariables(f.config, &submittedJob)
|
||||||
|
|
||||||
|
return f.jobCompiler.Compile(ctx, submittedJob)
|
||||||
|
}
|
||||||
|
|
||||||
// SetJobStatus is used by the web interface to change a job's status.
|
// SetJobStatus is used by the web interface to change a job's status.
|
||||||
func (f *Flamenco) SetJobStatus(e echo.Context, jobID string) error {
|
func (f *Flamenco) SetJobStatus(e echo.Context, jobID string) error {
|
||||||
logger := requestLogger(e)
|
logger := requestLogger(e)
|
||||||
|
@ -283,6 +283,52 @@ func TestGetJobTypeUnknown(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestSubmitJobCheckWithEtag(t *testing.T) {
|
||||||
|
mockCtrl := gomock.NewController(t)
|
||||||
|
defer mockCtrl.Finish()
|
||||||
|
|
||||||
|
mf := newMockedFlamenco(mockCtrl)
|
||||||
|
|
||||||
|
submittedJob := api.SubmittedJob{
|
||||||
|
Name: "поднео посао",
|
||||||
|
Type: "test",
|
||||||
|
Priority: 50,
|
||||||
|
SubmitterPlatform: "linux",
|
||||||
|
TypeEtag: ptr("bad etag"),
|
||||||
|
}
|
||||||
|
|
||||||
|
mf.jobCompiler.EXPECT().Compile(gomock.Any(), submittedJob).
|
||||||
|
Return(nil, job_compilers.ErrJobTypeBadEtag)
|
||||||
|
mf.expectConvertTwoWayVariables(t, config.VariableAudienceWorkers, "linux", map[string]string{}).AnyTimes()
|
||||||
|
|
||||||
|
// Expect the job to be rejected.
|
||||||
|
{
|
||||||
|
echoCtx := mf.prepareMockedJSONRequest(submittedJob)
|
||||||
|
err := mf.flamenco.SubmitJobCheck(echoCtx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
assertResponseAPIError(t, echoCtx,
|
||||||
|
http.StatusPreconditionFailed, "rejecting job because its settings are outdated, refresh the job type")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Expect the job compiler to be called.
|
||||||
|
authoredJob := job_compilers.AuthoredJob{
|
||||||
|
JobID: "afc47568-bd9d-4368-8016-e91d945db36d",
|
||||||
|
Name: submittedJob.Name,
|
||||||
|
JobType: submittedJob.Type,
|
||||||
|
Priority: submittedJob.Priority,
|
||||||
|
Status: api.JobStatusUnderConstruction,
|
||||||
|
Created: mf.clock.Now(),
|
||||||
|
}
|
||||||
|
mf.jobCompiler.EXPECT().Compile(gomock.Any(), gomock.Any()).Return(&authoredJob, nil)
|
||||||
|
|
||||||
|
{ // Expect the job with the right etag to be accepted.
|
||||||
|
submittedJob.TypeEtag = ptr("correct etag")
|
||||||
|
echoCtx := mf.prepareMockedJSONRequest(submittedJob)
|
||||||
|
err := mf.flamenco.SubmitJobCheck(echoCtx)
|
||||||
|
assert.NoError(t, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestGetJobTypeError(t *testing.T) {
|
func TestGetJobTypeError(t *testing.T) {
|
||||||
mockCtrl := gomock.NewController(t)
|
mockCtrl := gomock.NewController(t)
|
||||||
defer mockCtrl.Finish()
|
defer mockCtrl.Finish()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user