From 204ce46b54bf7377a1de7919339b863aa889f9d4 Mon Sep 17 00:00:00 2001 From: Leonardo Menezes Date: Sun, 3 Apr 2016 21:26:56 +0200 Subject: [PATCH] pass client as a param to controller impl for easier testing --- app/controllers/BaseController.scala | 11 ++++-- .../ClearIndexCacheController.scala | 4 +- app/controllers/CloseIndexController.scala | 4 +- .../ClusterOverviewController.scala | 19 +++++----- app/controllers/DeleteIndexController.scala | 4 +- .../DisableShardAllocationController.scala | 4 +- app/controllers/ElasticActionController.scala | 6 +-- .../EnableShardAllocationController.scala | 4 +- app/controllers/GetIndexMapping.scala | 4 +- app/controllers/GetIndexSettings.scala | 4 +- app/controllers/GetShardStats.scala | 7 ++-- app/controllers/Main.scala | 4 +- app/controllers/NodeStatsController.scala | 4 +- app/controllers/OpenIndexController.scala | 4 +- app/controllers/OptimizeIndexController.scala | 4 +- app/controllers/PutClusterSettings.scala | 4 +- app/controllers/RefreshIndexController.scala | 4 +- .../MissingRequiredParamException.scala | 2 +- build.sbt | 3 +- .../ClearIndexCacheControllerSpec.scala | 37 +++++++++++++++++++ .../ClusterOverviewControllerSpec.scala | 6 +-- 21 files changed, 76 insertions(+), 67 deletions(-) create mode 100644 test/controllers/ClearIndexCacheControllerSpec.scala diff --git a/app/controllers/BaseController.scala b/app/controllers/BaseController.scala index e77bd72..b98861f 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 7c38549..48823e5 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 d1adb1a..3f2e3c0 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 44af6cf..150d986 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 491f54d..200b2c4 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 e26090e..72acf2b 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 704d46a..c48fa06 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 0db3252..65a5a84 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 fab353e..6f95196 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 c98bde1..78f0c08 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 f170850..87968b4 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 3db7104..27bd073 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 eaa4c31..36881dc 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 fb7410d..ab484bf 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 c64e2f0..03fb459 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 a2b18b7..efa7c11 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 36d90c2..3a4fbb5 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 1f8b0ba..78decad 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 e0d51b2..166d503 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 0000000..e884726 --- /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 5027638..261603f 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 "" } } -- GitLab