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

akkeeper.master.route.MonitoringController.scala Maven / Gradle / Ivy

There is a newer version: 0.3.3
Show newest version
/*
 * Copyright 2017-2018 Iaroslav Zeigerman
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package akkeeper.master.route

import akka.actor.ActorRef
import akka.http.scaladsl.model.StatusCodes
import akka.http.scaladsl.model.Uri.Path
import akka.http.scaladsl.server.PathMatcher._
import akka.http.scaladsl.server.{PathMatcher1, Route}
import akka.util.Timeout
import akkeeper.api._
import akkeeper.common.InstanceId
import scala.concurrent.ExecutionContext
import scala.util.Try
import MonitoringController._

class MonitoringController(service: ActorRef)(implicit dispatcher: ExecutionContext,
                                              timeout: Timeout)
  extends BaseController with MonitoringApiJsonProtocol {

  registerHandler[InstanceInfoResponse](StatusCodes.OK)
  registerHandler[InstancesList](StatusCodes.OK)
  registerHandler[InstanceNotFound](StatusCodes.NotFound)
  registerHandler[InstanceTerminated](StatusCodes.OK)

  override val route: Route =
    pathPrefix("instances") {
      path(InstanceIdMatcher) { instanceId =>
        get {
          handleRequest(service, GetInstance(instanceId))
        } ~
        delete {
          handleRequest(service, TerminateInstance(instanceId))
        }
      } ~
      path(Segment) { segment =>
        complete(StatusCodes.BadRequest -> "Invalid instance ID")
      } ~
      (pathEnd | pathSingleSlash) {
        parameters('role.*, 'containerName.?) { (role, containerName) =>
          if (role.isEmpty && containerName.isEmpty) {
            handleRequest(service, GetInstances())
          } else {
            handleRequest(service, GetInstancesBy(role.toSet, containerName))
          }
        }
      }
    }
}

object MonitoringController {
  def apply(service: ActorRef)(implicit dispatcher: ExecutionContext,
                               timeout: Timeout): BaseController = {
    new MonitoringController(service)
  }

  private object InstanceIdMatcher extends PathMatcher1[InstanceId] {
    override def apply(v: Path): Matching[Tuple1[InstanceId]] = {
      if (!v.isEmpty) {
        val instanceId = Try(InstanceId.fromString(v.head.toString))
        instanceId.map(id => Matched(Path.Empty, Tuple1(id))).getOrElse(Unmatched)
      } else {
        Unmatched
      }
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy