Miscellaneous app cleanup (#7594)
* app cleanup * whoops, forgot a file * some minor cleanup * longer container deadline * defensive checks
Этот коммит содержится в:
@@ -61,12 +61,6 @@ type API struct {
|
|||||||
BaseRoutes *Routes
|
BaseRoutes *Routes
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRouter() *mux.Router {
|
|
||||||
ret := mux.NewRouter()
|
|
||||||
ret.NotFoundHandler = http.HandlerFunc(Handle404)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func Init(a *app.App, root *mux.Router) *API {
|
func Init(a *app.App, root *mux.Router) *API {
|
||||||
api := &API{
|
api := &API{
|
||||||
App: a,
|
App: a,
|
||||||
|
|||||||
@@ -34,31 +34,26 @@ type TestHelper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setupTestHelper(enterprise bool) *TestHelper {
|
func setupTestHelper(enterprise bool) *TestHelper {
|
||||||
|
utils.TranslationsPreInit()
|
||||||
|
utils.LoadConfig("config.json")
|
||||||
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
|
|
||||||
th := &TestHelper{
|
th := &TestHelper{
|
||||||
App: app.New(),
|
App: app.New(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if th.App.Srv == nil {
|
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
||||||
utils.TranslationsPreInit()
|
*utils.Cfg.RateLimitSettings.Enable = false
|
||||||
utils.LoadConfig("config.json")
|
utils.Cfg.EmailSettings.SendEmailNotifications = true
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
utils.DisableDebugLogForTest()
|
||||||
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
th.App.StartServer()
|
||||||
*utils.Cfg.RateLimitSettings.Enable = false
|
api4.Init(th.App, th.App.Srv.Router, false)
|
||||||
utils.Cfg.EmailSettings.SendEmailNotifications = true
|
Init(th.App, th.App.Srv.Router)
|
||||||
utils.DisableDebugLogForTest()
|
wsapi.Init(th.App, th.App.Srv.WebSocketRouter)
|
||||||
th.App.NewServer()
|
utils.EnableDebugLogForTest()
|
||||||
th.App.InitStores()
|
th.App.Srv.Store.MarkSystemRanUnitTests()
|
||||||
th.App.Srv.Router = NewRouter()
|
|
||||||
th.App.Srv.WebSocketRouter = th.App.NewWebSocketRouter()
|
|
||||||
th.App.StartServer()
|
|
||||||
api4.Init(th.App, th.App.Srv.Router, false)
|
|
||||||
Init(th.App, th.App.Srv.Router)
|
|
||||||
wsapi.Init(th.App, th.App.Srv.WebSocketRouter)
|
|
||||||
utils.EnableDebugLogForTest()
|
|
||||||
th.App.Srv.Store.MarkSystemRanUnitTests()
|
|
||||||
|
|
||||||
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
||||||
}
|
|
||||||
|
|
||||||
utils.SetIsLicensed(enterprise)
|
utils.SetIsLicensed(enterprise)
|
||||||
if enterprise {
|
if enterprise {
|
||||||
|
|||||||
@@ -109,12 +109,6 @@ type API struct {
|
|||||||
BaseRoutes *Routes
|
BaseRoutes *Routes
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRouter() *mux.Router {
|
|
||||||
ret := mux.NewRouter()
|
|
||||||
ret.NotFoundHandler = http.HandlerFunc(Handle404)
|
|
||||||
return ret
|
|
||||||
}
|
|
||||||
|
|
||||||
func Init(a *app.App, root *mux.Router, full bool) *API {
|
func Init(a *app.App, root *mux.Router, full bool) *API {
|
||||||
api := &API{
|
api := &API{
|
||||||
App: a,
|
App: a,
|
||||||
|
|||||||
@@ -46,38 +46,31 @@ type TestHelper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setupTestHelper(enterprise bool) *TestHelper {
|
func setupTestHelper(enterprise bool) *TestHelper {
|
||||||
|
utils.TranslationsPreInit()
|
||||||
|
utils.LoadConfig("config.json")
|
||||||
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
|
|
||||||
th := &TestHelper{
|
th := &TestHelper{
|
||||||
App: app.New(),
|
App: app.New(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if th.App.Srv == nil {
|
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
||||||
utils.TranslationsPreInit()
|
*utils.Cfg.RateLimitSettings.Enable = false
|
||||||
utils.LoadConfig("config.json")
|
utils.Cfg.EmailSettings.SendEmailNotifications = true
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
utils.DisableDebugLogForTest()
|
||||||
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
th.App.StartServer()
|
||||||
*utils.Cfg.RateLimitSettings.Enable = false
|
Init(th.App, th.App.Srv.Router, true)
|
||||||
utils.Cfg.EmailSettings.SendEmailNotifications = true
|
wsapi.Init(th.App, th.App.Srv.WebSocketRouter)
|
||||||
utils.DisableDebugLogForTest()
|
utils.EnableDebugLogForTest()
|
||||||
th.App.NewServer()
|
th.App.Srv.Store.MarkSystemRanUnitTests()
|
||||||
th.App.InitStores()
|
|
||||||
th.App.Srv.Router = NewRouter()
|
|
||||||
th.App.Srv.WebSocketRouter = th.App.NewWebSocketRouter()
|
|
||||||
th.App.StartServer()
|
|
||||||
Init(th.App, th.App.Srv.Router, true)
|
|
||||||
wsapi.Init(th.App, th.App.Srv.WebSocketRouter)
|
|
||||||
utils.EnableDebugLogForTest()
|
|
||||||
th.App.Srv.Store.MarkSystemRanUnitTests()
|
|
||||||
|
|
||||||
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
||||||
}
|
|
||||||
|
|
||||||
utils.SetIsLicensed(enterprise)
|
utils.SetIsLicensed(enterprise)
|
||||||
if enterprise {
|
if enterprise {
|
||||||
utils.License().Features.SetDefaults()
|
utils.License().Features.SetDefaults()
|
||||||
}
|
}
|
||||||
|
|
||||||
th.App.Jobs.Store = th.App.Srv.Store
|
|
||||||
|
|
||||||
th.Client = th.CreateClient()
|
th.Client = th.CreateClient()
|
||||||
th.SystemAdminClient = th.CreateClient()
|
th.SystemAdminClient = th.CreateClient()
|
||||||
return th
|
return th
|
||||||
|
|||||||
10
app/admin.go
10
app/admin.go
@@ -15,7 +15,6 @@ import (
|
|||||||
|
|
||||||
l4g "github.com/alecthomas/log4go"
|
l4g "github.com/alecthomas/log4go"
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
"github.com/mattermost/mattermost-server/store"
|
|
||||||
"github.com/mattermost/mattermost-server/store/sqlstore"
|
"github.com/mattermost/mattermost-server/store/sqlstore"
|
||||||
"github.com/mattermost/mattermost-server/utils"
|
"github.com/mattermost/mattermost-server/utils"
|
||||||
)
|
)
|
||||||
@@ -187,12 +186,13 @@ func (a *App) RecycleDatabaseConnection() {
|
|||||||
oldStore := a.Srv.Store
|
oldStore := a.Srv.Store
|
||||||
|
|
||||||
l4g.Warn(utils.T("api.admin.recycle_db_start.warn"))
|
l4g.Warn(utils.T("api.admin.recycle_db_start.warn"))
|
||||||
a.Srv.Store = store.NewLayeredStore(sqlstore.NewSqlSupplier(utils.Cfg.SqlSettings, a.Metrics), a.Metrics, a.Cluster)
|
a.Srv.Store = a.newStore()
|
||||||
|
|
||||||
a.Jobs.Store = a.Srv.Store
|
a.Jobs.Store = a.Srv.Store
|
||||||
|
|
||||||
time.Sleep(20 * time.Second)
|
if a.Srv.Store != oldStore {
|
||||||
oldStore.Close()
|
time.Sleep(20 * time.Second)
|
||||||
|
oldStore.Close()
|
||||||
|
}
|
||||||
|
|
||||||
l4g.Warn(utils.T("api.admin.recycle_db_end.warn"))
|
l4g.Warn(utils.T("api.admin.recycle_db_end.warn"))
|
||||||
}
|
}
|
||||||
|
|||||||
65
app/app.go
65
app/app.go
@@ -4,17 +4,19 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
|
|
||||||
l4g "github.com/alecthomas/log4go"
|
l4g "github.com/alecthomas/log4go"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
|
||||||
"github.com/mattermost/mattermost-server/einterfaces"
|
"github.com/mattermost/mattermost-server/einterfaces"
|
||||||
ejobs "github.com/mattermost/mattermost-server/einterfaces/jobs"
|
ejobs "github.com/mattermost/mattermost-server/einterfaces/jobs"
|
||||||
"github.com/mattermost/mattermost-server/jobs"
|
"github.com/mattermost/mattermost-server/jobs"
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
"github.com/mattermost/mattermost-server/plugin/pluginenv"
|
"github.com/mattermost/mattermost-server/plugin/pluginenv"
|
||||||
|
"github.com/mattermost/mattermost-server/store"
|
||||||
|
"github.com/mattermost/mattermost-server/store/sqlstore"
|
||||||
"github.com/mattermost/mattermost-server/utils"
|
"github.com/mattermost/mattermost-server/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -44,44 +46,69 @@ type App struct {
|
|||||||
Metrics einterfaces.MetricsInterface
|
Metrics einterfaces.MetricsInterface
|
||||||
Mfa einterfaces.MfaInterface
|
Mfa einterfaces.MfaInterface
|
||||||
Saml einterfaces.SamlInterface
|
Saml einterfaces.SamlInterface
|
||||||
|
|
||||||
|
newStore func() store.Store
|
||||||
}
|
}
|
||||||
|
|
||||||
var appCount = 0
|
var appCount = 0
|
||||||
|
|
||||||
// New creates a new App. You must call Shutdown when you're done with it.
|
// New creates a new App. You must call Shutdown when you're done with it.
|
||||||
// XXX: For now, only one at a time is allowed as some resources are still shared.
|
// XXX: For now, only one at a time is allowed as some resources are still shared.
|
||||||
func New() *App {
|
func New(options ...Option) *App {
|
||||||
appCount++
|
appCount++
|
||||||
if appCount > 1 {
|
if appCount > 1 {
|
||||||
panic("Only one App should exist at a time. Did you forget to call Shutdown()?")
|
panic("Only one App should exist at a time. Did you forget to call Shutdown()?")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
l4g.Info(utils.T("api.server.new_server.init.info"))
|
||||||
|
|
||||||
app := &App{
|
app := &App{
|
||||||
goroutineExitSignal: make(chan struct{}, 1),
|
goroutineExitSignal: make(chan struct{}, 1),
|
||||||
Jobs: &jobs.JobServer{},
|
Jobs: &jobs.JobServer{},
|
||||||
|
Srv: &Server{
|
||||||
|
Router: mux.NewRouter(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
app.initEnterprise()
|
app.initEnterprise()
|
||||||
|
|
||||||
|
for _, option := range options {
|
||||||
|
option(app)
|
||||||
|
}
|
||||||
|
|
||||||
|
if app.newStore == nil {
|
||||||
|
app.newStore = func() store.Store {
|
||||||
|
return store.NewLayeredStore(sqlstore.NewSqlSupplier(utils.Cfg.SqlSettings, app.Metrics), app.Metrics, app.Cluster)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
app.Srv.Store = app.newStore()
|
||||||
|
app.Jobs.Store = app.Srv.Store
|
||||||
|
|
||||||
|
app.Srv.Router.NotFoundHandler = http.HandlerFunc(app.Handle404)
|
||||||
|
|
||||||
|
app.Srv.WebSocketRouter = &WebSocketRouter{
|
||||||
|
app: app,
|
||||||
|
handlers: make(map[string]webSocketHandler),
|
||||||
|
}
|
||||||
|
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) Shutdown() {
|
func (a *App) Shutdown() {
|
||||||
appCount--
|
appCount--
|
||||||
|
|
||||||
if a.Srv != nil {
|
l4g.Info(utils.T("api.server.stop_server.stopping.info"))
|
||||||
l4g.Info(utils.T("api.server.stop_server.stopping.info"))
|
|
||||||
|
|
||||||
a.Srv.GracefulServer.Stop(TIME_TO_WAIT_FOR_CONNECTIONS_TO_CLOSE_ON_SERVER_SHUTDOWN)
|
a.StopServer()
|
||||||
<-a.Srv.GracefulServer.StopChan()
|
a.HubStop()
|
||||||
a.HubStop()
|
|
||||||
|
|
||||||
a.ShutDownPlugins()
|
a.ShutDownPlugins()
|
||||||
a.WaitForGoroutines()
|
a.WaitForGoroutines()
|
||||||
|
|
||||||
a.Srv.Store.Close()
|
a.Srv.Store.Close()
|
||||||
a.Srv = nil
|
a.Srv = nil
|
||||||
|
|
||||||
l4g.Info(utils.T("api.server.stop_server.stopped.info"))
|
l4g.Info(utils.T("api.server.stop_server.stopped.info"))
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var accountMigrationInterface func(*App) einterfaces.AccountMigrationInterface
|
var accountMigrationInterface func(*App) einterfaces.AccountMigrationInterface
|
||||||
@@ -232,9 +259,11 @@ func (a *App) WaitForGoroutines() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func CloseBody(r *http.Response) {
|
func (a *App) Handle404(w http.ResponseWriter, r *http.Request) {
|
||||||
if r.Body != nil {
|
err := model.NewAppError("Handle404", "api.context.404.app_error", nil, "", http.StatusNotFound)
|
||||||
ioutil.ReadAll(r.Body)
|
err.Translate(utils.T)
|
||||||
r.Body.Close()
|
|
||||||
}
|
l4g.Debug("%v: code=404 ip=%v", r.URL.Path, utils.GetIpAddress(r))
|
||||||
|
|
||||||
|
utils.RenderWebError(err, w, r)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,26 +22,23 @@ type TestHelper struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setupTestHelper(enterprise bool) *TestHelper {
|
func setupTestHelper(enterprise bool) *TestHelper {
|
||||||
|
utils.TranslationsPreInit()
|
||||||
|
utils.LoadConfig("config.json")
|
||||||
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
|
|
||||||
th := &TestHelper{
|
th := &TestHelper{
|
||||||
App: New(),
|
App: New(),
|
||||||
}
|
}
|
||||||
|
|
||||||
if th.App.Srv == nil {
|
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
||||||
utils.TranslationsPreInit()
|
*utils.Cfg.RateLimitSettings.Enable = false
|
||||||
utils.LoadConfig("config.json")
|
utils.DisableDebugLogForTest()
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
th.App.StartServer()
|
||||||
*utils.Cfg.TeamSettings.MaxUsersPerTeam = 50
|
utils.InitHTML()
|
||||||
*utils.Cfg.RateLimitSettings.Enable = false
|
utils.EnableDebugLogForTest()
|
||||||
utils.DisableDebugLogForTest()
|
th.App.Srv.Store.MarkSystemRanUnitTests()
|
||||||
th.App.NewServer()
|
|
||||||
th.App.InitStores()
|
|
||||||
th.App.StartServer()
|
|
||||||
utils.InitHTML()
|
|
||||||
utils.EnableDebugLogForTest()
|
|
||||||
th.App.Srv.Store.MarkSystemRanUnitTests()
|
|
||||||
|
|
||||||
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
||||||
}
|
|
||||||
|
|
||||||
utils.SetIsLicensed(enterprise)
|
utils.SetIsLicensed(enterprise)
|
||||||
if enterprise {
|
if enterprise {
|
||||||
|
|||||||
12
app/oauth.go
12
app/oauth.go
@@ -7,7 +7,6 @@ import (
|
|||||||
"bytes"
|
"bytes"
|
||||||
b64 "encoding/base64"
|
b64 "encoding/base64"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -428,10 +427,7 @@ func (a *App) RevokeAccessToken(token string) *model.AppError {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) CompleteOAuth(service string, body io.ReadCloser, teamId string, props map[string]string) (*model.User, *model.AppError) {
|
func (a *App) CompleteOAuth(service string, body io.ReadCloser, teamId string, props map[string]string) (*model.User, *model.AppError) {
|
||||||
defer func() {
|
defer body.Close()
|
||||||
ioutil.ReadAll(body)
|
|
||||||
body.Close()
|
|
||||||
}()
|
|
||||||
|
|
||||||
action := props["action"]
|
action := props["action"]
|
||||||
|
|
||||||
@@ -688,11 +684,9 @@ func (a *App) AuthorizeOAuthUser(w http.ResponseWriter, r *http.Request, service
|
|||||||
if resp, err := utils.HttpClient(true).Do(req); err != nil {
|
if resp, err := utils.HttpClient(true).Do(req); err != nil {
|
||||||
return nil, "", stateProps, model.NewAppError("AuthorizeOAuthUser", "api.user.authorize_oauth_user.token_failed.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return nil, "", stateProps, model.NewAppError("AuthorizeOAuthUser", "api.user.authorize_oauth_user.token_failed.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
} else {
|
} else {
|
||||||
bodyBytes, _ = ioutil.ReadAll(resp.Body)
|
|
||||||
resp.Body = ioutil.NopCloser(bytes.NewBuffer(bodyBytes))
|
|
||||||
|
|
||||||
ar = model.AccessResponseFromJson(resp.Body)
|
ar = model.AccessResponseFromJson(resp.Body)
|
||||||
defer CloseBody(resp)
|
resp.Body.Close()
|
||||||
|
|
||||||
if ar == nil {
|
if ar == nil {
|
||||||
return nil, "", stateProps, model.NewAppError("AuthorizeOAuthUser", "api.user.authorize_oauth_user.bad_response.app_error", nil, "response_body="+string(bodyBytes), http.StatusInternalServerError)
|
return nil, "", stateProps, model.NewAppError("AuthorizeOAuthUser", "api.user.authorize_oauth_user.bad_response.app_error", nil, "response_body="+string(bodyBytes), http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
|||||||
29
app/options.go
Обычный файл
29
app/options.go
Обычный файл
@@ -0,0 +1,29 @@
|
|||||||
|
// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
|
||||||
|
// See License.txt for license information.
|
||||||
|
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/mattermost/mattermost-server/store"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Option func(a *App)
|
||||||
|
|
||||||
|
// By default, the app will use the store specified by the configuration. This allows you to
|
||||||
|
// construct an app with a different store.
|
||||||
|
//
|
||||||
|
// The storeOrFactory parameter must be either a store.Store or func() store.Store.
|
||||||
|
func StoreOverride(storeOrFactory interface{}) Option {
|
||||||
|
return func(a *App) {
|
||||||
|
switch s := storeOrFactory.(type) {
|
||||||
|
case store.Store:
|
||||||
|
a.newStore = func() store.Store {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
case func() store.Store:
|
||||||
|
a.newStore = s
|
||||||
|
default:
|
||||||
|
panic("invalid StoreOverride")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -679,7 +679,7 @@ func GetOpenGraphMetadata(url string) *opengraph.OpenGraph {
|
|||||||
l4g.Error("GetOpenGraphMetadata request failed for url=%v with err=%v", url, err.Error())
|
l4g.Error("GetOpenGraphMetadata request failed for url=%v with err=%v", url, err.Error())
|
||||||
return og
|
return og
|
||||||
}
|
}
|
||||||
defer CloseBody(res)
|
defer res.Body.Close()
|
||||||
|
|
||||||
if err := og.ProcessHTML(res.Body); err != nil {
|
if err := og.ProcessHTML(res.Body); err != nil {
|
||||||
l4g.Error("GetOpenGraphMetadata processing failed for url=%v with err=%v", url, err.Error())
|
l4g.Error("GetOpenGraphMetadata processing failed for url=%v with err=%v", url, err.Error())
|
||||||
|
|||||||
@@ -20,7 +20,6 @@ import (
|
|||||||
|
|
||||||
"github.com/mattermost/mattermost-server/model"
|
"github.com/mattermost/mattermost-server/model"
|
||||||
"github.com/mattermost/mattermost-server/store"
|
"github.com/mattermost/mattermost-server/store"
|
||||||
"github.com/mattermost/mattermost-server/store/sqlstore"
|
|
||||||
"github.com/mattermost/mattermost-server/utils"
|
"github.com/mattermost/mattermost-server/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -78,16 +77,6 @@ func (cw *CorsWrapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
const TIME_TO_WAIT_FOR_CONNECTIONS_TO_CLOSE_ON_SERVER_SHUTDOWN = time.Second
|
const TIME_TO_WAIT_FOR_CONNECTIONS_TO_CLOSE_ON_SERVER_SHUTDOWN = time.Second
|
||||||
|
|
||||||
func (a *App) NewServer() {
|
|
||||||
l4g.Info(utils.T("api.server.new_server.init.info"))
|
|
||||||
|
|
||||||
a.Srv = &Server{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (a *App) InitStores() {
|
|
||||||
a.Srv.Store = store.NewLayeredStore(sqlstore.NewSqlSupplier(utils.Cfg.SqlSettings, a.Metrics), a.Metrics, a.Cluster)
|
|
||||||
}
|
|
||||||
|
|
||||||
type VaryBy struct{}
|
type VaryBy struct{}
|
||||||
|
|
||||||
func (m *VaryBy) Key(r *http.Request) string {
|
func (m *VaryBy) Key(r *http.Request) string {
|
||||||
@@ -211,3 +200,11 @@ func (a *App) StartServer() {
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *App) StopServer() {
|
||||||
|
if a.Srv.GracefulServer != nil {
|
||||||
|
a.Srv.GracefulServer.Stop(TIME_TO_WAIT_FOR_CONNECTIONS_TO_CLOSE_ON_SERVER_SHUTDOWN)
|
||||||
|
<-a.Srv.GracefulServer.StopChan()
|
||||||
|
a.Srv.GracefulServer = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ func (a *App) TriggerWebhook(payload *model.OutgoingWebhookPayload, hook *model.
|
|||||||
if resp, err := utils.HttpClient(false).Do(req); err != nil {
|
if resp, err := utils.HttpClient(false).Do(req); err != nil {
|
||||||
l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.event_post.error"), err.Error())
|
l4g.Error(utils.T("api.post.handle_webhook_events_and_forget.event_post.error"), err.Error())
|
||||||
} else {
|
} else {
|
||||||
defer CloseBody(resp)
|
defer resp.Body.Close()
|
||||||
webhookResp := model.OutgoingWebhookResponseFromJson(resp.Body)
|
webhookResp := model.OutgoingWebhookResponseFromJson(resp.Body)
|
||||||
|
|
||||||
if webhookResp != nil && webhookResp.Text != nil {
|
if webhookResp != nil && webhookResp.Text != nil {
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ func GetWebrtcToken(sessionId string) (string, *model.AppError) {
|
|||||||
if rp, err := utils.HttpClient(true).Do(rq); err != nil {
|
if rp, err := utils.HttpClient(true).Do(rq); err != nil {
|
||||||
return "", model.NewAppError("WebRTC.Token", "model.client.connecting.app_error", nil, err.Error(), http.StatusInternalServerError)
|
return "", model.NewAppError("WebRTC.Token", "model.client.connecting.app_error", nil, err.Error(), http.StatusInternalServerError)
|
||||||
} else if rp.StatusCode >= 300 {
|
} else if rp.StatusCode >= 300 {
|
||||||
defer CloseBody(rp)
|
defer rp.Body.Close()
|
||||||
return "", model.AppErrorFromJson(rp.Body)
|
return "", model.AppErrorFromJson(rp.Body)
|
||||||
} else {
|
} else {
|
||||||
janusResponse := model.GatewayResponseFromJson(rp.Body)
|
janusResponse := model.GatewayResponseFromJson(rp.Body)
|
||||||
|
|||||||
@@ -21,13 +21,6 @@ type WebSocketRouter struct {
|
|||||||
handlers map[string]webSocketHandler
|
handlers map[string]webSocketHandler
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *App) NewWebSocketRouter() *WebSocketRouter {
|
|
||||||
return &WebSocketRouter{
|
|
||||||
app: a,
|
|
||||||
handlers: make(map[string]webSocketHandler),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (wr *WebSocketRouter) Handle(action string, handler webSocketHandler) {
|
func (wr *WebSocketRouter) Handle(action string, handler webSocketHandler) {
|
||||||
wr.handlers[action] = handler
|
wr.handlers[action] = handler
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ func initDBCommandContext(configFileLocation string) (*app.App, error) {
|
|||||||
utils.ConfigureCmdLineLog()
|
utils.ConfigureCmdLineLog()
|
||||||
|
|
||||||
a := app.New()
|
a := app.New()
|
||||||
a.NewServer()
|
|
||||||
a.InitStores()
|
|
||||||
if model.BuildEnterpriseReady == "true" {
|
if model.BuildEnterpriseReady == "true" {
|
||||||
a.LoadLicense()
|
a.LoadLicense()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,9 +8,6 @@ import (
|
|||||||
"syscall"
|
"syscall"
|
||||||
|
|
||||||
l4g "github.com/alecthomas/log4go"
|
l4g "github.com/alecthomas/log4go"
|
||||||
"github.com/mattermost/mattermost-server/store"
|
|
||||||
"github.com/mattermost/mattermost-server/store/sqlstore"
|
|
||||||
"github.com/mattermost/mattermost-server/utils"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -36,9 +33,7 @@ func jobserverCmdF(cmd *cobra.Command, args []string) {
|
|||||||
panic(err.Error())
|
panic(err.Error())
|
||||||
}
|
}
|
||||||
defer l4g.Close()
|
defer l4g.Close()
|
||||||
|
defer a.Shutdown()
|
||||||
a.Jobs.Store = store.NewLayeredStore(sqlstore.NewSqlSupplier(utils.Cfg.SqlSettings, a.Metrics), a.Metrics, a.Cluster)
|
|
||||||
defer a.Jobs.Store.Close()
|
|
||||||
|
|
||||||
a.Jobs.LoadLicense()
|
a.Jobs.LoadLicense()
|
||||||
|
|
||||||
|
|||||||
@@ -67,11 +67,6 @@ func runServer(configFileLocation string) {
|
|||||||
a := app.New()
|
a := app.New()
|
||||||
defer a.Shutdown()
|
defer a.Shutdown()
|
||||||
|
|
||||||
a.NewServer()
|
|
||||||
a.InitStores()
|
|
||||||
a.Srv.Router = api.NewRouter()
|
|
||||||
a.Srv.WebSocketRouter = a.NewWebSocketRouter()
|
|
||||||
|
|
||||||
if model.BuildEnterpriseReady == "true" {
|
if model.BuildEnterpriseReady == "true" {
|
||||||
a.LoadLicense()
|
a.LoadLicense()
|
||||||
}
|
}
|
||||||
@@ -92,6 +87,7 @@ func runServer(configFileLocation string) {
|
|||||||
l4g.Error("Unable to find webapp directory, could not initialize plugins")
|
l4g.Error("Unable to find webapp directory, could not initialize plugins")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.StartServer()
|
||||||
api4.Init(a, a.Srv.Router, false)
|
api4.Init(a, a.Srv.Router, false)
|
||||||
api3 := api.Init(a, a.Srv.Router)
|
api3 := api.Init(a, a.Srv.Router)
|
||||||
wsapi.Init(a, a.Srv.WebSocketRouter)
|
wsapi.Init(a, a.Srv.WebSocketRouter)
|
||||||
@@ -115,8 +111,6 @@ func runServer(configFileLocation string) {
|
|||||||
|
|
||||||
resetStatuses(a)
|
resetStatuses(a)
|
||||||
|
|
||||||
a.StartServer()
|
|
||||||
|
|
||||||
// If we allow testing then listen for manual testing URL hits
|
// If we allow testing then listen for manual testing URL hits
|
||||||
if utils.Cfg.ServiceSettings.EnableTesting {
|
if utils.Cfg.ServiceSettings.EnableTesting {
|
||||||
manualtesting.Init(api3)
|
manualtesting.Init(api3)
|
||||||
@@ -149,7 +143,6 @@ func runServer(configFileLocation string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
a.Jobs.Store = a.Srv.Store
|
|
||||||
if *utils.Cfg.JobSettings.RunJobs {
|
if *utils.Cfg.JobSettings.RunJobs {
|
||||||
a.Jobs.StartWorkers()
|
a.Jobs.StartWorkers()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -52,13 +52,11 @@ func webClientTestsCmdF(cmd *cobra.Command, args []string) error {
|
|||||||
defer a.Shutdown()
|
defer a.Shutdown()
|
||||||
|
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
a.Srv.Router = api.NewRouter()
|
a.StartServer()
|
||||||
a.Srv.WebSocketRouter = a.NewWebSocketRouter()
|
|
||||||
api4.Init(a, a.Srv.Router, false)
|
api4.Init(a, a.Srv.Router, false)
|
||||||
api.Init(a, a.Srv.Router)
|
api.Init(a, a.Srv.Router)
|
||||||
wsapi.Init(a, a.Srv.WebSocketRouter)
|
wsapi.Init(a, a.Srv.WebSocketRouter)
|
||||||
setupClientTests()
|
setupClientTests()
|
||||||
a.StartServer()
|
|
||||||
runWebClientTests()
|
runWebClientTests()
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
@@ -72,13 +70,11 @@ func serverForWebClientTestsCmdF(cmd *cobra.Command, args []string) error {
|
|||||||
defer a.Shutdown()
|
defer a.Shutdown()
|
||||||
|
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
a.Srv.Router = api.NewRouter()
|
a.StartServer()
|
||||||
a.Srv.WebSocketRouter = a.NewWebSocketRouter()
|
|
||||||
api4.Init(a, a.Srv.Router, false)
|
api4.Init(a, a.Srv.Router, false)
|
||||||
api.Init(a, a.Srv.Router)
|
api.Init(a, a.Srv.Router)
|
||||||
wsapi.Init(a, a.Srv.WebSocketRouter)
|
wsapi.Init(a, a.Srv.WebSocketRouter)
|
||||||
setupClientTests()
|
setupClientTests()
|
||||||
a.StartServer()
|
|
||||||
|
|
||||||
c := make(chan os.Signal)
|
c := make(chan os.Signal)
|
||||||
signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
signal.Notify(c, os.Interrupt, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
|||||||
@@ -85,8 +85,12 @@ func tearDownStores() {
|
|||||||
for _, st := range storeTypes {
|
for _, st := range storeTypes {
|
||||||
st := st
|
st := st
|
||||||
go func() {
|
go func() {
|
||||||
st.Store.Close()
|
if st.Store != nil {
|
||||||
st.Container.Stop()
|
st.Store.Close()
|
||||||
|
}
|
||||||
|
if st.Container != nil {
|
||||||
|
st.Container.Stop()
|
||||||
|
}
|
||||||
wg.Done()
|
wg.Done()
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -312,8 +312,8 @@ func UpgradeDatabaseToVersion43(sqlStore SqlStore) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func UpgradeDatabaseToVersion44(sqlStore SqlStore) {
|
func UpgradeDatabaseToVersion44(sqlStore SqlStore) {
|
||||||
if shouldPerformUpgrade(sqlStore, VERSION_4_3_0, VERSION_4_4_0) {
|
// TODO: Uncomment following when version 4.4.0 is released
|
||||||
// TODO: Uncomment following when version 4.4.0 is released
|
//if shouldPerformUpgrade(sqlStore, VERSION_4_3_0, VERSION_4_4_0) {
|
||||||
//saveSchemaVersion(sqlStore, VERSION_4_4_0)
|
// saveSchemaVersion(sqlStore, VERSION_4_4_0)
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -116,7 +116,8 @@ func runContainer(args []string) (*RunningContainer, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func waitForPort(port string) error {
|
func waitForPort(port string) error {
|
||||||
for i := 0; i < 120; i++ {
|
deadline := time.Now().Add(time.Minute * 10)
|
||||||
|
for time.Now().Before(deadline) {
|
||||||
conn, err := net.DialTimeout("tcp", "127.0.0.1:"+port, time.Minute)
|
conn, err := net.DialTimeout("tcp", "127.0.0.1:"+port, time.Minute)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -18,25 +18,22 @@ var ApiClient *model.Client
|
|||||||
var URL string
|
var URL string
|
||||||
|
|
||||||
func Setup() *app.App {
|
func Setup() *app.App {
|
||||||
|
utils.TranslationsPreInit()
|
||||||
|
utils.LoadConfig("config.json")
|
||||||
|
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
||||||
|
|
||||||
a := app.New()
|
a := app.New()
|
||||||
if a.Srv == nil {
|
a.StartServer()
|
||||||
utils.TranslationsPreInit()
|
api4.Init(a, a.Srv.Router, false)
|
||||||
utils.LoadConfig("config.json")
|
api3 := api.Init(a, a.Srv.Router)
|
||||||
utils.InitTranslations(utils.Cfg.LocalizationSettings)
|
Init(api3)
|
||||||
a.NewServer()
|
URL = "http://localhost" + *utils.Cfg.ServiceSettings.ListenAddress
|
||||||
a.InitStores()
|
ApiClient = model.NewClient(URL)
|
||||||
a.Srv.Router = api.NewRouter()
|
|
||||||
a.StartServer()
|
|
||||||
api4.Init(a, a.Srv.Router, false)
|
|
||||||
api3 := api.Init(a, a.Srv.Router)
|
|
||||||
Init(api3)
|
|
||||||
URL = "http://localhost" + *utils.Cfg.ServiceSettings.ListenAddress
|
|
||||||
ApiClient = model.NewClient(URL)
|
|
||||||
|
|
||||||
a.Srv.Store.MarkSystemRanUnitTests()
|
a.Srv.Store.MarkSystemRanUnitTests()
|
||||||
|
|
||||||
|
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
||||||
|
|
||||||
*utils.Cfg.TeamSettings.EnableOpenServer = true
|
|
||||||
}
|
|
||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user