Reload job in ui
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user