Commit b6191627 authored by Leonardo Menezes's avatar Leonardo Menezes
Browse files

display correct node roles

closes #24
parent c833010b
Loading
Loading
Loading
Loading
+5 −6
Original line number Diff line number Diff line
@@ -42,10 +42,8 @@ object Nodes {
  def apply(clusterState: JsValue, nodesStats: JsValue, nodes: JsValue): Seq[JsValue] = {
    val currentMaster = (clusterState \ "master_node").as[String]
    (nodes \ "nodes").as[JsObject].value.map { case (nodeId, info) =>
      val master = (info \ "attributes" \ "master").asOpt[String].getOrElse("true").equals("true")
      val data = (info \ "attributes" \ "data").asOpt[String].getOrElse("true").equals("true")
      val client = (info \ "attributes" \ "client").asOpt[String].getOrElse("false").equals("true")

      val nodeRoles = NodeRoles(info)
      val stats = (nodesStats \ "nodes" \ nodeId).as[JsObject]
      // FIXME: 1.X
      val totalInBytes = (stats \ "fs" \ "total" \ "total_in_bytes").asOpt[Long].getOrElse(0l)
@@ -64,9 +62,10 @@ object Nodes {
        "load_average"         -> JsNumber(BigDecimal((stats \ "os" \ "load_average").asOpt[Int].getOrElse(0))),// FIXME: 1.X
        "available_processors" -> (info \ "os" \ "available_processors").as[JsNumber],
        "cpu_percent"    -> cpuPercent,
        "master"         -> JsBoolean(master && !client),
        "data"           -> JsBoolean(data && !client),
        "client"         -> JsBoolean(client || !master && !data),
        "master"         -> JsBoolean(nodeRoles.master),
        "data"           -> JsBoolean(nodeRoles.data),
        "client"         -> JsBoolean(nodeRoles.client),
        "ingest"         -> JsBoolean(nodeRoles.ingest),
        "heap"           -> Json.obj(
          "used"          -> (stats \ "jvm" \ "mem" \ "heap_used_in_bytes").as[JsNumber],
          "committed"     -> (stats \ "jvm" \ "mem" \ "heap_committed_in_bytes").as[JsNumber],
+34 −0
Original line number Diff line number Diff line
package models.overview

import play.api.libs.json.{JsArray, JsString, JsValue}

case class NodeRoles(master: Boolean, data: Boolean, ingest: Boolean) {

  def client: Boolean = !master && !data && !ingest

}

object NodeRoles {

  def apply(nodeInfo: JsValue): NodeRoles = {
    (nodeInfo \ "roles").asOpt[JsArray] match {
      case Some(JsArray(roles)) => // 5.X
        NodeRoles(
          roles.contains(JsString("master")),
          roles.contains(JsString("data")),
          roles.contains(JsString("ingest"))
        )

      case None => // 2.X
        val master = (nodeInfo \ "attributes" \ "master").asOpt[String].getOrElse("true").equals("true")
        val data = (nodeInfo \ "attributes" \ "data").asOpt[String].getOrElse("true").equals("true")
        val client = (nodeInfo \ "attributes" \ "client").asOpt[String].getOrElse("false").equals("true")

        NodeRoles(
          master && !client,
          data && !client,
          false // 2.x doesnt support ingest
        )
    }
  }
}