From 02bc03ae2bf00f56b050d119117521b3bdf51f42 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Mon, 13 Jun 2022 15:11:24 +0200 Subject: [PATCH] Manager: replace `gorm.Model` with our own `persistence.Model` struct `persistence.Model` contains the common database fields for most model structs. It is a copy of `gorm.Model`, but without the `DeletedAt` field (which triggers Gorm's soft deletion). Soft deletion is not used by Flamenco. If it ever becomes necessary to support soft-deletion, see https://gorm.io/docs/delete.html#Soft-Delete --- internal/manager/api_impl/jobs_query_test.go | 3 +-- internal/manager/api_impl/support_test.go | 3 +-- internal/manager/persistence/db.go | 10 ++++++++++ internal/manager/persistence/jobs.go | 4 ++-- internal/manager/persistence/workers.go | 4 +--- .../task_state_machine/task_state_machine_test.go | 7 +++---- internal/manager/timeout_checker/tasks_test.go | 3 +-- internal/manager/timeout_checker/workers_test.go | 3 +-- 8 files changed, 20 insertions(+), 17 deletions(-) diff --git a/internal/manager/api_impl/jobs_query_test.go b/internal/manager/api_impl/jobs_query_test.go index 863d06c0..ee0b5946 100644 --- a/internal/manager/api_impl/jobs_query_test.go +++ b/internal/manager/api_impl/jobs_query_test.go @@ -10,7 +10,6 @@ import ( "git.blender.org/flamenco/pkg/api" "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "gorm.io/gorm" ) func TestFetchTask(t *testing.T) { @@ -24,7 +23,7 @@ func TestFetchTask(t *testing.T) { jobUUID := "8b179118-0189-478a-b463-73798409898c" dbTask := persistence.Task{ - Model: gorm.Model{ + Model: persistence.Model{ ID: 327, CreatedAt: mf.clock.Now().Add(-30 * time.Second), UpdatedAt: mf.clock.Now(), diff --git a/internal/manager/api_impl/support_test.go b/internal/manager/api_impl/support_test.go index f9c0f84a..c65501a9 100644 --- a/internal/manager/api_impl/support_test.go +++ b/internal/manager/api_impl/support_test.go @@ -16,7 +16,6 @@ import ( "github.com/golang/mock/gomock" "github.com/labstack/echo/v4" "github.com/stretchr/testify/assert" - "gorm.io/gorm" "git.blender.org/flamenco/internal/manager/api_impl/mocks" "git.blender.org/flamenco/internal/manager/persistence" @@ -143,7 +142,7 @@ func assertResponseEmpty(t *testing.T, echoCtx echo.Context) { func testWorker() persistence.Worker { return persistence.Worker{ - Model: gorm.Model{ID: 1}, + Model: persistence.Model{ID: 1}, UUID: "e7632d62-c3b8-4af0-9e78-01752928952c", Name: "дрон", Address: "fe80::5054:ff:fede:2ad7", diff --git a/internal/manager/persistence/db.go b/internal/manager/persistence/db.go index 489b7911..9f5bbf4b 100644 --- a/internal/manager/persistence/db.go +++ b/internal/manager/persistence/db.go @@ -21,6 +21,16 @@ type DB struct { gormDB *gorm.DB } +// Model contains the common database fields for most model structs. +// It is a copy of the gorm.Model struct, but without the `DeletedAt` field. +// Soft deletion is not used by Flamenco. If it ever becomes necessary to +// support soft-deletion, see https://gorm.io/docs/delete.html#Soft-Delete +type Model struct { + ID uint `gorm:"primarykey"` + CreatedAt time.Time + UpdatedAt time.Time +} + func OpenDB(ctx context.Context, dsn string) (*DB, error) { log.Info().Str("dsn", dsn).Msg("opening database") diff --git a/internal/manager/persistence/jobs.go b/internal/manager/persistence/jobs.go index 4f02d256..25f89379 100644 --- a/internal/manager/persistence/jobs.go +++ b/internal/manager/persistence/jobs.go @@ -16,7 +16,7 @@ import ( ) type Job struct { - gorm.Model + Model UUID string `gorm:"type:char(36);default:'';unique;index"` Name string `gorm:"type:varchar(64);default:''"` @@ -33,7 +33,7 @@ type StringInterfaceMap map[string]interface{} type StringStringMap map[string]string type Task struct { - gorm.Model + Model UUID string `gorm:"type:char(36);default:'';unique;index"` Name string `gorm:"type:varchar(64);default:''"` diff --git a/internal/manager/persistence/workers.go b/internal/manager/persistence/workers.go index b6258f83..50d1ef39 100644 --- a/internal/manager/persistence/workers.go +++ b/internal/manager/persistence/workers.go @@ -8,13 +8,11 @@ import ( "strings" "time" - "gorm.io/gorm" - "git.blender.org/flamenco/pkg/api" ) type Worker struct { - gorm.Model + Model UUID string `gorm:"type:char(36);default:'';unique;index;default:''"` Secret string `gorm:"type:varchar(255);default:''"` Name string `gorm:"type:varchar(64);default:''"` diff --git a/internal/manager/task_state_machine/task_state_machine_test.go b/internal/manager/task_state_machine/task_state_machine_test.go index 515f7f0c..ad2898b0 100644 --- a/internal/manager/task_state_machine/task_state_machine_test.go +++ b/internal/manager/task_state_machine/task_state_machine_test.go @@ -10,7 +10,6 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "gorm.io/gorm" "git.blender.org/flamenco/internal/manager/persistence" "git.blender.org/flamenco/internal/manager/task_state_machine/mocks" @@ -442,13 +441,13 @@ func (m *StateMachineMocks) expectBroadcastTaskChange( /* taskWithStatus() creates a task of a certain status, with a job of a certain status. */ func taskWithStatus(jobStatus api.JobStatus, taskStatus api.TaskStatus) *persistence.Task { job := persistence.Job{ - Model: gorm.Model{ID: 47}, + Model: persistence.Model{ID: 47}, UUID: "test-job-f3f5-4cef-9cd7-e67eb28eaf3e", Status: jobStatus, } task := persistence.Task{ - Model: gorm.Model{ID: 327}, + Model: persistence.Model{ID: 327}, UUID: "testtask-0001-4e28-aeea-8cbaf2fc96a5", JobID: job.ID, @@ -464,7 +463,7 @@ func taskWithStatus(jobStatus api.JobStatus, taskStatus api.TaskStatus) *persist func taskOfSameJob(task *persistence.Task, taskStatus api.TaskStatus) *persistence.Task { newTaskID := task.ID + 1 return &persistence.Task{ - Model: gorm.Model{ID: newTaskID}, + Model: persistence.Model{ID: newTaskID}, UUID: fmt.Sprintf("testtask-%04d-4e28-aeea-8cbaf2fc96a5", newTaskID), JobID: task.JobID, Job: task.Job, diff --git a/internal/manager/timeout_checker/tasks_test.go b/internal/manager/timeout_checker/tasks_test.go index 4aaa8fc1..654f601a 100644 --- a/internal/manager/timeout_checker/tasks_test.go +++ b/internal/manager/timeout_checker/tasks_test.go @@ -10,7 +10,6 @@ import ( "github.com/golang/mock/gomock" "github.com/stretchr/testify/assert" - "gorm.io/gorm" "git.blender.org/flamenco/internal/manager/persistence" "git.blender.org/flamenco/pkg/api" @@ -114,7 +113,7 @@ func TestTaskTimeout(t *testing.T) { worker := persistence.Worker{ UUID: "WORKER-UUID", Name: "Tester", - Model: gorm.Model{ID: 47}, + Model: persistence.Model{ID: 47}, } taskUnassigned := persistence.Task{ UUID: "TASK-UUID-UNASSIGNED", diff --git a/internal/manager/timeout_checker/workers_test.go b/internal/manager/timeout_checker/workers_test.go index c95eb44e..10c773ab 100644 --- a/internal/manager/timeout_checker/workers_test.go +++ b/internal/manager/timeout_checker/workers_test.go @@ -9,7 +9,6 @@ import ( "git.blender.org/flamenco/internal/manager/persistence" "git.blender.org/flamenco/pkg/api" "github.com/golang/mock/gomock" - "gorm.io/gorm" ) const workerTimeout = 20 * time.Minute @@ -31,7 +30,7 @@ func TestWorkerTimeout(t *testing.T) { worker := persistence.Worker{ UUID: "WORKER-UUID", Name: "Tester", - Model: gorm.Model{ID: 47}, + Model: persistence.Model{ID: 47}, LastSeenAt: lastSeenAt, Status: api.WorkerStatusAsleep, StatusRequested: api.WorkerStatusAwake,