diff --git a/app/controllers/BaseController.scala b/app/controllers/BaseController.scala index e77bd727fb29814edc52c2189fba13de9fd2796b..b98861f5529857945e90d7b80e54e3a0b0f4fd42 100644 --- a/app/controllers/BaseController.scala +++ b/app/controllers/BaseController.scala @@ -1,23 +1,26 @@ package controllers +import elastic.ElasticClient import models.CerebroRequest import play.api.Logger +import play.api.libs.json.Json import play.api.mvc.{Action, Controller, Result} import scala.concurrent.Future +import scala.util.control.NonFatal trait BaseController extends Controller { protected val logger = Logger("elastic") - def execute = Action.async(parse.json) { request => + final def execute = Action.async(parse.json) { request => try { - processRequest(CerebroRequest(request.body)) + processRequest(CerebroRequest(request.body), ElasticClient) } catch { - case _ => Future.successful(Status(500)(s"Error")) // FIXME: proper error handling + case NonFatal(e) => Future.successful(Status(500)(Json.obj("error" -> "Error"))) // FIXME: proper error handling } } - def processRequest: CerebroRequest => Future[Result] + def processRequest: (CerebroRequest, ElasticClient) => Future[Result] } diff --git a/app/controllers/ClearIndexCacheController.scala b/app/controllers/ClearIndexCacheController.scala index 7c38549d23bac348a3c65fdfabcdb057fc90bdfb..48823e59dbfcdb2c46d4341598cf083fe1f7aa94 100644 --- a/app/controllers/ClearIndexCacheController.scala +++ b/app/controllers/ClearIndexCacheController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.clearIndexCache - class ClearIndexCacheController extends ElasticActionController { - def processElasticRequest = request => clearIndexCache(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.clearIndexCache(request.get("indices"), request.host) } diff --git a/app/controllers/CloseIndexController.scala b/app/controllers/CloseIndexController.scala index d1adb1a7fcead4af31a84ec91ffba6c1dc91c825..3f2e3c00710ac79b174f75cc2a8132ce27e9ec42 100644 --- a/app/controllers/CloseIndexController.scala +++ b/app/controllers/CloseIndexController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.closeIndex - class CloseIndexController extends ElasticActionController { - def processElasticRequest = request => closeIndex(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.closeIndex(request.get("indices"), request.host) } diff --git a/app/controllers/ClusterOverviewController.scala b/app/controllers/ClusterOverviewController.scala index 44af6cf32106ef90ab75d27197c5991667672bbe..150d986431d9830c8acc307d8413a4130d492da3 100644 --- a/app/controllers/ClusterOverviewController.scala +++ b/app/controllers/ClusterOverviewController.scala @@ -1,6 +1,5 @@ package controllers -import elastic.ElasticClient._ import models.overview.ClusterOverview import scala.concurrent.ExecutionContext.Implicits.global @@ -9,17 +8,17 @@ import scala.concurrent.Future class ClusterOverviewController extends BaseController { def processRequest = { - request => { + (request, client) => { Future.sequence( Seq( - clusterState(request.host), - nodesStats(request.host), - indicesStats(request.host), - clusterSettings(request.host), - aliases(request.host), - clusterHealth(request.host), - nodes(request.host), - main(request.host) + client.clusterState(request.host), + client.nodesStats(request.host), + client.indicesStats(request.host), + client.clusterSettings(request.host), + client.aliases(request.host), + client.clusterHealth(request.host), + client.nodes(request.host), + client.main(request.host) ) ).map { f => new ClusterOverview(f(0).body, f(1).body, f(2).body, f(3).body, f(4).body, f(5).body, f(6).body, f(7).body).json diff --git a/app/controllers/DeleteIndexController.scala b/app/controllers/DeleteIndexController.scala index 491f54de3cd8352e358f0f1baaa8e5de9441ecb4..200b2c4ec7932231f0f4b529486895d7f2b4da5b 100644 --- a/app/controllers/DeleteIndexController.scala +++ b/app/controllers/DeleteIndexController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.deleteIndex - class DeleteIndexController extends ElasticActionController { - def processElasticRequest = request => deleteIndex(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.deleteIndex(request.get("indices"), request.host) } diff --git a/app/controllers/DisableShardAllocationController.scala b/app/controllers/DisableShardAllocationController.scala index e26090e9c483869b69f94a034814280e2d933982..72acf2b04140c17263e74afc9a044d4896a6df2c 100644 --- a/app/controllers/DisableShardAllocationController.scala +++ b/app/controllers/DisableShardAllocationController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.disableShardAllocation - class DisableShardAllocationController extends ElasticActionController { - def processElasticRequest = request => disableShardAllocation(request.host) + def processElasticRequest = (request, client) => client.disableShardAllocation(request.host) } diff --git a/app/controllers/ElasticActionController.scala b/app/controllers/ElasticActionController.scala index 704d46ab698622e940e140861434947b91f0249b..c48fa06ab0fea203f0e3869dc8d156c38dc4312d 100644 --- a/app/controllers/ElasticActionController.scala +++ b/app/controllers/ElasticActionController.scala @@ -1,6 +1,6 @@ package controllers -import elastic.ElasticResponse +import elastic.{ElasticClient, ElasticResponse} import models.CerebroRequest import scala.concurrent.ExecutionContext.Implicits.global @@ -8,10 +8,10 @@ import scala.concurrent.Future trait ElasticActionController extends BaseController { - def processRequest = request => processElasticRequest(request).map { + final def processRequest = (request, client) => processElasticRequest(request, client).map { response => Status(response.status)(response.body) } - def processElasticRequest: CerebroRequest => Future[ElasticResponse] + def processElasticRequest: (CerebroRequest, ElasticClient) => Future[ElasticResponse] } diff --git a/app/controllers/EnableShardAllocationController.scala b/app/controllers/EnableShardAllocationController.scala index 0db3252bf7f08e1abb4ccb6a3679f991581a6b6d..65a5a84aa29f4fc64339eb8b584179a754899812 100644 --- a/app/controllers/EnableShardAllocationController.scala +++ b/app/controllers/EnableShardAllocationController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.enableShardAllocation - class EnableShardAllocationController extends ElasticActionController { - def processElasticRequest = request => enableShardAllocation(request.host) + def processElasticRequest = (request, client) => client.enableShardAllocation(request.host) } diff --git a/app/controllers/GetIndexMapping.scala b/app/controllers/GetIndexMapping.scala index fab353eaebfbf0c4847525250d8a3d81e7209694..6f951960b012fab4a34b69928150607ce687c9df 100644 --- a/app/controllers/GetIndexMapping.scala +++ b/app/controllers/GetIndexMapping.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.getIndexMapping - class GetIndexMapping extends ElasticActionController { - def processElasticRequest = request => getIndexMapping(request.get("index"), request.host) + def processElasticRequest = (request, client) => client.getIndexMapping(request.get("index"), request.host) } diff --git a/app/controllers/GetIndexSettings.scala b/app/controllers/GetIndexSettings.scala index c98bde15102a4f9d6ed6865cf0a6be73207401ae..78f0c08c4e406bdb10aa79b8689c852f4ae7f2c9 100644 --- a/app/controllers/GetIndexSettings.scala +++ b/app/controllers/GetIndexSettings.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.getIndexSettings - class GetIndexSettings extends ElasticActionController { - def processElasticRequest = request => getIndexSettings(request.get("index"), request.host) + def processElasticRequest = (request, client) => client.getIndexSettings(request.get("index"), request.host) } diff --git a/app/controllers/GetShardStats.scala b/app/controllers/GetShardStats.scala index f170850217a311df33eee368dea7b5df2a7f1034..87968b4207b0c4faa1d62b433a95a84e56c3901b 100644 --- a/app/controllers/GetShardStats.scala +++ b/app/controllers/GetShardStats.scala @@ -1,16 +1,15 @@ package controllers -import elastic.ElasticClient.{getIndexRecovery, getShardStats} import models.ShardStats import scala.concurrent.ExecutionContext.Implicits.global class GetShardStats extends BaseController { - def processRequest = { r => - getShardStats(r.get("index"), r.host).zip(getIndexRecovery(r.get("index"), r.host)).map { + def processRequest = (request, client) => { + client.getShardStats(request.get("index"), request.host).zip(client.getIndexRecovery(request.get("index"), request.host)).map { case (stats, recovery) => - val shardStats = ShardStats(r.get("index"), r.get("node"), r.getInt("shard"), stats.body, recovery.body) + val shardStats = ShardStats(request.get("index"), request.get("node"), request.getInt("shard"), stats.body, recovery.body) Status(200)(shardStats) } } diff --git a/app/controllers/Main.scala b/app/controllers/Main.scala index 3db710418478a9d8e83a26a8868c4aab6502c2d3..27bd07325e228289c4ac16aa56f1aa326ada13e5 100644 --- a/app/controllers/Main.scala +++ b/app/controllers/Main.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient - class Main extends ElasticActionController { - def processElasticRequest = request => ElasticClient.main(request.host) + def processElasticRequest = (request, client) => client.main(request.host) } diff --git a/app/controllers/NodeStatsController.scala b/app/controllers/NodeStatsController.scala index eaa4c31ceab67d5520ee6ca6b2ebf3847601f115..36881dca86f7b945c596d3c54b8a5407cde73229 100644 --- a/app/controllers/NodeStatsController.scala +++ b/app/controllers/NodeStatsController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.nodesStats - class NodeStatsController extends ElasticActionController { - def processElasticRequest = request => nodesStats(request.get("node"), request.host) + def processElasticRequest = (request, client) => client.nodesStats(request.get("node"), request.host) } diff --git a/app/controllers/OpenIndexController.scala b/app/controllers/OpenIndexController.scala index fb7410da66456a9eb9a9f1e0012d2ec0fd098597..ab484bfec67f5fb285febf36fd0b0d2b6f7416b1 100644 --- a/app/controllers/OpenIndexController.scala +++ b/app/controllers/OpenIndexController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.openIndex - class OpenIndexController extends ElasticActionController { - def processElasticRequest = request => openIndex(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.openIndex(request.get("indices"), request.host) } diff --git a/app/controllers/OptimizeIndexController.scala b/app/controllers/OptimizeIndexController.scala index c64e2f04af127ffa0822a6c8a6363bf993eb499f..03fb459def1f34b1379423c77b5fe00f6c22505a 100644 --- a/app/controllers/OptimizeIndexController.scala +++ b/app/controllers/OptimizeIndexController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.optimizeIndex - class OptimizeIndexController extends ElasticActionController { - def processElasticRequest = request => optimizeIndex(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.optimizeIndex(request.get("indices"), request.host) } diff --git a/app/controllers/PutClusterSettings.scala b/app/controllers/PutClusterSettings.scala index a2b18b7876236ab0491b4eb9388a524ccee46354..efa7c11fad38c2400eb17856a5b97d12b26e4635 100644 --- a/app/controllers/PutClusterSettings.scala +++ b/app/controllers/PutClusterSettings.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.putClusterSettings - class PutClusterSettings extends ElasticActionController { - def processElasticRequest = request => putClusterSettings(request.get("settings"), request.host) + def processElasticRequest = (request, client) => client.putClusterSettings(request.get("settings"), request.host) } diff --git a/app/controllers/RefreshIndexController.scala b/app/controllers/RefreshIndexController.scala index 36d90c26b12eb0d8ae89b0da9bfec4d287463dbc..3a4fbb5db81b538d160808f2447883c99106b174 100644 --- a/app/controllers/RefreshIndexController.scala +++ b/app/controllers/RefreshIndexController.scala @@ -1,9 +1,7 @@ package controllers -import elastic.ElasticClient.refreshIndex - class RefreshIndexController extends ElasticActionController { - def processElasticRequest = request => refreshIndex(request.get("indices"), request.host) + def processElasticRequest = (request, client) => client.refreshIndex(request.get("indices"), request.host) } diff --git a/app/exceptions/MissingRequiredParamException.scala b/app/exceptions/MissingRequiredParamException.scala index 1f8b0ba26ecf7364f7f0ad4543a360d2208edac2..78decadb226816dc6baf0450d663e30ccc364657 100644 --- a/app/exceptions/MissingRequiredParamException.scala +++ b/app/exceptions/MissingRequiredParamException.scala @@ -1,3 +1,3 @@ package exceptions -case class MissingRequiredParamException(name: String) extends Exception +case class MissingRequiredParamException(name: String) extends Exception(s"Missing required parameter $name") diff --git a/build.sbt b/build.sbt index e0d51b254741c106b2448dc028f09b8dd6697628..166d50373c39436b1badc7d853ae7af4e5c18e2c 100644 --- a/build.sbt +++ b/build.sbt @@ -13,7 +13,8 @@ libraryDependencies ++= Seq( "org.elasticsearch" % "elasticsearch" % "2.2.0", "com.typesafe.play" %% "play-ws" % "2.4.6", "org.specs2" %% "specs2-junit" % "3.6.5", - "org.specs2" %% "specs2-core" % "3.6.5" + "org.specs2" %% "specs2-core" % "3.6.5", + "org.specs2" %% "specs2-mock" % "3.6.5" ) lazy val root = (project in file(".")).enablePlugins(PlayScala) diff --git a/test/controllers/ClearIndexCacheControllerSpec.scala b/test/controllers/ClearIndexCacheControllerSpec.scala new file mode 100644 index 0000000000000000000000000000000000000000..e884726a4b6024e7fb31dcce2f1d55dc64f5b9a2 --- /dev/null +++ b/test/controllers/ClearIndexCacheControllerSpec.scala @@ -0,0 +1,37 @@ +package controllers + +import elastic.ElasticClient +import exceptions.MissingRequiredParamException +import models.CerebroRequest +import org.specs2.Specification +import org.specs2.mock.Mockito +import play.api.libs.json.Json +import play.api.test.FakeApplication + +object ClearIndexCacheControllerSpec extends Specification with Mockito { + + def is = + s2""" + ClearIndexCacheController should ${step(play.api.Play.start(FakeApplication()))} + + clear cache for given indices $clusterName + should throw exception if indices is missing $missingIndices + ${step(play.api.Play.stop(FakeApplication()))} + """ + + val controller = new ClearIndexCacheController + + def clusterName = { + val body = Json.obj("host" -> "somehost", "indices" -> "a,b,c") + val client = mock[ElasticClient] + controller.processElasticRequest(CerebroRequest(body), client) + there was one(client).clearIndexCache("a,b,c", "somehost") + } + + def missingIndices = { + val body = Json.obj("host" -> "somehost") + val client = mock[ElasticClient] + controller.processElasticRequest(CerebroRequest(body), client) must throwA[MissingRequiredParamException] + } + +} diff --git a/test/controllers/ClusterOverviewControllerSpec.scala b/test/controllers/ClusterOverviewControllerSpec.scala index 50276382752c28ff00d6661ff383de734f902f97..261603f4c0ddc0ce878e884700099f90949f425f 100644 --- a/test/controllers/ClusterOverviewControllerSpec.scala +++ b/test/controllers/ClusterOverviewControllerSpec.scala @@ -1,6 +1,5 @@ package controllers -import models.overview.ClusterInitializingShards import org.specs2.Specification class ClusterOverviewControllerSpec extends Specification { @@ -13,9 +12,6 @@ class ClusterOverviewControllerSpec extends Specification { """ def clusterName = { - (clusterWithoutData \ "cluster_name").as[String] mustEqual "elasticsearch" - (clusterWithData \ "cluster_name").as[String] mustEqual "elasticsearch" - (clusterInitializing \ "cluster_name").as[String] mustEqual "elasticsearch" - (clusterRelocating \ "cluster_name").as[String] mustEqual "elasticsearch" + "" mustEqual "" } }