All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.hydrosphere.mist.CLI.scala Maven / Gradle / Ivy

There is a newer version: 0.10.0
Show newest version
package io.hydrosphere.mist

import akka.actor.{ActorSystem, Props}
import akka.pattern.ask
import io.hydrosphere.mist.Messages._
import io.hydrosphere.mist.worker.{CLINode, JobDescriptionSerializable, WorkerDescription}

import scala.concurrent.Await
import scala.language.postfixOps
import scala.sys.process._

private[mist] object CLI extends App {

  implicit val system = ActorSystem("mist", MistConfig.Akka.CLI.settings)
  val cliActor = system.actorOf(Props[CLINode], name = Constants.CLI.cliActorName )

  var argInput = args.mkString(" ")

  if(argInput.isEmpty) {
    println("Hello! This is a Mist command-line interface.")
    println("Enter your command please.")
  }

  while(true) {
    val input =
      if(argInput.nonEmpty) {
        println(argInput)
        argInput
      }
      else {
        print("mist>")
        readLine()
      }

    argInput =
      if(argInput.nonEmpty) {
        "exit"
      }
      else
      {
        ""
      }

    def beautifulPrintResult(header: List[String] = List())(someList: List[Any]): Unit = {
      if(someList.nonEmpty) {
        val headerTabs = {
          try {
            someList.asInstanceOf[List[WorkerDescription]].head.length()
          } catch {
            case _: ClassCastException => {
              try {
                someList.asInstanceOf[List[JobDescriptionSerializable]].head.length()
              } catch {
                case _: ClassCastException => List[Int](0)
              }
            }
          }
        }

        (header zip headerTabs).foreach { case (h, t) => print(h + " " * (t - h.length) + "\t") }
        print("\n")
        someList.foreach(y => println(y.toString))
      }
      else {
        header foreach (h => print(h + "\t"))
        print("\n")
      }
    }

    def cliResponseBuilder[A](msg: A, out: (List[Any]) => Unit): Unit = {
      implicit def anyToListAny(a: Any): List[Any] = if(a.isInstanceOf[List[Any]]) a.asInstanceOf[List[Any]] else List[Any](a)
      val future = cliActor.ask(msg)(timeout = Constants.CLI.timeoutDuration)
      val result = Await.result(future, Constants.CLI.timeoutDuration)
      out(result)
    }

    input match {
      case msg if msg.contains(Constants.CLI.listJobsMsg) => {
        val header = List("UID","TIME","NAMESPACE","EXT_ID","tROUTER")
        cliResponseBuilder(ListJobs, beautifulPrintResult(header))
      }

      case msg if msg.contains(Constants.CLI.listWorkersMsg) => {
        val header = List("NAMESPACE", "ADDRESS")
        cliResponseBuilder(ListWorkers, beautifulPrintResult(header))
      }

      case msg if msg.contains(Constants.CLI.listRoutersMsg) => {
        cliResponseBuilder(ListRouters, beautifulPrintResult())
      }

      case msg if msg.contains(Constants.CLI.stopWorkerMsg) => {
        cliResponseBuilder(new StopWorker(msg), beautifulPrintResult())
      }

      case msg if msg.contains(Constants.CLI.stopJobMsg) => {
        cliResponseBuilder(new StopJob(msg), beautifulPrintResult())
      }

      case msg if msg.contains(Constants.CLI.stopAllWorkersMsg) => {
        cliResponseBuilder(StopAllContexts, beautifulPrintResult())
      }

      case msg if msg.contains(Constants.CLI.startJob) => {
        val listCmd = msg.substring(Constants.CLI.startJob.length).trim.split(' ')
        if(listCmd.size == 3) {
          val config = "--config " + listCmd(0)
          val route = "--route " + listCmd(1)
          val externalId = "--external-id " + listCmd(2)
          s"bin/mist start job ${config} ${route} ${externalId}".!
        }
        else {
          println(listCmd.mkString(" "))
        }
      }

      case [email protected] => {
        system.shutdown
        sys.exit(0)
      }
      case _ => {
        println(s" ----------------------------------------------------------------- \n" +
          s"|             Mist Command Line Interface                          | \n" +
          s" ----------------------------------------------------------------- \n" +
          s"${Constants.CLI.startJob}    \t start job \n" +
          s"${Constants.CLI.listWorkersMsg} \t \t \t \t List all started workers \n" +
          s"${Constants.CLI.listJobsMsg} \t \t \t \t List all started jobs \n" +
          s"${Constants.CLI.listRoutersMsg} \t \t \t \t List routers \n" +
          s"${Constants.CLI.stopAllWorkersMsg} \t \t \t \t Stop all workers \n" +
          s"${Constants.CLI.stopWorkerMsg}  \t \t Stop worker by namespace \n" +
          s"${Constants.CLI.stopJobMsg}  \t \t \t Stop job by external id or UID\n" +
          s"${Constants.CLI.exitMsg} \t \n")
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy