Mm 23710 mmctl local mode (#14561)
* [MM-24146] Add unix socket listener for mmctl local mode (#14296) * add unix socket listener for mmctl local mode * add a constant for local-mode socket path * reflect review comments * [MM-24401] Base approach for Local Mode (#14333) * add unix socket listener for mmctl local mode * First working PoC * Adds the channel list endpoint * Add team list endpoint * Add a LocalClient to the api test helper and start local mode * Add helper to test with both SystemAdmin and Local clients * Add some docs * Adds TestForAllClients test helper * Incorporating @ashishbhate's proposal for adding test names to the helpers * Fix init errors after merge * Adds create channel tests * Always init local mode to allow for enabling-disabling it via config * Check the RemoteAddr of the request before marking session as local * Mark the request as errored if it's local and the origin is remote * Set the socket permissions to read/write when initialising * Fix linter * Replace RemoteAddr check to ditch connections with the IP:PORT shape Co-authored-by: Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> * Fix translations order * [MM-24832] Migrate plugin endpoints to local mode (#14543) * [MM-24832] Migrate plugin endpoints to local mode * Fix client reference in helper * [MM-24776] Migrate config endpoints to local mode (#14544) * [MM-24776] Migrate get config endpoint to local mode * [MM-24777] Migrate update config endpoint to local mode * Fix update config to bypass RestrictSystemAdmin flag * Add patchConfig endpoint * MM-24774/MM-24755: local mode for addLicense and removeLicense (#14491) Automatic Merge Co-authored-by: Ibrahim Serdar Acikgoz <serdaracikgoz86@gmail.com> Co-authored-by: Ashish Bhate <bhate.ashish@gmail.com>
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
e8081b7a0f
Коммит
0d89ff5d0e
@@ -55,6 +55,8 @@ type TestHelper struct {
|
||||
SystemAdminUser *model.User
|
||||
tempWorkspace string
|
||||
|
||||
LocalClient *model.Client4
|
||||
|
||||
IncludeCacheLayer bool
|
||||
}
|
||||
|
||||
@@ -78,6 +80,8 @@ func setupTestHelper(dbStore store.Store, searchEngine *searchengine.Broker, ent
|
||||
config := memoryStore.Get()
|
||||
*config.PluginSettings.Directory = filepath.Join(tempWorkspace, "plugins")
|
||||
*config.PluginSettings.ClientDirectory = filepath.Join(tempWorkspace, "webapp")
|
||||
config.ServiceSettings.EnableLocalMode = model.NewBool(true)
|
||||
*config.ServiceSettings.LocalModeSocketLocation = filepath.Join(tempWorkspace, "mattermost_local.sock")
|
||||
if updateConfig != nil {
|
||||
updateConfig(config)
|
||||
}
|
||||
@@ -118,13 +122,13 @@ func setupTestHelper(dbStore store.Store, searchEngine *searchengine.Broker, ent
|
||||
})
|
||||
prevListenAddress := *th.App.Config().ServiceSettings.ListenAddress
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = ":0" })
|
||||
serverErr := th.Server.Start()
|
||||
if serverErr != nil {
|
||||
panic(serverErr)
|
||||
if err := th.Server.Start(); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
th.App.UpdateConfig(func(cfg *model.Config) { *cfg.ServiceSettings.ListenAddress = prevListenAddress })
|
||||
Init(th.Server, th.Server.AppOptions, th.App.Srv().Router)
|
||||
InitLocal(th.Server, th.Server.AppOptions, th.App.Srv().LocalRouter)
|
||||
web.New(th.Server, th.Server.AppOptions, th.App.Srv().Router)
|
||||
wsapi.Init(th.App, th.App.Srv().WebSocketRouter)
|
||||
th.App.DoAppMigrations()
|
||||
@@ -149,6 +153,8 @@ func setupTestHelper(dbStore store.Store, searchEngine *searchengine.Broker, ent
|
||||
th.Client = th.CreateClient()
|
||||
th.SystemAdminClient = th.CreateClient()
|
||||
|
||||
th.LocalClient = th.CreateLocalClient(*config.ServiceSettings.LocalModeSocketLocation)
|
||||
|
||||
if th.tempWorkspace == "" {
|
||||
th.tempWorkspace = tempWorkspace
|
||||
}
|
||||
@@ -343,6 +349,22 @@ func (me *TestHelper) CreateClient() *model.Client4 {
|
||||
return model.NewAPIv4Client(fmt.Sprintf("http://localhost:%v", me.App.Srv().ListenAddr.Port))
|
||||
}
|
||||
|
||||
// ToDo: maybe move this to NewAPIv4SocketClient and reuse it in mmctl
|
||||
func (me *TestHelper) CreateLocalClient(socketPath string) *model.Client4 {
|
||||
httpClient := &http.Client{
|
||||
Transport: &http.Transport{
|
||||
Dial: func(network, addr string) (net.Conn, error) {
|
||||
return net.Dial("unix", socketPath)
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
return &model.Client4{
|
||||
ApiUrl: "http://_" + model.API_URL_SUFFIX,
|
||||
HttpClient: httpClient,
|
||||
}
|
||||
}
|
||||
|
||||
func (me *TestHelper) CreateWebSocketClient() (*model.WebSocketClient, *model.AppError) {
|
||||
return model.NewWebSocketClient4(fmt.Sprintf("ws://localhost:%v", me.App.Srv().ListenAddr.Port), me.Client.AuthToken)
|
||||
}
|
||||
@@ -671,6 +693,46 @@ func (me *TestHelper) CreateGroup() *model.Group {
|
||||
return group
|
||||
}
|
||||
|
||||
// TestForSystemAdminAndLocal runs a test function for both
|
||||
// SystemAdmin and Local clients. Several endpoints work in the same
|
||||
// way when used by a fully privileged user and through the local
|
||||
// mode, so this helper facilitates checking both
|
||||
func (me *TestHelper) TestForSystemAdminAndLocal(t *testing.T, f func(*testing.T, *model.Client4), name ...string) {
|
||||
var testName string
|
||||
if len(name) > 0 {
|
||||
testName = name[0] + "/"
|
||||
}
|
||||
|
||||
t.Run(testName+"SystemAdminClient", func(t *testing.T) {
|
||||
f(t, me.SystemAdminClient)
|
||||
})
|
||||
|
||||
t.Run(testName+"LocalClient", func(t *testing.T) {
|
||||
f(t, me.LocalClient)
|
||||
})
|
||||
}
|
||||
|
||||
// TestForAllClients runs a test function for all the clients
|
||||
// registered in the TestHelper
|
||||
func (me *TestHelper) TestForAllClients(t *testing.T, f func(*testing.T, *model.Client4), name ...string) {
|
||||
var testName string
|
||||
if len(name) > 0 {
|
||||
testName = name[0] + "/"
|
||||
}
|
||||
|
||||
t.Run(testName+"Client", func(t *testing.T) {
|
||||
f(t, me.Client)
|
||||
})
|
||||
|
||||
t.Run(testName+"SystemAdminClient", func(t *testing.T) {
|
||||
f(t, me.SystemAdminClient)
|
||||
})
|
||||
|
||||
t.Run(testName+"LocalClient", func(t *testing.T) {
|
||||
f(t, me.LocalClient)
|
||||
})
|
||||
}
|
||||
|
||||
func GenerateTestUsername() string {
|
||||
return "fakeuser" + model.NewRandomString(10)
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user