2020-08-09 22:29:54 +00:00
|
|
|
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
|
|
// See LICENSE.txt for license information.
|
2016-06-23 18:28:05 +00:00
|
|
|
|
|
|
|
package model
|
|
|
|
|
|
|
|
import (
|
2017-08-16 21:37:37 +00:00
|
|
|
"encoding/json"
|
|
|
|
"io"
|
|
|
|
"net/http"
|
2018-02-08 23:11:04 +00:00
|
|
|
"time"
|
2016-06-23 18:28:05 +00:00
|
|
|
)
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
const (
|
2018-02-08 23:11:04 +00:00
|
|
|
JOB_TYPE_DATA_RETENTION = "data_retention"
|
|
|
|
JOB_TYPE_MESSAGE_EXPORT = "message_export"
|
|
|
|
JOB_TYPE_ELASTICSEARCH_POST_INDEXING = "elasticsearch_post_indexing"
|
|
|
|
JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION = "elasticsearch_post_aggregation"
|
2020-08-09 22:29:54 +00:00
|
|
|
JOB_TYPE_BLEVE_POST_INDEXING = "bleve_post_indexing"
|
2018-02-08 23:11:04 +00:00
|
|
|
JOB_TYPE_LDAP_SYNC = "ldap_sync"
|
2018-11-18 17:55:05 +00:00
|
|
|
JOB_TYPE_MIGRATIONS = "migrations"
|
2020-08-09 22:29:54 +00:00
|
|
|
JOB_TYPE_PLUGINS = "plugins"
|
2020-10-19 21:40:00 +00:00
|
|
|
JOB_TYPE_EXPIRY_NOTIFY = "expiry_notify"
|
|
|
|
JOB_TYPE_PRODUCT_NOTICES = "product_notices"
|
|
|
|
JOB_TYPE_ACTIVE_USERS = "active_users"
|
2021-10-16 22:47:22 +00:00
|
|
|
JOB_TYPE_IMPORT_PROCESS = "import_process"
|
|
|
|
JOB_TYPE_IMPORT_DELETE = "import_delete"
|
|
|
|
JOB_TYPE_EXPORT_PROCESS = "export_process"
|
|
|
|
JOB_TYPE_EXPORT_DELETE = "export_delete"
|
2020-12-31 13:48:12 +00:00
|
|
|
JOB_TYPE_CLOUD = "cloud"
|
2021-10-16 22:47:22 +00:00
|
|
|
JOB_TYPE_RESEND_INVITATION_EMAIL = "resend_invitation_email"
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
JOB_STATUS_PENDING = "pending"
|
|
|
|
JOB_STATUS_IN_PROGRESS = "in_progress"
|
|
|
|
JOB_STATUS_SUCCESS = "success"
|
|
|
|
JOB_STATUS_ERROR = "error"
|
|
|
|
JOB_STATUS_CANCEL_REQUESTED = "cancel_requested"
|
|
|
|
JOB_STATUS_CANCELED = "canceled"
|
2020-08-09 22:29:54 +00:00
|
|
|
JOB_STATUS_WARNING = "warning"
|
2017-08-16 21:37:37 +00:00
|
|
|
)
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2021-10-16 22:47:22 +00:00
|
|
|
var ALL_JOB_TYPES = [...]string{
|
|
|
|
JOB_TYPE_DATA_RETENTION,
|
|
|
|
JOB_TYPE_MESSAGE_EXPORT,
|
|
|
|
JOB_TYPE_ELASTICSEARCH_POST_INDEXING,
|
|
|
|
JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION,
|
|
|
|
JOB_TYPE_BLEVE_POST_INDEXING,
|
|
|
|
JOB_TYPE_LDAP_SYNC,
|
|
|
|
JOB_TYPE_MIGRATIONS,
|
|
|
|
JOB_TYPE_PLUGINS,
|
|
|
|
JOB_TYPE_EXPIRY_NOTIFY,
|
|
|
|
JOB_TYPE_PRODUCT_NOTICES,
|
|
|
|
JOB_TYPE_ACTIVE_USERS,
|
|
|
|
JOB_TYPE_IMPORT_PROCESS,
|
|
|
|
JOB_TYPE_IMPORT_DELETE,
|
|
|
|
JOB_TYPE_EXPORT_PROCESS,
|
|
|
|
JOB_TYPE_EXPORT_DELETE,
|
|
|
|
JOB_TYPE_CLOUD,
|
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
type Job struct {
|
2018-02-08 23:11:04 +00:00
|
|
|
Id string `json:"id"`
|
|
|
|
Type string `json:"type"`
|
|
|
|
Priority int64 `json:"priority"`
|
|
|
|
CreateAt int64 `json:"create_at"`
|
|
|
|
StartAt int64 `json:"start_at"`
|
|
|
|
LastActivityAt int64 `json:"last_activity_at"`
|
|
|
|
Status string `json:"status"`
|
|
|
|
Progress int64 `json:"progress"`
|
|
|
|
Data map[string]string `json:"data"`
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
func (j *Job) IsValid() *AppError {
|
2020-08-09 22:29:54 +00:00
|
|
|
if !IsValidId(j.Id) {
|
2017-08-16 21:37:37 +00:00
|
|
|
return NewAppError("Job.IsValid", "model.job.is_valid.id.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
2016-07-22 21:14:13 +00:00
|
|
|
}
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
if j.CreateAt == 0 {
|
|
|
|
return NewAppError("Job.IsValid", "model.job.is_valid.create_at.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
switch j.Type {
|
|
|
|
case JOB_TYPE_DATA_RETENTION:
|
|
|
|
case JOB_TYPE_ELASTICSEARCH_POST_INDEXING:
|
2018-02-08 23:11:04 +00:00
|
|
|
case JOB_TYPE_ELASTICSEARCH_POST_AGGREGATION:
|
2020-08-09 22:29:54 +00:00
|
|
|
case JOB_TYPE_BLEVE_POST_INDEXING:
|
2018-02-08 23:11:04 +00:00
|
|
|
case JOB_TYPE_LDAP_SYNC:
|
|
|
|
case JOB_TYPE_MESSAGE_EXPORT:
|
2018-11-18 17:55:05 +00:00
|
|
|
case JOB_TYPE_MIGRATIONS:
|
2020-08-09 22:29:54 +00:00
|
|
|
case JOB_TYPE_PLUGINS:
|
2020-10-19 21:40:00 +00:00
|
|
|
case JOB_TYPE_PRODUCT_NOTICES:
|
|
|
|
case JOB_TYPE_EXPIRY_NOTIFY:
|
|
|
|
case JOB_TYPE_ACTIVE_USERS:
|
2021-10-16 22:47:22 +00:00
|
|
|
case JOB_TYPE_IMPORT_PROCESS:
|
|
|
|
case JOB_TYPE_IMPORT_DELETE:
|
|
|
|
case JOB_TYPE_EXPORT_PROCESS:
|
|
|
|
case JOB_TYPE_EXPORT_DELETE:
|
2020-12-31 13:48:12 +00:00
|
|
|
case JOB_TYPE_CLOUD:
|
2021-10-16 22:47:22 +00:00
|
|
|
case JOB_TYPE_RESEND_INVITATION_EMAIL:
|
2017-08-16 21:37:37 +00:00
|
|
|
default:
|
|
|
|
return NewAppError("Job.IsValid", "model.job.is_valid.type.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
switch j.Status {
|
|
|
|
case JOB_STATUS_PENDING:
|
|
|
|
case JOB_STATUS_IN_PROGRESS:
|
|
|
|
case JOB_STATUS_SUCCESS:
|
|
|
|
case JOB_STATUS_ERROR:
|
|
|
|
case JOB_STATUS_CANCEL_REQUESTED:
|
|
|
|
case JOB_STATUS_CANCELED:
|
|
|
|
default:
|
|
|
|
return NewAppError("Job.IsValid", "model.job.is_valid.status.app_error", nil, "id="+j.Id, http.StatusBadRequest)
|
|
|
|
}
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
return nil
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2020-08-09 22:29:54 +00:00
|
|
|
func (j *Job) ToJson() string {
|
|
|
|
b, _ := json.Marshal(j)
|
2018-11-18 17:55:05 +00:00
|
|
|
return string(b)
|
2017-08-16 21:37:37 +00:00
|
|
|
}
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
func JobFromJson(data io.Reader) *Job {
|
|
|
|
var job Job
|
|
|
|
if err := json.NewDecoder(data).Decode(&job); err == nil {
|
|
|
|
return &job
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
2021-10-16 22:47:22 +00:00
|
|
|
return nil
|
2017-08-16 21:37:37 +00:00
|
|
|
}
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
func JobsToJson(jobs []*Job) string {
|
2018-11-18 17:55:05 +00:00
|
|
|
b, _ := json.Marshal(jobs)
|
|
|
|
return string(b)
|
2017-08-16 21:37:37 +00:00
|
|
|
}
|
2016-06-23 18:28:05 +00:00
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
func JobsFromJson(data io.Reader) []*Job {
|
|
|
|
var jobs []*Job
|
|
|
|
if err := json.NewDecoder(data).Decode(&jobs); err == nil {
|
|
|
|
return jobs
|
|
|
|
}
|
2021-10-16 22:47:22 +00:00
|
|
|
return nil
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2020-08-09 22:29:54 +00:00
|
|
|
func (j *Job) DataToJson() string {
|
|
|
|
b, _ := json.Marshal(j.Data)
|
2018-11-18 17:55:05 +00:00
|
|
|
return string(b)
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
type Worker interface {
|
|
|
|
Run()
|
|
|
|
Stop()
|
|
|
|
JobChannel() chan<- Job
|
2016-08-15 16:47:31 +00:00
|
|
|
}
|
|
|
|
|
2017-08-16 21:37:37 +00:00
|
|
|
type Scheduler interface {
|
2018-02-08 23:11:04 +00:00
|
|
|
Name() string
|
|
|
|
JobType() string
|
|
|
|
Enabled(cfg *Config) bool
|
|
|
|
NextScheduleTime(cfg *Config, now time.Time, pendingJobs bool, lastSuccessfulJob *Job) *time.Time
|
|
|
|
ScheduleJob(cfg *Config, pendingJobs bool, lastSuccessfulJob *Job) (*Job, *AppError)
|
2016-06-23 18:28:05 +00:00
|
|
|
}
|