/http/src/main/scala/filodb/http/FiloHttpServer.scala

https://github.com/velvia/FiloDB · Scala · 55 lines · 38 code · 9 blank · 8 comment · 0 complexity · fd22a994a722df6eca12b0dd949b340b MD5 · raw file

  1. package filodb.http
  2. import scala.concurrent.{Await, Future}
  3. import scala.concurrent.duration.FiniteDuration
  4. import akka.actor.{ActorRef, ActorSystem}
  5. import akka.http.scaladsl.Http
  6. import akka.http.scaladsl.server.Directives._
  7. import akka.http.scaladsl.server.Route
  8. import akka.stream.ActorMaterializer
  9. import com.typesafe.scalalogging.StrictLogging
  10. trait FiloRoute {
  11. def route: Route
  12. }
  13. class FiloHttpServer(actorSystem: ActorSystem) extends StrictLogging {
  14. val settings = new HttpSettings(actorSystem.settings.config)
  15. private var binding: Http.ServerBinding = _
  16. /**
  17. * Starts the HTTP Server, blocks until it is up.
  18. *
  19. * @param coordinatorRef the ActorRef to the local NodeCoordinator
  20. * @param clusterProxy the ClusterSingletonProxy ActorRef to the NodeClusterActor singleton
  21. * @param externalRoutes Additional routes to add besides those configured within the module
  22. */
  23. def start(coordinatorRef: ActorRef,
  24. clusterProxy: ActorRef,
  25. externalRoutes: Route = reject): Unit = {
  26. implicit val system = actorSystem
  27. implicit val materializer = ActorMaterializer()
  28. // This is a preliminary implementation of routes. Will be enhanced later
  29. val filoRoutes: List[FiloRoute] = List(AdminRoutes,
  30. new ClusterApiRoute(clusterProxy),
  31. new HealthRoute(coordinatorRef),
  32. new PrometheusApiRoute(coordinatorRef, settings))
  33. val reduced = filoRoutes.foldLeft[Route](reject)((acc, r) => r.route ~ acc)
  34. val finalRoute = reduced ~ externalRoutes
  35. val bindingFuture = Http().bindAndHandle(finalRoute,
  36. settings.httpServerBindHost,
  37. settings.httpServerBindPort)
  38. binding = Await.result(bindingFuture,
  39. scala.concurrent.duration.Duration.fromNanos(settings.httpServerStartTimeout.toNanos))
  40. logger.info("FiloDB HTTP server is live at http:/{}/", binding.localAddress)
  41. }
  42. def shutdown(hardDeadline: FiniteDuration): Future[Http.HttpTerminated] = {
  43. logger.info("Shutting down HTTP server")
  44. binding.terminate(hardDeadline)
  45. }
  46. }