summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGeorge Goldberg <george@gberg.me>2017-06-29 22:40:14 +0100
committerJoram Wilander <jwawilander@gmail.com>2017-06-29 17:40:14 -0400
commitf2898927f1b92d3c8cd9e7c63ce27dee7e6ae88f (patch)
treef29a8058cf581d128502b2da532fc551aa1101b9
parenta4f363a50b7807de9ac086ee0e62442a7645f5e8 (diff)
downloadchat-f2898927f1b92d3c8cd9e7c63ce27dee7e6ae88f.tar.gz
chat-f2898927f1b92d3c8cd9e7c63ce27dee7e6ae88f.tar.bz2
chat-f2898927f1b92d3c8cd9e7c63ce27dee7e6ae88f.zip
PLT-6474: Server: Add elasticsearch/test endpoint to API. (#6792)
-rw-r--r--api4/api.go4
-rw-r--r--api4/elasticsearch.go33
-rw-r--r--api4/elasticsearch_test.go19
-rw-r--r--app/elasticsearch.go24
-rw-r--r--einterfaces/elasticsearch.go1
-rw-r--r--i18n/en.json8
-rw-r--r--model/client4.go17
7 files changed, 106 insertions, 0 deletions
diff --git a/api4/api.go b/api4/api.go
index a636581d7..be957d63b 100644
--- a/api4/api.go
+++ b/api4/api.go
@@ -77,6 +77,8 @@ type Routes struct {
LDAP *mux.Router // 'api/v4/ldap'
+ Elasticsearch *mux.Router // 'api/v4/elasticsearch'
+
Brand *mux.Router // 'api/v4/brand'
System *mux.Router // 'api/v4/system'
@@ -171,6 +173,7 @@ func InitApi(full bool) {
BaseRoutes.Public = BaseRoutes.ApiRoot.PathPrefix("/public").Subrouter()
BaseRoutes.Reactions = BaseRoutes.ApiRoot.PathPrefix("/reactions").Subrouter()
BaseRoutes.Jobs = BaseRoutes.ApiRoot.PathPrefix("/jobs").Subrouter()
+ BaseRoutes.Elasticsearch = BaseRoutes.ApiRoot.PathPrefix("/elasticsearch").Subrouter()
BaseRoutes.Emojis = BaseRoutes.ApiRoot.PathPrefix("/emoji").Subrouter()
BaseRoutes.Emoji = BaseRoutes.Emojis.PathPrefix("/{emoji_id:[A-Za-z0-9]+}").Subrouter()
@@ -193,6 +196,7 @@ func InitApi(full bool) {
InitCompliance()
InitCluster()
InitLdap()
+ InitElasticsearch()
InitBrand()
InitJob()
InitCommand()
diff --git a/api4/elasticsearch.go b/api4/elasticsearch.go
new file mode 100644
index 000000000..05ef1f539
--- /dev/null
+++ b/api4/elasticsearch.go
@@ -0,0 +1,33 @@
+// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package api4
+
+import (
+ "net/http"
+
+ l4g "github.com/alecthomas/log4go"
+ "github.com/mattermost/platform/app"
+ "github.com/mattermost/platform/model"
+ "github.com/mattermost/platform/utils"
+)
+
+func InitElasticsearch() {
+ l4g.Debug(utils.T("api.elasticsearch.init.debug"))
+
+ BaseRoutes.Elasticsearch.Handle("/test", ApiSessionRequired(testElasticsearch)).Methods("POST")
+}
+
+func testElasticsearch(c *Context, w http.ResponseWriter, r *http.Request) {
+ if !app.SessionHasPermissionTo(c.Session, model.PERMISSION_MANAGE_SYSTEM) {
+ c.SetPermissionError(model.PERMISSION_MANAGE_SYSTEM)
+ return
+ }
+
+ if err := app.TestElasticsearch(); err != nil {
+ c.Err = err
+ return
+ }
+
+ ReturnStatusOK(w)
+}
diff --git a/api4/elasticsearch_test.go b/api4/elasticsearch_test.go
new file mode 100644
index 000000000..1478f052f
--- /dev/null
+++ b/api4/elasticsearch_test.go
@@ -0,0 +1,19 @@
+// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package api4
+
+import (
+ "testing"
+)
+
+func TestElasticsearchTest(t *testing.T) {
+ th := Setup().InitBasic().InitSystemAdmin()
+ defer TearDown()
+
+ _, resp := th.Client.TestElasticsearch()
+ CheckForbiddenStatus(t, resp)
+
+ _, resp = th.SystemAdminClient.TestElasticsearch()
+ CheckNotImplementedStatus(t, resp)
+}
diff --git a/app/elasticsearch.go b/app/elasticsearch.go
new file mode 100644
index 000000000..c021b15e8
--- /dev/null
+++ b/app/elasticsearch.go
@@ -0,0 +1,24 @@
+// Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
+// See License.txt for license information.
+
+package app
+
+import (
+ "net/http"
+
+ "github.com/mattermost/platform/model"
+ "github.com/mattermost/platform/einterfaces"
+)
+
+func TestElasticsearch() *model.AppError {
+ if esI := einterfaces.GetElasticSearchInterface(); esI != nil {
+ if err := esI.TestConfig(); err != nil {
+ return err
+ }
+ } else {
+ err := model.NewAppError("TestElasticsearch", "ent.elasticsearch.test_config.license.error", nil, "", http.StatusNotImplemented)
+ return err
+ }
+
+ return nil
+}
diff --git a/einterfaces/elasticsearch.go b/einterfaces/elasticsearch.go
index 61e1d532f..af89b38a5 100644
--- a/einterfaces/elasticsearch.go
+++ b/einterfaces/elasticsearch.go
@@ -10,6 +10,7 @@ type ElasticSearchInterface interface {
IndexPost(post *model.Post, teamId string)
SearchPosts(channels *model.ChannelList, searchParams []*model.SearchParams) ([]string, *model.AppError)
DeletePost(postId string)
+ TestConfig() *model.AppError
}
var theElasticSearchInterface ElasticSearchInterface
diff --git a/i18n/en.json b/i18n/en.json
index f0dd4d77e..923fd4b66 100644
--- a/i18n/en.json
+++ b/i18n/en.json
@@ -3504,6 +3504,14 @@
"translation": "Failed to set ElasticSearch index settings"
},
{
+ "id": "ent.elasticsearch.test_config.indexing_disabled.error",
+ "translation": "Elasticsearch is disabled."
+ },
+ {
+ "id": "ent.elasticsearch.test_config.license.error",
+ "translation": "License does not support Elasticsearch."
+ },
+ {
"id": "ent.emoji.licence_disable.app_error",
"translation": "Custom emoji restrictions disabled by current license. Please contact your system administrator about upgrading your enterprise license."
},
diff --git a/model/client4.go b/model/client4.go
index 89fed55ff..33a906429 100644
--- a/model/client4.go
+++ b/model/client4.go
@@ -230,6 +230,10 @@ func (c *Client4) GetBrandRoute() string {
return fmt.Sprintf("/brand")
}
+func (c *Client4) GetElasticsearchRoute() string {
+ return fmt.Sprintf("/elasticsearch")
+}
+
func (c *Client4) GetCommandsRoute() string {
return fmt.Sprintf("/commands")
}
@@ -2514,6 +2518,19 @@ func (c *Client4) DeauthorizeOAuthApp(appId string) (bool, *Response) {
}
}
+// Elasticsearch Section
+
+// TestElasticsearch will attempt to connect to the configured Elasticsearch server and return OK if configured
+// correctly.
+func (c *Client4) TestElasticsearch() (bool, *Response) {
+ if r, err := c.DoApiPost(c.GetElasticsearchRoute()+"/test", ""); err != nil {
+ return false, BuildErrorResponse(r, err)
+ } else {
+ defer closeBody(r)
+ return CheckStatusOK(r), BuildResponse(r)
+ }
+}
+
// Commands Section
// CreateCommand will create a new command if the user have the right permissions.