Skip to content

Commit

Permalink
Merge pull request #7 from bennsimon/add-scheduleUnit-validation
Browse files Browse the repository at this point in the history
add scheduleUnit validation
  • Loading branch information
bennsimon authored Aug 12, 2023
2 parents 88ec599 + 8ec40b4 commit 3111851
Show file tree
Hide file tree
Showing 2 changed files with 62 additions and 0 deletions.
30 changes: 30 additions & 0 deletions handler/scheduleHandler/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package scheduleHandler

import (
workloadschedulerv1 "bennsimon.github.io/workload-scheduler-operator/api/v1"
"bennsimon.github.io/workload-scheduler-operator/util"
"context"
"fmt"
"k8s.io/utils/strings/slices"
"sigs.k8s.io/controller-runtime/pkg/client"
"strings"
"time"
Expand All @@ -27,6 +29,34 @@ func New() *ScheduleHandler {
func (s *ScheduleHandler) ValidateSchedule(schedule *workloadschedulerv1.Schedule) error {
if schedule.Spec.ScheduleUnits == nil || len(schedule.Spec.ScheduleUnits) == 0 {
return fmt.Errorf("schedule(s) need to be defined")
} else {
now := time.Now().In(time.Local)
days := []string{"sunday", "monday", "tuesday", "wednesday", "thursday", "friday", "saturday"}

for _, scheduleUnit := range schedule.Spec.ScheduleUnits {
if scheduleUnit.Days != nil && len(scheduleUnit.Days) > 0 {
for _, day := range scheduleUnit.Days {
if !slices.Contains(days, strings.ToLower(day)) {
return fmt.Errorf("day: %s, is not valid", day)
}
}
}
startTime, err := util.ProcessScheduleTimeUnit(scheduleUnit.Start, now)
if err != nil {
return err
}
endTime, err := util.ProcessScheduleTimeUnit(scheduleUnit.End, now)
if err != nil {
return err
}

if startTime.After(endTime) {
return fmt.Errorf("invalid timeunit, %s; startTime: %s, endTime: %s", "endTime is before startTime", startTime, endTime)
}
if startTime.Equal(endTime) {
return fmt.Errorf("invalid timeunit, %s; startTime: %s, endTime: %s", "endTime == startTime", startTime, endTime)
}
}
}
return nil
}
Expand Down
32 changes: 32 additions & 0 deletions handler/scheduleHandler/handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -175,3 +175,35 @@ func TestScheduleHandler_CheckIfSchedulesExist(t *testing.T) {
})
}
}

func TestScheduleHandler_ValidateSchedule(t *testing.T) {
type fields struct {
IScheduleHandler IScheduleHandler
}
type args struct {
schedule *v1.Schedule
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{name: "should return error when ScheduleUnits is nil", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: nil}}}, wantErr: true},
{name: "should return error when ScheduleUnits is empty", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: []v1.ScheduleUnit{}}}}, wantErr: true},
{name: "should return error when startTime is after EndTime", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: []v1.ScheduleUnit{{Start: v1.TimeUnit{Time: "09:00:00"}, End: v1.TimeUnit{Time: "08:00:00"}}}}}}, wantErr: true},
{name: "should return error when startTime is equal to EndTime", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: []v1.ScheduleUnit{{Start: v1.TimeUnit{Time: "08:00:00"}, End: v1.TimeUnit{Time: "08:00:00"}}}}}}, wantErr: true},
{name: "should not return error with valid timeUnit", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: []v1.ScheduleUnit{{Start: v1.TimeUnit{Time: "09:00:00"}, Days: []string{"Monday"}, End: v1.TimeUnit{Time: "18:00:00"}}}}}}, wantErr: false},
{name: "should return error if day is invalid", fields: fields{IScheduleHandler: New()}, args: args{schedule: &v1.Schedule{Spec: v1.ScheduleSpec{ScheduleUnits: []v1.ScheduleUnit{{Days: []string{"Motday"}, Start: v1.TimeUnit{Time: "09:00:00"}, End: v1.TimeUnit{Time: "18:00:00"}}}}}}, wantErr: true},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
s := &ScheduleHandler{
IScheduleHandler: tt.fields.IScheduleHandler,
}
if err := s.ValidateSchedule(tt.args.schedule); (err != nil) != tt.wantErr {
t.Errorf("ValidateSchedule() error = %v, wantErr %v", err, tt.wantErr)
}
})
}
}

0 comments on commit 3111851

Please sign in to comment.