jets 0.2.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (292) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/bin/commit_docs.sh +26 -0
  3. data/.circleci/config.yml +126 -0
  4. data/.codebuild/README.md +57 -0
  5. data/.codebuild/bin/jets +3 -0
  6. data/.codebuild/buildspec-base.yml +14 -0
  7. data/.codebuild/integration.sh +54 -0
  8. data/.codebuild/jets.postman_collection.json +323 -0
  9. data/.codebuild/scripts/install-docker.sh +12 -0
  10. data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
  11. data/.codebuild/scripts/install-java.sh +20 -0
  12. data/.codebuild/scripts/install-node.sh +4 -0
  13. data/.gitignore +3 -0
  14. data/.gitmodules +9 -0
  15. data/.python-version +1 -0
  16. data/.rspec +2 -0
  17. data/.ruby-version +1 -1
  18. data/CHANGELOG.md +3 -0
  19. data/Dockerfile +16 -0
  20. data/Dockerfile.base +53 -0
  21. data/Gemfile +8 -1
  22. data/Gemfile.lock +132 -28
  23. data/LICENSE.txt +1 -1
  24. data/Procfile +2 -0
  25. data/README.md +116 -17
  26. data/Rakefile +6 -0
  27. data/buildspec.yml +18 -0
  28. data/exe/jets +14 -0
  29. data/jets.gemspec +31 -3
  30. data/lib/jets.rb +56 -8
  31. data/lib/jets/application.rb +121 -0
  32. data/lib/jets/application/middleware.rb +23 -0
  33. data/lib/jets/aws_services.rb +71 -0
  34. data/lib/jets/booter.rb +95 -0
  35. data/lib/jets/builders.rb +6 -0
  36. data/lib/jets/builders/code_builder.rb +431 -0
  37. data/lib/jets/builders/deducer.rb +73 -0
  38. data/lib/jets/builders/gem_replacer.rb +154 -0
  39. data/lib/jets/builders/handler_generator.rb +76 -0
  40. data/lib/jets/builders/node-hello.js +73 -0
  41. data/lib/jets/builders/node-shim.js +151 -0
  42. data/lib/jets/cfn.rb +5 -4
  43. data/lib/jets/cfn/ship.rb +178 -0
  44. data/lib/jets/cfn/status.rb +208 -0
  45. data/lib/jets/cfn/template_builders.rb +21 -0
  46. data/lib/jets/cfn/template_builders/api_gateway_builder.rb +73 -0
  47. data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +38 -0
  48. data/lib/jets/cfn/template_builders/base_child_builder.rb +38 -0
  49. data/lib/jets/cfn/template_builders/controller_builder.rb +107 -0
  50. data/lib/jets/cfn/template_builders/function_builder.rb +20 -0
  51. data/lib/jets/cfn/template_builders/function_properties.rb +6 -0
  52. data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +106 -0
  53. data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +12 -0
  54. data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +12 -0
  55. data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +13 -0
  56. data/lib/jets/cfn/template_builders/interface.rb +91 -0
  57. data/lib/jets/cfn/template_builders/job_builder.rb +63 -0
  58. data/lib/jets/cfn/template_builders/parent_builder.rb +97 -0
  59. data/lib/jets/cfn/template_builders/rule_builder.rb +55 -0
  60. data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +45 -0
  61. data/lib/jets/cfn/template_mappers.rb +23 -0
  62. data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +48 -0
  63. data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +4 -0
  64. data/lib/jets/cfn/template_mappers/child_mapper.rb +41 -0
  65. data/lib/jets/cfn/template_mappers/config_rule_mapper.rb +34 -0
  66. data/lib/jets/cfn/template_mappers/controller_mapper.rb +36 -0
  67. data/lib/jets/cfn/template_mappers/events_rule_mapper.rb +40 -0
  68. data/lib/jets/cfn/template_mappers/function_mapper.rb +4 -0
  69. data/lib/jets/cfn/template_mappers/gateway_method_mapper.rb +56 -0
  70. data/lib/jets/cfn/template_mappers/gateway_resource_mapper.rb +62 -0
  71. data/lib/jets/cfn/template_mappers/job_mapper.rb +4 -0
  72. data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +50 -0
  73. data/lib/jets/cfn/template_mappers/rule_mapper.rb +5 -0
  74. data/lib/jets/cli.rb +180 -15
  75. data/lib/jets/commands.rb +22 -0
  76. data/lib/jets/commands/base.rb +151 -0
  77. data/lib/jets/commands/build.rb +186 -0
  78. data/lib/jets/commands/call.rb +175 -0
  79. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  80. data/lib/jets/commands/call/autoload_guesser.rb +112 -0
  81. data/lib/jets/commands/call/base_guesser.rb +33 -0
  82. data/lib/jets/commands/call/guesser.rb +51 -0
  83. data/lib/jets/commands/console.rb +12 -0
  84. data/lib/jets/commands/db.rb +15 -0
  85. data/lib/jets/commands/db/environment-task.rake +3 -0
  86. data/lib/jets/commands/db/tasks.rb +30 -0
  87. data/lib/jets/commands/dbconsole.rb +131 -0
  88. data/lib/jets/commands/delete.rb +119 -0
  89. data/lib/jets/commands/deploy.rb +53 -0
  90. data/lib/jets/commands/dynamodb.rb +22 -0
  91. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  92. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  93. data/lib/jets/commands/help.rb +9 -0
  94. data/lib/jets/commands/help/build.md +1 -0
  95. data/lib/jets/commands/help/call.md +55 -0
  96. data/lib/jets/commands/help/console.md +4 -0
  97. data/lib/jets/commands/help/db/generate.md +8 -0
  98. data/lib/jets/commands/help/dbconsole.md +5 -0
  99. data/lib/jets/commands/help/delete.md +9 -0
  100. data/lib/jets/commands/help/deploy.md +5 -0
  101. data/lib/jets/commands/help/dynamodb/generate.md +50 -0
  102. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  103. data/lib/jets/commands/help/generate.md +5 -0
  104. data/lib/jets/commands/help/new.md +9 -0
  105. data/lib/jets/commands/help/process/controller.md +6 -0
  106. data/lib/jets/commands/help/process/function.md +5 -0
  107. data/lib/jets/commands/help/process/job.md +5 -0
  108. data/lib/jets/commands/help/process/rule.md +5 -0
  109. data/lib/jets/commands/help/routes.md +3 -0
  110. data/lib/jets/commands/help/server.md +6 -0
  111. data/lib/jets/commands/help/status.md +1 -0
  112. data/lib/jets/commands/help/url.md +5 -0
  113. data/lib/jets/commands/main.rb +111 -0
  114. data/lib/jets/commands/markdown.rb +8 -0
  115. data/lib/jets/commands/markdown/creator.rb +58 -0
  116. data/lib/jets/commands/markdown/index.rb +27 -0
  117. data/lib/jets/commands/markdown/page.rb +125 -0
  118. data/lib/jets/commands/markdown/shell.rb +11 -0
  119. data/lib/jets/commands/new.rb +110 -0
  120. data/lib/jets/commands/rake_command.rb +61 -0
  121. data/lib/jets/commands/rake_tasks.rb +45 -0
  122. data/lib/jets/commands/sequence.rb +44 -0
  123. data/lib/jets/commands/stack_info.rb +30 -0
  124. data/lib/jets/commands/templates/skeleton/.env +2 -0
  125. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  126. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  127. data/lib/jets/commands/templates/skeleton/.gitignore +14 -0
  128. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  129. data/lib/jets/commands/templates/skeleton/Gemfile.tt +27 -0
  130. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  131. data/lib/jets/commands/templates/skeleton/README.md +4 -0
  132. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  133. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  134. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  135. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +2 -0
  136. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  137. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  138. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +24 -0
  139. data/lib/jets/commands/templates/skeleton/bin/ruby_server +18 -0
  140. data/lib/jets/commands/templates/skeleton/bin/ruby_server.rb +2 -0
  141. data/lib/jets/commands/templates/skeleton/config.ru +4 -0
  142. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +26 -0
  143. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  144. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +25 -0
  145. data/lib/jets/commands/templates/skeleton/config/routes.rb +8 -0
  146. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  147. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  148. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  149. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  150. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  151. data/lib/jets/commands/templates/skeleton/public/index.html.tt +79 -0
  152. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +18 -0
  153. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  154. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  155. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +27 -0
  156. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
  157. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  158. data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
  159. data/lib/jets/commands/url.rb +45 -0
  160. data/lib/jets/commands/webpacker_template.rb +19 -0
  161. data/lib/jets/controller.rb +9 -0
  162. data/lib/jets/controller/base.rb +50 -0
  163. data/lib/jets/controller/callbacks.rb +43 -0
  164. data/lib/jets/controller/layout.rb +17 -0
  165. data/lib/jets/controller/params.rb +53 -0
  166. data/lib/jets/controller/redirection.rb +55 -0
  167. data/lib/jets/controller/renderers.rb +5 -0
  168. data/lib/jets/controller/renderers/aws_proxy_renderer.rb +69 -0
  169. data/lib/jets/controller/renderers/base_renderer.rb +16 -0
  170. data/lib/jets/controller/renderers/template_renderer.rb +107 -0
  171. data/lib/jets/controller/rendering.rb +80 -0
  172. data/lib/jets/controller/request.rb +55 -0
  173. data/lib/jets/core.rb +81 -0
  174. data/lib/jets/default/application.rb +20 -0
  175. data/lib/jets/dotenv.rb +37 -0
  176. data/lib/jets/erb.rb +51 -0
  177. data/lib/jets/generator.rb +40 -0
  178. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  179. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
  180. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  181. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  182. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  183. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  184. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  185. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  186. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  187. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  188. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  189. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  190. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +71 -0
  191. data/lib/jets/internal/app/controllers/jets/public_controller.rb +30 -0
  192. data/lib/jets/internal/app/controllers/jets/public_controller/python/show.py +47 -0
  193. data/lib/jets/internal/app/controllers/jets/public_controller/python/show.pyc +0 -0
  194. data/lib/jets/internal/app/controllers/jets/welcome_controller.rb +22 -0
  195. data/lib/jets/internal/app/controllers/jets/welcome_controller/python/index.py +24 -0
  196. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +52 -0
  197. data/lib/jets/job.rb +5 -0
  198. data/lib/jets/job/base.rb +29 -0
  199. data/lib/jets/job/dsl.rb +58 -0
  200. data/lib/jets/job/task.rb +17 -0
  201. data/lib/jets/klass.rb +71 -0
  202. data/lib/jets/lambda.rb +18 -0
  203. data/lib/jets/lambda/dsl.rb +153 -0
  204. data/lib/jets/lambda/function.rb +29 -0
  205. data/lib/jets/lambda/function_constructor.rb +60 -0
  206. data/lib/jets/lambda/functions.rb +22 -0
  207. data/lib/jets/lambda/task.rb +77 -0
  208. data/lib/jets/naming.rb +61 -0
  209. data/lib/jets/pascalize.rb +30 -0
  210. data/lib/jets/poly_fun.rb +61 -0
  211. data/lib/jets/poly_fun/base_executor.rb +129 -0
  212. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  213. data/lib/jets/poly_fun/node_error.rb +8 -0
  214. data/lib/jets/poly_fun/node_executor.rb +54 -0
  215. data/lib/jets/poly_fun/python_error.rb +8 -0
  216. data/lib/jets/poly_fun/python_executor.rb +23 -0
  217. data/lib/jets/preheat.rb +72 -0
  218. data/lib/jets/processors.rb +4 -0
  219. data/lib/jets/processors/deducer.rb +54 -0
  220. data/lib/jets/processors/main_processor.rb +57 -0
  221. data/lib/jets/rails_overrides.rb +4 -0
  222. data/lib/jets/rails_overrides/asset_tag_helper.rb +41 -0
  223. data/lib/jets/rails_overrides/common_methods.rb +13 -0
  224. data/lib/jets/rails_overrides/rendering_helper.rb +26 -0
  225. data/lib/jets/rails_overrides/url_helper.rb +26 -0
  226. data/lib/jets/route.rb +145 -0
  227. data/lib/jets/router.rb +115 -0
  228. data/lib/jets/ruby_server.rb +91 -0
  229. data/lib/jets/rule.rb +5 -0
  230. data/lib/jets/rule/base.rb +19 -0
  231. data/lib/jets/rule/dsl.rb +64 -0
  232. data/lib/jets/rule/task.rb +44 -0
  233. data/lib/jets/server.rb +16 -0
  234. data/lib/jets/server/api_gateway.rb +39 -0
  235. data/lib/jets/server/lambda_aws_proxy.rb +122 -0
  236. data/lib/jets/server/route_matcher.rb +96 -0
  237. data/lib/jets/server/timing_middleware.rb +16 -0
  238. data/lib/jets/server/webpacker_setup.rb +7 -0
  239. data/lib/jets/timing.rb +65 -0
  240. data/lib/jets/timing/report.rb +82 -0
  241. data/lib/jets/util.rb +7 -12
  242. data/lib/jets/version.rb +1 -1
  243. data/support/clean +3 -0
  244. data/support/console +3 -0
  245. metadata +473 -76
  246. data/bin/jets +0 -14
  247. data/lib/jets/base_controller.rb +0 -54
  248. data/lib/jets/build.rb +0 -46
  249. data/lib/jets/build/handler_generator.rb +0 -46
  250. data/lib/jets/build/lambda_deducer.rb +0 -23
  251. data/lib/jets/build/templates/handler.js +0 -149
  252. data/lib/jets/build/traveling_ruby.rb +0 -133
  253. data/lib/jets/cfn/base.rb +0 -17
  254. data/lib/jets/cfn/builder.rb +0 -53
  255. data/lib/jets/cfn/namer.rb +0 -30
  256. data/lib/jets/cli/help.rb +0 -19
  257. data/lib/jets/command.rb +0 -25
  258. data/lib/jets/process.rb +0 -18
  259. data/lib/jets/process/base_processor.rb +0 -23
  260. data/lib/jets/process/controller_processor.rb +0 -36
  261. data/lib/jets/process/help.rb +0 -11
  262. data/lib/jets/process/processor_deducer.rb +0 -51
  263. data/lib/jets/project.rb +0 -23
  264. data/notes/design.md +0 -107
  265. data/notes/faq.md +0 -3
  266. data/notes/lambda_ruby_info.md +0 -34
  267. data/notes/traveling-ruby-packaging-jets.md +0 -26
  268. data/notes/traveling-ruby-packaging.md +0 -103
  269. data/notes/traveling-ruby-structure.md +0 -6
  270. data/notes/traveling-ruby.md +0 -82
  271. data/spec/fixtures/classes.rb +0 -5
  272. data/spec/fixtures/project/.gitignore +0 -3
  273. data/spec/fixtures/project/.ruby-version +0 -1
  274. data/spec/fixtures/project/Gemfile +0 -4
  275. data/spec/fixtures/project/Gemfile.lock +0 -23
  276. data/spec/fixtures/project/app/controllers/application_controller.rb +0 -2
  277. data/spec/fixtures/project/app/controllers/posts_controller.rb +0 -12
  278. data/spec/fixtures/project/bin/jets +0 -22
  279. data/spec/fixtures/project/config/routes.rb +0 -6
  280. data/spec/fixtures/project/handlers/controllers/posts.js +0 -212
  281. data/spec/lib/cli_spec.rb +0 -20
  282. data/spec/lib/jets/base_controller_spec.rb +0 -18
  283. data/spec/lib/jets/build/handler_generator_spec.rb +0 -20
  284. data/spec/lib/jets/build/lambda_deducer_spec.rb +0 -15
  285. data/spec/lib/jets/build_spec.rb +0 -34
  286. data/spec/lib/jets/cfn/builder_spec.rb +0 -18
  287. data/spec/lib/jets/cfn/namer_spec.rb +0 -16
  288. data/spec/lib/jets/process/controller_processor_spec.rb +0 -22
  289. data/spec/lib/jets/process/infer_spec.rb +0 -24
  290. data/spec/lib/jets/process_spec.rb +0 -18
  291. data/spec/lib/jets/project_spec.rb +0 -14
  292. data/spec/spec_helper.rb +0 -28
@@ -0,0 +1,63 @@
1
+ class Jets::Cfn::TemplateBuilders
2
+ class JobBuilder < BaseChildBuilder
3
+ def compose
4
+ add_common_parameters
5
+ add_functions
6
+ add_scheduled_tasks
7
+ end
8
+
9
+ def add_scheduled_tasks
10
+ # @app_klass is PostsController, HardJob, Hello, or HelloFunction
11
+ @app_klass.tasks.each do |task|
12
+ map = Jets::Cfn::TemplateMappers::EventsRuleMapper.new(task)
13
+
14
+ # If there's no scheduled expression dont add a scheduled Events::Rule
15
+ if task.schedule_expression
16
+ add_event_rule(task, map)
17
+ add_permission(map)
18
+ end
19
+ end
20
+ end
21
+
22
+ def add_event_rule(task, map)
23
+ add_resource(map.logical_id, "AWS::Events::Rule",
24
+ ScheduleExpression: task.schedule_expression,
25
+ State: task.state,
26
+ Targets: [
27
+ {
28
+ Arn: "!GetAtt #{map.lambda_function_logical_id}.Arn",
29
+ Id: map.rule_target_id
30
+ }
31
+ ]
32
+ )
33
+ # Example:
34
+ # add_resource("HardJobDigScheduledEvent", "AWS::Events::Rule",
35
+ # ScheduleExpression: "rate(1 minute)",
36
+ # State: "ENABLED",
37
+ # Targets: [
38
+ # {
39
+ # Arn: "!GetAtt HardJobDigLambdaFunction.Arn",
40
+ # Id: "RuleTargetHardJobDig"
41
+ # }
42
+ # ]
43
+ # )
44
+ end
45
+
46
+ def add_permission(map)
47
+ add_resource(map.permission_logical_id, "AWS::Lambda::Permission",
48
+ FunctionName: "!GetAtt #{map.lambda_function_logical_id}.Arn",
49
+ Action: "lambda:InvokeFunction",
50
+ Principal: "events.amazonaws.com",
51
+ SourceArn: "!GetAtt #{map.logical_id}.Arn"
52
+ )
53
+ # Example:
54
+ # add_resource("HardJobDigEventsRulePermission", "AWS::Lambda::Permission",
55
+ # FunctionName: "!GetAtt HardJobDigLambdaFunction.Arn",
56
+ # Action: "lambda:InvokeFunction",
57
+ # Principal: "events.amazonaws.com",
58
+ # SourceArn: "!GetAtt HardJobDigScheduledEvent.Arn"
59
+ # )
60
+ end
61
+ end
62
+ end
63
+
@@ -0,0 +1,97 @@
1
+ require 'erb'
2
+
3
+ class Jets::Cfn::TemplateBuilders
4
+ class ParentBuilder
5
+ include Interface
6
+ include Jets::AwsServices
7
+
8
+ def initialize(options={})
9
+ @options = options
10
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
11
+ end
12
+
13
+ # compose is an interface method
14
+ def compose
15
+ puts "Building parent template."
16
+
17
+ add_minimal_resources
18
+ add_child_resources unless @options[:stack_type] == :minimal
19
+ end
20
+
21
+ # template_path is an interface method
22
+ def template_path
23
+ Jets::Naming.parent_template_path
24
+ end
25
+
26
+ def add_minimal_resources
27
+ # variables for minimal-stack.yml
28
+ path = File.expand_path("../templates/minimal-stack.yml", __FILE__)
29
+ variables = {
30
+ policy_name: "lambda-#{Jets.config.project_namespace}-policy",
31
+ role_name: "lambda-#{Jets.config.project_namespace}-role",
32
+ }
33
+ rendered_result = Jets::Erb.result(path, variables)
34
+ minimal_template = YAML.load(rendered_result)
35
+
36
+ # minimal_template = YAML.load(IO.read(path))
37
+ @template.deep_merge!(minimal_template)
38
+ end
39
+
40
+ def add_child_resources
41
+ expression = "#{Jets::Naming.template_path_prefix}-*"
42
+ # IE: path: #{Jets.build_root}/templates/demo-dev-2-comments_controller.yml
43
+ Dir.glob(expression).each do |path|
44
+ next unless File.file?(path)
45
+ next if path =~ /api-gateway/ # treated specially
46
+
47
+ # Example of produced code:
48
+ #
49
+ # map = Jets::Cfn::TemplateMappers::ControllerMapper.new(path, s3_bucket)
50
+ # map = Jets::Cfn::TemplateMappers::JobMapper.new(path, s3_bucket)
51
+ # map = Jets::Cfn::TemplateMappers::FunctionMapper.new(path, s3_bucket)
52
+ #
53
+ mapper_class_name = File.basename(path, '.yml').split('_').last
54
+ mapper_class_name = mapper_class_name.classify
55
+ mapper_class = "Jets::Cfn::TemplateMappers::#{mapper_class_name}Mapper".constantize # ControllerMapper or JobMapper
56
+ map = mapper_class.new(path, @options[:s3_bucket])
57
+
58
+ # map.logical_id example: PostsController, HardJob, Hello, HelloFunction
59
+ add_resource(map.logical_id, "AWS::CloudFormation::Stack",
60
+ TemplateURL: map.template_url,
61
+ Parameters: map.parameters,
62
+ )
63
+ end
64
+
65
+ if @options[:stack_type] == :full and !Jets::Router.routes.empty?
66
+ add_api_gateway
67
+ add_api_gateway_deployment
68
+ end
69
+ end
70
+
71
+ # Each shared stacks has different logic.
72
+ # Handle in ugly case statement until we see the common patterns between them.
73
+ # TODO: clean up the add_shared_stack logical after we figure out the common interface pattern
74
+ def add_api_gateway
75
+ path = "#{Jets.config.project_namespace}-api-gateway.yml"
76
+ map = Jets::Cfn::TemplateMappers::ApiGatewayMapper.new(path, @options[:s3_bucket])
77
+
78
+ add_resource(map.logical_id, "AWS::CloudFormation::Stack",
79
+ Properties: { TemplateURL: map.template_url }
80
+ )
81
+
82
+ add_output(map.logical_id, Value: "!Ref #{map.logical_id}")
83
+ end
84
+
85
+ def add_api_gateway_deployment
86
+ path = "#{Jets.config.project_namespace}-api-gateway-deployment.yml"
87
+ map = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.new(path, @options[:s3_bucket])
88
+ add_resource(map.logical_id, "AWS::CloudFormation::Stack",
89
+ Properties: {
90
+ TemplateURL: map.template_url,
91
+ Parameters: map.parameters
92
+ },
93
+ DependsOn: map.depends_on
94
+ )
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,55 @@
1
+ class Jets::Cfn::TemplateBuilders
2
+ class RuleBuilder < BaseChildBuilder
3
+ def compose
4
+ add_common_parameters
5
+ add_functions
6
+ add_config_rules
7
+ end
8
+
9
+ def add_config_rules
10
+ # @app_klass is PostsController, HardRule, Hello, or HelloFunction, or GameRule
11
+ @app_klass.tasks.each do |task|
12
+ map = Jets::Cfn::TemplateMappers::ConfigRuleMapper.new(task)
13
+
14
+ add_config_rule(task, map)
15
+ add_permission(map)
16
+ end
17
+ end
18
+
19
+
20
+ def add_config_rule(task, map)
21
+ # Usually we build the properties with the mappers but in the case for
22
+ # a config_rule it makes more sense to grab properties from the task
23
+ # using config_rule_properties
24
+ add_resource(map.logical_id, "AWS::Config::ConfigRule",
25
+ Properties: task.config_rule_properties,
26
+ DependsOn: map.permission_logical_id
27
+ )
28
+ # Example:
29
+ # add_resource("GameRuleProtectConfigRule", "AWS::Config::ConfigRule",
30
+ # "ConfigRuleName" : String,
31
+ # "Description" : String,
32
+ # "InputParameters" : { ParameterName : Value },
33
+ # "MaximumExecutionFrequency" : String,
34
+ # "Scope" : Scope,
35
+ # "Source" : Source
36
+ # )
37
+ end
38
+
39
+ def add_permission(map)
40
+ add_resource(map.permission_logical_id, "AWS::Lambda::Permission",
41
+ FunctionName: "!GetAtt #{map.lambda_function_logical_id}.Arn",
42
+ Action: "lambda:InvokeFunction",
43
+ Principal: "config.amazonaws.com"
44
+ )
45
+ # Example:
46
+ # add_resource("GameRuleProtectConfigRulePermission", "AWS::Lambda::Permission",
47
+ # FunctionName: "!GetAtt GameRuleProtectLambdaFunction.Arn",
48
+ # Action: "lambda:InvokeFunction",
49
+ # Principal: "config.amazonaws.com",
50
+ # SourceArn: "!GetAtt ScheduledEventHardRuleDig.Arn"
51
+ # )
52
+ end
53
+ end
54
+ end
55
+
@@ -0,0 +1,45 @@
1
+ ---
2
+ Resources:
3
+ S3Bucket:
4
+ Type: AWS::S3::Bucket
5
+ IamRole:
6
+ Type: AWS::IAM::Role
7
+ Properties:
8
+ AssumeRolePolicyDocument:
9
+ Version: '2012-10-17'
10
+ Statement:
11
+ - Effect: Allow
12
+ Principal:
13
+ Service:
14
+ - lambda.amazonaws.com
15
+ Action:
16
+ - sts:AssumeRole
17
+ Policies:
18
+ - PolicyName: <%= @policy_name %>
19
+ PolicyDocument:
20
+ Version: '2012-10-17'
21
+ Statement:
22
+ - Effect: Allow
23
+ Action:
24
+ - logs:*
25
+ Resource: '*'
26
+ # TODO: Make IAM permissions more fine grain for mimimal stack
27
+ # - Fn::Sub: arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/quiz-dev-hello:*:*
28
+ # - Fn::Sub: arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/quiz-dev-quiz:*:*
29
+ # TODO: Allow hook so user can configure IAM themselves and support managed polices
30
+ - Effect: Allow
31
+ Action:
32
+ - dynamodb:*
33
+ Resource: "*"
34
+ # required for PreheatJob which calls the other lambda functions repeatedly
35
+ - Effect: Allow
36
+ Action:
37
+ - lambda:*
38
+ Resource: "*"
39
+ Path: "/"
40
+ RoleName: <%= @role_name %>
41
+ Outputs:
42
+ S3Bucket:
43
+ Value: "!Ref S3Bucket" # not a valid cfn notation, surrounding double quotes is handled by post processing.
44
+ IamRole:
45
+ Value: "!Ref IamRole"
@@ -0,0 +1,23 @@
1
+ require 'active_support/core_ext/hash'
2
+ require 'yaml'
3
+
4
+ class Jets::Cfn
5
+ class TemplateMappers
6
+ # used in the parent_template.rb
7
+ autoload :ChildMapper, "jets/cfn/template_mappers/child_mapper"
8
+ autoload :ControllerMapper, "jets/cfn/template_mappers/controller_mapper"
9
+ autoload :JobMapper, "jets/cfn/template_mappers/job_mapper"
10
+ autoload :FunctionMapper, "jets/cfn/template_mappers/function_mapper"
11
+ autoload :RuleMapper, "jets/cfn/template_mappers/rule_mapper"
12
+
13
+ autoload :ApiGatewayMapper, "jets/cfn/template_mappers/api_gateway_mapper"
14
+ autoload :ApiGatewayDeploymentMapper, "jets/cfn/template_mappers/api_gateway_deployment_mapper"
15
+ # used in the child_template.rb
16
+ autoload :GatewayMethodMapper, "jets/cfn/template_mappers/gateway_method_mapper"
17
+ autoload :GatewayResourceMapper, "jets/cfn/template_mappers/gateway_resource_mapper"
18
+ autoload :LambdaFunctionMapper, "jets/cfn/template_mappers/lambda_function_mapper"
19
+
20
+ autoload :EventsRuleMapper, "jets/cfn/template_mappers/events_rule_mapper"
21
+ autoload :ConfigRuleMapper, "jets/cfn/template_mappers/config_rule_mapper"
22
+ end
23
+ end
@@ -0,0 +1,48 @@
1
+ class Jets::Cfn::TemplateMappers
2
+ class ApiGatewayDeploymentMapper < ChildMapper
3
+ def logical_id
4
+ self.class.logical_id
5
+ end
6
+
7
+ def timestamp
8
+ self.class.timestamp
9
+ end
10
+
11
+ # stage_name: stag, stag-1, stag-2, etc
12
+ def stage_name
13
+ self.class.stage_name
14
+ end
15
+
16
+ def parameters
17
+ {
18
+ RestApi: "!GetAtt ApiGateway.Outputs.RestApi"
19
+ }
20
+ end
21
+
22
+ def depends_on
23
+ expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
24
+ controller_logical_ids = []
25
+ Dir.glob(expression).each do |path|
26
+ next unless File.file?(path)
27
+ # @s3_bucket is available from the inherited ChildMapper class
28
+ map = ChildMapper.new(path, @s3_bucket)
29
+ controller_logical_ids << map.logical_id
30
+ end
31
+ controller_logical_ids
32
+ end
33
+
34
+ # Returns: "ApiGatewayDeployment[timestamp]"
35
+ def self.logical_id
36
+ "ApiGatewayDeployment#{timestamp}"
37
+ end
38
+
39
+ @@timestamp = nil
40
+ def self.timestamp
41
+ @@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
42
+ end
43
+
44
+ def self.stage_name
45
+ [Jets.config.short_env, Jets.config.env_extra].compact.join('_').gsub('-','_') # Stage name only allows a-zA-Z0-9_
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,4 @@
1
+ class Jets::Cfn::TemplateMappers
2
+ class ApiGatewayMapper < ChildMapper
3
+ end
4
+ end
@@ -0,0 +1,41 @@
1
+ class Jets::Cfn::TemplateMappers
2
+ class ChildMapper
3
+ attr_reader :path
4
+ def initialize(path, s3_bucket)
5
+ # "#{Jets.build_root}/templates/demo-dev-posts_controller.yml"
6
+ @path = path
7
+ @s3_bucket = s3_bucket
8
+ end
9
+
10
+ # common parameters to all child stacks
11
+ def parameters
12
+ parameters = {
13
+ # YAML.dump converts it to a string
14
+ # !GetAtt Base.Outputs.IamRole => "!GetAtt Base.Outputs.IamRole"
15
+ # But post processing of the template fixes this
16
+ IamRole: "!GetAtt IamRole.Arn",
17
+ S3Bucket: "!Ref S3Bucket",
18
+ }
19
+ end
20
+
21
+ # Example: PostsController
22
+ def logical_id
23
+ regexp = Regexp.new(".*#{Jets.config.project_namespace}-")
24
+ contoller_name = @path.sub(regexp, '').sub('.yml', '')
25
+ # map the path to a camelized logical_id. Example:
26
+ # /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
27
+ # PostsController
28
+ contoller_name.underscore.camelize
29
+ end
30
+
31
+ def template_url
32
+ # here's where it gets interesting with the bucket. The bucket will
33
+ # need to exist for the child templates. But wont be created until the stack
34
+ # has been first launched. We can create the bucket in a separate stack
35
+ # And then grab it and then store it in a cache file.
36
+ basename = File.basename(@path)
37
+ # IE: https://s3.amazonaws.com/[bucket]/jets/cfn-templates/demo-dev-posts_controller.yml"
38
+ "https://s3.amazonaws.com/#{@s3_bucket}/jets/cfn-templates/#{basename}"
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,34 @@
1
+ # Used in cfn/template_builders/rule_builder.rb to build AWS::Config::ConfigRule
2
+ class Jets::Cfn::TemplateMappers
3
+ class ConfigRuleMapper
4
+ # task is a Jets::Job::Task
5
+ def initialize(task)
6
+ @task = task
7
+ end
8
+
9
+ # Example: "ConfigRuleGameRuleProtect"
10
+ def logical_id
11
+ "#{full_task_name}ConfigRule"
12
+ end
13
+
14
+ # Example: "GameRuleProtectLambdaFunction"
15
+ def lambda_function_logical_id
16
+ "#{full_task_name}LambdaFunction"
17
+ end
18
+
19
+ # Example: GameRuleProtectConfigRulePermission
20
+ def permission_logical_id
21
+ "#{full_task_name}ConfigRulePermission"
22
+ end
23
+
24
+ private
25
+ # Full camelized task name including the class
26
+ # Example: GameRuleProtect
27
+ def full_task_name
28
+ class_name = @task.class_name
29
+ task_name = @task.meth.to_s.camelize
30
+ "#{class_name}#{task_name}"
31
+ end
32
+ end
33
+ end
34
+
@@ -0,0 +1,36 @@
1
+ class Jets::Cfn::TemplateMappers
2
+ class ControllerMapper < ChildMapper
3
+ # Parameters that are common to all controller stacks
4
+ def parameters
5
+ parameters = super
6
+ return parameters if Jets::Router.routes.empty?
7
+
8
+ # Add the API Gateway parameters
9
+ parameters[:RestApi] = "!GetAtt ApiGateway.Outputs.RestApi"
10
+ scoped_routes.each do |route|
11
+ map = GatewayResourceMapper.new(route.path)
12
+ parameters[map.logical_id] = "!GetAtt ApiGateway.Outputs.#{map.logical_id}"
13
+ end
14
+
15
+ parameters
16
+ end
17
+
18
+ def scoped_routes
19
+ @routes ||= Jets::Router.routes.select do |route|
20
+ route.controller_name == current_class
21
+ end
22
+ end
23
+
24
+ # Example:
25
+ # 1. demo-stag-admin-related_pages_controller.yml
26
+ # 2. admin/posts_controller
27
+ # 3. Admin::PostsController
28
+ def current_class
29
+ templates_prefix = "#{Jets::Naming.template_path_prefix}-"
30
+ @path.sub(templates_prefix, '')
31
+ .sub(/\.yml$/,'')
32
+ .gsub('-','/')
33
+ .classify
34
+ end
35
+ end
36
+ end