app/lib/AmazonConnection.scala (59 lines of code) (raw):
package lib
import com.amazonaws.auth.DefaultAWSCredentialsProviderChain
import com.amazonaws.handlers.AsyncHandler
import com.amazonaws.regions.{Region, Regions}
import com.amazonaws.services.autoscaling.AmazonAutoScalingAsyncClient
import com.amazonaws.services.cloudwatch.AmazonCloudWatchAsyncClient
import com.amazonaws.services.cloudwatch.model.Datapoint
import com.amazonaws.services.ec2.AmazonEC2AsyncClient
import com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingAsyncClient
import com.amazonaws.services.s3.AmazonS3Client
import com.amazonaws.services.sqs.AmazonSQSAsyncClient
import com.amazonaws.{AmazonWebServiceRequest, ClientConfiguration}
import model.ScalingAction
import play.api.libs.json.{Json, Writes}
import java.util.concurrent.{Future => JuncFuture}
import scala.concurrent.{Future, Promise}
import scala.util.{Failure, Success}
class AmazonConnection(clientConfig: ClientConfiguration) {
val credentialsProvider = new DefaultAWSCredentialsProviderChain()
val ec2 = new AmazonEC2AsyncClient(credentialsProvider, clientConfig)
val elb = new AmazonElasticLoadBalancingAsyncClient(credentialsProvider, clientConfig)
val autoscaling = new AmazonAutoScalingAsyncClient(credentialsProvider, clientConfig)
val s3 = new AmazonS3Client(credentialsProvider, clientConfig)
val cloudWatch: AmazonCloudWatchAsyncClient = Region.getRegion(Regions.EU_WEST_1).createClient(
classOf[AmazonCloudWatchAsyncClient], credentialsProvider, clientConfig)
val sqs = Region.getRegion(Regions.EU_WEST_1).createClient(
classOf[AmazonSQSAsyncClient], credentialsProvider, clientConfig)
ec2.setEndpoint("ec2.eu-west-1.amazonaws.com")
elb.setEndpoint("elasticloadbalancing.eu-west-1.amazonaws.com")
autoscaling.setEndpoint("autoscaling.eu-west-1.amazonaws.com")
}
object AWS {
def futureOf[X <: AmazonWebServiceRequest, T](call: (X,AsyncHandler[X, T]) => JuncFuture[T], req: X): Future[T] = {
val p = Promise[T]()
val h = new AsyncHandler[X, T] {
def onError(exception: Exception) { p.complete(Failure(exception)) }
def onSuccess(request: X, result: T) { p.complete(Success(result)) }
}
call(req, h)
p.future
}
lazy val connection = new AmazonConnection(Config.clientConfiguration)
object Writes {
implicit val datapointWrites = new Writes[Datapoint] {
override def writes(d: Datapoint) = Json.obj(
"time" -> d.getTimestamp.getTime,
"average" -> Option(d.getAverage).map(_.toInt),
"maximum" -> Option(d.getMaximum).map(_.toInt),
"sum" -> Option(d.getSum).map(_.toLong)
)
}
implicit val scalingActionWrites = new Writes[ScalingAction] {
override def writes(a: ScalingAction) = Json.obj(
"age" -> a.age,
"cause" -> a.cause
)
}
}
}