Semaphore/api/schedules/pool.go

93 lines
1.6 KiB
Go
Raw Normal View History

2021-09-06 13:05:10 +02:00
package schedules
import (
log "github.com/Sirupsen/logrus"
"github.com/ansible-semaphore/semaphore/api/tasks"
2021-09-06 13:05:10 +02:00
"github.com/ansible-semaphore/semaphore/db"
"github.com/robfig/cron/v3"
"sync"
2021-09-06 13:05:10 +02:00
)
type ScheduleRunner struct {
Store db.Store
Schedule db.Schedule
2021-09-06 13:05:10 +02:00
}
func (r ScheduleRunner) Run() {
_, err := tasks.AddTaskToPool(r.Store, db.Task{}, nil, r.Schedule.ProjectID)
if err != nil {
log.Error(err)
}
2021-09-06 13:05:10 +02:00
}
type SchedulePool struct {
cron *cron.Cron
locker sync.Locker
2021-09-06 13:05:10 +02:00
}
func (p *SchedulePool) init() {
2021-09-06 13:05:10 +02:00
p.cron = cron.New()
p.locker = &sync.Mutex{}
}
2021-09-06 13:05:10 +02:00
func (p *SchedulePool) Refresh(d db.Store) {
2021-09-06 13:05:10 +02:00
schedules, err := d.GetSchedules()
if err != nil {
log.Error(err)
2021-09-06 13:05:10 +02:00
return
}
p.locker.Lock()
p.clear()
2021-09-06 13:05:10 +02:00
for _, schedule := range schedules {
_, err := p.addRunner(ScheduleRunner{
Store: d,
Schedule: schedule,
})
2021-09-06 13:05:10 +02:00
if err != nil {
log.Error(err)
2021-09-06 13:05:10 +02:00
}
}
p.locker.Unlock()
2021-09-06 13:05:10 +02:00
}
func (p *SchedulePool) addRunner(runner ScheduleRunner) (int, error) {
id, err := p.cron.AddJob(runner.Schedule.CronFormat, runner)
2021-09-06 13:05:10 +02:00
if err != nil {
return 0, err
2021-09-06 13:05:10 +02:00
}
return int(id), nil
2021-09-06 13:05:10 +02:00
}
func (p *SchedulePool) Run() {
2021-09-06 13:05:10 +02:00
p.cron.Run()
}
func (p *SchedulePool) clear() {
runners := p.cron.Entries()
for _, r := range runners {
p.cron.Remove(r.ID)
}
}
func (p *SchedulePool) Destroy() {
p.locker.Lock()
p.cron.Stop()
p.clear()
p.cron = nil
p.locker.Unlock()
}
2021-09-06 13:05:10 +02:00
func CreateSchedulePool(d db.Store) (pool SchedulePool) {
pool.init()
pool.Refresh(d)
return
2021-09-06 13:05:10 +02:00
}
func ValidateCronFormat(cronFormat string) error {
_, err := cron.ParseStandard(cronFormat)
return err
}