jets.benforeva 3.0.17.pre.mount.pre.fix

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 (459) hide show
  1. checksums.yaml +7 -0
  2. data/.circleci/config.yml +92 -0
  3. data/.cody/README.md +13 -0
  4. data/.cody/docs/bin/build.sh +7 -0
  5. data/.cody/docs/bin/bundler_setup.sh +8 -0
  6. data/.cody/docs/bin/cli_docs.sh +6 -0
  7. data/.cody/docs/bin/git_commit.sh +27 -0
  8. data/.cody/docs/bin/git_setup.sh +12 -0
  9. data/.cody/docs/bin/subnav.sh +14 -0
  10. data/.cody/docs/buildspec.yml +10 -0
  11. data/.cody/docs/project.rb +10 -0
  12. data/.github/ISSUE_TEMPLATE/bug_report.md +84 -0
  13. data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
  14. data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
  15. data/.github/ISSUE_TEMPLATE/question.md +14 -0
  16. data/.github/ISSUE_TEMPLATE.md +7 -0
  17. data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
  18. data/.gitignore +24 -0
  19. data/.gitmodules +0 -0
  20. data/.python-version +1 -0
  21. data/.rspec +4 -0
  22. data/.ruby-gemset +1 -0
  23. data/.ruby-version +1 -0
  24. data/CHANGELOG.md +1035 -0
  25. data/CONDUCT.md +1 -0
  26. data/CONTRIBUTING.md +1 -0
  27. data/Dockerfile +16 -0
  28. data/Dockerfile.base +53 -0
  29. data/Gemfile +14 -0
  30. data/Guardfile +22 -0
  31. data/LICENSE.txt +22 -0
  32. data/Procfile +2 -0
  33. data/README.md +212 -0
  34. data/Rakefile +24 -0
  35. data/backers.md +20 -0
  36. data/bin/release +9 -0
  37. data/exe/jets.benforeva +14 -0
  38. data/jets.benforeva.gemspec +71 -0
  39. data/lib/jets/application/defaults.rb +200 -0
  40. data/lib/jets/application.rb +240 -0
  41. data/lib/jets/authorizer/base.rb +36 -0
  42. data/lib/jets/authorizer/dsl.rb +69 -0
  43. data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
  44. data/lib/jets/autoloaders.rb +112 -0
  45. data/lib/jets/aws_info.rb +111 -0
  46. data/lib/jets/aws_services/global_memoist.rb +57 -0
  47. data/lib/jets/aws_services/s3_bucket.rb +34 -0
  48. data/lib/jets/aws_services/stack_status.rb +64 -0
  49. data/lib/jets/aws_services.rb +95 -0
  50. data/lib/jets/booter.rb +167 -0
  51. data/lib/jets/builders/code_builder.rb +410 -0
  52. data/lib/jets/builders/code_size.rb +57 -0
  53. data/lib/jets/builders/gem_replacer.rb +89 -0
  54. data/lib/jets/builders/handler_generator.rb +186 -0
  55. data/lib/jets/builders/lambda_layer.rb +68 -0
  56. data/lib/jets/builders/md5.rb +60 -0
  57. data/lib/jets/builders/md5_zip.rb +61 -0
  58. data/lib/jets/builders/purger.rb +35 -0
  59. data/lib/jets/builders/rack_packager.rb +51 -0
  60. data/lib/jets/builders/rackup_wrappers/rackup +19 -0
  61. data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
  62. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
  63. data/lib/jets/builders/reconfigure_rails.rb +114 -0
  64. data/lib/jets/builders/ruby_packager.rb +235 -0
  65. data/lib/jets/builders/shim_vars/app.rb +78 -0
  66. data/lib/jets/builders/shim_vars/base.rb +25 -0
  67. data/lib/jets/builders/shim_vars/shared.rb +37 -0
  68. data/lib/jets/builders/templates/handler.rb +12 -0
  69. data/lib/jets/builders/tidy.rb +107 -0
  70. data/lib/jets/builders/util.rb +31 -0
  71. data/lib/jets/bundle.rb +88 -0
  72. data/lib/jets/camelizer.rb +4 -0
  73. data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
  74. data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
  75. data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
  76. data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
  77. data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
  78. data/lib/jets/cfn/builders/controller_builder.rb +50 -0
  79. data/lib/jets/cfn/builders/function_builder.rb +14 -0
  80. data/lib/jets/cfn/builders/interface.rb +133 -0
  81. data/lib/jets/cfn/builders/job_builder.rb +14 -0
  82. data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
  83. data/lib/jets/cfn/builders/parent_builder.rb +130 -0
  84. data/lib/jets/cfn/builders/rule_builder.rb +24 -0
  85. data/lib/jets/cfn/builders/shared_builder.rb +14 -0
  86. data/lib/jets/cfn/builders/util/source.rb +21 -0
  87. data/lib/jets/cfn/built_template.rb +15 -0
  88. data/lib/jets/cfn/ship.rb +188 -0
  89. data/lib/jets/cfn/status.rb +10 -0
  90. data/lib/jets/cfn/template_source.rb +61 -0
  91. data/lib/jets/cfn/upload.rb +157 -0
  92. data/lib/jets/cli.rb +208 -0
  93. data/lib/jets/commands/base.rb +145 -0
  94. data/lib/jets/commands/build.rb +252 -0
  95. data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
  96. data/lib/jets/commands/call/autoload_guesser.rb +136 -0
  97. data/lib/jets/commands/call/base_guesser.rb +62 -0
  98. data/lib/jets/commands/call/guesser.rb +48 -0
  99. data/lib/jets/commands/call.rb +182 -0
  100. data/lib/jets/commands/clean/base.rb +24 -0
  101. data/lib/jets/commands/clean/build.rb +13 -0
  102. data/lib/jets/commands/clean/log.rb +111 -0
  103. data/lib/jets/commands/clean.rb +19 -0
  104. data/lib/jets/commands/configure.rb +51 -0
  105. data/lib/jets/commands/console.rb +12 -0
  106. data/lib/jets/commands/db/environment-task.rake +3 -0
  107. data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
  108. data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
  109. data/lib/jets/commands/db/tasks.rb +34 -0
  110. data/lib/jets/commands/db.rb +13 -0
  111. data/lib/jets/commands/dbconsole.rb +134 -0
  112. data/lib/jets/commands/delete.rb +136 -0
  113. data/lib/jets/commands/deploy.rb +137 -0
  114. data/lib/jets/commands/dotenv.rb +9 -0
  115. data/lib/jets/commands/dynamodb/migrate.rb +9 -0
  116. data/lib/jets/commands/dynamodb/migrator.rb +36 -0
  117. data/lib/jets/commands/dynamodb.rb +19 -0
  118. data/lib/jets/commands/gems.rb +13 -0
  119. data/lib/jets/commands/help/build.md +6 -0
  120. data/lib/jets/commands/help/call.md +69 -0
  121. data/lib/jets/commands/help/clean/build.md +5 -0
  122. data/lib/jets/commands/help/clean/log.md +5 -0
  123. data/lib/jets/commands/help/console.md +18 -0
  124. data/lib/jets/commands/help/db/generate.md +8 -0
  125. data/lib/jets/commands/help/dbconsole.md +9 -0
  126. data/lib/jets/commands/help/degenerate.md +16 -0
  127. data/lib/jets/commands/help/delete.md +22 -0
  128. data/lib/jets/commands/help/deploy.md +32 -0
  129. data/lib/jets/commands/help/dynamodb/generate.md +52 -0
  130. data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
  131. data/lib/jets/commands/help/gems/check.md +6 -0
  132. data/lib/jets/commands/help/generate.md +28 -0
  133. data/lib/jets/commands/help/import/rack.md +13 -0
  134. data/lib/jets/commands/help/import/rails.md +11 -0
  135. data/lib/jets/commands/help/new.md +42 -0
  136. data/lib/jets/commands/help/routes.md +16 -0
  137. data/lib/jets/commands/help/runner.md +17 -0
  138. data/lib/jets/commands/help/server.md +15 -0
  139. data/lib/jets/commands/help/status.md +14 -0
  140. data/lib/jets/commands/help/upgrade.md +7 -0
  141. data/lib/jets/commands/help/url.md +6 -0
  142. data/lib/jets/commands/help.rb +9 -0
  143. data/lib/jets/commands/import/base.rb +49 -0
  144. data/lib/jets/commands/import/cheatsheet.rb +35 -0
  145. data/lib/jets/commands/import/rack.rb +16 -0
  146. data/lib/jets/commands/import/rails.rb +74 -0
  147. data/lib/jets/commands/import/sequence.rb +90 -0
  148. data/lib/jets/commands/import/templates/config/database.yml +30 -0
  149. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
  150. data/lib/jets/commands/import.rb +12 -0
  151. data/lib/jets/commands/main.rb +166 -0
  152. data/lib/jets/commands/markdown/creator.rb +58 -0
  153. data/lib/jets/commands/markdown/index.rb +27 -0
  154. data/lib/jets/commands/markdown/page.rb +125 -0
  155. data/lib/jets/commands/markdown/shell.rb +11 -0
  156. data/lib/jets/commands/new.rb +173 -0
  157. data/lib/jets/commands/rake_command.rb +61 -0
  158. data/lib/jets/commands/rake_tasks.rb +50 -0
  159. data/lib/jets/commands/runner.rb +16 -0
  160. data/lib/jets/commands/sequence.rb +105 -0
  161. data/lib/jets/commands/stack_info.rb +30 -0
  162. data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
  163. data/lib/jets/commands/templates/skeleton/.env.test +3 -0
  164. data/lib/jets/commands/templates/skeleton/.env.tt +3 -0
  165. data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
  166. data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
  167. data/lib/jets/commands/templates/skeleton/.rspec +3 -0
  168. data/lib/jets/commands/templates/skeleton/Gemfile.tt +39 -0
  169. data/lib/jets/commands/templates/skeleton/Procfile +7 -0
  170. data/lib/jets/commands/templates/skeleton/README.md +11 -0
  171. data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
  172. data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
  173. data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
  174. data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
  175. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
  176. data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
  177. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +26 -0
  178. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
  179. data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
  180. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
  181. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +7 -0
  182. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
  183. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -0
  184. data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
  185. data/lib/jets/commands/templates/skeleton/config.ru +5 -0
  186. data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
  187. data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
  188. data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
  189. data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
  190. data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
  191. data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
  192. data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
  193. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
  194. data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
  195. data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
  196. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +23 -0
  197. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
  198. data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
  199. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
  200. data/lib/jets/commands/upgrade/version1.rb +136 -0
  201. data/lib/jets/commands/upgrade.rb +105 -0
  202. data/lib/jets/commands/url.rb +69 -0
  203. data/lib/jets/commands/webpacker_template.rb +18 -0
  204. data/lib/jets/controller/authorization.rb +91 -0
  205. data/lib/jets/controller/base.rb +175 -0
  206. data/lib/jets/controller/callbacks.rb +73 -0
  207. data/lib/jets/controller/cookies/jar.rb +269 -0
  208. data/lib/jets/controller/cookies.rb +38 -0
  209. data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
  210. data/lib/jets/controller/error.rb +4 -0
  211. data/lib/jets/controller/forgery_protection.rb +43 -0
  212. data/lib/jets/controller/layout.rb +17 -0
  213. data/lib/jets/controller/middleware/cors.rb +60 -0
  214. data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
  215. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
  216. data/lib/jets/controller/middleware/local/route_matcher.rb +22 -0
  217. data/lib/jets/controller/middleware/local.rb +120 -0
  218. data/lib/jets/controller/middleware/main.rb +53 -0
  219. data/lib/jets/controller/middleware/reloader.rb +15 -0
  220. data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
  221. data/lib/jets/controller/parameters_filter.rb +29 -0
  222. data/lib/jets/controller/params.rb +117 -0
  223. data/lib/jets/controller/rack/adapter.rb +94 -0
  224. data/lib/jets/controller/rack/env.rb +122 -0
  225. data/lib/jets/controller/redirection.rb +51 -0
  226. data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
  227. data/lib/jets/controller/rendering.rb +96 -0
  228. data/lib/jets/controller/request.rb +29 -0
  229. data/lib/jets/controller/response.rb +61 -0
  230. data/lib/jets/controller/stage.rb +34 -0
  231. data/lib/jets/controller.rb +3 -0
  232. data/lib/jets/core.rb +157 -0
  233. data/lib/jets/core_ext/bundler.rb +7 -0
  234. data/lib/jets/core_ext/kernel.rb +13 -0
  235. data/lib/jets/db.rb +15 -0
  236. data/lib/jets/dotenv/show.rb +11 -0
  237. data/lib/jets/dotenv/ssm.rb +64 -0
  238. data/lib/jets/dotenv.rb +48 -0
  239. data/lib/jets/erb.rb +51 -0
  240. data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
  241. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
  242. data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
  243. data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -0
  244. data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
  245. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
  246. data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
  247. data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
  248. data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
  249. data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
  250. data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
  251. data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
  252. data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
  253. data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
  254. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
  255. data/lib/jets/generator.rb +112 -0
  256. data/lib/jets/inflections.rb +32 -0
  257. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
  258. data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
  259. data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
  260. data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
  261. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
  262. data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
  263. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -0
  264. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
  265. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
  266. data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +33 -0
  267. data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
  268. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
  269. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  270. data/lib/jets/internal/turbines/jets/mailer.rb +52 -0
  271. data/lib/jets/job/base.rb +49 -0
  272. data/lib/jets/job/dsl/dynamodb_event.rb +67 -0
  273. data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
  274. data/lib/jets/job/dsl/iot_event.rb +24 -0
  275. data/lib/jets/job/dsl/kinesis_event.rb +46 -0
  276. data/lib/jets/job/dsl/log_event.rb +15 -0
  277. data/lib/jets/job/dsl/rule_event.rb +75 -0
  278. data/lib/jets/job/dsl/s3_event.rb +36 -0
  279. data/lib/jets/job/dsl/sns_event.rb +54 -0
  280. data/lib/jets/job/dsl/sqs_event.rb +96 -0
  281. data/lib/jets/job/dsl.rb +40 -0
  282. data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
  283. data/lib/jets/job/helpers/log_event_helper.rb +17 -0
  284. data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
  285. data/lib/jets/klass.rb +109 -0
  286. data/lib/jets/lambda/dsl.rb +404 -0
  287. data/lib/jets/lambda/function.rb +29 -0
  288. data/lib/jets/lambda/function_constructor.rb +55 -0
  289. data/lib/jets/lambda/functions.rb +39 -0
  290. data/lib/jets/lambda/task.rb +111 -0
  291. data/lib/jets/logger.rb +21 -0
  292. data/lib/jets/mega/hash_converter.rb +25 -0
  293. data/lib/jets/mega/request/source.rb +21 -0
  294. data/lib/jets/mega/request.rb +163 -0
  295. data/lib/jets/middleware/configurator.rb +84 -0
  296. data/lib/jets/middleware/default_stack.rb +53 -0
  297. data/lib/jets/middleware/layer.rb +34 -0
  298. data/lib/jets/middleware/stack.rb +77 -0
  299. data/lib/jets/middleware.rb +33 -0
  300. data/lib/jets/naming.rb +63 -0
  301. data/lib/jets/overrides/lambda/marshaller.rb +31 -0
  302. data/lib/jets/overrides/lambda.rb +1 -0
  303. data/lib/jets/overrides/rails/action_controller.rb +13 -0
  304. data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
  305. data/lib/jets/overrides/rails/common_methods.rb +13 -0
  306. data/lib/jets/overrides/rails/migration_checker.rb +34 -0
  307. data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
  308. data/lib/jets/overrides/rails/url_helper.rb +88 -0
  309. data/lib/jets/overrides/rails.rb +6 -0
  310. data/lib/jets/poly_fun/base_executor.rb +125 -0
  311. data/lib/jets/poly_fun/lambda_executor.rb +16 -0
  312. data/lib/jets/poly_fun/node_error.rb +8 -0
  313. data/lib/jets/poly_fun/node_executor.rb +54 -0
  314. data/lib/jets/poly_fun/python_error.rb +8 -0
  315. data/lib/jets/poly_fun/python_executor.rb +23 -0
  316. data/lib/jets/poly_fun.rb +73 -0
  317. data/lib/jets/preheat.rb +117 -0
  318. data/lib/jets/processors/deducer.rb +65 -0
  319. data/lib/jets/processors/main_processor.rb +61 -0
  320. data/lib/jets/rack_server.rb +86 -0
  321. data/lib/jets/rdoc.rb +30 -0
  322. data/lib/jets/resource/api_gateway/authorizer.rb +82 -0
  323. data/lib/jets/resource/api_gateway/base_path/function.rb +49 -0
  324. data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
  325. data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
  326. data/lib/jets/resource/api_gateway/cors.rb +61 -0
  327. data/lib/jets/resource/api_gateway/deployment.rb +80 -0
  328. data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
  329. data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
  330. data/lib/jets/resource/api_gateway/method.rb +102 -0
  331. data/lib/jets/resource/api_gateway/resource.rb +82 -0
  332. data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
  333. data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
  334. data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
  335. data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
  336. data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
  337. data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
  338. data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
  339. data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
  340. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
  341. data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
  342. data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
  343. data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
  344. data/lib/jets/resource/api_gateway/rest_api.rb +64 -0
  345. data/lib/jets/resource/associated.rb +37 -0
  346. data/lib/jets/resource/base.rb +28 -0
  347. data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
  348. data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
  349. data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
  350. data/lib/jets/resource/child_stack/api_resource.rb +54 -0
  351. data/lib/jets/resource/child_stack/app_class.rb +149 -0
  352. data/lib/jets/resource/child_stack/authorizer.rb +40 -0
  353. data/lib/jets/resource/child_stack/base.rb +24 -0
  354. data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
  355. data/lib/jets/resource/child_stack/shared.rb +85 -0
  356. data/lib/jets/resource/config/config_rule.rb +74 -0
  357. data/lib/jets/resource/config/managed_rule.rb +15 -0
  358. data/lib/jets/resource/events/rule.rb +31 -0
  359. data/lib/jets/resource/iam/application_role.rb +27 -0
  360. data/lib/jets/resource/iam/base_role_definition.rb +47 -0
  361. data/lib/jets/resource/iam/class_role.rb +74 -0
  362. data/lib/jets/resource/iam/function_role.rb +54 -0
  363. data/lib/jets/resource/iam/managed_policy.rb +22 -0
  364. data/lib/jets/resource/iam/policy_document.rb +41 -0
  365. data/lib/jets/resource/iot/topic_rule.rb +34 -0
  366. data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
  367. data/lib/jets/resource/lambda/function/environment.rb +62 -0
  368. data/lib/jets/resource/lambda/function.rb +221 -0
  369. data/lib/jets/resource/lambda/gem_layer.rb +17 -0
  370. data/lib/jets/resource/lambda/layer_version.rb +44 -0
  371. data/lib/jets/resource/logs/subscription_filter.rb +31 -0
  372. data/lib/jets/resource/permission.rb +45 -0
  373. data/lib/jets/resource/replacer.rb +85 -0
  374. data/lib/jets/resource/route53/record_set.rb +98 -0
  375. data/lib/jets/resource/s3/bucket.rb +24 -0
  376. data/lib/jets/resource/sns/subscription.rb +29 -0
  377. data/lib/jets/resource/sns/topic.rb +35 -0
  378. data/lib/jets/resource/sns/topic_policy.rb +40 -0
  379. data/lib/jets/resource/sqs/queue.rb +21 -0
  380. data/lib/jets/resource/standardizer.rb +42 -0
  381. data/lib/jets/resource.rb +71 -0
  382. data/lib/jets/router/dsl/mount.rb +13 -0
  383. data/lib/jets/router/dsl.rb +144 -0
  384. data/lib/jets/router/error.rb +4 -0
  385. data/lib/jets/router/finder.rb +47 -0
  386. data/lib/jets/router/helpers/core_helper.rb +27 -0
  387. data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
  388. data/lib/jets/router/helpers.rb +4 -0
  389. data/lib/jets/router/matcher.rb +81 -0
  390. data/lib/jets/router/method_creator/code.rb +99 -0
  391. data/lib/jets/router/method_creator/edit.rb +12 -0
  392. data/lib/jets/router/method_creator/generic.rb +11 -0
  393. data/lib/jets/router/method_creator/index.rb +48 -0
  394. data/lib/jets/router/method_creator/new.rb +12 -0
  395. data/lib/jets/router/method_creator/root.rb +15 -0
  396. data/lib/jets/router/method_creator/show.rb +12 -0
  397. data/lib/jets/router/method_creator.rb +50 -0
  398. data/lib/jets/router/resources/base.rb +7 -0
  399. data/lib/jets/router/resources/filter.rb +15 -0
  400. data/lib/jets/router/resources/options.rb +13 -0
  401. data/lib/jets/router/route/authorizer.rb +57 -0
  402. data/lib/jets/router/route.rb +230 -0
  403. data/lib/jets/router/scope.rb +95 -0
  404. data/lib/jets/router/util.rb +38 -0
  405. data/lib/jets/router.rb +180 -0
  406. data/lib/jets/rule/base.rb +19 -0
  407. data/lib/jets/rule/dsl.rb +109 -0
  408. data/lib/jets/spec_helpers/controllers/params.rb +8 -0
  409. data/lib/jets/spec_helpers/controllers/request.rb +101 -0
  410. data/lib/jets/spec_helpers/controllers/response.rb +10 -0
  411. data/lib/jets/spec_helpers/controllers.rb +47 -0
  412. data/lib/jets/spec_helpers/fixtures.rb +11 -0
  413. data/lib/jets/spec_helpers.rb +21 -0
  414. data/lib/jets/stack/builder.rb +43 -0
  415. data/lib/jets/stack/definition.rb +50 -0
  416. data/lib/jets/stack/depends/item.rb +26 -0
  417. data/lib/jets/stack/depends.rb +34 -0
  418. data/lib/jets/stack/function.rb +69 -0
  419. data/lib/jets/stack/main/dsl/base.rb +63 -0
  420. data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
  421. data/lib/jets/stack/main/dsl/iam.rb +8 -0
  422. data/lib/jets/stack/main/dsl/kinesis.rb +15 -0
  423. data/lib/jets/stack/main/dsl/lambda.rb +83 -0
  424. data/lib/jets/stack/main/dsl/s3.rb +12 -0
  425. data/lib/jets/stack/main/dsl/sns.rb +16 -0
  426. data/lib/jets/stack/main/dsl/sqs.rb +10 -0
  427. data/lib/jets/stack/main/dsl.rb +17 -0
  428. data/lib/jets/stack/main.rb +4 -0
  429. data/lib/jets/stack/output/dsl.rb +19 -0
  430. data/lib/jets/stack/output/lookup.rb +36 -0
  431. data/lib/jets/stack/output.rb +35 -0
  432. data/lib/jets/stack/parameter/dsl.rb +42 -0
  433. data/lib/jets/stack/parameter.rb +37 -0
  434. data/lib/jets/stack/resource/dsl.rb +19 -0
  435. data/lib/jets/stack/resource.rb +31 -0
  436. data/lib/jets/stack/s3_event.rb +87 -0
  437. data/lib/jets/stack.rb +88 -0
  438. data/lib/jets/tmp_loader.rb +53 -0
  439. data/lib/jets/turbine.rb +41 -0
  440. data/lib/jets/turbo/database_yaml.rb +41 -0
  441. data/lib/jets/turbo/project/.gitignore +12 -0
  442. data/lib/jets/turbo/project/.jetskeep +1 -0
  443. data/lib/jets/turbo/project/Gemfile +16 -0
  444. data/lib/jets/turbo/project/Rakefile +2 -0
  445. data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
  446. data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
  447. data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
  448. data/lib/jets/turbo/project/config/application.rb +5 -0
  449. data/lib/jets/turbo/project/config/routes.rb +4 -0
  450. data/lib/jets/turbo/project/config.ru +5 -0
  451. data/lib/jets/turbo/rails.rb +127 -0
  452. data/lib/jets/turbo/templates/config/database.yml +30 -0
  453. data/lib/jets/turbo.rb +56 -0
  454. data/lib/jets/util.rb +40 -0
  455. data/lib/jets/version.rb +3 -0
  456. data/lib/jets.rb +31 -0
  457. data/readme/prerelease.md +6 -0
  458. data/readme/testing.md +60 -0
  459. metadata +1105 -0
@@ -0,0 +1,123 @@
1
+ module Jets::Cfn::Builders
2
+ class ApiGatewayBuilder
3
+ extend Memoist
4
+ include Interface
5
+ include Jets::AwsServices
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
10
+ end
11
+
12
+ # compose is an interface method
13
+ def compose
14
+ add_gateway_routes # "child template": build before add_gateway_rest_api. RestApi logical id and change detection is dependent on it.
15
+ add_gateway_rest_api # changes parent template
16
+ add_custom_domain # changes parent template
17
+ end
18
+
19
+ # template_path is an interface method
20
+ def template_path
21
+ Jets::Naming.api_gateway_template_path
22
+ end
23
+
24
+ # do not bother writing a template if routes are empty
25
+ def write
26
+ super unless Jets::Router.routes.empty?
27
+ end
28
+
29
+ # If the are routes in config/routes.rb add Gateway API in parent stack
30
+ def add_gateway_rest_api
31
+ rest_api = Jets::Resource::ApiGateway::RestApi.new
32
+ add_resource(rest_api)
33
+ add_outputs(rest_api.outputs)
34
+
35
+ deployment = Jets::Resource::ApiGateway::Deployment.new
36
+ outputs = deployment.outputs(true)
37
+ add_output("RestApiUrl", Value: outputs["RestApiUrl"])
38
+ end
39
+
40
+ def add_custom_domain
41
+ return unless Jets.custom_domain?
42
+ add_domain_name
43
+ add_route53_dns if Jets.config.domain.route53
44
+ end
45
+
46
+ def add_domain_name
47
+ add_outputs(create_domain_name)
48
+ end
49
+
50
+ def add_route53_dns
51
+ dns = Jets::Resource::Route53::RecordSet.new
52
+ if !existing_domain_name?(dns.domain_name) or existing_dns_record_on_stack?
53
+ add_resource(dns)
54
+ add_outputs(dns.outputs)
55
+ end
56
+ end
57
+
58
+ def create_domain_name()
59
+ resource = Jets::Resource::ApiGateway::DomainName.new
60
+
61
+ return {
62
+ "DomainName" => resource.domain_name
63
+ } if (existing_domain_name?(resource) and !existing_domain_name_on_stack?)
64
+
65
+ add_resource(resource)
66
+ return resource.outputs
67
+ end
68
+
69
+ def existing_domain_name?(resource)
70
+ apigateway.get_domain_name({
71
+ domain_name: resource.domain_name
72
+ })
73
+ return true
74
+ rescue
75
+ return false
76
+ end
77
+ memoize :existing_domain_name?
78
+
79
+ def existing_domain_name_on_stack?
80
+ cfn.describe_stack_resource({
81
+ stack_name: api_gateway_physical_resource_id,
82
+ logical_resource_id: "DomainName"
83
+ })
84
+ return true
85
+ rescue
86
+ return false
87
+ end
88
+
89
+ def existing_dns_record_on_stack?
90
+ cfn.describe_stack_resource({
91
+ stack_name: api_gateway_physical_resource_id,
92
+ logical_resource_id: "DnsRecord"
93
+ })
94
+ return true
95
+ rescue
96
+ return false
97
+ end
98
+
99
+ def api_gateway_physical_resource_id
100
+ cfn.describe_stack_resource({
101
+ stack_name: Jets::Naming.parent_stack_name,
102
+ logical_resource_id: "ApiGateway"
103
+ })
104
+ .stack_resource_detail
105
+ .physical_resource_id
106
+ rescue
107
+ return nil
108
+ end
109
+ memoize :api_gateway_physical_resource_id
110
+
111
+ # Adds route related Resources and Outputs
112
+ # Delegates to ApiResourcesBuilder
113
+ PAGE_LIMIT = Integer(ENV['JETS_AWS_OUTPUTS_LIMIT'] || 200) # Allow override for testing
114
+ def add_gateway_routes
115
+ # Reject homepage. Otherwise we have 200 - 1 resources on the first page.
116
+ # There's a next call in ApiResources.add_gateway_resources to skip the homepage.
117
+ all_paths = Jets::Router.all_paths.reject { |p| p == '' }
118
+ all_paths.each_slice(PAGE_LIMIT).each_with_index do |paths, i|
119
+ ApiResourcesBuilder.new(@options, paths, i+1).build
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,44 @@
1
+ module Jets::Cfn::Builders
2
+ class ApiResourcesBuilder
3
+ include Interface
4
+ include Jets::AwsServices
5
+
6
+ def initialize(options={}, paths=[], page)
7
+ @options, @paths, @page = options, paths, page
8
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
9
+ end
10
+
11
+ # compose is an interface method
12
+ def compose
13
+ add_rest_api_parameter
14
+ add_gateway_routes
15
+ end
16
+
17
+ # template_path is an interface method
18
+ def template_path
19
+ Jets::Naming.api_resources_template_path(@page)
20
+ end
21
+
22
+ def add_rest_api_parameter
23
+ add_parameter("RestApi", Description: "RestApi")
24
+ end
25
+
26
+ def add_gateway_routes
27
+ @paths.each do |path|
28
+ homepage = path == ''
29
+ next if homepage # handled by RootResourceId output already
30
+
31
+ resource = Jets::Resource::ApiGateway::Resource.new(path)
32
+ add_resource(resource)
33
+ add_outputs(resource.outputs)
34
+
35
+ parent_path = resource.parent_path_parameter
36
+ add_parameter(parent_path) unless part_of_template?(parent_path)
37
+ end
38
+ end
39
+
40
+ def part_of_template?(parent_path)
41
+ @template["Resources"].key?(parent_path)
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,67 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class AuthorizerBuilder < BaseChildBuilder
8
+ include Interface
9
+ include Jets::AwsServices
10
+
11
+ def initialize(path)
12
+ @path = path # IE: app/authorizers/main_authorizer.rb
13
+ @app_class = Jets::Klass.from_path(path)
14
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
15
+ end
16
+
17
+ def compose
18
+ add_common_parameters
19
+ add_api_gateway_parameters
20
+ add_functions
21
+ add_resources
22
+ add_outputs
23
+ # These dont have lambda functions associated with them
24
+ add_cognito_authorizers
25
+ add_cognito_outputs
26
+ end
27
+
28
+ def add_cognito_authorizers
29
+ @app_class.cognito_authorizers.each do |authorizer|
30
+ resource = Jets::Resource.new(authorizer[:definition], authorizer[:replacements])
31
+ add_resource(resource)
32
+ end
33
+ end
34
+
35
+ def add_outputs
36
+ # IE: @app_class = MainAuthorizer
37
+ # The associated resource is the Jets::Resource::ApiGateway::Authorizer definition built during evaluation
38
+ # of the user defined Authorizer class. We'll use it to compute the logical id.
39
+ @app_class.tasks.each do |task|
40
+ authorizer = task.associated_resources.first
41
+ next unless authorizer
42
+
43
+ resource = Jets::Resource.new(authorizer.definition, task.replacements)
44
+ logical_id = resource.logical_id
45
+ add_output(logical_id, value: "!Ref #{logical_id}")
46
+ end
47
+ end
48
+
49
+ def add_cognito_outputs
50
+ @app_class.cognito_authorizers.each do |authorizer|
51
+ resource = Jets::Resource.new(authorizer[:definition], authorizer[:replacements])
52
+ logical_id = resource.logical_id
53
+ add_output(logical_id, value: "!Ref #{logical_id}")
54
+ end
55
+ end
56
+
57
+ def add_api_gateway_parameters
58
+ return if Jets::Router.routes.empty?
59
+
60
+ add_parameter("RestApi", Description: "RestApi")
61
+ end
62
+
63
+ def template_path
64
+ Jets::Naming.authorizer_template_path(@path)
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,69 @@
1
+ # Implements:
2
+ #
3
+ # * template_path
4
+ #
5
+ # FYI
6
+ #
7
+ # * compose implemented by the classes that include this
8
+ module Jets::Cfn::Builders
9
+ class BaseChildBuilder
10
+ include Interface
11
+
12
+ # The app_class is can be a controller, job or anonymous function class.
13
+ # IE: PostsController, HardJob
14
+ def initialize(app_class)
15
+ @app_class = app_class
16
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
17
+ end
18
+
19
+ # template_path is an interface method for Interface module
20
+ def template_path
21
+ Jets::Naming.app_template_path(@app_class)
22
+ end
23
+
24
+ def add_common_parameters
25
+ common_parameters = Jets::Resource::ChildStack::CommonParameters.common_parameters
26
+ common_parameters.each do |k,_|
27
+ add_parameter(k, Description: k.to_s)
28
+ end
29
+
30
+ depends_on_params.each do |output_key, output_value|
31
+ desc = output_value.gsub("!GetAtt ", "") # desc doesnt allow !GetAtt
32
+ add_parameter(output_key, Description: desc)
33
+ end
34
+ end
35
+
36
+ def depends_on_params
37
+ return {} unless @app_class.depends_on
38
+ depends = Jets::Stack::Depends.new(@app_class.depends_on)
39
+ depends.params
40
+ end
41
+
42
+ def add_functions
43
+ add_class_iam_policy
44
+ @app_class.tasks.each do |task|
45
+ add_function(task)
46
+ add_function_iam_policy(task)
47
+ end
48
+ end
49
+
50
+ def add_function(task)
51
+ resource = Jets::Resource::Lambda::Function.new(task)
52
+ add_resource(resource)
53
+ end
54
+
55
+ def add_class_iam_policy
56
+ return unless @app_class.build_class_iam?
57
+
58
+ resource = Jets::Resource::Iam::ClassRole.new(@app_class)
59
+ add_resource(resource)
60
+ end
61
+
62
+ def add_function_iam_policy(task)
63
+ return unless task.build_function_iam?
64
+
65
+ resource = Jets::Resource::Iam::FunctionRole.new(task)
66
+ add_resource(resource)
67
+ end
68
+ end
69
+ end
@@ -0,0 +1,50 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class ControllerBuilder < BaseChildBuilder
8
+ # compose is an interface method for Interface module
9
+ def compose
10
+ add_common_parameters
11
+ add_api_gateway_parameters
12
+ add_functions
13
+ add_routes
14
+ add_resources
15
+ end
16
+
17
+ def add_api_gateway_parameters
18
+ return if Jets::Router.routes.empty?
19
+
20
+ add_parameter("RestApi", Description: "RestApi")
21
+ scoped_routes.each do |route|
22
+ resource = Jets::Resource::ApiGateway::Resource.new(route.path)
23
+ add_parameter(resource.logical_id, description: resource.desc)
24
+ if route.authorizer
25
+ add_parameter(route.authorizer_id, description: route.authorizer_metadata)
26
+ end
27
+ end
28
+
29
+ if @app_class.authorizer
30
+ add_parameter(@app_class.authorizer_id, description: @app_class.authorizer_metadata)
31
+ end
32
+ end
33
+
34
+ def add_routes
35
+ scoped_routes.each_with_index do |route, i|
36
+ method = Jets::Resource::ApiGateway::Method.new(route)
37
+ add_resource(method)
38
+ add_resource(method.permission)
39
+ add_resource(method.cors) if Jets.config.cors
40
+ end
41
+ end
42
+
43
+ # routes scoped to this controller template.
44
+ def scoped_routes
45
+ @routes ||= Jets::Router.routes.select do |route|
46
+ route.controller_name == @app_class.to_s
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,14 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class FunctionBuilder < BaseChildBuilder
8
+ # compose is an interface method for Interface module
9
+ def compose
10
+ add_common_parameters
11
+ add_functions
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,133 @@
1
+ # The class including this module should implement these methods:
2
+ #
3
+ # * compose
4
+ # * template_path
5
+ module Jets::Cfn::Builders
6
+ module Interface
7
+ extend Memoist
8
+
9
+ def build(parent=false)
10
+ # Do not bother building or writing the template unless there are functions defined
11
+ return if @app_class && !@app_class.build?
12
+
13
+ if @options.nil? || @options[:templates] || @options[:stack_type] != :minimal || parent
14
+ compose # must be implemented by subclass
15
+ end
16
+ write
17
+ end
18
+
19
+ def write
20
+ FileUtils.mkdir_p(File.dirname(template_path))
21
+ IO.write(template_path, text)
22
+ end
23
+
24
+ def template
25
+ # need the to_hash or the YAML dump has
26
+ # !ruby/hash:ActiveSupport::HashWithIndifferentAccess
27
+ @template.to_hash
28
+ end
29
+
30
+ def text
31
+ text = YAML.dump(template)
32
+ post_process_template(text)
33
+ end
34
+
35
+ # post process the text so that
36
+ # "!Ref IamRole" => !Ref IamRole
37
+ # We strip the surrounding quotes
38
+ def post_process_template(text)
39
+ results = text.split("\n").map do |line|
40
+ if line.include?(': "!') # IE: IamRole: "!Ref IamRole",
41
+ # IamRole: "!Ref IamRole" => IamRole: !Ref IamRole
42
+ line.sub(/: "(.*)"/, ': \1')
43
+ elsif line.include?('- "!') # IE: - "!GetAtt Foo.Arn"
44
+ # IamRole: - "!GetAtt Foo.Arn" => - !GetAtt Foo.Arn
45
+ line.sub(/- "(.*)"/, '- \1')
46
+ else
47
+ line
48
+ end
49
+ end
50
+ results.join("\n") + "\n"
51
+ end
52
+
53
+ def add_description(desc)
54
+ @template[:Description] = desc
55
+ end
56
+
57
+ def add_parameters(attributes)
58
+ attributes.each do |name,value|
59
+ add_parameter(name.to_s.camelize, Description: value)
60
+ end
61
+ end
62
+
63
+ def add_parameter(name, options={})
64
+ defaults = { Type: "String" }
65
+ options = defaults.merge(options)
66
+ @template[:Parameters] ||= {}
67
+ @template[:Parameters][name.to_s.camelize] = Jets::Camelizer.transform(options)
68
+ end
69
+
70
+ def add_outputs(attributes)
71
+ attributes.each do |name,value|
72
+ add_output(name.to_s.camelize, Value: value)
73
+ end
74
+ end
75
+
76
+ def add_output(name, options={})
77
+ @template[:Outputs] ||= {}
78
+ @template[:Outputs][name.camelize] = Jets::Camelizer.transform(options)
79
+ end
80
+
81
+ def add_resources
82
+ @app_class.tasks.each do |task|
83
+ task.associated_resources.each do |associated|
84
+ resource = Jets::Resource.new(associated.definition, task.replacements)
85
+ add_resource(resource)
86
+ add_resource(resource.permission)
87
+ end
88
+ end
89
+ end
90
+
91
+ def add_resource(resource)
92
+ add_template_resource(resource.logical_id, resource.type, resource.attributes)
93
+ end
94
+
95
+ # The add_resource method can take an options Hash with both with either
96
+ # top level attributes or properties.
97
+ #
98
+ # Example:
99
+ #
100
+ # Top level options:
101
+ #
102
+ # add_template_resource("MyId", "AWS::ApiGateway::RestApi",
103
+ # type: "AWS::ApiGateway::RestApi",
104
+ # properties: {
105
+ # name: "my-api"
106
+ # },
107
+ # depends_on: ["AnotherResource"]
108
+ # )
109
+ #
110
+ # Simple options with properties only:
111
+ #
112
+ # add_template_resource("MyId", "AWS::CloudFormationStack",
113
+ # template_url: "template_url",
114
+ # parameters: {},
115
+ # )
116
+ #
117
+ def add_template_resource(logical_id, type, options)
118
+ options = Jets::Camelizer.transform(options)
119
+
120
+ attributes = if options.include?('Type')
121
+ base = { 'Type' => type }
122
+ base.merge(options) # options are top-level attributes
123
+ else
124
+ {
125
+ 'Type' => type,
126
+ 'Properties' => options # options are properties
127
+ }
128
+ end
129
+
130
+ @template['Resources'][logical_id] = attributes
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,14 @@
1
+ # Implements:
2
+ #
3
+ # compose
4
+ # template_path
5
+ #
6
+ module Jets::Cfn::Builders
7
+ class JobBuilder < BaseChildBuilder
8
+ def compose
9
+ add_common_parameters
10
+ add_functions
11
+ add_resources
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,34 @@
1
+ class Jets::Cfn::Builders::ParentBuilder
2
+ module Stagger
3
+ def add_stagger(resource)
4
+ batch_size = stagger_batch_size # shorter convenience variable
5
+ return if !stagger_enabled || batch_size.nil? || batch_size == 0
6
+
7
+ # initialize all here to keep logic together
8
+ @previous_stacks ||= []
9
+ @added_count ||= 0
10
+
11
+ if @previous_stacks.size >= batch_size
12
+ at_boundary = @added_count % batch_size == 0
13
+ if at_boundary
14
+ @left = @added_count - batch_size
15
+ @right = @left + batch_size - 1
16
+ end
17
+ previous_stack_batch = @previous_stacks[@left..@right]
18
+ resource.add_stagger_depends_on(previous_stack_batch)
19
+ end
20
+
21
+ @added_count += 1
22
+ @previous_stacks << resource
23
+ end
24
+
25
+ def stagger_batch_size
26
+ Jets.config.deploy.stagger.batch_size
27
+ end
28
+
29
+ # for spec-ing
30
+ def stagger_enabled
31
+ Jets.config.deploy.stagger.enabled
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,130 @@
1
+ require 'erb'
2
+
3
+ module Jets::Cfn::Builders
4
+ class ParentBuilder
5
+ include Interface
6
+ include Jets::AwsServices
7
+ include Stagger
8
+
9
+ def initialize(options={})
10
+ @options = options
11
+ @template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
12
+ end
13
+
14
+ # compose is an interface method
15
+ def compose
16
+ build_minimal_resources
17
+ build_child_resources if full?
18
+ end
19
+
20
+ # template_path is an interface method
21
+ def template_path
22
+ Jets::Naming.parent_template_path
23
+ end
24
+
25
+ def build_minimal_resources
26
+ add_description("Jets: #{Jets.version} Code: #{Util::Source.version}")
27
+
28
+ # Initial s3 bucket, used to store code zipfile and templates Jets generates
29
+ resource = Jets::Resource::S3::Bucket.new(logical_id: "s3_bucket",
30
+ bucket_encryption: {
31
+ server_side_encryption_configuration: [
32
+ server_side_encryption_by_default: {
33
+ sse_algorithm: "AES256"
34
+ }]}
35
+ )
36
+ add_resource(resource)
37
+ add_outputs(resource.outputs)
38
+
39
+ return unless full?
40
+ # Add application-wide IAM policy from Jets.config.iam_role
41
+ resource = Jets::Resource::Iam::ApplicationRole.new
42
+ add_resource(resource)
43
+ add_outputs(resource.outputs)
44
+
45
+ return if Jets.poly_only?
46
+ resource = Jets::Resource::Lambda::GemLayer.new
47
+ add_resource(resource)
48
+ add_outputs(resource.outputs)
49
+ end
50
+
51
+ def build_child_resources
52
+ for_each_path(:app) do |path|
53
+ add_app_class_stack(path)
54
+ end
55
+ for_each_path(:shared) do |path|
56
+ add_shared_resources(path)
57
+ end
58
+
59
+ if full? and !Jets::Router.routes.empty?
60
+ for_each_path(:authorizers) do |path|
61
+ add_authorizer_resources(path)
62
+ end
63
+ add_api_gateway
64
+ add_api_resources
65
+ add_api_deployment
66
+ end
67
+ end
68
+
69
+ # Example paths:
70
+ # #{Jets.build_root}/templates/demo-dev-2-shared-resources.yml
71
+ # #{Jets.build_root}/templates/demo-dev-2-app-comments_controller.yml
72
+ # #{Jets.build_root}/templates/demo-dev-2-authorizers-main_authorizer.yml
73
+ def for_each_path(type)
74
+ expression = "#{Jets::Naming.template_path_prefix}-#{type}-*"
75
+ Dir.glob(expression).each do |path|
76
+ next unless File.file?(path)
77
+ yield(path)
78
+ end
79
+ end
80
+
81
+ def full?
82
+ @options[:templates] || @options[:stack_type] == :full
83
+ end
84
+
85
+ def add_app_class_stack(path)
86
+ resource = Jets::Resource::ChildStack::AppClass.new(@options[:s3_bucket], path: path)
87
+ add_stagger(resource)
88
+ add_child_resources(resource)
89
+ end
90
+
91
+ def add_authorizer_resources(path)
92
+ resource = Jets::Resource::ChildStack::Authorizer.new(@options[:s3_bucket], path: path)
93
+ add_child_resources(resource)
94
+ end
95
+
96
+ def add_shared_resources(path)
97
+ resource = Jets::Resource::ChildStack::Shared.new(@options[:s3_bucket], path: path)
98
+ add_child_resources(resource) if resource.resources?
99
+ end
100
+
101
+ def add_api_gateway
102
+ resource = Jets::Resource::ChildStack::ApiGateway.new(@options[:s3_bucket])
103
+ add_child_resources(resource)
104
+ end
105
+
106
+ def add_api_resources
107
+ expression = "#{Jets::Naming.template_path_prefix}-api-resources-*"
108
+ # IE: path: #{Jets.build_root}/templates/demo-dev-2-api-resources-1.yml"
109
+ Dir.glob(expression).sort.each do |path|
110
+ next unless File.file?(path)
111
+
112
+ regexp = Regexp.new("#{Jets.config.project_namespace}-api-resources-(\\d+).yml") # tricky to escape \d pattern
113
+ md = path.match(regexp)
114
+ page = md[1]
115
+ resource = Jets::Resource::ChildStack::ApiResource.new(@options[:s3_bucket], page: page)
116
+ add_child_resources(resource)
117
+ end
118
+ end
119
+
120
+ def add_api_deployment
121
+ resource = Jets::Resource::ChildStack::ApiDeployment.new(@options[:s3_bucket])
122
+ add_child_resources(resource)
123
+ end
124
+
125
+ def add_child_resources(resource)
126
+ add_resource(resource)
127
+ add_outputs(resource.outputs)
128
+ end
129
+ end
130
+ end