diff --git a/internal/manager/api_impl/workers.go b/internal/manager/api_impl/workers.go index 3f704f3b..2a002e40 100644 --- a/internal/manager/api_impl/workers.go +++ b/internal/manager/api_impl/workers.go @@ -180,8 +180,13 @@ func (f *Flamenco) SignOff(e echo.Context) error { // (GET /api/worker/state) func (f *Flamenco) WorkerState(e echo.Context) error { + logger := requestLogger(e) worker := requestWorkerOrPanic(e) + if err := f.workerSeen(logger, worker); err != nil { + return sendAPIError(e, http.StatusInternalServerError, "error marking worker as 'seen'") + } + if worker.StatusRequested == "" { return e.NoContent(http.StatusNoContent) } diff --git a/internal/manager/api_impl/workers_test.go b/internal/manager/api_impl/workers_test.go index d20c5c5b..a077edee 100644 --- a/internal/manager/api_impl/workers_test.go +++ b/internal/manager/api_impl/workers_test.go @@ -271,6 +271,42 @@ func TestWorkerSignoffStatusChangeRequest(t *testing.T) { assertResponseNoContent(t, echo) } +func TestWorkerState(t *testing.T) { + mockCtrl := gomock.NewController(t) + defer mockCtrl.Finish() + + mf := newMockedFlamenco(mockCtrl) + worker := testWorker() + + mf.persistence.EXPECT().WorkerSeen(gomock.Any(), &worker).Times(2) + + // No state change requested. + { + echo := mf.prepareMockedRequest(nil) + requestWorkerStore(echo, &worker) + err := mf.flamenco.WorkerState(echo) + if assert.NoError(t, err) { + assertResponseNoContent(t, echo) + } + } + + // State change requested. + { + requestStatus := api.WorkerStatusAsleep + worker.StatusChangeRequest(requestStatus, false) + + echo := mf.prepareMockedRequest(nil) + requestWorkerStore(echo, &worker) + + err := mf.flamenco.WorkerState(echo) + if assert.NoError(t, err) { + assertResponseJSON(t, echo, http.StatusOK, api.WorkerStateChange{ + StatusRequested: requestStatus, + }) + } + } +} + func TestWorkerStateChanged(t *testing.T) { mockCtrl := gomock.NewController(t) defer mockCtrl.Finish()