/** * Generated by API Builder - https://www.apibuilder.io * Service version: 0.0.1-dev * User agent: apibuilder app.apibuilder.io/grhodes/code-deploy-dashboard/0.0.1-dev/ning_1_9_client */ package io.grhodes.code.deploy.dashboard.v0.models { /** * @param name Name of this application. * @param deploymentGroups List of deployment groups for this application. */ final case class Application( name: String, deploymentGroups: Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentGroup] ) /** * @param id The deployment id * @param created Date deployment created * @param started Date deployment started * @param completed Date deployment created * @param deploymentGroupName The deployment group name * @param failed The number of instances failed deployment * @param skipped The number of instances skipped deployment * @param inProgress The number of instances currently deploying * @param pending The number of instances pending deployment * @param succeeded The number of instances succeeded at deployment * @param status The status of the deployment * @param errorMessage A error message if the deployment failed * @param revisionLocation The location of the revision * @param instances The instances involved in this deployment */ final case class Deployment( id: String, created: _root_.org.joda.time.DateTime, started: _root_.org.joda.time.DateTime, completed: _root_.org.joda.time.DateTime, creator: String, deploymentGroupName: String, failed: Int, skipped: Int, inProgress: Int, pending: Int, succeeded: Int, status: String, errorMessage: _root_.scala.Option[String] = None, revisionLocation: String, instances: Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentInstance] ) /** * @param name Name of this deployment group. * @param autoScalingGroupNames List of auto scaling groups for this deployment group. */ final case class DeploymentGroup( name: String, autoScalingGroupNames: Seq[String] ) /** * @param id The instance id * @param status The status of this instances deployment * @param lastUpdatedAt Last updated at time * @param lifecycleEvents Deployment lifecycle events */ final case class DeploymentInstance( id: String, status: String, lastUpdatedAt: _root_.org.joda.time.DateTime, lifecycleEvents: Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentLifecycleEvent] ) /** * @param name The deployment lifecycle event name * @param startTime Time the deployment lifecycle event started * @param endTime Time the deployment lifecycle event ended * @param status The status of the deployment lifecycle event * @param errorLogTail The deployment lifecycle event log tail if it failed * @param errorMessage The deployment lifecycle event error message if it failed * @param scriptName The deployment lifecycle event script filename if it failed */ final case class DeploymentLifecycleEvent( name: String, startTime: _root_.org.joda.time.DateTime, endTime: _root_.org.joda.time.DateTime, status: String, errorLogTail: _root_.scala.Option[String] = None, errorMessage: _root_.scala.Option[String] = None, scriptName: _root_.scala.Option[String] = None ) /** * @param name Name of this service. * @param version Version of this service. * @param scalaVersion Version of Scala this service is using. * @param sbtVersion Version of SBT used to build this service. * @param buildTime Time the service was built at. */ final case class Info( name: String, version: String, scalaVersion: String, sbtVersion: String, buildTime: _root_.org.joda.time.DateTime ) } package io.grhodes.code.deploy.dashboard.v0.models { package object json { import play.api.libs.json.__ import play.api.libs.json.JsString import play.api.libs.json.Writes import play.api.libs.functional.syntax._ import io.grhodes.code.deploy.dashboard.v0.models.json._ private[v0] implicit val jsonReadsUUID: play.api.libs.json.Reads[_root_.java.util.UUID] = __.read[String].map { str => _root_.java.util.UUID.fromString(str) } private[v0] implicit val jsonWritesUUID: play.api.libs.json.Writes[_root_.java.util.UUID] = (x: _root_.java.util.UUID) => play.api.libs.json.JsString(x.toString) private[v0] implicit val jsonReadsJodaDateTime: play.api.libs.json.Reads[_root_.org.joda.time.DateTime] = __.read[String].map { str => _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseDateTime(str) } private[v0] implicit val jsonWritesJodaDateTime: play.api.libs.json.Writes[_root_.org.joda.time.DateTime] = (x: _root_.org.joda.time.DateTime) => { play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(x)) } private[v0] implicit val jsonReadsJodaLocalDate: play.api.libs.json.Reads[_root_.org.joda.time.LocalDate] = __.read[String].map { str => _root_.org.joda.time.format.ISODateTimeFormat.dateTimeParser.parseLocalDate(str) } private[v0] implicit val jsonWritesJodaLocalDate: play.api.libs.json.Writes[_root_.org.joda.time.LocalDate] = (x: _root_.org.joda.time.LocalDate) => { play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.date.print(x)) } implicit def jsonReadsCodeDeployDashboardApplication: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.Application] = { for { name <- (__ \ "name").read[String] deploymentGroups <- (__ \ "deploymentGroups").read[Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentGroup]] } yield Application(name, deploymentGroups) } def jsObjectApplication(obj: io.grhodes.code.deploy.dashboard.v0.models.Application): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "name" -> play.api.libs.json.JsString(obj.name), "deploymentGroups" -> play.api.libs.json.Json.toJson(obj.deploymentGroups) ) } implicit def jsonWritesCodeDeployDashboardApplication: play.api.libs.json.Writes[Application] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.Application) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectApplication(obj) } } implicit def jsonReadsCodeDeployDashboardDeployment: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.Deployment] = { for { id <- (__ \ "id").read[String] created <- (__ \ "created").read[_root_.org.joda.time.DateTime] started <- (__ \ "started").read[_root_.org.joda.time.DateTime] completed <- (__ \ "completed").read[_root_.org.joda.time.DateTime] creator <- (__ \ "creator").read[String] deploymentGroupName <- (__ \ "deployment_group_name").read[String] failed <- (__ \ "failed").read[Int] skipped <- (__ \ "skipped").read[Int] inProgress <- (__ \ "in_progress").read[Int] pending <- (__ \ "pending").read[Int] succeeded <- (__ \ "succeeded").read[Int] status <- (__ \ "status").read[String] errorMessage <- (__ \ "error_message").readNullable[String] revisionLocation <- (__ \ "revision_location").read[String] instances <- (__ \ "instances").read[Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentInstance]] } yield Deployment(id, created, started, completed, creator, deploymentGroupName, failed, skipped, inProgress, pending, succeeded, status, errorMessage, revisionLocation, instances) } def jsObjectDeployment(obj: io.grhodes.code.deploy.dashboard.v0.models.Deployment): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "id" -> play.api.libs.json.JsString(obj.id), "created" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.created)), "started" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.started)), "completed" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.completed)), "creator" -> play.api.libs.json.JsString(obj.creator), "deployment_group_name" -> play.api.libs.json.JsString(obj.deploymentGroupName), "failed" -> play.api.libs.json.JsNumber(obj.failed), "skipped" -> play.api.libs.json.JsNumber(obj.skipped), "in_progress" -> play.api.libs.json.JsNumber(obj.inProgress), "pending" -> play.api.libs.json.JsNumber(obj.pending), "succeeded" -> play.api.libs.json.JsNumber(obj.succeeded), "status" -> play.api.libs.json.JsString(obj.status), "revision_location" -> play.api.libs.json.JsString(obj.revisionLocation), "instances" -> play.api.libs.json.Json.toJson(obj.instances) ) ++ (obj.errorMessage match { case None => play.api.libs.json.Json.obj() case Some(x) => play.api.libs.json.Json.obj("error_message" -> play.api.libs.json.JsString(x)) }) } implicit def jsonWritesCodeDeployDashboardDeployment: play.api.libs.json.Writes[Deployment] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.Deployment) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectDeployment(obj) } } implicit def jsonReadsCodeDeployDashboardDeploymentGroup: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.DeploymentGroup] = { for { name <- (__ \ "name").read[String] autoScalingGroupNames <- (__ \ "autoScalingGroupNames").read[Seq[String]] } yield DeploymentGroup(name, autoScalingGroupNames) } def jsObjectDeploymentGroup(obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentGroup): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "name" -> play.api.libs.json.JsString(obj.name), "autoScalingGroupNames" -> play.api.libs.json.Json.toJson(obj.autoScalingGroupNames) ) } implicit def jsonWritesCodeDeployDashboardDeploymentGroup: play.api.libs.json.Writes[DeploymentGroup] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentGroup) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectDeploymentGroup(obj) } } implicit def jsonReadsCodeDeployDashboardDeploymentInstance: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.DeploymentInstance] = { for { id <- (__ \ "id").read[String] status <- (__ \ "status").read[String] lastUpdatedAt <- (__ \ "last_updated_at").read[_root_.org.joda.time.DateTime] lifecycleEvents <- (__ \ "lifecycle_events").read[Seq[io.grhodes.code.deploy.dashboard.v0.models.DeploymentLifecycleEvent]] } yield DeploymentInstance(id, status, lastUpdatedAt, lifecycleEvents) } def jsObjectDeploymentInstance(obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentInstance): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "id" -> play.api.libs.json.JsString(obj.id), "status" -> play.api.libs.json.JsString(obj.status), "last_updated_at" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.lastUpdatedAt)), "lifecycle_events" -> play.api.libs.json.Json.toJson(obj.lifecycleEvents) ) } implicit def jsonWritesCodeDeployDashboardDeploymentInstance: play.api.libs.json.Writes[DeploymentInstance] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentInstance) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectDeploymentInstance(obj) } } implicit def jsonReadsCodeDeployDashboardDeploymentLifecycleEvent: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.DeploymentLifecycleEvent] = { for { name <- (__ \ "name").read[String] startTime <- (__ \ "start_time").read[_root_.org.joda.time.DateTime] endTime <- (__ \ "end_time").read[_root_.org.joda.time.DateTime] status <- (__ \ "status").read[String] errorLogTail <- (__ \ "error_log_tail").readNullable[String] errorMessage <- (__ \ "error_message").readNullable[String] scriptName <- (__ \ "script_name").readNullable[String] } yield DeploymentLifecycleEvent(name, startTime, endTime, status, errorLogTail, errorMessage, scriptName) } def jsObjectDeploymentLifecycleEvent(obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentLifecycleEvent): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "name" -> play.api.libs.json.JsString(obj.name), "start_time" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.startTime)), "end_time" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.endTime)), "status" -> play.api.libs.json.JsString(obj.status) ) ++ (obj.errorLogTail match { case None => play.api.libs.json.Json.obj() case Some(x) => play.api.libs.json.Json.obj("error_log_tail" -> play.api.libs.json.JsString(x)) }) ++ (obj.errorMessage match { case None => play.api.libs.json.Json.obj() case Some(x) => play.api.libs.json.Json.obj("error_message" -> play.api.libs.json.JsString(x)) }) ++ (obj.scriptName match { case None => play.api.libs.json.Json.obj() case Some(x) => play.api.libs.json.Json.obj("script_name" -> play.api.libs.json.JsString(x)) }) } implicit def jsonWritesCodeDeployDashboardDeploymentLifecycleEvent: play.api.libs.json.Writes[DeploymentLifecycleEvent] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.DeploymentLifecycleEvent) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectDeploymentLifecycleEvent(obj) } } implicit def jsonReadsCodeDeployDashboardInfo: play.api.libs.json.Reads[io.grhodes.code.deploy.dashboard.v0.models.Info] = { for { name <- (__ \ "name").read[String] version <- (__ \ "version").read[String] scalaVersion <- (__ \ "scala_version").read[String] sbtVersion <- (__ \ "sbt_version").read[String] buildTime <- (__ \ "build_time").read[_root_.org.joda.time.DateTime] } yield Info(name, version, scalaVersion, sbtVersion, buildTime) } def jsObjectInfo(obj: io.grhodes.code.deploy.dashboard.v0.models.Info): play.api.libs.json.JsObject = { play.api.libs.json.Json.obj( "name" -> play.api.libs.json.JsString(obj.name), "version" -> play.api.libs.json.JsString(obj.version), "scala_version" -> play.api.libs.json.JsString(obj.scalaVersion), "sbt_version" -> play.api.libs.json.JsString(obj.sbtVersion), "build_time" -> play.api.libs.json.JsString(_root_.org.joda.time.format.ISODateTimeFormat.dateTime.print(obj.buildTime)) ) } implicit def jsonWritesCodeDeployDashboardInfo: play.api.libs.json.Writes[Info] = { (obj: io.grhodes.code.deploy.dashboard.v0.models.Info) => { io.grhodes.code.deploy.dashboard.v0.models.json.jsObjectInfo(obj) } } } } package io.grhodes.code.deploy.dashboard.v0 { import com.ning.http.client.{AsyncCompletionHandler, AsyncHttpClient, Realm, Request, RequestBuilder, Response, AsyncHttpClientConfig} object Constants { val BaseUrl = "http://code-deploy-dashboard.tools.gilt.com" val Namespace = "io.grhodes.code.deploy.dashboard.v0" val UserAgent = "apibuilder app.apibuilder.io/grhodes/code-deploy-dashboard/0.0.1-dev/ning_1_9_client" val Version = "0.0.1-dev" val VersionMajor = 0 } class Client( val baseUrl: String = "http://code-deploy-dashboard.tools.gilt.com", auth: scala.Option[io.grhodes.code.deploy.dashboard.v0.Authorization] = None, defaultHeaders: Seq[(String, String)] = Nil, asyncHttpClient: AsyncHttpClient = Client.defaultAsyncHttpClient ) extends interfaces.Client { import org.slf4j.{Logger, LoggerFactory} import io.grhodes.code.deploy.dashboard.v0.models.json._ def closeAsyncHttpClient(): Unit = { asyncHttpClient.close() } val logger = LoggerFactory.getLogger(getClass) def applications: Applications = Applications def info: Info = Info object Applications extends Applications { override def get( requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Seq[io.grhodes.code.deploy.dashboard.v0.models.Application]] = { _executeRequest("GET", s"/application", requestHeaders = requestHeaders).map { case r if r.getStatusCode == 200 => _root_.io.grhodes.code.deploy.dashboard.v0.Client.parseJson("Seq[io.grhodes.code.deploy.dashboard.v0.models.Application]", r, _.validate[Seq[io.grhodes.code.deploy.dashboard.v0.models.Application]]) case r => throw io.grhodes.code.deploy.dashboard.v0.errors.FailedRequest(r.getStatusCode, s"Unsupported response code[${r.getStatusCode}]. Expected: 200", requestUri = Some(r.getUri.toJavaNetURI)) } } } object Info extends Info { override def get( requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.grhodes.code.deploy.dashboard.v0.models.Info] = { _executeRequest("GET", s"/info", requestHeaders = requestHeaders).map { case r if r.getStatusCode == 200 => _root_.io.grhodes.code.deploy.dashboard.v0.Client.parseJson("io.grhodes.code.deploy.dashboard.v0.models.Info", r, _.validate[io.grhodes.code.deploy.dashboard.v0.models.Info]) case r => throw io.grhodes.code.deploy.dashboard.v0.errors.FailedRequest(r.getStatusCode, s"Unsupported response code[${r.getStatusCode}]. Expected: 200", requestUri = Some(r.getUri.toJavaNetURI)) } } } def _logRequest(request: Request): Unit = { if (logger.isInfoEnabled) { logger.info("_logRequest: " + request) } } def _logResponse(response: Response): Unit = { if (logger.isInfoEnabled) { logger.info("_logResponse: status=" + response.getStatusCode + ", responseBody: " + response.getResponseBody("UTF-8")) } } def _requestBuilder(method: String, path: String, requestHeaders: Seq[(String, String)]): RequestBuilder = { val builder = new RequestBuilder(method) .setUrl(baseUrl + path) .addHeader("User-Agent", Constants.UserAgent) .addHeader("X-Apidoc-Version", Constants.Version) .addHeader("X-Apidoc-Version-Major", Constants.VersionMajor.toString) defaultHeaders.foreach { h => builder.addHeader(h._1, h._2) } requestHeaders.foreach { h => builder.addHeader(h._1, h._2) } auth.fold(builder) { case Authorization.Basic(username, passwordOpt) => { builder.setRealm( new Realm.RealmBuilder() .setPrincipal(username) .setPassword(passwordOpt.getOrElse("")) .setUsePreemptiveAuth(true) .setScheme(Realm.AuthScheme.BASIC) .build() ) } case a => sys.error("Invalid authorization scheme[" + a.getClass + "]") } } def _executeRequest( method: String, path: String, queryParameters: Seq[(String, String)] = Nil, requestHeaders: Seq[(String, String)] = Nil, body: Option[play.api.libs.json.JsValue] = None )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[com.ning.http.client.Response] = { val allHeaders = body match { case None => requestHeaders case Some(_) => _withJsonContentType(requestHeaders) } val request = _requestBuilder(method, path, allHeaders) queryParameters.foreach { pair => request.addQueryParam(pair._1, pair._2) } val requestWithParamsAndBody = body.fold(request) { b => val serialized = play.api.libs.json.Json.stringify(b) request.setBody(serialized) } val finalRequest = requestWithParamsAndBody.build() _logRequest(finalRequest) val result = scala.concurrent.Promise[com.ning.http.client.Response]() asyncHttpClient.executeRequest(finalRequest, new AsyncCompletionHandler[Unit]() { override def onCompleted(r: com.ning.http.client.Response) = { _logResponse(r) result.success(r) } override def onThrowable(t: Throwable) = result.failure(t) } ) result.future } /** * Adds a Content-Type: application/json header unless the specified requestHeaders * already contain a Content-Type header */ def _withJsonContentType(headers: Seq[(String, String)]): Seq[(String, String)] = { headers.find { _._1.toUpperCase == "CONTENT-TYPE" } match { case None => headers ++ Seq(("Content-Type" -> "application/json; charset=UTF-8")) case Some(_) => headers } } } object Client { private lazy val defaultAsyncHttpClient = { new AsyncHttpClient( new AsyncHttpClientConfig.Builder() .setExecutorService(java.util.concurrent.Executors.newCachedThreadPool()) .build() ) } def parseJson[T]( className: String, r: _root_.com.ning.http.client.Response, f: (play.api.libs.json.JsValue => play.api.libs.json.JsResult[T]) ): T = { f(play.api.libs.json.Json.parse(r.getResponseBody("UTF-8"))) match { case play.api.libs.json.JsSuccess(x, _) => x case play.api.libs.json.JsError(errors) => { throw io.grhodes.code.deploy.dashboard.v0.errors.FailedRequest(r.getStatusCode, s"Invalid json for class[" + className + "]: " + errors.mkString(" "), requestUri = Some(r.getUri.toJavaNetURI)) } } } } sealed trait Authorization extends _root_.scala.Product with _root_.scala.Serializable object Authorization { final case class Basic(username: String, password: Option[String] = None) extends Authorization } package interfaces { trait Client { def baseUrl: String def applications: io.grhodes.code.deploy.dashboard.v0.Applications def info: io.grhodes.code.deploy.dashboard.v0.Info } } trait Applications { def get( requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[Seq[io.grhodes.code.deploy.dashboard.v0.models.Application]] } trait Info { def get( requestHeaders: Seq[(String, String)] = Nil )(implicit ec: scala.concurrent.ExecutionContext): scala.concurrent.Future[io.grhodes.code.deploy.dashboard.v0.models.Info] } package errors { final case class FailedRequest(responseCode: Int, message: String, requestUri: Option[_root_.java.net.URI] = None) extends _root_.java.lang.Exception(s"HTTP $responseCode: $message") } object PathSegment { // See https://github.com/playframework/playframework/blob/2.3.x/framework/src/play/src/main/scala/play/utils/UriEncoding.scala def encode(s: String, inputCharset: String): String = { val in = s.getBytes(inputCharset) val out = new java.io.ByteArrayOutputStream() for (b <- in) { val allowed = segmentChars.get(b & 0xFF) if (allowed) { out.write(b) } else { out.write('%') out.write(upperHex((b >> 4) & 0xF)) out.write(upperHex(b & 0xF)) } } out.toString("US-ASCII") } private def upperHex(x: Int): Int = { // Assume 0 <= x < 16 if (x < 10) (x + '0') else (x - 10 + 'A') } private val segmentChars: java.util.BitSet = membershipTable(pchar) private def pchar: Seq[Char] = { val alphaDigit = for ((min, max) <- Seq(('a', 'z'), ('A', 'Z'), ('0', '9')); c <- min to max) yield c val unreserved = alphaDigit ++ Seq('-', '.', '_', '~') val subDelims = Seq('!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=') unreserved ++ subDelims ++ Seq(':', '@') } private def membershipTable(chars: Seq[Char]): java.util.BitSet = { val bits = new java.util.BitSet(256) for (c <- chars) { bits.set(c.toInt) } bits } } }