Reload job in ui

This commit is contained in:
bel
2020-03-15 23:04:48 +00:00
parent 19d4b645b8
commit 8138e31e53
12 changed files with 275 additions and 93 deletions

View File

@@ -20,12 +20,12 @@ type Job struct {
Schedule string
Raw string
Runner Runner
Disabled bool
foo func()
LastStatus int
LastOutput string
LastRuntime time.Duration
LastRun time.Time
Disabled bool
}
func NewJob(runner Runner, schedule, raw string) (*Job, error) {
@@ -59,7 +59,7 @@ func newBashJob(schedule, sh string, title ...string) (*Job, error) {
out, err := cmd.CombinedOutput()
j.LastRuntime = time.Since(start)
if err != nil {
out = []byte(fmt.Sprintf("error running command: %v: %v", err, out))
out = []byte(fmt.Sprintf("error running command: %v: %s", err, out))
}
j.LastOutput = strings.TrimSpace(string(out))
if cmd != nil && cmd.ProcessState != nil {

View File

@@ -15,6 +15,8 @@ import (
cron "github.com/robfig/cron/v3"
)
var Schedule *Scheduler = New()
type Scheduler struct {
cron *cron.Cron
running map[string]cron.EntryID
@@ -154,6 +156,40 @@ func (s *Scheduler) loadJobFromStore(k string) (*Job, error) {
return j, err
}
func (s *Scheduler) Update(j *Job) error {
entryID, ok := s.getEntry(j)
if !ok {
return errors.New("job not found in storage")
}
i, err := s.loadJobFromStore(j.Name)
if err != nil {
return err
}
j.LastStatus = i.LastStatus
j.LastOutput = i.LastOutput
j.LastRuntime = i.LastRuntime
j.LastRun = i.LastRun
b, err := j.Encode()
if err != nil {
return err
}
if err := config.Store.Set(j.Name, b, ns.Jobs...); err != nil {
return err
}
s.cron.Remove(entryID)
entryID, err = s.cron.AddJob(j.Schedule, j)
if err != nil {
return err
}
s.running[j.Name] = entryID
return nil
}
func (s *Scheduler) Add(j *Job) error {
if _, ok := s.getEntry(j); ok {
return ErrDuplicateJob

View File

@@ -2,11 +2,13 @@ package scheduler
import (
"bytes"
"fmt"
"io/ioutil"
"local/firestormy/config"
"local/storage"
"os"
"testing"
"time"
)
func TestSchedulerAddRemove(t *testing.T) {
@@ -192,3 +194,49 @@ func TestSplitScheduleCommandTitle(t *testing.T) {
})
}
}
func TestSchedulerUpdate(t *testing.T) {
config.Store, _ = storage.New(storage.MAP)
was := config.Store
defer func() {
config.Store = was
}()
s := New()
j, err := NewJob(Bash, "* * * * *", "hostname")
if err != nil {
t.Fatal(err)
}
if err := s.Add(j); err != nil {
t.Fatal(err)
}
if list, err := s.List(); err != nil {
t.Fatal(err)
} else if len(list) != 1 {
t.Fatal(err)
}
time.Sleep(time.Millisecond * 1500)
j.Raw = "echo 2"
j.Title = "title 2"
if err := s.Update(j); err != nil {
t.Fatal(err)
}
if list, err := s.List(); err != nil {
t.Fatal(err)
} else if len(list) != 1 {
t.Fatal(err)
} else if j, err := s.loadJobFromStore(j.Name); err != nil {
t.Fatal(err)
} else if j.Raw != "echo 2" {
t.Error(j.Raw)
} else if j.Title != "title 2" {
t.Error(j.Title)
} else if entry := s.cron.Entry(s.running[j.Name]); entry == s.cron.Entry(-99) {
t.Error(entry)
} else if entries := s.cron.Entries(); len(entries) != 1 {
t.Error(entries)
} else if job, ok := entries[0].Job.(*Job); !ok {
t.Error(fmt.Sprintf("%T", entries[0].Job))
} else if fmt.Sprintf("%+v", job) != fmt.Sprintf("%+v", j) {
t.Error(job)
}
}