cronsun/models/job.go

145 lines
2.7 KiB
Go
Raw Normal View History

2017-01-09 03:10:55 +00:00
package models
2017-01-09 02:32:14 +00:00
import (
"encoding/json"
2017-01-12 08:35:30 +00:00
"strings"
client "github.com/coreos/etcd/clientv3"
"sunteng/commons/log"
"sunteng/cronsun/conf"
)
2017-01-12 08:35:30 +00:00
const (
DefaultJobGroup = "Default"
)
2017-01-09 09:13:56 +00:00
// 需要执行的 cron cmd 命令
2017-01-12 08:35:30 +00:00
// 注册到 /cronsun/cmd/groupName/<id>
2017-01-09 02:32:14 +00:00
type Job struct {
2017-01-12 08:35:30 +00:00
ID string `json:"id"`
2017-01-11 08:12:37 +00:00
Name string `json:"name"`
Group string `json:"group"`
Command string `json:"cmd"`
Rule []*JobRule `json:"rule"`
2017-01-16 06:30:55 +00:00
Pause bool `json:"pause"` // 可手工控制的状态
Schedules map[string][]string `json:"-"` // map[ip][]timer node 服务使用
2017-01-09 02:32:14 +00:00
}
type JobRule struct {
2017-01-11 08:12:37 +00:00
Timer string `json:"timer"`
2017-01-09 09:13:56 +00:00
GroupIDs []string `json:"gids"`
2017-01-11 08:12:37 +00:00
NodeIDs []string `json:"nids"`
ExcludeNodeIDs []string `json:"exclude_nids"`
2017-01-09 02:32:14 +00:00
}
2017-01-16 06:30:55 +00:00
func GetJob(group, id string) (job *Job, err error) {
resp, err := DefalutClient.Get(JobKey(group, id))
if err != nil {
return
}
if resp.Count == 0 {
err = ErrNotFound
return
}
err = json.Unmarshal(resp.Kvs[0].Value, &job)
return
}
func DeleteJob(group, id string) (resp *client.DeleteResponse, err error) {
return DefalutClient.Delete(JobKey(group, id))
}
func GetJobs() (jobs map[string]*Job, err error) {
resp, err := DefalutClient.Get(conf.Config.Cmd, client.WithPrefix())
if err != nil {
return
}
count := len(resp.Kvs)
if count == 0 {
return
}
jobs = make(map[string]*Job, count)
for _, j := range resp.Kvs {
job := new(Job)
if e := json.Unmarshal(j.Value, job); e != nil {
log.Warnf("job[%s] umarshal err: %s", string(j.Key), e.Error())
continue
}
jobs[job.ID] = job
}
return
}
func (j *Job) BuildSchedules(gs map[string]*Group) {
j.Schedules = make(map[string][]string)
for _, r := range j.Rule {
sch := make(map[string]string)
for _, gid := range r.GroupIDs {
g, ok := gs[gid]
if !ok {
continue
}
for _, id := range g.NodeIDs {
sch[id] = r.Timer
}
}
for _, id := range r.NodeIDs {
sch[id] = r.Timer
}
for _, id := range r.ExcludeNodeIDs {
delete(sch, id)
}
for id, t := range sch {
j.Schedules[id] = append(j.Schedules[id], t)
}
}
}
func (j *Job) Schedule(id string) ([]string, bool) {
if len(j.Schedules) == 0 {
return nil, false
}
s, ok := j.Schedules[id]
return s, ok
}
func (j *Job) Run() {
2017-01-12 08:35:30 +00:00
}
2017-01-16 06:30:55 +00:00
func JobKey(group, id string) string {
return conf.Config.Cmd + group + "/" + id
}
2017-01-12 08:35:30 +00:00
func (j *Job) Key() string {
2017-01-16 06:30:55 +00:00
return JobKey(j.Group, j.ID)
2017-01-12 08:35:30 +00:00
}
func (j *Job) Check() error {
j.Name = strings.TrimSpace(j.Name)
if len(j.Name) == 0 {
return ErrEmptyJobName
}
j.Group = strings.TrimSpace(j.Group)
if len(j.Group) == 0 {
j.Group = DefaultJobGroup
}
// 不修改 Command 的内容,简单判断是否为空
if len(strings.TrimSpace(j.Command)) == 0 {
return ErrEmptyJobCommand
}
2017-01-12 08:35:30 +00:00
return nil
}