From f2898927f1b92d3c8cd9e7c63ce27dee7e6ae88f Mon Sep 17 00:00:00 2001 From: George Goldberg Date: Thu, 29 Jun 2017 22:40:14 +0100 Subject: PLT-6474: Server: Add elasticsearch/test endpoint to API. (#6792) --- api4/api.go | 4 ++++ api4/elasticsearch.go | 33 +++++++++++++++++++++++++++++++++ api4/elasticsearch_test.go | 19 +++++++++++++++++++ app/elasticsearch.go | 24 ++++++++++++++++++++++++ einterfaces/elasticsearch.go | 1 + i18n/en.json | 8 ++++++++ model/client4.go | 17 +++++++++++++++++ 7 files changed, 106 insertions(+) create mode 100644 api4/elasticsearch.go create mode 100644 api4/elasticsearch_test.go create mode 100644 app/elasticsearch.go 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 @@ -3503,6 +3503,14 @@ "id": "ent.elasticsearch.start.index_settings_failed", "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. -- cgit v1.2.3-1-g7c22