Skip to content

Commit

Permalink
add more discovery to TemplateBase
Browse files Browse the repository at this point in the history
  • Loading branch information
tylersouthwick committed May 31, 2017
1 parent 9f58d69 commit b2d1fea
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 10 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,25 @@ import com.monsanto.arch.cloudformation.model.simple.SecurityGroupRoutable
* and builds a template from them. This search for:
*
* <ul>
* <li>Parameter</li>
* <li>Condition</li>
* <li>Mapping</li>
* <li>Resource</li>
* <li>SecurityGroupRoutable</li>
* <li>Output</li>
* <li>Parameter</li>
* <li>Condition</li>
* <li>Mapping</li>
* <li>Resource</li>
* <li>SecurityGroupRoutable</li>
* <li>Output</li>
* <li>Template</li>
* <li>HasTemplate</li>
* </ul>
*/
trait TemplateBase extends HasTemplate {

private def extract[A: Manifest]: Option[Seq[A]] = {
val objs = getClass.getMethods
//make sure that we don't call template method again
.filterNot(m => m.getName == "template" && m.getReturnType.isAssignableFrom(classOf[Template]))
.filter(_.getParameterCount == 0)
.filter(x => manifest[A].runtimeClass.isAssignableFrom(x.getReturnType))
.map(_.invoke(this).asInstanceOf[A])
.map(_.invoke(this).asInstanceOf[A])
println(s"Extracted ${objs.length} ${manifest[A].runtimeClass.getName}")
if (objs.isEmpty) {
None
Expand All @@ -42,7 +46,15 @@ trait TemplateBase extends HasTemplate {
Routables = extract[SecurityGroupRoutable[_ <: Resource[_]]],
Outputs = extract[Output[_]]
)
println("processed template " + getClass.getName)
t

val subHasTemplates = extract[HasTemplate].toSeq.flatten
val subTemplates = extract[Template].toSeq.flatten
try {
(subHasTemplates.map(_.template) ++ subTemplates).foldLeft(t) {
_ ++ _
}
} finally {
println("processed template " + getClass.getName)
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import org.scalatest.{FunSpec, Matchers}

class TemplateBaseSpec extends FunSpec with Matchers {

it("should find ") {
it("should find components of templates") {
object MyTemplate extends TemplateBase {
val param1 = StringParameter("test1", "desc1")
def resource1 = `AWS::SQS::Queue`(
Expand All @@ -24,4 +24,52 @@ class TemplateBaseSpec extends FunSpec with Matchers {
MyTemplate.template.Resources.toSeq.flatten should contain(MyTemplate.resource1)
}

it("should find instances of HasTemplate") {
object MyTemplate extends TemplateBase {

lazy val anotherTemplate = new TemplateBase {
def resource1 = `AWS::SQS::Queue`(
name = "resource1",
QueueName = "test1",
DelaySeconds = 5,
MessageRetentionPeriod = 2,
ReceiveMessageWaitTimeSeconds = 9,
VisibilityTimeout = 4
)
}

lazy val anotherTemplate2 = new TemplateBase {
def resource = `AWS::SQS::Queue`(
name = "resource2",
QueueName = "test2",
DelaySeconds = 5,
MessageRetentionPeriod = 2,
ReceiveMessageWaitTimeSeconds = 9,
VisibilityTimeout = 4
)
}
}

MyTemplate.template.Resources.toSeq.flatten should contain(MyTemplate.anotherTemplate.resource1)
MyTemplate.template.Resources.toSeq.flatten should contain(MyTemplate.anotherTemplate2.resource)
}

it("should find instances of Template") {
val queue = `AWS::SQS::Queue`(
name = "resource1",
QueueName = "test1",
DelaySeconds = 5,
MessageRetentionPeriod = 2,
ReceiveMessageWaitTimeSeconds = 9,
VisibilityTimeout = 4
)
object MyTemplate extends TemplateBase {

lazy val anotherTemplate = Template.EMPTY ++ queue

}

MyTemplate.template.Resources.toSeq.flatten should contain(queue)
}

}

0 comments on commit b2d1fea

Please sign in to comment.