diff options
author | Harrison Healey <harrisonmhealey@gmail.com> | 2017-05-18 15:05:57 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-05-18 15:05:57 -0400 |
commit | 577ed27f1bb060080d311342047e31943a02ccbb (patch) | |
tree | ad57fa69b1daf143e914ea2480a475e5450cc236 /jobs | |
parent | 920bc0d8712a50691b1f698779f60132536eb214 (diff) | |
download | chat-577ed27f1bb060080d311342047e31943a02ccbb.tar.gz chat-577ed27f1bb060080d311342047e31943a02ccbb.tar.bz2 chat-577ed27f1bb060080d311342047e31943a02ccbb.zip |
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
Diffstat (limited to 'jobs')
-rw-r--r-- | jobs/jobs.go | 74 | ||||
-rw-r--r-- | jobs/jobserver/jobserver.go | 46 | ||||
-rw-r--r-- | jobs/server.go | 46 | ||||
-rw-r--r-- | jobs/testjob.go | 54 |
4 files changed, 220 insertions, 0 deletions
diff --git a/jobs/jobs.go b/jobs/jobs.go new file mode 100644 index 000000000..8c84f4eea --- /dev/null +++ b/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 +} diff --git a/jobs/jobserver/jobserver.go b/jobs/jobserver/jobserver.go new file mode 100644 index 000000000..813676b78 --- /dev/null +++ b/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") +} diff --git a/jobs/server.go b/jobs/server.go new file mode 100644 index 000000000..dd3448842 --- /dev/null +++ b/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")) + } +} diff --git a/jobs/testjob.go b/jobs/testjob.go new file mode 100644 index 000000000..59d5274e5 --- /dev/null +++ b/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 +} |