Skip to content

Commit

Permalink
feat: implement scheduling relative to last task execution (#439)
Browse files Browse the repository at this point in the history
  • Loading branch information
garethgeorge authored Aug 27, 2024
1 parent 44585ed commit 6ed1280
Show file tree
Hide file tree
Showing 26 changed files with 1,120 additions and 249 deletions.
277 changes: 166 additions & 111 deletions gen/go/v1/config.pb.go

Large diffs are not rendered by default.

138 changes: 64 additions & 74 deletions gen/go/v1/operations.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions internal/api/backresthandler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -502,6 +502,7 @@ func TestHookOnErrorHandling(t *testing.T) {
}

for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
sut.opstore.ResetForTest(t)

Expand Down
1 change: 1 addition & 0 deletions internal/config/config_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ func TestConfig(t *testing.T) {
}

for _, tc := range tests {
tc := tc
t.Run(tc.name, func(t *testing.T) {
t.Parallel()
err := tc.store.Update(tc.config)
Expand Down
1 change: 1 addition & 0 deletions internal/config/migrations/001prunepolicy_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@ func Test001Migration(t *testing.T) {
}

for _, tc := range cases {
tc := tc
t.Run(tc.name, func(t *testing.T) {
config := v1.Config{}
err := protojson.Unmarshal([]byte(tc.config), &config)
Expand Down
42 changes: 42 additions & 0 deletions internal/config/migrations/003relativescheduling.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package migrations

import (
v1 "github.com/garethgeorge/backrest/gen/go/v1"
)

func convertToRelativeSchedule(sched *v1.Schedule) {
switch s := sched.GetSchedule().(type) {
case *v1.Schedule_MaxFrequencyDays:
sched.Schedule = &v1.Schedule_MinDaysSinceLastRun{
MinDaysSinceLastRun: s.MaxFrequencyDays,
}
case *v1.Schedule_MaxFrequencyHours:
sched.Schedule = &v1.Schedule_MinHoursSinceLastRun{
MinHoursSinceLastRun: s.MaxFrequencyHours,
}
case *v1.Schedule_Cron:
sched.Schedule = &v1.Schedule_CronSinceLastRun{
CronSinceLastRun: s.Cron,
}
default:
// do nothing
}
}

func migration003RelativeScheduling(config *v1.Config) {
// loop over plans and examine prune policy's
for _, repo := range config.Repos {
prunePolicy := repo.GetPrunePolicy()
if prunePolicy == nil {
continue
}

if schedule := repo.GetPrunePolicy().GetSchedule(); schedule != nil {
convertToRelativeSchedule(schedule)
}

if schedule := repo.GetCheckPolicy().GetSchedule(); schedule != nil {
convertToRelativeSchedule(schedule)
}
}
}
128 changes: 128 additions & 0 deletions internal/config/migrations/003relativescheduling_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
package migrations

import (
"testing"

v1 "github.com/garethgeorge/backrest/gen/go/v1"
"google.golang.org/protobuf/proto"
)

func Test003Migration(t *testing.T) {
config := &v1.Config{
Repos: []*v1.Repo{
{
Id: "prune daily",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MaxFrequencyDays{
MaxFrequencyDays: 1,
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MaxFrequencyDays{
MaxFrequencyDays: 1,
},
},
},
},
{
Id: "prune hourly",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MaxFrequencyHours{
MaxFrequencyHours: 1,
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MaxFrequencyHours{
MaxFrequencyHours: 1,
},
},
},
},
{
Id: "prune cron",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_Cron{
Cron: "0 0 * * *",
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_Cron{
Cron: "0 0 * * *",
},
},
},
},
},
}

want := &v1.Config{
Repos: []*v1.Repo{
{
Id: "prune daily",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MinDaysSinceLastRun{
MinDaysSinceLastRun: 1,
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MinDaysSinceLastRun{
MinDaysSinceLastRun: 1,
},
},
},
},
{
Id: "prune hourly",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MinHoursSinceLastRun{
MinHoursSinceLastRun: 1,
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_MinHoursSinceLastRun{
MinHoursSinceLastRun: 1,
},
},
},
},
{
Id: "prune cron",
PrunePolicy: &v1.PrunePolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_CronSinceLastRun{
CronSinceLastRun: "0 0 * * *",
},
},
},
CheckPolicy: &v1.CheckPolicy{
Schedule: &v1.Schedule{
Schedule: &v1.Schedule_CronSinceLastRun{
CronSinceLastRun: "0 0 * * *",
},
},
},
},
},
}

migration003RelativeScheduling(config)

if !proto.Equal(config, want) {
t.Errorf("got %v, want %v", config, want)
}
}
1 change: 1 addition & 0 deletions internal/config/migrations/migrations.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import (
var migrations = []func(*v1.Config){
migration001PrunePolicy,
migration002Schedules,
migration003RelativeScheduling,
}

var CurrentVersion = int32(len(migrations))
Expand Down
1 change: 1 addition & 0 deletions internal/config/validationutil/validationutil_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ func TestSanitizeID(t *testing.T) {
}

for _, tc := range tcs {
tc := tc
t.Run(tc.name, func(t *testing.T) {
got := SanitizeID(tc.id)
if got != tc.want {
Expand Down
Loading

0 comments on commit 6ed1280

Please sign in to comment.