README
¶
Package cron implements a cron spec parser and job runner. Usage Callers may register Funcs to be invoked on a given schedule. Cron will run them in their own goroutines. c := cron.New() c.AddFunc("0 30 * * * *", func() { fmt.Println("Every hour on the half hour") }) c.AddFunc("@hourly", func() { fmt.Println("Every hour") }) c.AddFunc("@every 1h30m", func() { fmt.Println("Every hour thirty") }) c.Start() .. // Funcs are invoked in their own goroutine, asynchronously. ... // Funcs may also be added to a running Cron c.AddFunc("@daily", func() { fmt.Println("Every day") }) .. // Inspect the cron job entries' next and previous run times. inspect(c.Entries()) .. c.Stop() // Stop the scheduler (does not stop any jobs already running). CRON Expression Format A cron expression represents a set of times, using 6 space-separated fields.
Field name | Mandatory? | Allowed values | Allowed special characters |
---|---|---|---|
Seconds | Yes | 0-59 | * / , - |
Minutes | Yes | 0-59 | * / , - |
Hours | Yes | 0-23 | * / , - |
Day of month | Yes | 1-31 | * / , - ? |
Month | Yes | 1-12 or JAN-DEC | * / , - |
Day of week | Yes | 0-6 or SUN-SAT | * / , - ? |
Note: Month and Day-of-week field values are case insensitive. "SUN", "Sun", | |||
and "sun" are equally accepted. | |||
Special Characters | |||
Asterisk ( * ) | |||
The asterisk indicates that the cron expression will match for all values of the | |||
field; e.g., using an asterisk in the 5th field (month) would indicate every | |||
month. | |||
Slash ( / ) | |||
Slashes are used to describe increments of ranges. For example 3-59/15 in the | |||
1st field (minutes) would indicate the 3rd minute of the hour and every 15 | |||
minutes thereafter. The form "*/..." is equivalent to the form "first-last/...", | |||
that is, an increment over the largest possible range of the field. The form | |||
"N/..." is accepted as meaning "N-MAX/...", that is, starting at N, use the | |||
increment until the end of that specific range. It does not wrap around. | |||
Comma ( , ) | |||
Commas are used to separate items of a list. For example, using "MON,WED,FRI" in | |||
the 5th field (day of week) would mean Mondays, Wednesdays and Fridays. | |||
Hyphen ( - ) | |||
Hyphens are used to define ranges. For example, 9-17 would indicate every | |||
hour between 9am and 5pm inclusive. | |||
Question mark ( ? ) | |||
Question mark may be used instead of '*' for leaving either day-of-month or | |||
day-of-week blank. | |||
Predefined schedules | |||
You may use one of several pre-defined schedules in place of a cron expression. | |||
Entry | Description | Equivalent To | |
----- | ----------- | ------------- | |
@yearly (or @annually) | Run once a year, midnight, Jan. 1st | 0 0 0 1 1 * | |
@monthly | Run once a month, midnight, first of month | 0 0 0 1 * * | |
@weekly | Run once a week, midnight on Sunday | 0 0 0 * * 0 | |
@daily (or @midnight) | Run once a day, midnight | 0 0 0 * * * | |
@hourly | Run once an hour, beginning of hour | 0 0 * * * * | |
Intervals | |||
You may also schedule a job to execute at fixed intervals, starting at the time it's added | |||
or cron is run. This is supported by formatting the cron spec like this: | |||
@every | |||
where "duration" is a string accepted by time.ParseDuration | |||
(http://golang.org/pkg/time/#ParseDuration). | |||
For example, "@every 1h30m10s" would indicate a schedule that activates immediately, | |||
and then every 1 hour, 30 minutes, 10 seconds. | |||
Note: The interval does not take the job runtime into account. For example, | |||
if a job takes 3 minutes to run, and it is scheduled to run every 5 minutes, | |||
it will have only 2 minutes of idle time between each run. | |||
Time zones | |||
All interpretation and scheduling is done in the machine's local time zone (as | |||
provided by the Go time package (http://www.golang.org/pkg/time). | |||
Be aware that jobs scheduled during daylight-savings leap-ahead transitions will | |||
not be run! | |||
Thread safety | |||
Since the Cron service runs concurrently with the calling code, some amount of | |||
care must be taken to ensure proper synchronization. | |||
All cron methods are designed to be correctly synchronized as long as the caller | |||
ensures that invocations have a clear happens-before ordering between them. | |||
Implementation | |||
Cron entries are stored in an array, sorted by their next activation time. Cron | |||
sleeps until the next job is due to be run. | |||
Upon waking: |
- it runs each entry that is active on that second
- it calculates the next run times for the jobs that were run
- it re-sorts the array of entries by next activation time.
- it goes to sleep until the soonest job.
Documentation
¶
Index ¶
- Variables
- func DoRequest(baseAPI, query, queryType, method string, body []byte) ([]byte, int, error)
- type AlertingNameConfig
- type AlertingRulesConfig
- type AllocatedResources
- type Body
- type ClusterResource
- type Config
- type ConfigUnit
- type DependStrategy
- type ExecedTask
- type Expr
- type FirstConfig
- type GlobalConfig
- type InitStatus
- type InstallStatus
- type LabelsResp
- type Login
- type LoginResult
- type NodeDetails
- type NodePodResource
- type NodeResource
- type NodeResourceResponse
- type NotificationEvent
- type Pods
- type Prome
- type PromeData
- type PromeResultCore
- type PrometheusAPI
- type PrometheusInterface
- type Resource
- type ResponseBody
- type RulesConfig
- type Scheduler
- type SchedulerStatus
- type Shell
- type Task
- type TaskGroup
- type TaskGroupStatus
- type TaskOutPut
- type TaskOutPutStatus
- type TaskStatus
- type TaskTemp
Constants ¶
This section is empty.
Variables ¶
var AtLeastOnceStrategy = "AtLeastOnce"
AtLeastOnceStrategy 至少已执行一次
var SameNodeStrategy = "SameNode"
SameNodeStrategy 相同节点已执行
Functions ¶
Types ¶
type AlertingNameConfig ¶
type AlertingNameConfig struct { Name string `yaml:"name" json:"name"` Rules []*RulesConfig `yaml:"rules" json:"rules"` }
AlertingNameConfig -
type AlertingRulesConfig ¶
type AlertingRulesConfig struct {
Groups []*AlertingNameConfig `yaml:"groups" json:"groups"`
}
AlertingRulesConfig -
type AllocatedResources ¶
type AllocatedResources struct { CPURequests int64 CPULimits int64 MemoryRequests int64 MemoryLimits int64 MemoryRequestsR string MemoryLimitsR string CPURequestsR string CPULimitsR string }
AllocatedResources -
type Body ¶
type Body struct { List interface{} `json:"list"` Bean interface{} `json:"bean,omitempty"` }
Body -
type ClusterResource ¶
type ClusterResource struct { AllNode int `json:"all_node"` NotReadyNode int `json:"notready_node"` ComputeNode int `json:"compute_node"` Tenant int `json:"tenant"` CapCPU int `json:"cap_cpu"` //可分配CPU总额 CapMem int `json:"cap_mem"` //可分配Mem总额 HealthCapCPU int `json:"health_cap_cpu"` //健康可分配CPU HealthCapMem int `json:"health_cap_mem"` //健康可分配Mem UnhealthCapCPU int `json:"unhealth_cap_cpu"` //不健康可分配CPU UnhealthCapMem int `json:"unhealth_cap_mem"` //不健康可分配Mem ReqCPU float32 `json:"req_cpu"` //已使用CPU总额 ReqMem int `json:"req_mem"` //已使用Mem总额 HealthReqCPU float32 `json:"health_req_cpu"` //健康已使用CPU HealthReqMem int `json:"health_req_mem"` //健康已使用Mem UnhealthReqCPU float32 `json:"unhealth_req_cpu"` //不健康已使用CPU UnhealthReqMem int `json:"unhealth_req_mem"` //不健康已使用Mem CapDisk uint64 `json:"cap_disk"` ReqDisk uint64 `json:"req_disk"` MaxAllocatableMemoryNodeResource *NodeResource `json:"max_allocatable_memory_node_resource"` }
ClusterResource 资源
type Config ¶
type Config struct { Cn string `json:"cn_name"` Name string `json:"name"` Value string `json:"value"` }
Config -
type ConfigUnit ¶
type ConfigUnit struct { //配置名称 例如:network Name string `json:"name" validate:"name|required"` CNName string `json:"cn_name" validate:"cn_name"` //类型 例如:midonet Value interface{} `json:"value" validate:"value|required"` ValueType string `json:"value_type"` //可选类型 类型名称和需要的配置项 OptionalValue []string `json:"optional_value,omitempty"` DependConfig map[string][]ConfigUnit `json:"depend_config,omitempty"` //是否用户可配置 IsConfigurable bool `json:"is_configurable"` }
ConfigUnit 一个配置单元
func (ConfigUnit) String ¶
func (c ConfigUnit) String() string
type DependStrategy ¶
type DependStrategy struct { DependTaskID string `json:"depend_task_id"` DetermineStrategy string `json:"strategy"` }
DependStrategy 依赖策略
type ExecedTask ¶
type ExecedTask struct { ID string `json:"id"` Seq int `json:"seq"` Desc string `json:"desc"` Status string `json:"status"` CompleteStatus string `json:"complete_status"` ErrorMsg string `json:"err_msg"` Depends []string `json:"dep"` Next []string `json:"next"` }
ExecedTask -
type Expr ¶
type Expr struct { Body struct { // expr // in: body // required: true Expr string `json:"expr" validate:"expr|required"` } }
Expr swagger:parameters createToken
type FirstConfig ¶
type FirstConfig struct { StorageMode string `json:"storage_mode"` StorageHost string `json:"storage_host,omitempty"` StorageEndPoint string `json:"storage_endpoint,omitempty"` NetworkMode string `json:"network_mode"` ZKHosts string `json:"zk_host,omitempty"` CassandraIP string `json:"cassandra_ip,omitempty"` K8SAPIAddr string `json:"k8s_apiserver,omitempty"` MasterIP string `json:"master_ip,omitempty"` DNS string `json:"dns,omitempty"` ZMQSub string `json:"zmq_sub,omitempty"` ZMQTo string `json:"zmq_to,omitempty"` EtcdIP string `json:"etcd_ip,omitempty"` }
FirstConfig -
type GlobalConfig ¶
type GlobalConfig struct {
Configs map[string]*ConfigUnit `json:"configs"`
}
GlobalConfig 全局配置
func CreateDefaultGlobalConfig ¶
func CreateDefaultGlobalConfig() *GlobalConfig
CreateDefaultGlobalConfig 生成默认配置
func CreateGlobalConfig ¶
func CreateGlobalConfig(kvs []*mvccpb.KeyValue) (*GlobalConfig, error)
CreateGlobalConfig 生成配置
type InitStatus ¶
type InitStatus struct { Status int `json:"status"` StatusCN string `json:"cn"` HostID string `json:"uuid"` }
InitStatus -
type InstallStatus ¶
type InstallStatus struct { Status int `json:"status"` StatusCN string `json:"cn"` Tasks []*ExecedTask `json:"tasks"` }
InstallStatus -
type LabelsResp ¶
type LabelsResp struct { SysLabels map[string]string `json:"sys_labels"` CustomLabels map[string]string `json:"custom_labels"` }
LabelsResp -
type Login ¶
type Login struct { HostPort string `json:"hostport"` LoginType bool `json:"type"` HostType string `json:"hosttype"` RootPwd string `json:"pwd,omitempty"` }
Login -
type LoginResult ¶
type LoginResult struct { HostPort string `json:"hostport"` LoginType bool `json:"type"` Result string `json:"result"` }
LoginResult -
type NodeDetails ¶
type NodeDetails struct { Name string `json:"name"` Role []string `json:"role"` Status string `json:"status"` Labels map[string]string `json:"labels"` Annotations map[string]string `json:"annotations"` CreationTimestamp string `json:"creationtimestamp"` Conditions []v1.NodeCondition `json:"conditions"` Addresses map[string]string `json:"addresses"` Capacity map[string]string `json:"capacity"` Allocatable map[string]string `json:"allocatable"` SystemInfo v1.NodeSystemInfo `json:"systeminfo"` NonterminatedPods []*Pods `json:"nonterminatedpods"` AllocatedResources map[string]string `json:"allocatedresources"` Events map[string][]string `json:"events"` }
NodeDetails NodeDetails
type NodePodResource ¶
type NodePodResource struct { AllocatedResources `json:"allocatedresources"` Resource `json:"allocatable"` }
NodePodResource -
type NodeResource ¶
type NodeResource struct { MilliCPU int64 `json:"milli_cpu"` Memory int64 `json:"memory"` NvidiaGPU int64 `json:"nvidia_gpu"` EphemeralStorage int64 `json:"ephemeral_storage"` // We store allowedPodNumber (which is Node.Status.Allocatable.Pods().Value()) // explicitly as int, to avoid conversions and improve performance. AllowedPodNumber int `json:"allowed_pod_number"` }
NodeResource is a collection of compute resource.
func NewResource ¶
func NewResource(rl v1.ResourceList) *NodeResource
NewResource creates a Resource from ResourceList
func (*NodeResource) Add ¶
func (r *NodeResource) Add(rl v1.ResourceList)
Add adds ResourceList into Resource.
func (*NodeResource) ResourceList ¶
func (r *NodeResource) ResourceList() v1.ResourceList
ResourceList returns a resource list of this resource.
type NodeResourceResponse ¶
type NodeResourceResponse struct { CapCPU int `json:"cap_cpu"` CapMem int `json:"cap_mem"` ReqCPU float32 `json:"req_cpu"` ReqMem int `json:"req_mem"` }
NodeResourceResponse 资源
type NotificationEvent ¶
type NotificationEvent struct { //Kind could be service, tenant, cluster, node Kind string `json:"Kind"` //KindID could be service_id,tenant_id,cluster_id,node_id KindID string `json:"KindID"` Hash string `json:"Hash"` //Type could be Normal UnNormal Notification Type string `json:"Type"` Message string `json:"Message"` Reason string `json:"Reason"` Count int `json:"Count"` LastTime string `json:"LastTime"` FirstTime string `json:"FirstTime"` IsHandle bool `json:"IsHandle"` HandleMessage string `json:"HandleMessage"` ServiceName string `json:"ServiceName"` TenantName string `json:"TenantName"` }
NotificationEvent NotificationEvent
type Pods ¶
type Pods struct { Namespace string `json:"namespace"` Id string `json:"id"` Name string `json:"name"` TenantName string `json:"tenant_name"` CPURequests string `json:"cpurequest"` CPURequestsR string `json:"cpurequestr"` CPULimits string `json:"cpulimits"` CPULimitsR string `json:"cpulimitsr"` MemoryRequests string `json:"memoryrequests"` MemoryRequestsR string `json:"memoryrequestsr"` MemoryLimits string `json:"memorylimits"` MemoryLimitsR string `json:"memorylimitsr"` Status string `json:"status"` }
Pods -
type PromeData ¶
type PromeData struct { ResultType string `json:"resultType"` Result []*PromeResultCore `json:"result"` }
PromeData -
type PromeResultCore ¶
type PromeResultCore struct { Metric map[string]string `json:"metric"` Value []interface{} `json:"value"` Values []interface{} `json:"values"` }
PromeResultCore -
type PrometheusAPI ¶
type PrometheusAPI struct {
API string
}
PrometheusAPI -
func (*PrometheusAPI) Query ¶
func (s *PrometheusAPI) Query(query string) (*Prome, *utils.APIHandleError)
Query Get
func (*PrometheusAPI) QueryRange ¶
func (s *PrometheusAPI) QueryRange(query string, start, end, step string) (*Prome, *utils.APIHandleError)
QueryRange Get
type PrometheusInterface ¶
type PrometheusInterface interface { Query(query string) *Prome QueryRange(query string, start, end, step string) *Prome }
PrometheusInterface -
type ResponseBody ¶
type ResponseBody struct { Code int `json:"code"` Msg string `json:"msg"` MsgCN string `json:"msgcn"` Body Body `json:"body,omitempty"` }
ResponseBody -
type RulesConfig ¶
type RulesConfig struct { Alert string `yaml:"alert" json:"alert"` Expr string `yaml:"expr" json:"expr"` For string `yaml:"for" json:"for"` Labels map[string]string `yaml:"labels" json:"labels"` Annotations map[string]string `yaml:"annotations" json:"annotations"` }
RulesConfig -
type Scheduler ¶
type Scheduler struct { Mode string `json:"mode"` //立即调度(Intime),触发调度(Passive) Status map[string]SchedulerStatus `json:"status"` }
Scheduler 调度状态
type SchedulerStatus ¶
type SchedulerStatus struct { Status string `json:"status"` Message string `json:"message"` SchedulerTime time.Time `json:"scheduler_time"` //调度时间 SchedulerMaster string `json:"scheduler_master"` //调度的管理节点 }
SchedulerStatus 调度状态
type Task ¶
type Task struct { Name string `json:"name" validate:"name|required"` ID string `json:"id" validate:"id|uuid"` TempID string `json:"temp_id,omitempty" validate:"temp_id|uuid"` Temp *TaskTemp `json:"temp,omitempty"` GroupID string `json:"group_id,omitempty"` //执行的节点 Nodes []string `json:"nodes"` //执行时间定义 //例如每30分钟执行一次:@every 30m Timer string `json:"timer"` TimeOut int64 `json:"time_out"` // 执行任务失败重试次数 // 默认为 0,不重试 Retry int `json:"retry"` // 执行任务失败重试时间间隔 // 单位秒,如果不大于 0 则马上重试 Interval int `json:"interval"` //ExecCount 执行次数 ExecCount int `json:"exec_count"` //每个执行节点执行状态 Status map[string]TaskStatus `json:"status,omitempty"` Scheduler Scheduler `json:"scheduler"` CreateTime time.Time `json:"create_time"` StartTime time.Time `json:"start_time"` CompleteTime time.Time `json:"complete_time"` ResultPath string `json:"result_path"` EventID string `json:"event_id"` RunMode string `json:"run_mode"` OutPut []*TaskOutPut `json:"out_put"` }
Task 任务
type TaskGroup ¶
type TaskGroup struct { Name string `json:"name" validate:"name|required"` ID string `json:"id" validate:"id|uuid"` Tasks []*Task `json:"tasks"` CreateTime time.Time `json:"create_time"` Status *TaskGroupStatus `json:"status"` }
TaskGroup 任务组
type TaskGroupStatus ¶
type TaskGroupStatus struct { TaskStatus map[string]TaskStatus `json:"task_status"` InitTime time.Time `json:"init_time"` StartTime time.Time `json:"start_time"` EndTime time.Time `json:"end_time"` Status string `json:"status"` //create init exec complete timeout }
TaskGroupStatus 任务组状态
type TaskOutPut ¶
type TaskOutPut struct { NodeID string `json:"node_id"` JobID string `json:"job_id"` Global map[string]string `json:"global"` Inner map[string]string `json:"inner"` //返回数据类型,检测结果类(check) 执行安装类 (install) 普通类 (common) Type string `json:"type"` Status []TaskOutPutStatus `json:"status"` ExecStatus string `json:"exec_status"` Body string `json:"body"` }
TaskOutPut 任务输出
func ParseTaskOutPut ¶
func ParseTaskOutPut(body string) (t TaskOutPut, err error)
ParseTaskOutPut json parse
type TaskOutPutStatus ¶
type TaskOutPutStatus struct { Name string `json:"name"` //节点属性 ConditionType string `json:"condition_type"` //节点属性值 ConditionStatus string `json:"condition_status"` NextTask []string `json:"next_tasks,omitempty"` NextGroups []string `json:"next_groups,omitempty"` }
TaskOutPutStatus 输出数据
type TaskStatus ¶
type TaskStatus struct { JobID string `json:"job_id"` Status string `json:"status"` //执行状态,create init exec complete timeout StartTime time.Time `json:"start_time"` EndTime time.Time `json:"end_time"` TakeTime int `json:"take_time"` CompleStatus string `json:"comple_status"` //脚本退出码 ShellCode int `json:"shell_code"` Message string `json:"message,omitempty"` }
TaskStatus 任务状态
type TaskTemp ¶
type TaskTemp struct { Name string `json:"name" validate:"name|required"` ID string `json:"id" validate:"id|uuid"` Shell Shell `json:"shell"` Envs map[string]string `json:"envs,omitempty"` Input string `json:"input,omitempty"` Args []string `json:"args,omitempty"` Depends []DependStrategy `json:"depends,omitempty"` Timeout int `json:"timeout" validate:"timeout|required|numeric"` CreateTime time.Time `json:"create_time"` Labels map[string]string `json:"labels,omitempty"` }
TaskTemp 任务模版