Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Reduce ability to create invalid RDS template #29

Merged
merged 1 commit into from
Oct 21, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 4 additions & 2 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -42,9 +42,11 @@ javacOptions ++= Seq("-Xlint:unchecked", "-Xlint:deprecation")

libraryDependencies ++= Seq (
// -- testing --
"org.scalatest" %% "scalatest" % "2.2.1" % "test"
"org.scalatest" %% "scalatest" % "2.2.1" % "test"
// -- json --
,"io.spray" %% "spray-json" % "1.3.2"
,"io.spray" %% "spray-json" % "1.3.2"
// -- reflection --
,"org.scala-lang" % "scala-reflect" % scalaVersion.value
).map(_.force())

resolvers ++= Seq(
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.monsanto.arch.cloudformation.model

import spray.json._
import scala.reflect.runtime.universe._

class EnumFormat[T](values: Seq[T], stringifier: T => String = (x: T) => x.toString)
(implicit tag: TypeTag[T]) extends JsonFormat[T] {
override def read(json: JsValue): T =
json match {
case s: JsString =>
values.find(x => stringifier(x) == s.value).getOrElse(deserializationError(s.toString + " is not a valid " + tag.tpe))
case x => deserializationError(x.toString + " is not a String")
}
override def write(obj: T) = JsString(stringifier(obj))
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,98 +35,136 @@ object `AWS::CloudWatch::Alarm` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm`] = jsonFormat17(`AWS::CloudWatch::Alarm`.apply)
}

sealed abstract class `AWS::CloudWatch::Alarm::ComparisonOperator`(val operator: String)
sealed trait `AWS::CloudWatch::Alarm::ComparisonOperator`
object `AWS::CloudWatch::Alarm::ComparisonOperator` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::ComparisonOperator`] = new JsonFormat[`AWS::CloudWatch::Alarm::ComparisonOperator`] {
def write(obj: `AWS::CloudWatch::Alarm::ComparisonOperator`) = JsString(obj.operator)
//TODO
def read(json: JsValue) = ???
}
case object GreaterThanOrEqualToThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`
case object GreaterThanThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`
case object LessThanOrEqualToThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`
case object LessThanThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`
val values = Seq(GreaterThanOrEqualToThreshold, GreaterThanThreshold, LessThanOrEqualToThreshold, LessThanThreshold)
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::ComparisonOperator`] =
new EnumFormat[`AWS::CloudWatch::Alarm::ComparisonOperator`](values)
}
case object GreaterThanOrEqualToThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`("GreaterThanOrEqualToThreshold")
case object GreaterThanThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`("GreaterThanThreshold")
case object LessThanOrEqualToThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`("LessThanOrEqualToThreshold")
case object LessThanThreshold extends `AWS::CloudWatch::Alarm::ComparisonOperator`("LessThanThreshold")

case class `AWS::CloudWatch::Alarm::Dimension`(Name: String, Value: Token[ResourceRef[_]])
object `AWS::CloudWatch::Alarm::Dimension` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Dimension`] = jsonFormat2(`AWS::CloudWatch::Alarm::Dimension`.apply)
def from[A <: Resource[A]](name: String, value: Token[ResourceRef[A]]): `AWS::CloudWatch::Alarm::Dimension` = `AWS::CloudWatch::Alarm::Dimension`(name, value.asInstanceOf[Token[ResourceRef[_]]])
}

sealed abstract class `AWS::CloudWatch::Alarm::Namespace`(val name: String)
sealed trait `AWS::CloudWatch::Alarm::Namespace`
object `AWS::CloudWatch::Alarm::Namespace` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Namespace`] = new JsonFormat[`AWS::CloudWatch::Alarm::Namespace`] {
def write(obj: `AWS::CloudWatch::Alarm::Namespace`) = JsString(obj.name)
//TODO
def read(json: JsValue) = ???
}
case object `AWS/AutoScaling` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/Billing` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/CloudFront` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/DynamoDB` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/ElastiCache` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/EBS` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/EC2` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/ELB` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/ElasticMapReduce` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/Kinesis` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/OpsWorks` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/Redshift` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/RDS` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/Route53` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/SNS` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/SQS` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/SWF` extends `AWS::CloudWatch::Alarm::Namespace`
case object `AWS/StorageGateway` extends `AWS::CloudWatch::Alarm::Namespace`
val values = Seq(`AWS/AutoScaling`,
`AWS/Billing`,
`AWS/CloudFront`,
`AWS/DynamoDB`,
`AWS/ElastiCache`,
`AWS/EBS`,
`AWS/EC2`,
`AWS/ELB`,
`AWS/ElasticMapReduce`,
`AWS/Kinesis`,
`AWS/OpsWorks`,
`AWS/Redshift`,
`AWS/RDS`,
`AWS/Route53`,
`AWS/SNS`,
`AWS/SQS`,
`AWS/SWF`,
`AWS/StorageGateway`
)
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Namespace`] =
new EnumFormat[`AWS::CloudWatch::Alarm::Namespace`](values)
}
case object `AWS/AutoScaling` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/AutoScaling")
case object `AWS/Billing` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/Billing")
case object `AWS/CloudFront` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/CloudFront")
case object `AWS/DynamoDB` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/DynamoDB")
case object `AWS/ElastiCache` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/ElastiCache")
case object `AWS/EBS` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/EBS")
case object `AWS/EC2` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/EC2")
case object `AWS/ELB` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/ELB")
case object `AWS/ElasticMapReduce` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/ElasticMapReduce")
case object `AWS/Kinesis` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/Kinesis")
case object `AWS/OpsWorks` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/OpsWorks")
case object `AWS/Redshift` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/Redshift")
case object `AWS/RDS` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/RDS")
case object `AWS/Route53` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/Route53")
case object `AWS/SNS` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/SNS")
case object `AWS/SQS` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/SQS")
case object `AWS/SWF` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/SWF")
case object `AWS/StorageGateway` extends `AWS::CloudWatch::Alarm::Namespace`("AWS/StorageGateway")

sealed abstract class `AWS::CloudWatch::Alarm::Statistic`(val name: String)
sealed trait `AWS::CloudWatch::Alarm::Statistic`
object `AWS::CloudWatch::Alarm::Statistic` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Statistic`] = new JsonFormat[`AWS::CloudWatch::Alarm::Statistic`] {
def write(obj: `AWS::CloudWatch::Alarm::Statistic`) = JsString(obj.name)
//TODO
def read(json: JsValue) = ???
}
case object SampleCount extends `AWS::CloudWatch::Alarm::Statistic`
case object Average extends `AWS::CloudWatch::Alarm::Statistic`
case object Sum extends `AWS::CloudWatch::Alarm::Statistic`
case object Minimum extends `AWS::CloudWatch::Alarm::Statistic`
case object Maximum extends `AWS::CloudWatch::Alarm::Statistic`
val values = Seq(SampleCount, Average, Sum, Minimum, Maximum)
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Statistic`] =
new EnumFormat[`AWS::CloudWatch::Alarm::Statistic`](values)
}
case object SampleCount extends `AWS::CloudWatch::Alarm::Statistic`("SampleCount")
case object Average extends `AWS::CloudWatch::Alarm::Statistic`("Average")
case object Sum extends `AWS::CloudWatch::Alarm::Statistic`("Sum")
case object Minimum extends `AWS::CloudWatch::Alarm::Statistic`("Minimum")
case object Maximum extends `AWS::CloudWatch::Alarm::Statistic`("Maximum")

sealed abstract class `AWS::CloudWatch::Alarm::Unit`(val name: String)
sealed trait `AWS::CloudWatch::Alarm::Unit`
object `AWS::CloudWatch::Alarm::Unit` extends DefaultJsonProtocol {
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Unit`] = new JsonFormat[`AWS::CloudWatch::Alarm::Unit`] {
def write(obj: `AWS::CloudWatch::Alarm::Unit`) = JsString(obj.name)
//TODO
def read(json: JsValue) = ???
}
case object Seconds extends `AWS::CloudWatch::Alarm::Unit`
case object Microseconds extends `AWS::CloudWatch::Alarm::Unit`
case object Milliseconds extends `AWS::CloudWatch::Alarm::Unit`
case object Bytes extends `AWS::CloudWatch::Alarm::Unit`
case object Kilobytes extends `AWS::CloudWatch::Alarm::Unit`
case object Megabytes extends `AWS::CloudWatch::Alarm::Unit`
case object Gigabytes extends `AWS::CloudWatch::Alarm::Unit`
case object Terabytes extends `AWS::CloudWatch::Alarm::Unit`
case object Bits extends `AWS::CloudWatch::Alarm::Unit`
case object Kilobits extends `AWS::CloudWatch::Alarm::Unit`
case object Megabits extends `AWS::CloudWatch::Alarm::Unit`
case object Gigabits extends `AWS::CloudWatch::Alarm::Unit`
case object Terabits extends `AWS::CloudWatch::Alarm::Unit`
case object Percent extends `AWS::CloudWatch::Alarm::Unit`
case object Count extends `AWS::CloudWatch::Alarm::Unit`
case object `Bytes/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Kilobytes/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Megabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Gigabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Terabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Bits/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Kilobits/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Megabits/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Gigabits/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Terabits/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object `Count/Second` extends `AWS::CloudWatch::Alarm::Unit`
case object UnitNone extends `AWS::CloudWatch::Alarm::Unit`
val values = Seq(
Seconds,
Microseconds,
Milliseconds,
Bytes,
Kilobytes,
Megabytes,
Gigabytes,
Terabytes,
Bits,
Kilobits,
Megabits,
Gigabits,
Terabits,
Percent,
Count,
`Bytes/Second`,
`Kilobytes/Second`,
`Megabytes/Second`,
`Gigabytes/Second`,
`Terabytes/Second`,
`Bits/Second`,
`Kilobits/Second`,
`Megabits/Second`,
`Gigabits/Second`,
`Terabits/Second`,
`Count/Second`,
UnitNone
)
implicit val format: JsonFormat[`AWS::CloudWatch::Alarm::Unit`] =
new EnumFormat[`AWS::CloudWatch::Alarm::Unit`](values)
}
case object Seconds extends `AWS::CloudWatch::Alarm::Unit`("Seconds")
case object Microseconds extends `AWS::CloudWatch::Alarm::Unit`("Microseconds")
case object Milliseconds extends `AWS::CloudWatch::Alarm::Unit`("Milliseconds")
case object Bytes extends `AWS::CloudWatch::Alarm::Unit`("Bytes")
case object Kilobytes extends `AWS::CloudWatch::Alarm::Unit`("Kilobytes")
case object Megabytes extends `AWS::CloudWatch::Alarm::Unit`("Megabytes")
case object Gigabytes extends `AWS::CloudWatch::Alarm::Unit`("Gigabytes")
case object Terabytes extends `AWS::CloudWatch::Alarm::Unit`("Terabytes")
case object Bits extends `AWS::CloudWatch::Alarm::Unit`("Bits")
case object Kilobits extends `AWS::CloudWatch::Alarm::Unit`("Kilobits")
case object Megabits extends `AWS::CloudWatch::Alarm::Unit`("Megabits")
case object Gigabits extends `AWS::CloudWatch::Alarm::Unit`("Gigabits")
case object Terabits extends `AWS::CloudWatch::Alarm::Unit`("Terabits")
case object Percent extends `AWS::CloudWatch::Alarm::Unit`("Percent")
case object Count extends `AWS::CloudWatch::Alarm::Unit`("Count")
case object `Bytes/Second` extends `AWS::CloudWatch::Alarm::Unit`("Bytes/Second")
case object `Kilobytes/Second` extends `AWS::CloudWatch::Alarm::Unit`("Kilobytes/Second")
case object `Megabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`("Megabytes/Second")
case object `Gigabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`("Gigabytes/Second")
case object `Terabytes/Second` extends `AWS::CloudWatch::Alarm::Unit`("Terabytes/Second")
case object `Bits/Second` extends `AWS::CloudWatch::Alarm::Unit`("Bits/Second")
case object `Kilobits/Second` extends `AWS::CloudWatch::Alarm::Unit`("Kilobits/Second")
case object `Megabits/Second` extends `AWS::CloudWatch::Alarm::Unit`("Megabits/Second")
case object `Gigabits/Second` extends `AWS::CloudWatch::Alarm::Unit`("Gigabits/Second")
case object `Terabits/Second` extends `AWS::CloudWatch::Alarm::Unit`("Terabits/Second")
case object `Count/Second` extends `AWS::CloudWatch::Alarm::Unit`("Count/Second")
case object UnitNone extends `AWS::CloudWatch::Alarm::Unit`("UnitNone")
Original file line number Diff line number Diff line change
Expand Up @@ -161,7 +161,8 @@ object `AWS::ElasticLoadBalancing::LoadBalancer` extends DefaultJsonProtocol {
DependsOn = DependsOn
)

implicit val format: JsonFormat[`AWS::ElasticLoadBalancing::LoadBalancer`] = jsonFormat19(`AWS::ElasticLoadBalancing::LoadBalancer`.apply)
implicit val format: JsonFormat[`AWS::ElasticLoadBalancing::LoadBalancer`] =
jsonFormat19(`AWS::ElasticLoadBalancing::LoadBalancer`.apply)
}

case class ELBAccessLoggingPolicy(
Expand All @@ -178,19 +179,9 @@ sealed trait ELBLoggingEmitInterval
object ELBLoggingEmitInterval extends DefaultJsonProtocol {
case object `5` extends ELBLoggingEmitInterval
case object `60` extends ELBLoggingEmitInterval

implicit val format: JsonFormat[ELBLoggingEmitInterval] = new JsonFormat[ELBLoggingEmitInterval] {
override def write(obj: ELBLoggingEmitInterval): JsValue = obj match {
case `5` => JsNumber(5)
case `60` => JsNumber(60)
}
override def read(json: JsValue): ELBLoggingEmitInterval = {
json.toString() match {
case "5" => `5`
case "60" => `60`
}
}
}
val values = Seq(`5`, `60`)
implicit val format: JsonFormat[ELBLoggingEmitInterval] =
new EnumFormat[ELBLoggingEmitInterval](values)
}

case class ELBAppCookieStickinessPolicy(
Expand Down Expand Up @@ -242,18 +233,8 @@ object ELBListenerProtocol extends DefaultJsonProtocol {
case object HTTPS extends ELBListenerProtocol
case object SSL extends ELBListenerProtocol
case object TCP extends ELBListenerProtocol

implicit val format: JsonFormat[ELBListenerProtocol] = new JsonFormat[ELBListenerProtocol] {
override def write(obj: ELBListenerProtocol)= JsString(obj.toString)
override def read(json: JsValue): ELBListenerProtocol = {
json.toString match {
case "HTTP" => HTTP
case "HTTPS" => HTTPS
case "SSL" => SSL
case "TCP" => TCP
}
}
}
val values = Seq(HTTPS, HTTPS, SSL, TCP)
implicit val format: JsonFormat[ELBListenerProtocol] = new EnumFormat[ELBListenerProtocol](values)
}

case class ELBHealthCheck(
Expand Down Expand Up @@ -285,16 +266,8 @@ object NameValuePair extends DefaultJsonProtocol {

sealed trait ELBScheme
object ELBScheme extends DefaultJsonProtocol {
case object internal extends ELBScheme
case object internal extends ELBScheme
case object `internet-facing` extends ELBScheme

implicit val format: JsonFormat[ELBScheme] = new JsonFormat[ELBScheme] {
override def write(obj: ELBScheme)= JsString(obj.toString)
override def read(json: JsValue): ELBScheme = {
json.toString match {
case "internal" => internal
case "internet-facing" => `internet-facing`
}
}
}
val values = Seq(internal, `internet-facing`)
implicit val format: JsonFormat[ELBScheme] = new EnumFormat[ELBScheme](values)
}
Loading