diff --git a/cmd/flamenco-worker-poc/registration.go b/cmd/flamenco-worker-poc/registration.go index 3572c0c8..686be44a 100644 --- a/cmd/flamenco-worker-poc/registration.go +++ b/cmd/flamenco-worker-poc/registration.go @@ -47,6 +47,8 @@ func registerOrSignOn(ctx context.Context, configWrangler worker.FileConfigWrang log.Fatal().Err(err).Msg("loading configuration") } + log.Info().Interface("config", cfg).Msg("loaded configuration") + if cfg.Manager == "" { log.Fatal().Msg("no manager configured") } @@ -126,11 +128,12 @@ func register(ctx context.Context, cfg worker.WorkerConfig, client api.ClientWit // signOn tells the Manager we're alive and returns the status the Manager tells us to go to. func signOn(ctx context.Context, cfg worker.WorkerConfig, client api.ClientWithResponsesInterface) (api.WorkerStatus, error) { logger := log.With().Str("manager", cfg.Manager).Logger() - logger.Info().Msg("signing on at Manager") + logger.Info().Interface("taskTypes", cfg.TaskTypes).Msg("signing on at Manager") req := api.SignOnJSONRequestBody{ Nickname: mustHostname(), SupportedTaskTypes: cfg.TaskTypes, + SoftwareVersion: appinfo.ApplicationVersion, } resp, err := client.SignOnWithResponse(ctx, req) if err != nil { diff --git a/internal/manager/api_impl/api_impl.go b/internal/manager/api_impl/api_impl.go index a03fc3c7..dd25efd4 100644 --- a/internal/manager/api_impl/api_impl.go +++ b/internal/manager/api_impl/api_impl.go @@ -43,6 +43,7 @@ type PersistenceService interface { CreateWorker(ctx context.Context, w *persistence.Worker) error FetchWorker(ctx context.Context, uuid string) (*persistence.Worker, error) + SaveWorker(ctx context.Context, w *persistence.Worker) error SaveWorkerStatus(ctx context.Context, w *persistence.Worker) error // ScheduleTask finds a task to execute by the given worker, and assigns it to that worker. diff --git a/internal/manager/api_impl/workers.go b/internal/manager/api_impl/workers.go index 1b8bd163..303881eb 100644 --- a/internal/manager/api_impl/workers.go +++ b/internal/manager/api_impl/workers.go @@ -89,14 +89,8 @@ func (f *Flamenco) SignOn(e echo.Context) error { } logger.Info().Msg("worker signing on") - - w := requestWorkerOrPanic(e) - w.Status = api.WorkerStatusStarting - err = f.persist.SaveWorkerStatus(e.Request().Context(), w) + w, err := f.workerUpdateAfterSignOn(e, req) if err != nil { - logger.Warn().Err(err). - Str("newStatus", string(w.Status)). - Msg("error storing Worker in database") return sendAPIError(e, http.StatusInternalServerError, "error storing worker in database") } @@ -109,6 +103,33 @@ func (f *Flamenco) SignOn(e echo.Context) error { return e.JSON(http.StatusOK, resp) } +func (f *Flamenco) workerUpdateAfterSignOn(e echo.Context, update api.SignOnJSONBody) (*persistence.Worker, error) { + logger := requestLogger(e) + w := requestWorkerOrPanic(e) + + // Update the worker for with the new sign-on info. + w.Status = api.WorkerStatusStarting + w.Address = e.RealIP() + w.Name = update.Nickname + + // Remove trailing spaces from task types, and convert to lower case. + for idx := range update.SupportedTaskTypes { + update.SupportedTaskTypes[idx] = strings.TrimSpace(strings.ToLower(update.SupportedTaskTypes[idx])) + } + w.SupportedTaskTypes = strings.Join(update.SupportedTaskTypes, ",") + + // Save the new Worker info to the database. + err := f.persist.SaveWorker(e.Request().Context(), w) + if err != nil { + logger.Warn().Err(err). + Str("newStatus", string(w.Status)). + Msg("error storing Worker in database") + return nil, err + } + + return w, nil +} + func (f *Flamenco) SignOff(e echo.Context) error { logger := requestLogger(e) diff --git a/internal/manager/persistence/workers.go b/internal/manager/persistence/workers.go index a3a53215..4c1f3ef0 100644 --- a/internal/manager/persistence/workers.go +++ b/internal/manager/persistence/workers.go @@ -52,7 +52,7 @@ func (w *Worker) TaskTypes() []string { func (db *DB) CreateWorker(ctx context.Context, w *Worker) error { if err := db.gormDB.Create(w).Error; err != nil { - return fmt.Errorf("error creating new worker: %v", err) + return fmt.Errorf("error creating new worker: %w", err) } return nil } @@ -67,8 +67,15 @@ func (db *DB) FetchWorker(ctx context.Context, uuid string) (*Worker, error) { } func (db *DB) SaveWorkerStatus(ctx context.Context, w *Worker) error { - if err := db.gormDB.Model(w).Updates(Worker{Status: w.Status}).Error; err != nil { - return fmt.Errorf("error saving worker: %v", err) + if err := db.gormDB.Model(w).Select("status").Updates(Worker{Status: w.Status}).Error; err != nil { + return fmt.Errorf("error saving worker: %w", err) + } + return nil +} + +func (db *DB) SaveWorker(ctx context.Context, w *Worker) error { + if err := db.gormDB.Save(w).Error; err != nil { + return fmt.Errorf("error saving worker: %w", err) } return nil } diff --git a/internal/manager/persistence/workers_test.go b/internal/manager/persistence/workers_test.go index 767d59db..9d879a01 100644 --- a/internal/manager/persistence/workers_test.go +++ b/internal/manager/persistence/workers_test.go @@ -66,3 +66,62 @@ func TestCreateFetchWorker(t *testing.T) { assert.EqualValues(t, w.SupportedTaskTypes, fetchedWorker.SupportedTaskTypes) } + +func TestSaveWorker(t *testing.T) { + db := CreateTestDB(t) + + ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second) + defer cancel() + + w := Worker{ + UUID: uuid.New().String(), + Name: "дрон", + Address: "fe80::5054:ff:fede:2ad7", + LastActivity: "", + Platform: "linux", + Software: "3.0", + Status: api.WorkerStatusAwake, + SupportedTaskTypes: "blender,ffmpeg,file-management", + } + + err := db.CreateWorker(ctx, &w) + assert.NoError(t, err) + + fetchedWorker, err := db.FetchWorker(ctx, w.UUID) + assert.NoError(t, err) + assert.NotNil(t, fetchedWorker) + + // Update all updatable fields of the Worker + updatedWorker := *fetchedWorker + updatedWorker.Name = "7 မှ 9" + updatedWorker.Address = "fe80::cafe:f00d" + updatedWorker.LastActivity = "Rendering" + updatedWorker.Platform = "windows" + updatedWorker.Software = "3.1" + updatedWorker.Status = api.WorkerStatusAsleep + updatedWorker.SupportedTaskTypes = "blender,ffmpeg,file-management,misc" + + // Saving only the status should just do that. + err = db.SaveWorkerStatus(ctx, &updatedWorker) + assert.NoError(t, err) + assert.Equal(t, "7 မှ 9", updatedWorker.Name, "Saving status should not touch the name") + + // Check saved worker + fetchedWorker, err = db.FetchWorker(ctx, w.UUID) + assert.NoError(t, err) + assert.NotNil(t, fetchedWorker) + assert.Equal(t, updatedWorker.Status, fetchedWorker.Status, "new status should have been saved") + assert.NotEqual(t, updatedWorker.Name, fetchedWorker.Name, "non-status fields should not have been updated") + + // Saving the entire worker should save everything. + err = db.SaveWorker(ctx, &updatedWorker) + assert.NoError(t, err) + + // Check saved worker + fetchedWorker, err = db.FetchWorker(ctx, w.UUID) + assert.NoError(t, err) + assert.NotNil(t, fetchedWorker) + assert.Equal(t, updatedWorker.Status, fetchedWorker.Status, "new status should have been saved") + assert.Equal(t, updatedWorker.Name, fetchedWorker.Name, "non-status fields should also have been updated") + assert.Equal(t, updatedWorker.Software, fetchedWorker.Software, "non-status fields should also have been updated") +} diff --git a/internal/worker/config.go b/internal/worker/config.go index 8a5b321a..d7f726cd 100644 --- a/internal/worker/config.go +++ b/internal/worker/config.go @@ -60,7 +60,7 @@ func NewConfigWrangler() FileConfigWrangler { func (fcw FileConfigWrangler) DefaultConfig() WorkerConfig { return WorkerConfig{ Manager: "", - TaskTypes: []string{"sleep", "blender-render", "file-management", "exr-merge", "debug"}, + TaskTypes: []string{"sleep", "blender", "file-management", "exr-merge", "debug"}, } } diff --git a/internal/worker/state_asleep.go b/internal/worker/state_asleep.go index ee1c2a83..bdd48e14 100644 --- a/internal/worker/state_asleep.go +++ b/internal/worker/state_asleep.go @@ -56,8 +56,8 @@ func (w *Worker) runStateAsleep(ctx context.Context) { return case <-time.After(durationSleepCheck): } - if !w.isState(api.WorkerStatusAwake) { - logger.Debug().Msg("state fetching interrupted by state change") + if !w.isState(api.WorkerStatusAsleep) { + logger.Debug().Str("newStatus", string(w.state)).Msg("state fetching interrupted by state change") return } diff --git a/pkg/api/flamenco-manager.yaml b/pkg/api/flamenco-manager.yaml index fb6819b9..d09c4a25 100644 --- a/pkg/api/flamenco-manager.yaml +++ b/pkg/api/flamenco-manager.yaml @@ -289,7 +289,8 @@ components: supported_task_types: type: array items: {type: string} - required: [nickname, supported_task_types] + software_version: {type: string} + required: [nickname, supported_task_types, software_version] WorkerStateChange: type: object diff --git a/pkg/api/openapi_spec.gen.go b/pkg/api/openapi_spec.gen.go index 6295ca6e..0d104f1e 100644 --- a/pkg/api/openapi_spec.gen.go +++ b/pkg/api/openapi_spec.gen.go @@ -18,61 +18,62 @@ import ( // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "XNc2bDQAAA==", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/pkg/api/openapi_types.gen.go b/pkg/api/openapi_types.gen.go index 227d16f1..263cd021 100644 --- a/pkg/api/openapi_types.gen.go +++ b/pkg/api/openapi_types.gen.go @@ -254,6 +254,7 @@ type WorkerRegistration struct { // WorkerSignOn defines model for WorkerSignOn. type WorkerSignOn struct { Nickname string `json:"nickname"` + SoftwareVersion string `json:"software_version"` SupportedTaskTypes []string `json:"supported_task_types"` }