PLT-6408 Framework for job server (#6404)
* Added initial job server * Added job server to be ran as part of platform * Added test job to the enterprise repo * Fixed job server not loading license * Renamed job package to jobs * Fixed TE not being buildable * Added JobStatus table to database * Changed fields used by JobStatus * Added APIs to query job status * Added config change listener to server * Added option to run job server from Makefile * Added ability to enable/disable jobs from config * Commented out placeholder for search indexing job * Fixed govet * Removed debug messages and fixed job api init message
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
920bc0d871
Коммит
577ed27f1b
74
jobs/jobs.go
Обычный файл
74
jobs/jobs.go
Обычный файл
@@ -0,0 +1,74 @@
|
||||
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
package jobs
|
||||
|
||||
import (
|
||||
"sync"
|
||||
|
||||
l4g "github.com/alecthomas/log4go"
|
||||
ejobs "github.com/mattermost/platform/einterfaces/jobs"
|
||||
"github.com/mattermost/platform/model"
|
||||
"github.com/mattermost/platform/store"
|
||||
"github.com/mattermost/platform/utils"
|
||||
)
|
||||
|
||||
type Jobs struct {
|
||||
startOnce sync.Once
|
||||
|
||||
DataRetention model.Job
|
||||
// SearchIndexing model.Job
|
||||
|
||||
listenerId string
|
||||
}
|
||||
|
||||
func InitJobs(s store.Store) *Jobs {
|
||||
jobs := &Jobs{
|
||||
// SearchIndexing: MakeTestJob(s, "SearchIndexing"),
|
||||
}
|
||||
|
||||
if dataRetentionInterface := ejobs.GetDataRetentionInterface(); dataRetentionInterface != nil {
|
||||
jobs.DataRetention = dataRetentionInterface.MakeJob(s)
|
||||
}
|
||||
|
||||
return jobs
|
||||
}
|
||||
|
||||
func (jobs *Jobs) Start() *Jobs {
|
||||
l4g.Info("Starting jobs")
|
||||
|
||||
jobs.startOnce.Do(func() {
|
||||
if jobs.DataRetention != nil && *utils.Cfg.DataRetentionSettings.Enable {
|
||||
go jobs.DataRetention.Run()
|
||||
}
|
||||
|
||||
// go jobs.SearchIndexing.Run()
|
||||
})
|
||||
|
||||
jobs.listenerId = utils.AddConfigListener(jobs.handleConfigChange)
|
||||
|
||||
return jobs
|
||||
}
|
||||
|
||||
func (jobs *Jobs) handleConfigChange(oldConfig *model.Config, newConfig *model.Config) {
|
||||
if jobs.DataRetention != nil {
|
||||
if !*oldConfig.DataRetentionSettings.Enable && *newConfig.DataRetentionSettings.Enable {
|
||||
go jobs.DataRetention.Run()
|
||||
} else if *oldConfig.DataRetentionSettings.Enable && !*newConfig.DataRetentionSettings.Enable {
|
||||
jobs.DataRetention.Stop()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (jobs *Jobs) Stop() *Jobs {
|
||||
utils.RemoveConfigListener(jobs.listenerId)
|
||||
|
||||
if jobs.DataRetention != nil && *utils.Cfg.DataRetentionSettings.Enable {
|
||||
jobs.DataRetention.Stop()
|
||||
}
|
||||
// jobs.SearchIndexing.Stop()
|
||||
|
||||
l4g.Info("Stopped jobs")
|
||||
|
||||
return jobs
|
||||
}
|
||||
46
jobs/jobserver/jobserver.go
Обычный файл
46
jobs/jobserver/jobserver.go
Обычный файл
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"os"
|
||||
"os/signal"
|
||||
"syscall"
|
||||
|
||||
l4g "github.com/alecthomas/log4go"
|
||||
"github.com/mattermost/platform/jobs"
|
||||
"github.com/mattermost/platform/store"
|
||||
"github.com/mattermost/platform/utils"
|
||||
|
||||
_ "github.com/mattermost/platform/imports"
|
||||
)
|
||||
|
||||
var Srv jobs.JobServer
|
||||
|
||||
func main() {
|
||||
// Initialize
|
||||
utils.InitAndLoadConfig("config.json")
|
||||
defer l4g.Close()
|
||||
|
||||
Srv.Store = store.NewSqlStore()
|
||||
defer Srv.Store.Close()
|
||||
|
||||
Srv.LoadLicense()
|
||||
|
||||
// Run jobs
|
||||
l4g.Info("Starting Mattermost job server")
|
||||
Srv.Jobs = jobs.InitJobs(Srv.Store)
|
||||
Srv.Jobs.Start()
|
||||
|
||||
var signalChan chan os.Signal = make(chan os.Signal)
|
||||
signal.Notify(signalChan, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
||||
<-signalChan
|
||||
|
||||
// Cleanup anything that isn't handled by a defer statement
|
||||
l4g.Info("Stopping Mattermost job server")
|
||||
|
||||
Srv.Jobs.Stop()
|
||||
|
||||
l4g.Info("Stopped Mattermost job server")
|
||||
}
|
||||
46
jobs/server.go
Обычный файл
46
jobs/server.go
Обычный файл
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
package jobs
|
||||
|
||||
import (
|
||||
l4g "github.com/alecthomas/log4go"
|
||||
"github.com/mattermost/platform/model"
|
||||
"github.com/mattermost/platform/store"
|
||||
"github.com/mattermost/platform/utils"
|
||||
)
|
||||
|
||||
type JobServer struct {
|
||||
Store store.Store
|
||||
Jobs *Jobs
|
||||
}
|
||||
|
||||
func (server *JobServer) LoadLicense() {
|
||||
licenseId := ""
|
||||
if result := <-server.Store.System().Get(); result.Err == nil {
|
||||
props := result.Data.(model.StringMap)
|
||||
licenseId = props[model.SYSTEM_ACTIVE_LICENSE_ID]
|
||||
}
|
||||
|
||||
var licenseBytes []byte
|
||||
|
||||
if len(licenseId) != 26 {
|
||||
// Lets attempt to load the file from disk since it was missing from the DB
|
||||
_, licenseBytes = utils.GetAndValidateLicenseFileFromDisk()
|
||||
} else {
|
||||
if result := <-server.Store.License().Get(licenseId); result.Err == nil {
|
||||
record := result.Data.(*model.LicenseRecord)
|
||||
licenseBytes = []byte(record.Bytes)
|
||||
l4g.Info("License key valid unlocking enterprise features.")
|
||||
} else {
|
||||
l4g.Info(utils.T("mattermost.load_license.find.warn"))
|
||||
}
|
||||
}
|
||||
|
||||
if licenseBytes != nil {
|
||||
utils.LoadLicense(licenseBytes)
|
||||
l4g.Info("License key valid unlocking enterprise features.")
|
||||
} else {
|
||||
l4g.Info(utils.T("mattermost.load_license.find.warn"))
|
||||
}
|
||||
}
|
||||
54
jobs/testjob.go
Обычный файл
54
jobs/testjob.go
Обычный файл
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||
// See License.txt for license information.
|
||||
|
||||
package jobs
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
l4g "github.com/alecthomas/log4go"
|
||||
"github.com/mattermost/platform/store"
|
||||
)
|
||||
|
||||
type TestJob struct {
|
||||
store store.Store
|
||||
|
||||
name string
|
||||
stop chan bool
|
||||
stopped chan bool
|
||||
}
|
||||
|
||||
func MakeTestJob(s store.Store, name string) *TestJob {
|
||||
return &TestJob{
|
||||
store: s,
|
||||
name: name,
|
||||
stop: make(chan bool, 1),
|
||||
stopped: make(chan bool, 1),
|
||||
}
|
||||
}
|
||||
|
||||
func (job *TestJob) Run() {
|
||||
l4g.Debug("Job %v: Started", job.name)
|
||||
|
||||
running := true
|
||||
for running {
|
||||
l4g.Debug("Job %v: Tick", job.name)
|
||||
|
||||
select {
|
||||
case <-job.stop:
|
||||
l4g.Debug("Job %v: Received stop signal", job.name)
|
||||
running = false
|
||||
case <-time.After(10 * time.Second):
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
l4g.Debug("Job %v: Finished", job.name)
|
||||
job.stopped <- true
|
||||
}
|
||||
|
||||
func (job *TestJob) Stop() {
|
||||
l4g.Debug("Job %v: Stopping", job.name)
|
||||
job.stop <- true
|
||||
<-job.stopped
|
||||
}
|
||||
Ссылка в новой задаче
Block a user