Skip to content
Snippets Groups Projects
Commit 204ce46b authored by Leonardo Menezes's avatar Leonardo Menezes
Browse files

pass client as a param to controller impl for easier testing

parent 88c9e749
No related branches found
No related tags found
No related merge requests found
Showing
with 75 additions and 62 deletions
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]
}
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)
}
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)
}
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
......
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)
}
package controllers
import elastic.ElasticClient.disableShardAllocation
class DisableShardAllocationController extends ElasticActionController {
def processElasticRequest = request => disableShardAllocation(request.host)
def processElasticRequest = (request, client) => client.disableShardAllocation(request.host)
}
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]
}
package controllers
import elastic.ElasticClient.enableShardAllocation
class EnableShardAllocationController extends ElasticActionController {
def processElasticRequest = request => enableShardAllocation(request.host)
def processElasticRequest = (request, client) => client.enableShardAllocation(request.host)
}
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)
}
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)
}
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)
}
}
......
package controllers
import elastic.ElasticClient
class Main extends ElasticActionController {
def processElasticRequest = request => ElasticClient.main(request.host)
def processElasticRequest = (request, client) => client.main(request.host)
}
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)
}
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)
}
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)
}
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)
}
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)
}
package exceptions
case class MissingRequiredParamException(name: String) extends Exception
case class MissingRequiredParamException(name: String) extends Exception(s"Missing required parameter $name")
......@@ -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)
......
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]
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment