Commit 5a0f16cb authored by Leonardo Menezes's avatar Leonardo Menezes
Browse files

initial version of aliases management screen

parent ea509d18
Loading
Loading
Loading
Loading

README.md

0 → 100644
+20 −0
Original line number Diff line number Diff line
cerebro
=======================

cerebro is an open source(MIT License) elasticsearch web admin tool.

Installation
------------

- Download from ...
- Extract files
- Run bin/cerebro on unix, of bin/cerebro.bar on Windows
- Access on http://localhost:9000

Screenshots
------------
#### cluster overview
![cluster overview](imgs/cluster_view.png)

####REST Client
![rest client](imgs/rest_client.png)
+15 −0
Original line number Diff line number Diff line
package controllers

import models.{Aliases, ElasticServer}

import scala.concurrent.ExecutionContext.Implicits.global

class GetAliasesController extends BaseController {

  def processRequest = (request, client) => {
    client.getAliases(ElasticServer(request.host, request.authentication)).map { aliases =>
      Status(aliases.status)(Aliases(aliases.body))
    }
  }

}
+17 −0
Original line number Diff line number Diff line
package controllers

import models.ElasticServer
import play.api.libs.json.JsArray

import scala.concurrent.ExecutionContext.Implicits.global

class UpdateAliasesController extends BaseController {

  def processRequest = (request, client) => {
    val changes = request.getOptArray("changes").getOrElse(JsArray()).value
    client.updateAliases(changes, ElasticServer(request.host, request.authentication)).map { aliases =>
      Status(aliases.status)(aliases.body)
    }
  }

}
+14 −2
Original line number Diff line number Diff line
@@ -2,6 +2,7 @@ package elastic

import models.{ESAuth, ElasticServer}
import play.api.Play.current
import play.api.libs.json.{JsArray, JsObject, JsValue, Json}
import play.api.libs.ws.{WS, WSAuthScheme}

import scala.concurrent.ExecutionContext.Implicits.global
@@ -121,8 +122,19 @@ trait ElasticClient {
    execute(s"${target.host}$path", "GET", None, target.authentication)
  }

  def executeRequest(method: String, path: String, data: Option[String], target: ElasticServer) =
    execute(s"${target.host}/$path", method, data, target.authentication)
  def getAliases(target: ElasticServer) = {
    val path = "/_aliases"
    execute(s"${target.host}$path", "GET", None, target.authentication)
  }

  def updateAliases(changes: Seq[JsValue], target: ElasticServer) = {
    val path = "/_aliases"
    val body = Json.obj("actions" -> JsArray(changes))
    execute(s"${target.host}$path", "POST", Some(body.toString), target.authentication)
  }

  def executeRequest(method: String, path: String, data: Option[JsValue], target: ElasticServer) =
    execute(s"${target.host}/$path", method, data.map(_.toString), target.authentication)

  private def execute[T](url: String, method: String, body: Option[String] = None, authentication: Option[ESAuth] = None) = {
    val request = authentication.foldLeft(WS.url(url).withMethod(method)) {
+27 −0
Original line number Diff line number Diff line
package models

import play.api.libs.json._

object Aliases {

  def apply(json: JsValue): JsValue = {
    val indices = json.as[JsObject].keys.filter {
      index => (json \ index \ "aliases").as[JsObject].keys.nonEmpty
    }
    JsArray(indices.flatMap { index => flattenIndexAliases(index, (json \ index \ "aliases").as[JsObject]) }.toSeq)
  }

  private def flattenIndexAliases(index: String, aliases: JsObject) =
    aliases.keys.map { alias =>
      buildAlias(index, alias, (aliases \ alias).get)
    }

  private def buildAlias(index: String, alias: String, properties: JsValue): JsValue =
    Json.obj(
      "alias" -> JsString(alias),
      "index" -> JsString(index),
      "filter" -> (properties \ "filter").asOpt[JsValue],
      "search_routing" -> (properties \ "search_routing").asOpt[JsValue],
      "index_routing" -> (properties \ "index_routing").asOpt[JsValue]
    )
}
Loading