Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision

Target

Select target project
  • oss/libraries/go/services/job-queues
1 result
Select Git revision
Show changes
# THIS FILE IS AUTOGENERATED BY THE DEVENVSHELL
# DO NOT EDIT THIS FILE MANUALLY
# INSTEAD EDIT THE DEVENVSHELL CONFIGURATION FILE devenv.nix
# AND OPEN A SHELL WITH THE COMMAND devenv shell
#
# Information about the task runner can be found here:
# https://taskfile.dev
version: '3'
tasks:
default:
cmds:
- task --list
silent: true
test:
desc: Execute unit tests in Go.
env:
TEST_BY_TASK: true
cmds:
- docker pull atmoz/sftp:alpine
- docker pull axllent/mailpit
- echo "Execute unit tests in Go."
- test-lib
test-fuzz:
desc: Conduct fuzzing tests.#
env:
TEST_BY_TASK: true
cmds:
- echo "Conduct fuzzing tests."
- go test -tags=runOnTask -v -fuzztime=30s -fuzz=Fuzz ./...
add-licenses:
desc: Attach license headers to Go files.
cmds:
- echo "Attach license headers to Go files."
- go install github.com/google/addlicense@latest
- addlicense -c "schukai GmbH" -s -l "AGPL-3.0" ./*.go
silent: true
check-licenses:
desc: Check license headers of Go files.
silent: true
cmds:
- go-licenses save "$(get-go-default-packages)" --ignore "gitlab.schukai.com" --force --save_path ${DEVENV_ROOT}/licenses/
check:
desc: Confirm repository status.
cmds:
- git diff-index --quiet HEAD || (echo "There are uncommitted changes after running make. Please commit or stash them before running make."; exit 1)
silent: true
commit:
desc: Commit changes to the repository.
aliases:
- c
- ci
- git-commit
cmds:
- do-git-commit
......@@ -15,10 +15,17 @@ import (
func TestWriteToDB1(t *testing.T) {
gormDB, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
gormDB.Logger = gormDB.Logger.LogMode(4)
......@@ -36,18 +43,17 @@ func TestWriteToDB1(t *testing.T) {
}
job.scheduler = scheduler
saver.Sync(job)
saver.Sync(job)
manager.WaitSync()
// check if stats are in database
time.Sleep(1 * time.Second)
var stats JobPersistence
err = gormDB.First(&stats, "id = ?", job.GetID()).Error
assert.Nil(t, err)
assert.Equal(t, job.GetID(), stats.ID)
assert.Equal(t, job.GetID(), stats.ID)
manager.WaitSync()
}
......@@ -9,38 +9,33 @@ import (
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"runtime"
"sync"
"testing"
"time"
)
func TestWriteToDB2(t *testing.T) {
gormDB, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
gormDB.Logger = gormDB.Logger.LogMode(4)
manager := &Manager{database: gormDB}
// Starte den DBSaver
NewJobSyncer(manager)
db := gormDB
var wg sync.WaitGroup
wg.Add(1)
defer wg.Done()
mgr := NewManager()
mgr.SetDB(gormDB)
// run sub tests
wg.Add(1)
defer wg.Done()
worker := NewLocalWorker(1)
err = mgr.AddWorker(worker)
assert.Nil(t, err)
......@@ -54,66 +49,73 @@ func TestWriteToDB2(t *testing.T) {
scheduler := &InstantScheduler{}
err = mgr.ScheduleJob(job, scheduler)
assert.Nil(t, err)
_ = manager.WaitSync()
err = mgr.CancelJobSchedule("job1")
assert.Nil(t, err)
_ = manager.WaitSync()
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
scheduler2 := &InstantScheduler{}
err = mgr.ScheduleJob(job, scheduler2)
assert.Nil(t, err)
_ = manager.WaitSync()
err = mgr.CancelJobSchedule("job1")
assert.Nil(t, err)
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
scheduler3 := &InstantScheduler{}
err = mgr.ScheduleJob(job, scheduler3)
assert.Nil(t, err)
_ = manager.WaitSync()
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
if mgr.jobSyncer == nil {
t.Error("mgr.JobSyncer == nil")
return
}
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
mgr.jobSyncer.Sync(job)
_ = mgr.jobSyncer.Sync(job)
_ = manager.WaitSync()
runtime.Gosched()
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
err = mgr.CancelJobSchedule("job1")
assert.Nil(t, err)
runtime.Gosched()
time.Sleep(1 * time.Second)
// time.Sleep(1 * time.Second)
_ = manager.WaitSync()
scheduler4 := &InstantScheduler{}
err = mgr.ScheduleJob(job, scheduler4)
assert.Nil(t, err)
_ = manager.WaitSync()
runtime.Gosched()
time.Sleep(1 * time.Second)
//time.Sleep(1 * time.Second)
mgr.jobSyncer.Sync(job)
_ = mgr.jobSyncer.Sync(job)
_ = manager.WaitSync()
time.Sleep(2 * time.Second)
//time.Sleep(2 * time.Second)
err = mgr.CancelJobSchedule("job1")
assert.Nil(t, err)
_ = manager.WaitSync()
tries := 10
for tries > 0 {
var tmpJob JobPersistence
if err := db.First(&tmpJob, "id = ?", "job1").Error; err == nil {
break
}
tries--
time.Sleep(1 * time.Second)
......@@ -121,11 +123,10 @@ func TestWriteToDB2(t *testing.T) {
assert.True(t, tries > 0)
time.Sleep(1 * time.Second)
err = LoadJobsAndScheduleFromDatabase(db, mgr)
assert.Nil(t, err)
_ = manager.WaitSync()
time.Sleep(1 * time.Second)
mgr.jobSyncer.Sync(job)
}
......@@ -14,11 +14,19 @@ import (
func TestWriteToDB3(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
db.Logger = db.Logger.LogMode(4)
manager := NewManager()
......
......@@ -12,11 +12,19 @@ import (
func TestWriteToDB4(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
//db, err := gorm.Open(sqlite.Open("file:/home/vs/workspaces/alvine/cloud/framework/dummy.sqlite"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("an error occurred while opening the database: %v", err)
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
manager := NewManager()
manager.SetDB(db)
......
......@@ -11,10 +11,19 @@ import (
func TestWriteToDB5(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
manager := NewManager()
manager.SetDB(db)
......
......@@ -7,7 +7,7 @@ package jobqueue
import (
"fmt"
"github.com/stretchr/testify/assert"
"gorm.io/driver/mysql"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"testing"
"time"
......@@ -20,8 +20,22 @@ func TestWriteToDB6(t *testing.T) {
// docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=my-secret-pw -e MYSQL_DATABASE=testdb -p 3306:3306 -d mysql:latest && \
// docker logs -f mysql-test
dsn := "root:my-secret-pw@tcp(localhost:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
//dsn := "root:my-secret-pw@tcp(localhost:3306)/testdb?charset=utf8mb4&parseTime=True&loc=Local"
//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
manager := NewManager()
manager.SetDB(db)
......
......@@ -11,8 +11,19 @@ import (
)
func TestCreateOrUpdateJob(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
assert.NoError(t, err)
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
// Migrate the schema
assert.NoError(t, db.AutoMigrate(&JobPersistence{}, &JobLog{}, &JobStats{}))
......@@ -20,7 +31,7 @@ func TestCreateOrUpdateJob(t *testing.T) {
runner := &CounterRunnable{}
job := NewJob[CounterResult]("job1", runner)
assert.NoError(t, saveJob(job, db))
assert.NoError(t, saveJob(job.GetPersistence(), db))
var jobPersistence JobPersistence
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
......@@ -29,7 +40,7 @@ func TestCreateOrUpdateJob(t *testing.T) {
assert.Equal(t, "", jobPersistence.Description)
assert.Equal(t, Priority(1), jobPersistence.Priority)
job.description = "Updated description"
assert.NoError(t, saveJob(job, db))
assert.NoError(t, saveJob(job.GetPersistence(), db))
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
assert.Equal(t, "Updated description", jobPersistence.Description)
......
......@@ -7,31 +7,39 @@ import (
"github.com/stretchr/testify/assert"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
"log"
"os"
"testing"
"time"
)
func TestUpdateJob(t *testing.T) {
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{})
assert.NoError(t, err)
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
assert.NoError(t, db.AutoMigrate(&JobPersistence{}, &JobLog{}, &JobStats{}))
runner := &CounterRunnable{}
job := NewJob[CounterResult]("job1", runner)
assert.NoError(t, saveJob(job, db))
assert.NoError(t, saveJob(job.GetPersistence(), db))
job.SetPriority(PriorityHigh)
assert.NoError(t, updateJob(job, db))
assert.NoError(t, updateJob(job.GetPersistence(), db))
var jobPersistence JobPersistence
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
assert.Equal(t, PriorityDefault, jobPersistence.Priority) // PriorityDefault because the update should not update the priority
assert.NoError(t, saveJob(job, db))
assert.NoError(t, saveJob(job.GetPersistence(), db))
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
assert.Equal(t, PriorityHigh, jobPersistence.Priority)
......@@ -43,19 +51,19 @@ func TestUpdateJob(t *testing.T) {
func TestCheckAndSaveOrUpdate(t *testing.T) {
newLogger := logger.New(
log.New(os.Stdout, "\r\n", log.LstdFlags),
logger.Config{
SlowThreshold: time.Second,
LogLevel: logger.Info,
Colorful: true,
},
)
db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{
Logger: newLogger,
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
assert.NoError(t, err)
db := gormDB
assert.NoError(t, db.AutoMigrate(&JobPersistence{}, &JobLog{}, &JobStats{}))
......@@ -66,13 +74,13 @@ func TestCheckAndSaveOrUpdate(t *testing.T) {
var jobPersistence JobPersistence
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job))
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence()))
jobPersistence = JobPersistence{}
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
assert.Equal(t, PriorityDefault, jobPersistence.Priority)
job.SetPriority(PriorityHigh)
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job))
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence()))
jobPersistence = JobPersistence{}
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
assert.Equal(t, PriorityDefault, jobPersistence.Priority) // second update should not update the priority, because update only update stats and logs
......@@ -94,10 +102,10 @@ func TestCheckAndSaveOrUpdate(t *testing.T) {
JobID: job.GetID(),
}}
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job))
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence()))
job.stats.RunCount = 9
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job))
assert.NoError(t, syncer.CheckAndSaveOrUpdate(job.GetPersistence()))
jobPersistence = JobPersistence{}
assert.NoError(t, db.First(&jobPersistence, "id = ?", job.GetID()).Error)
......
......@@ -5,12 +5,13 @@ package jobqueue
import (
"errors"
"fmt"
"gorm.io/gorm"
"strings"
"time"
)
func (s *JobSyncer) CheckAndSaveOrUpdate(job GenericJob) error {
func (s *JobSyncer) CheckAndSaveOrUpdate(job JobPersistence) error {
s.mu.Lock()
defer s.mu.Unlock()
......@@ -18,11 +19,10 @@ func (s *JobSyncer) CheckAndSaveOrUpdate(job GenericJob) error {
return ErrNoDatabaseConnection
}
permJob := job.GetPersistence()
db := s.manager.database
fmt.Println("Database: ", db)
var existing JobPersistence
result := db.Where("id = ?", permJob.ID).First(&existing)
result := db.Where("id = ?", job.GetID()).First(&existing)
if result.Error == nil {
return updateJob(job, db)
......@@ -88,7 +88,7 @@ func (s *JobSyncer) ResetStats(job GenericJob) error {
if s.manager == nil || s.manager.database == nil {
return ErrNoDatabaseConnection
}
return updateJob(job, s.manager.database)
return updateJob(job.GetPersistence(), s.manager.database)
}
......@@ -98,21 +98,19 @@ func (s *JobSyncer) UpdateJob(job GenericJob) error {
if s.manager == nil || s.manager.database == nil {
return ErrNoDatabaseConnection
}
return updateJob(job, s.manager.database)
return updateJob(job.GetPersistence(), s.manager.database)
}
func updateJob(job GenericJob, db *gorm.DB) error {
func updateJob(job JobPersistence, db *gorm.DB) error {
if db == nil {
return ErrNoDatabaseConnection
}
permJob := job.GetPersistence()
maxRetries := 3
var attempt int
for attempt = 0; attempt < maxRetries; attempt++ {
err := update(&permJob, db)
err := update(&job, db)
if err != nil {
if strings.Contains(err.Error(), "lock") {
time.Sleep(time.Millisecond * 100)
......@@ -154,7 +152,7 @@ func update(job *JobPersistence, db *gorm.DB) error {
}
}
for i, _ := range job.Logs {
for i := range job.Logs {
job.Logs[i].LogID = 0
_ = tx.Create(&job.Logs[i])
// no error handling, if it fails, it fails
......@@ -170,7 +168,7 @@ func (s *JobSyncer) SaveJob(job GenericJob) error {
if s.manager == nil || s.manager.database == nil {
return ErrNoDatabaseConnection
}
return saveJob(job, s.manager.database)
return saveJob(job.GetPersistence(), s.manager.database)
}
func save(job *JobPersistence, db *gorm.DB) error {
......@@ -181,23 +179,33 @@ func save(job *JobPersistence, db *gorm.DB) error {
return db.Transaction(func(tx *gorm.DB) error {
var existingJob JobPersistence
if err := tx.First(&existingJob, "id = ?", job.ID).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
if err := tx.Create(job).Error; err != nil {
return ErrFailedToCreate
}
} else {
return ErrFailedToQueryExistingJob
}
} else {
if err := tx.Save(job).Error; err != nil {
return err
return ErrFailedToSaveJob
}
}
if job.Stats != (JobStats{}) {
job.Stats.JobID = job.ID
if job.Stats.RunCount == 0 {
Info("Stats runCount is 0, skipping update")
}
if err := tx.Save(&job.Stats).Error; err != nil {
if err := tx.Model(job.Stats).
Select("*").
Omit("job_id", "created_at").
Updates(job.Stats).Error; err != nil {
return err
}
}
for i, _ := range job.Logs {
for i := range job.Logs {
job.Logs[i].LogID = 0
_ = tx.Create(&job.Logs[i])
// no error handling, if it fails, it fails
......@@ -207,18 +215,16 @@ func save(job *JobPersistence, db *gorm.DB) error {
})
}
func saveJob(job GenericJob, db *gorm.DB) error {
func saveJob(job JobPersistence, db *gorm.DB) error {
if db == nil {
return ErrNoDatabaseConnection
}
permJob := job.GetPersistence()
maxRetries := 3
var attempt int
for attempt = 0; attempt < maxRetries; attempt++ {
err := save(&permJob, db)
err := save(&job, db)
if err != nil {
if strings.Contains(err.Error(), "lock") {
time.Sleep(time.Millisecond * 100)
......
......@@ -12,8 +12,19 @@ import (
)
func TestDeleteJob(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
db.Logger = db.Logger.LogMode(4)
assert.Nil(t, err)
......@@ -27,7 +38,7 @@ func TestDeleteJob(t *testing.T) {
// Erstelle einen Job zum Löschen
runner := &CounterRunnable{}
job := NewJob[CounterResult]("testJobID", runner)
err = saveJob(job, db)
err = saveJob(job.GetPersistence(), db)
assert.Nil(t, err)
var count int64
......@@ -42,9 +53,21 @@ func TestDeleteJob(t *testing.T) {
db.Model(&JobPersistence{}).Where("id = ?", "testJobID").Count(&count)
assert.Equal(t, int64(0), count)
}
func TestResetLogs(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
assert.Nil(t, err)
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
db.Logger = db.Logger.LogMode(4)
......@@ -59,7 +82,7 @@ func TestResetLogs(t *testing.T) {
// Erstelle einen Job und füge einige Logs hinzu
runner := &CounterRunnable{}
job := NewJob[CounterResult]("testJobID", runner)
err = saveJob(job, db)
err = saveJob(job.GetPersistence(), db)
assert.Nil(t, err)
// Füge Logs zum Job hinzu
......@@ -84,8 +107,19 @@ func TestResetLogs(t *testing.T) {
}
func TestResetStats(t *testing.T) {
db, err := gorm.Open(sqlite.Open("file::memory:?cache=shared"), &gorm.Config{})
assert.Nil(t, err)
gormDB, err := gorm.Open(sqlite.Open("file:unique_id?mode=memory&cache=shared"), &gorm.Config{})
if err != nil {
t.Fatalf("a error occurred while opening the database: %v", err)
}
t.Cleanup(func() {
sqlDB, err := gormDB.DB()
if err != nil {
t.Fatalf("failed to get generic database object from GORM DB: %v", err)
}
_ = sqlDB.Close()
})
db := gormDB
db.Logger = db.Logger.LogMode(4)
......@@ -100,7 +134,7 @@ func TestResetStats(t *testing.T) {
// Erstelle einen Job und setze einige Statistiken
runner := &CounterRunnable{}
job := NewJob[CounterResult]("testJobID", runner)
err = saveJob(job, db)
err = saveJob(job.GetPersistence(), db)
assert.Nil(t, err)
// Aktualisiere die Job-Statistiken
......
This diff is collapsed.
inputs:
nixpkgs:
url: github:nixos/nixpkgs/nixos-23.11
version:
url: git+https://gitlab.schukai.com/oss/utilities/version.git
flake: true
......@@ -43,7 +43,7 @@ var (
ErrSchedulerNotSet = fmt.Errorf("scheduler is not set")
ErrJobNotActive = fmt.Errorf("job is not active")
ErrJobAlreadyActive = fmt.Errorf("job is already active")
ErrChannelAlreadyClosed = fmt.Errorf("channel is already closed")
ErrChannelAlreadyClosed = fmt.Errorf("the channel is already closed")
ErrUnknownScheduleType = fmt.Errorf("unknown schedule type")
ErrNoManager = fmt.Errorf("no manager")
ErrCannotLoadStatsFromDatabase = fmt.Errorf("errors while loading stats from database")
......@@ -54,4 +54,12 @@ var (
ErrJobSyncerNotRunning = fmt.Errorf("JobSyncer is not running")
ErrMaxRetriesReached = fmt.Errorf("maximum number of retries reached")
ErrTimeoutReached = fmt.Errorf("timeout reached")
ErrFailedToCreate = fmt.Errorf("failed to create")
ErrFailedToQueryExistingJob = fmt.Errorf("failed to query an existing job")
ErrFailedToSaveJob = fmt.Errorf("failed to save a job")
ErrScheduleTimeIsInThePast = fmt.Errorf("scheduled time is in the past")
ErrParameterIsNil = fmt.Errorf("parameter is nil")
ErrJobIDEmpty = fmt.Errorf("job ID is empty")
ErrManagerNotInitialized = fmt.Errorf("manager is not initialized")
ErrJobSyncerNotInitialized = fmt.Errorf("JobSyncer is not initialized")
)
{
"nodes": {
"devenv": {
"locked": {
"dir": "src/modules",
"lastModified": 1713353943,
"narHash": "sha256-1gDYT+Hhqpnt+CDYL1h2huE07c6BCod6qlsaFNTPcn8=",
"owner": "cachix",
"repo": "devenv",
"rev": "5b933eb8522b61873e859c9c68de16330d8f5d8b",
"type": "github"
},
"original": {
"dir": "src/modules",
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1696426674,
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-utils": {
"inputs": {
"systems": "systems"
......@@ -51,34 +18,13 @@
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1709087332,
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1713145326,
"narHash": "sha256-m7+IWM6mkWOg22EC5kRUFCycXsXLSU7hWmHdmBfmC3s=",
"lastModified": 1713344939,
"narHash": "sha256-jpHkAt0sG2/J7ueKnG7VvLLkBYUMQbXQ2L8OBpVG53s=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "53a2c32bc66f5ae41a28d7a9a49d321172af621e",
"rev": "e402c3eb6d88384ca6c52ef1c53e61bdc9b84ddd",
"type": "github"
},
"original": {
......@@ -88,29 +34,13 @@
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1710695816,
"narHash": "sha256-3Eh7fhEID17pv9ZxrPwCLfqXnYP006RKzSs0JptsN84=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "614b4613980a522ba49f0d194531beddbb7220d3",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-23.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1713145326,
"narHash": "sha256-m7+IWM6mkWOg22EC5kRUFCycXsXLSU7hWmHdmBfmC3s=",
"lastModified": 1704145853,
"narHash": "sha256-G/1AMt9ibpeMlcxvD1vNaC8imGaK+g7zZ99e29BLgWw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "53a2c32bc66f5ae41a28d7a9a49d321172af621e",
"rev": "2d2ea8eab9e400618748ab1a6a108255233b602c",
"type": "github"
},
"original": {
......@@ -119,35 +49,10 @@
"type": "indirect"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": "flake-compat",
"flake-utils": "flake-utils",
"gitignore": "gitignore",
"nixpkgs": [
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1712897695,
"narHash": "sha256-nMirxrGteNAl9sWiOhoN5tIHyjBbVi5e2tgZUgZlK3Y=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "40e6053ecb65fcbf12863338a6dcefb3f55f1bf8",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"flake-utils": "flake-utils",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": "pre-commit-hooks",
"version": "version"
}
},
......@@ -177,11 +82,11 @@
"rev": "6b4f85fe6d934429cf3055bbcd8cf15014730118",
"revCount": 114,
"type": "git",
"url": "https://gitlab.schukai.com/oss/utilities/version.git"
"url": "https://gitlab.schukai.com/oss/utilities/version.git/"
},
"original": {
"type": "git",
"url": "https://gitlab.schukai.com/oss/utilities/version.git"
"url": "https://gitlab.schukai.com/oss/utilities/version.git/"
}
}
},
......
{
description = "Development environment";
inputs = {
nixpkgs = {url = "github:nixos/nixpkgs/nixos-23.11";};
flake-utils = {url = "github:numtide/flake-utils";};
version = {url = "git+https://gitlab.schukai.com/oss/utilities/version.git/";};
};
outputs = {
self,
nixpkgs,
flake-utils,
version,
}:
flake-utils.lib.eachDefaultSystem (system: let
inherit (nixpkgs.lib) optional;
pkgs' = import nixpkgs {inherit system;};
script-task = pkgs'.callPackage ./nix/scripts/go-task.nix {};
script-run-tests = pkgs'.callPackage ./nix/scripts/run-tests.nix {};
script-run-extended-tests = pkgs'.callPackage ./nix/scripts/run-extended-tests.nix {};
script-run-ci-tests = pkgs'.callPackage ./nix/scripts/run-ci-tests.nix {};
script-check-code = pkgs'.callPackage ./nix/scripts/check-code.nix {};
script-build-cover-report = pkgs'.callPackage ./nix/scripts/build-cover-report.nix {};
script-clean-up = pkgs'.callPackage ./nix/scripts/clean-up.nix {};
script-deploy = pkgs'.callPackage ./nix/scripts/deploy.nix {};
import-version = version.packages.${system}.version;
in {
devShells = {
default = let
ciJobToken = builtins.getEnv "CI_JOB_TOKEN";
in
pkgs'.mkShell {
nativeBuildInputs = with pkgs'; [
script-run-tests
script-run-extended-tests
script-run-ci-tests
script-check-code
script-build-cover-report
script-task
script-clean-up
script-deploy
import-version
alejandra
blackbox
blackbox-terminal
coreutils-full
delve
dialog
drill
fd
feh
gcc12
gdlv
git
glab
gnugrep
gnumake
gnused
go
go-licenses
golangci-lint
gosec
gum
jq
niv
libffi
logrotate
meld
memcached
netcat
ranger
unixtools.xxd
unzip
util-linux
vhs
wget
zlib
];
shellHook = ''
echo "Welcome to your development environment."
'';
};
};
});
}
......@@ -18,6 +18,7 @@ require (
gorm.io/driver/mysql v1.5.6
gorm.io/driver/sqlite v1.5.5
gorm.io/gorm v1.25.9
gotest.tools/v3 v3.5.1
)
require (
......@@ -30,6 +31,7 @@ require (
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/go-cmp v0.6.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kr/fs v0.1.0 // indirect
......@@ -52,5 +54,4 @@ require (
golang.org/x/sys v0.19.0 // indirect
golang.org/x/time v0.3.0 // indirect
golang.org/x/tools v0.6.0 // indirect
gotest.tools/v3 v3.5.1 // indirect
)
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8=
github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM=
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
......@@ -29,6 +31,7 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
......@@ -45,7 +48,9 @@ github.com/lufia/plan9stats v0.0.0-20240408141607-282e7b5d6b74 h1:1KuuSOy4ZNgW0K
github.com/lufia/plan9stats v0.0.0-20240408141607-282e7b5d6b74/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/mattn/go-sqlite3 v1.14.17 h1:mCRHCLDUBXgpKAqIKsaAaAsrAlbkeomtRFKXh2L6YIM=
github.com/mattn/go-sqlite3 v1.14.17/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A=
github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
......@@ -66,6 +71,7 @@ github.com/shirou/gopsutil/v3 v3.24.3 h1:eoUGJSmdfLzJ3mxIhmOAhgKEKgQkeOwKpz1NbhV
github.com/shirou/gopsutil/v3 v3.24.3/go.mod h1:JpND7O217xa72ewWz9zN2eIIkPWsDN/3pl0H8Qt0uwg=
github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM=
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
......@@ -87,6 +93,8 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
......@@ -116,6 +124,8 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
......@@ -134,10 +144,13 @@ golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q=
golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
......@@ -150,6 +163,7 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
......@@ -159,8 +173,7 @@ gorm.io/driver/mysql v1.5.6/go.mod h1:sEtPWMiqiN1N1cMXoXmBbd8C6/l+TESwriotuRRpkD
gorm.io/driver/sqlite v1.5.5 h1:7MDMtUZhV065SilG62E0MquljeArQZNfJnjd9i9gx3E=
gorm.io/driver/sqlite v1.5.5/go.mod h1:6NgQ7sQWAIFsPrJJl1lSNSu2TABh0ZZ/zm5fosATavE=
gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.8 h1:WAGEZ/aEcznN4D03laj8DKnehe1e9gYQAjW8xyPRdeo=
gorm.io/gorm v1.25.8/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU=
gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU=
......@@ -16,7 +16,7 @@ import (
)
// TestRoundTrip tests the round trip of jobs from yaml to the manager and back to yaml
// This test runs forever and must be stopped manually
// This test runs forever and must be stopped manually. this test run without database
// Use the following command to run this test:
// go test -timeout 6h -run TestRoundTrip -v
func TestRoundTrip(t *testing.T) {
......@@ -63,6 +63,8 @@ func TestRoundTrip(t *testing.T) {
var err error
t.Log("This test runs forever and must be stopped manually")
cronInstance := cron.New(cron.WithSeconds())
cronInstance.Start()
......