* app cleanup

* whoops, forgot a file

* some minor cleanup

* longer container deadline

* defensive checks
Этот коммит содержится в:
Chris
2017-10-09 14:59:48 -07:00
коммит произвёл GitHub
родитель 0f66b6e726
Коммит bff2b5e735
22 изменённых файлов: 165 добавлений и 166 удалений

Просмотреть файл

@@ -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

Просмотреть файл

@@ -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"))
} }

Просмотреть файл

@@ -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 {

Просмотреть файл

@@ -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 Обычный файл
Просмотреть файл

@@ -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
} }