ufo 5.0.7 → 6.0.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 (457) hide show
  1. checksums.yaml +4 -4
  2. data/.cody/README.md +19 -0
  3. data/.cody/acceptance/bin/build.sh +90 -0
  4. data/.cody/acceptance/buildspec.yml +10 -0
  5. data/.cody/acceptance/project.rb +11 -0
  6. data/.cody/acceptance/role.rb +28 -0
  7. data/.cody/shared/script/install/ufo.sh +40 -0
  8. data/.cody/shared/script/install.sh +5 -0
  9. data/.github/workflows/main.yml +28 -0
  10. data/CHANGELOG.md +4 -1
  11. data/Gemfile +0 -2
  12. data/README.md +1 -32
  13. data/lib/templates/docker/Dockerfile +4 -0
  14. data/lib/templates/helper/%underscore_name%_helper.rb.tt +6 -0
  15. data/lib/templates/init/.ufo/config/web/base.rb +6 -0
  16. data/lib/templates/init/.ufo/config/web/dev.rb +6 -0
  17. data/lib/templates/init/.ufo/config/web/prod.rb +6 -0
  18. data/lib/templates/init/.ufo/config.rb.tt +39 -0
  19. data/lib/templates/init/.ufo/resources/iam_roles/execution_role.rb +23 -0
  20. data/lib/templates/init/.ufo/resources/iam_roles/task_role.rb +20 -0
  21. data/lib/templates/init/.ufo/resources/task_definitions/web.yml +29 -0
  22. data/lib/templates/init/.ufo/vars/base.rb +20 -0
  23. data/lib/templates/init/.ufo/vars/dev.rb +4 -0
  24. data/lib/templates/init/.ufo/vars/prod.rb +4 -0
  25. data/lib/ufo/aws_services.rb +118 -0
  26. data/lib/ufo/booter.rb +27 -0
  27. data/lib/ufo/cfn/base.rb +7 -0
  28. data/lib/ufo/cfn/deploy.rb +54 -0
  29. data/lib/ufo/{stack → cfn/stack}/builder/base.rb +12 -23
  30. data/lib/ufo/cfn/stack/builder/conditions.rb +25 -0
  31. data/lib/ufo/{stack → cfn/stack}/builder/outputs.rb +2 -2
  32. data/lib/ufo/cfn/stack/builder/parameters.rb +34 -0
  33. data/lib/ufo/cfn/stack/builder/resources/base.rb +4 -0
  34. data/lib/ufo/cfn/stack/builder/resources/dns.rb +47 -0
  35. data/lib/ufo/{stack/builder/resources/ecs.rb → cfn/stack/builder/resources/ecs_service.rb} +11 -10
  36. data/lib/ufo/cfn/stack/builder/resources/elb.rb +35 -0
  37. data/lib/ufo/cfn/stack/builder/resources/iam_roles/base.rb +32 -0
  38. data/lib/ufo/cfn/stack/builder/resources/iam_roles/execution_role.rb +4 -0
  39. data/lib/ufo/cfn/stack/builder/resources/iam_roles/task_role.rb +4 -0
  40. data/lib/ufo/cfn/stack/builder/resources/listener.rb +65 -0
  41. data/lib/ufo/cfn/stack/builder/resources/listener_ssl.rb +44 -0
  42. data/lib/ufo/cfn/stack/builder/resources/scaling/base.rb +5 -0
  43. data/lib/ufo/cfn/stack/builder/resources/scaling/policy.rb +27 -0
  44. data/lib/ufo/cfn/stack/builder/resources/scaling/role.rb +33 -0
  45. data/lib/ufo/cfn/stack/builder/resources/scaling/target.rb +22 -0
  46. data/lib/ufo/cfn/stack/builder/resources/security_group/base.rb +4 -0
  47. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs.rb +4 -4
  48. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs_rule.rb +2 -2
  49. data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/elb.rb +5 -6
  50. data/lib/ufo/{stack → cfn/stack}/builder/resources/target_group.rb +4 -4
  51. data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition/reconstructor.rb +4 -4
  52. data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition.rb +4 -4
  53. data/lib/ufo/cfn/stack/builder/resources.rb +24 -0
  54. data/lib/ufo/cfn/stack/builder.rb +30 -0
  55. data/lib/ufo/{stack → cfn/stack}/custom_properties.rb +21 -5
  56. data/lib/ufo/cfn/stack/params.rb +51 -0
  57. data/lib/ufo/{stack → cfn/stack}/status.rb +2 -2
  58. data/lib/ufo/cfn/stack/template.rb +8 -0
  59. data/lib/ufo/cfn/stack/vars.rb +110 -0
  60. data/lib/ufo/cfn/stack/vpc.rb +31 -0
  61. data/lib/ufo/cfn/stack.rb +175 -0
  62. data/lib/ufo/cli/base.rb +18 -0
  63. data/lib/ufo/cli/build.rb +30 -0
  64. data/lib/ufo/cli/cancel.rb +18 -0
  65. data/lib/ufo/cli/central/update.rb +80 -0
  66. data/lib/ufo/cli/central.rb +12 -0
  67. data/lib/ufo/cli/clean.rb +17 -0
  68. data/lib/ufo/cli/destroy.rb +31 -0
  69. data/lib/ufo/{docker.rb → cli/docker.rb} +18 -18
  70. data/lib/ufo/cli/exec.rb +82 -0
  71. data/lib/ufo/cli/help/central/update.md +20 -0
  72. data/lib/ufo/{help → cli/help}/completion.md +0 -0
  73. data/lib/ufo/{help → cli/help}/completion_script.md +0 -0
  74. data/lib/ufo/cli/help/destroy.md +9 -0
  75. data/lib/ufo/cli/help/docker/base.md +39 -0
  76. data/lib/ufo/{help → cli/help}/docker/build.md +9 -9
  77. data/lib/ufo/{help → cli/help}/docker/clean.md +8 -8
  78. data/lib/ufo/{help → cli/help}/docker/compile.md +0 -0
  79. data/lib/ufo/cli/help/docker/name.md +16 -0
  80. data/lib/ufo/{help → cli/help}/docker/push.md +0 -0
  81. data/lib/ufo/cli/help/docker.md +6 -0
  82. data/lib/ufo/{help → cli/help}/help.md +1 -1
  83. data/lib/ufo/cli/help/init.md +27 -0
  84. data/lib/ufo/{help → cli/help}/logs.md +5 -4
  85. data/lib/ufo/cli/help/ps.md +12 -0
  86. data/lib/ufo/cli/help/releases.md +15 -0
  87. data/lib/ufo/cli/help/rollback.md +40 -0
  88. data/lib/ufo/cli/help/scale.md +7 -0
  89. data/lib/ufo/cli/help/ship.md +41 -0
  90. data/lib/ufo/cli/help/stop.md +3 -0
  91. data/lib/ufo/cli/help.rb +62 -0
  92. data/lib/ufo/{logs.rb → cli/logs.rb} +13 -6
  93. data/lib/ufo/cli/new/concerns.rb +16 -0
  94. data/lib/ufo/cli/new/helper.rb +24 -0
  95. data/lib/ufo/cli/new/init.rb +68 -0
  96. data/lib/ufo/{sequence.rb → cli/new/sequence.rb} +26 -4
  97. data/lib/ufo/cli/new.rb +10 -0
  98. data/lib/ufo/cli/opts.rb +35 -0
  99. data/lib/ufo/{ps → cli/ps}/task.rb +22 -29
  100. data/lib/ufo/cli/ps.rb +190 -0
  101. data/lib/ufo/{releases.rb → cli/releases.rb} +4 -4
  102. data/lib/ufo/{rollback.rb → cli/rollback.rb} +24 -12
  103. data/lib/ufo/cli/scale.rb +76 -0
  104. data/lib/ufo/cli/ship.rb +28 -0
  105. data/lib/ufo/cli/status.rb +8 -0
  106. data/lib/ufo/cli/stop.rb +49 -0
  107. data/lib/ufo/{tasks.rb → cli/tasks.rb} +2 -2
  108. data/lib/ufo/{upgrade.rb → cli/upgrade.rb} +2 -2
  109. data/lib/ufo/cli.rb +82 -172
  110. data/lib/ufo/command.rb +56 -1
  111. data/lib/ufo/concerns/autoscaling.rb +11 -0
  112. data/lib/ufo/concerns/names.rb +9 -0
  113. data/lib/ufo/concerns.rb +26 -0
  114. data/lib/ufo/config/inits.rb +13 -0
  115. data/lib/ufo/config.rb +187 -0
  116. data/lib/ufo/core.rb +32 -44
  117. data/lib/ufo/docker/builder.rb +44 -40
  118. data/lib/ufo/docker/cleaner.rb +9 -12
  119. data/lib/ufo/docker/compiler.rb +10 -4
  120. data/lib/ufo/docker/concerns.rb +7 -0
  121. data/lib/ufo/docker/dockerfile.rb +13 -9
  122. data/lib/ufo/docker/pusher.rb +13 -25
  123. data/lib/ufo/docker/state.rb +63 -0
  124. data/lib/ufo/ecr/auth.rb +8 -7
  125. data/lib/ufo/ecr/cleaner.rb +10 -14
  126. data/lib/ufo/ext/core/module.rb +31 -0
  127. data/lib/ufo/ext/core/nil_class.rb +11 -0
  128. data/lib/ufo/ext.rb +2 -0
  129. data/lib/ufo/{role → iam_role}/builder.rb +1 -1
  130. data/lib/ufo/{role → iam_role}/dsl.rb +8 -2
  131. data/lib/ufo/{role → iam_role}/registry.rb +1 -1
  132. data/lib/ufo/info.rb +22 -4
  133. data/lib/ufo/layering/layer.rb +95 -0
  134. data/lib/ufo/layering.rb +23 -0
  135. data/lib/ufo/log_group.rb +18 -10
  136. data/lib/ufo/logger/formatter.rb +13 -0
  137. data/lib/ufo/logger.rb +32 -0
  138. data/lib/ufo/names.rb +69 -0
  139. data/lib/ufo/param.rb +2 -1
  140. data/lib/ufo/task_definition/builder.rb +7 -0
  141. data/lib/ufo/task_definition/context.rb +45 -0
  142. data/lib/ufo/task_definition/erb/base.rb +18 -0
  143. data/lib/ufo/task_definition/erb/json.rb +28 -0
  144. data/lib/ufo/task_definition/erb/yaml.rb +18 -0
  145. data/lib/ufo/task_definition/erb.rb +78 -0
  146. data/lib/ufo/task_definition/helpers/aws_data_helper.rb +18 -0
  147. data/lib/ufo/task_definition/helpers/core.rb +50 -0
  148. data/lib/ufo/task_definition/helpers/ssm/fetcher.rb +39 -0
  149. data/lib/ufo/task_definition/helpers/ssm.rb +8 -0
  150. data/lib/ufo/task_definition/helpers/stack_output.rb +23 -0
  151. data/lib/ufo/{dsl/helper → task_definition/helpers}/vars.rb +40 -19
  152. data/lib/ufo/task_definition/helpers/vpc.rb +48 -0
  153. data/lib/ufo/task_definition/helpers.rb +5 -0
  154. data/lib/ufo/task_definition.rb +19 -0
  155. data/lib/ufo/upgrade/upgrade3.rb +1 -1
  156. data/lib/ufo/upgrade/upgrade4.rb +3 -3
  157. data/lib/ufo/utils/execute.rb +30 -0
  158. data/lib/ufo/utils/logging.rb +7 -0
  159. data/lib/ufo/utils/pretty.rb +18 -0
  160. data/lib/ufo/utils/squeezer.rb +1 -1
  161. data/lib/ufo/utils/sure.rb +23 -0
  162. data/lib/ufo/version.rb +1 -1
  163. data/lib/ufo/yaml/loader.rb +48 -0
  164. data/lib/ufo/yaml/validator.rb +51 -0
  165. data/lib/ufo/yaml.rb +13 -0
  166. data/lib/ufo.rb +12 -2
  167. data/spec/spec_helper.rb +4 -26
  168. data/spec/{lib → ufo}/ecr_auth_spec.rb +0 -0
  169. data/spec/{lib → ufo}/ecr_cleaner_spec.rb +0 -2
  170. data/spec/{lib/role → ufo/iam_role}/builder_spec.rb +5 -5
  171. data/spec/{lib/role → ufo/iam_role}/dsl_spec.rb +3 -3
  172. data/spec/{lib → ufo}/logs_spec.rb +2 -2
  173. data/ufo.gemspec +9 -3
  174. metadata +244 -341
  175. data/.circleci/bin/commit_docs.sh +0 -26
  176. data/.circleci/config.yml +0 -78
  177. data/.gitmodules +0 -0
  178. data/docs/.gitignore +0 -5
  179. data/docs/CNAME +0 -1
  180. data/docs/Gemfile +0 -4
  181. data/docs/LICENSE +0 -21
  182. data/docs/README.md +0 -20
  183. data/docs/_config.yml +0 -75
  184. data/docs/_docs/aws-ecs-task-execution-role.md +0 -28
  185. data/docs/_docs/conventions.md +0 -47
  186. data/docs/_docs/extras/codebuild-iam-role.md +0 -46
  187. data/docs/_docs/extras/dockerfile-erb.md +0 -60
  188. data/docs/_docs/extras/ecs-network-mode.md +0 -37
  189. data/docs/_docs/extras/load-balancer.md +0 -83
  190. data/docs/_docs/extras/minimal-deploy-iam.md +0 -79
  191. data/docs/_docs/extras/notification-arns.md +0 -21
  192. data/docs/_docs/extras/redirection-support.md +0 -27
  193. data/docs/_docs/extras/route53-support.md +0 -27
  194. data/docs/_docs/extras/security-groups.md +0 -36
  195. data/docs/_docs/extras/ssl-support.md +0 -20
  196. data/docs/_docs/faq.md +0 -100
  197. data/docs/_docs/fargate.md +0 -5
  198. data/docs/_docs/helpers.md +0 -24
  199. data/docs/_docs/iam-roles.md +0 -112
  200. data/docs/_docs/install.md +0 -25
  201. data/docs/_docs/more/auto-completion.md +0 -24
  202. data/docs/_docs/more/automated-cleanup.md +0 -14
  203. data/docs/_docs/more/customize-cloudformation.md +0 -35
  204. data/docs/_docs/more/migrations.md +0 -25
  205. data/docs/_docs/more/run-in-pieces.md +0 -30
  206. data/docs/_docs/more/single-task.md +0 -25
  207. data/docs/_docs/more/stuck-cloudformation.md +0 -29
  208. data/docs/_docs/more/why-cloudformation.md +0 -21
  209. data/docs/_docs/next-steps.md +0 -16
  210. data/docs/_docs/quick-start-ec2.md +0 -86
  211. data/docs/_docs/secrets.md +0 -135
  212. data/docs/_docs/settings/aws_profile.md +0 -36
  213. data/docs/_docs/settings/cfn.md +0 -12
  214. data/docs/_docs/settings/cluster.md +0 -66
  215. data/docs/_docs/settings/manage-security-groups.md +0 -24
  216. data/docs/_docs/settings/network.md +0 -45
  217. data/docs/_docs/settings.md +0 -55
  218. data/docs/_docs/ssl_errors.md +0 -40
  219. data/docs/_docs/structure.md +0 -41
  220. data/docs/_docs/tutorial-ufo-docker-build.md +0 -61
  221. data/docs/_docs/tutorial-ufo-init.md +0 -86
  222. data/docs/_docs/tutorial-ufo-ship.md +0 -95
  223. data/docs/_docs/tutorial-ufo-ships.md +0 -38
  224. data/docs/_docs/tutorial-ufo-tasks-build.md +0 -177
  225. data/docs/_docs/tutorial.md +0 -14
  226. data/docs/_docs/ufo-current.md +0 -49
  227. data/docs/_docs/ufo-env-extra.md +0 -22
  228. data/docs/_docs/ufo-env.md +0 -46
  229. data/docs/_docs/ufo-logs.md +0 -49
  230. data/docs/_docs/ufo-task-params.md +0 -43
  231. data/docs/_docs/ufo-tasks-register.md +0 -21
  232. data/docs/_docs/upgrading/upgrade4.5.md +0 -52
  233. data/docs/_docs/upgrading/upgrade4.md +0 -48
  234. data/docs/_docs/upgrading/upgrade5.md +0 -19
  235. data/docs/_docs/upgrading.md +0 -13
  236. data/docs/_docs/variables.md +0 -55
  237. data/docs/_includes/about.html +0 -19
  238. data/docs/_includes/banner/foot.html +0 -2
  239. data/docs/_includes/banner/head.html +0 -5
  240. data/docs/_includes/cfn-customize.md +0 -53
  241. data/docs/_includes/commands.html +0 -80
  242. data/docs/_includes/contact.html +0 -17
  243. data/docs/_includes/contact_disqus.html +0 -16
  244. data/docs/_includes/contact_static.html +0 -17
  245. data/docs/_includes/content.html +0 -26
  246. data/docs/_includes/css/bootstrap.min.css +0 -7
  247. data/docs/_includes/css/main.css +0 -501
  248. data/docs/_includes/css/quotes.css +0 -102
  249. data/docs/_includes/css/syntax.css +0 -65
  250. data/docs/_includes/css/table.css +0 -53
  251. data/docs/_includes/css/timeline.css +0 -201
  252. data/docs/_includes/css/ufo.css +0 -218
  253. data/docs/_includes/edit-on-github.html +0 -11
  254. data/docs/_includes/example.html +0 -63
  255. data/docs/_includes/footer.html +0 -44
  256. data/docs/_includes/google_analytics.html +0 -10
  257. data/docs/_includes/head.html +0 -32
  258. data/docs/_includes/header.html +0 -15
  259. data/docs/_includes/js.html +0 -32
  260. data/docs/_includes/js_disqus.html +0 -21
  261. data/docs/_includes/modals.html +0 -40
  262. data/docs/_includes/nav.html +0 -27
  263. data/docs/_includes/prev_next.md +0 -19
  264. data/docs/_includes/quotes.html +0 -19
  265. data/docs/_includes/reference.md +0 -5
  266. data/docs/_includes/repo_push_access.md +0 -11
  267. data/docs/_includes/subnav.html +0 -78
  268. data/docs/_includes/summary.html +0 -22
  269. data/docs/_includes/ufo-ship-options.md +0 -12
  270. data/docs/_includes/uses.html +0 -19
  271. data/docs/_layouts/default.html +0 -13
  272. data/docs/_layouts/style.css +0 -6
  273. data/docs/_reference/ufo-apps.md +0 -37
  274. data/docs/_reference/ufo-cancel.md +0 -24
  275. data/docs/_reference/ufo-completion.md +0 -46
  276. data/docs/_reference/ufo-completion_script.md +0 -27
  277. data/docs/_reference/ufo-current.md +0 -93
  278. data/docs/_reference/ufo-deploy.md +0 -76
  279. data/docs/_reference/ufo-destroy.md +0 -36
  280. data/docs/_reference/ufo-docker-base.md +0 -71
  281. data/docs/_reference/ufo-docker-build.md +0 -91
  282. data/docs/_reference/ufo-docker-clean.md +0 -44
  283. data/docs/_reference/ufo-docker-compile.md +0 -19
  284. data/docs/_reference/ufo-docker-help.md +0 -15
  285. data/docs/_reference/ufo-docker-name.md +0 -37
  286. data/docs/_reference/ufo-docker-push.md +0 -49
  287. data/docs/_reference/ufo-docker.md +0 -38
  288. data/docs/_reference/ufo-init.md +0 -125
  289. data/docs/_reference/ufo-logs.md +0 -40
  290. data/docs/_reference/ufo-network-help.md +0 -15
  291. data/docs/_reference/ufo-network-init.md +0 -39
  292. data/docs/_reference/ufo-network.md +0 -26
  293. data/docs/_reference/ufo-ps.md +0 -56
  294. data/docs/_reference/ufo-releases.md +0 -40
  295. data/docs/_reference/ufo-resources.md +0 -44
  296. data/docs/_reference/ufo-rollback.md +0 -61
  297. data/docs/_reference/ufo-scale.md +0 -50
  298. data/docs/_reference/ufo-ship.md +0 -129
  299. data/docs/_reference/ufo-ships.md +0 -68
  300. data/docs/_reference/ufo-status.md +0 -23
  301. data/docs/_reference/ufo-stop.md +0 -31
  302. data/docs/_reference/ufo-task.md +0 -56
  303. data/docs/_reference/ufo-tasks-build.md +0 -178
  304. data/docs/_reference/ufo-tasks-help.md +0 -15
  305. data/docs/_reference/ufo-tasks-register.md +0 -29
  306. data/docs/_reference/ufo-tasks.md +0 -35
  307. data/docs/_reference/ufo-upgrade-help.md +0 -15
  308. data/docs/_reference/ufo-upgrade-v2to3.md +0 -15
  309. data/docs/_reference/ufo-upgrade-v33to34.md +0 -15
  310. data/docs/_reference/ufo-upgrade-v3to4.md +0 -27
  311. data/docs/_reference/ufo-upgrade-v43to45.md +0 -15
  312. data/docs/_reference/ufo-upgrade.md +0 -29
  313. data/docs/_reference/ufo-version.md +0 -23
  314. data/docs/articles.md +0 -14
  315. data/docs/bin/web +0 -4
  316. data/docs/css/font-awesome/css/font-awesome.css +0 -1566
  317. data/docs/css/font-awesome/css/font-awesome.min.css +0 -4
  318. data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
  319. data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
  320. data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +0 -504
  321. data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
  322. data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
  323. data/docs/docs.md +0 -29
  324. data/docs/img/docs/cloudformation-resources.png +0 -0
  325. data/docs/img/logos/boltops-logo-full.png +0 -0
  326. data/docs/img/logos/boltops-logo.png +0 -0
  327. data/docs/img/logos/ufo-logo-2.png +0 -0
  328. data/docs/img/logos/ufo-logo.png +0 -0
  329. data/docs/img/logos/ufo-site-header.png +0 -0
  330. data/docs/img/logos/ufo.jpg +0 -0
  331. data/docs/img/tutorials/ecs-console-task-definitions.png +0 -0
  332. data/docs/img/tutorials/ecs-console-ufo-ship.png +0 -0
  333. data/docs/img/tutorials/ecs-console-ufo-ships.png +0 -0
  334. data/docs/index.html +0 -10
  335. data/docs/js/bootstrap.js +0 -2114
  336. data/docs/js/bootstrap.min.js +0 -6
  337. data/docs/js/cbpAnimatedHeader.js +0 -44
  338. data/docs/js/cbpAnimatedHeader.min.js +0 -11
  339. data/docs/js/classie.js +0 -80
  340. data/docs/js/contact_me.js +0 -70
  341. data/docs/js/contact_me_static.js +0 -23
  342. data/docs/js/freelancer.js +0 -37
  343. data/docs/js/jqBootstrapValidation.js +0 -912
  344. data/docs/js/jquery-1.11.0.js +0 -4
  345. data/docs/js/jquery.easing.min.js +0 -44
  346. data/docs/js/nav.js +0 -53
  347. data/docs/quick-start.md +0 -133
  348. data/docs/reference.md +0 -29
  349. data/docs/style.css +0 -3
  350. data/docs/utils/ssl-doctor.rb +0 -89
  351. data/docs/utils/test-aws-api-access.rb +0 -11
  352. data/docs/utils/update-cert-chains.sh +0 -11
  353. data/lib/template/.env +0 -3
  354. data/lib/template/.secrets +0 -5
  355. data/lib/template/.ufo/iam_roles/execution_role.rb +0 -7
  356. data/lib/template/.ufo/iam_roles/task_role.rb +0 -21
  357. data/lib/template/.ufo/params.yml.tt +0 -27
  358. data/lib/template/.ufo/settings/cfn/default.yml.tt +0 -72
  359. data/lib/template/.ufo/settings/network/default.yml.tt +0 -26
  360. data/lib/template/.ufo/settings.yml.tt +0 -26
  361. data/lib/template/.ufo/task_definitions.rb.tt +0 -61
  362. data/lib/template/.ufo/templates/fargate.json.erb +0 -39
  363. data/lib/template/.ufo/templates/main.json.erb +0 -43
  364. data/lib/template/.ufo/variables/base.rb.tt +0 -19
  365. data/lib/template/.ufo/variables/development.rb +0 -8
  366. data/lib/template/.ufo/variables/production.rb +0 -7
  367. data/lib/template/Dockerfile +0 -15
  368. data/lib/template/bin/deploy.tt +0 -7
  369. data/lib/ufo/apps/cfn_map.rb +0 -70
  370. data/lib/ufo/apps/cluster.rb +0 -24
  371. data/lib/ufo/apps/service.rb +0 -56
  372. data/lib/ufo/apps.rb +0 -56
  373. data/lib/ufo/aws_service.rb +0 -36
  374. data/lib/ufo/base.rb +0 -35
  375. data/lib/ufo/cancel.rb +0 -23
  376. data/lib/ufo/current.rb +0 -104
  377. data/lib/ufo/default/settings.yml +0 -24
  378. data/lib/ufo/default/templates/main.json.erb +0 -39
  379. data/lib/ufo/destroy.rb +0 -41
  380. data/lib/ufo/docker/variables.rb +0 -26
  381. data/lib/ufo/dsl/helper.rb +0 -79
  382. data/lib/ufo/dsl/outputter.rb +0 -43
  383. data/lib/ufo/dsl/task_definition.rb +0 -108
  384. data/lib/ufo/dsl.rb +0 -96
  385. data/lib/ufo/help/apps.md +0 -12
  386. data/lib/ufo/help/balancer.md +0 -3
  387. data/lib/ufo/help/completions.md +0 -16
  388. data/lib/ufo/help/completions_script.md +0 -1
  389. data/lib/ufo/help/current.md +0 -65
  390. data/lib/ufo/help/deploy.md +0 -38
  391. data/lib/ufo/help/destroy.md +0 -9
  392. data/lib/ufo/help/docker/base.md +0 -49
  393. data/lib/ufo/help/docker/name.md +0 -16
  394. data/lib/ufo/help/docker.md +0 -6
  395. data/lib/ufo/help/init.md +0 -91
  396. data/lib/ufo/help/network/init.md +0 -13
  397. data/lib/ufo/help/ps.md +0 -27
  398. data/lib/ufo/help/releases.md +0 -16
  399. data/lib/ufo/help/resources.md +0 -20
  400. data/lib/ufo/help/rollback.md +0 -35
  401. data/lib/ufo/help/scale.md +0 -26
  402. data/lib/ufo/help/ship.md +0 -95
  403. data/lib/ufo/help/ships.md +0 -35
  404. data/lib/ufo/help/stop.md +0 -7
  405. data/lib/ufo/help/task.md +0 -27
  406. data/lib/ufo/help/tasks/build.md +0 -158
  407. data/lib/ufo/help/tasks/register.md +0 -14
  408. data/lib/ufo/help/tasks.md +0 -7
  409. data/lib/ufo/help/upgrade/v3to4.md +0 -3
  410. data/lib/ufo/help.rb +0 -9
  411. data/lib/ufo/init.rb +0 -119
  412. data/lib/ufo/network/fetch.rb +0 -48
  413. data/lib/ufo/network/helper.rb +0 -23
  414. data/lib/ufo/network/init.rb +0 -26
  415. data/lib/ufo/network.rb +0 -21
  416. data/lib/ufo/ps.rb +0 -129
  417. data/lib/ufo/scale.rb +0 -28
  418. data/lib/ufo/setting/profile.rb +0 -44
  419. data/lib/ufo/setting/security_groups.rb +0 -22
  420. data/lib/ufo/setting.rb +0 -75
  421. data/lib/ufo/settings.rb +0 -20
  422. data/lib/ufo/ship.rb +0 -103
  423. data/lib/ufo/stack/builder/conditions.rb +0 -23
  424. data/lib/ufo/stack/builder/parameters.rb +0 -45
  425. data/lib/ufo/stack/builder/resources/base.rb +0 -4
  426. data/lib/ufo/stack/builder/resources/dns.rb +0 -17
  427. data/lib/ufo/stack/builder/resources/elb.rb +0 -45
  428. data/lib/ufo/stack/builder/resources/listener.rb +0 -42
  429. data/lib/ufo/stack/builder/resources/listener_ssl.rb +0 -16
  430. data/lib/ufo/stack/builder/resources/roles/base.rb +0 -22
  431. data/lib/ufo/stack/builder/resources/roles/execution_role.rb +0 -4
  432. data/lib/ufo/stack/builder/resources/roles/task_role.rb +0 -4
  433. data/lib/ufo/stack/builder/resources/security_group/base.rb +0 -4
  434. data/lib/ufo/stack/builder/resources.rb +0 -20
  435. data/lib/ufo/stack/builder.rb +0 -26
  436. data/lib/ufo/stack/context.rb +0 -253
  437. data/lib/ufo/stack/helper.rb +0 -55
  438. data/lib/ufo/stack/template_body.rb +0 -13
  439. data/lib/ufo/stack.rb +0 -213
  440. data/lib/ufo/status.rb +0 -56
  441. data/lib/ufo/stop.rb +0 -49
  442. data/lib/ufo/task.rb +0 -225
  443. data/lib/ufo/tasks/builder.rb +0 -40
  444. data/lib/ufo/tasks/register.rb +0 -90
  445. data/lib/ufo/template_scope.rb +0 -57
  446. data/lib/ufo/util.rb +0 -69
  447. data/spec/lib/apps_spec.rb +0 -20
  448. data/spec/lib/builder_spec.rb +0 -23
  449. data/spec/lib/cli_spec.rb +0 -73
  450. data/spec/lib/completion_spec.rb +0 -18
  451. data/spec/lib/ps_spec.rb +0 -14
  452. data/spec/lib/register_spec.rb +0 -49
  453. data/spec/lib/setting_spec.rb +0 -18
  454. data/spec/lib/ship_spec.rb +0 -46
  455. data/spec/lib/stack/status_spec.rb +0 -76
  456. data/spec/lib/stop_spec.rb +0 -13
  457. data/spec/lib/task_spec.rb +0 -54
@@ -0,0 +1,28 @@
1
+ class Ufo::TaskDefinition::Erb
2
+ class Json < Base
3
+ def data
4
+ text = IO.read(@path)
5
+ JSON.load(text)
6
+ rescue JSON::ParserError => e
7
+ # NOTE: JSON::ParserError e.message is not very useful
8
+ logger.error "ERROR: #{e.class}".color(:red)
9
+ logger.error <<~EOL
10
+ Rendered file contains invalid JSON. For debugging, files available at:
11
+
12
+ source: #{@task_definition.path}
13
+ rendered: #{@path}
14
+
15
+ EOL
16
+ logger.error "Contents of the rendered file:\n\n"
17
+ print_code(text)
18
+ if jq_available?
19
+ system "cat #{@path} | jq"
20
+ end
21
+ exit 1
22
+ end
23
+
24
+ def jq_available?
25
+ system("type jq > /dev/null 2>&1")
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,18 @@
1
+ class Ufo::TaskDefinition::Erb
2
+ class Yaml < Base
3
+ def data
4
+ text = IO.read(@path)
5
+ YAML.load(text)
6
+ rescue Psych::SyntaxError => e
7
+ logger.error "ERROR: #{e.class}: #{e.message}"
8
+ logger.error <<~EOL
9
+ Rendered file contains invalid YAML. For debugging, files available at:
10
+
11
+ source: #{@task_definition.path}
12
+ rendered: #{@path}
13
+
14
+ EOL
15
+ print_code(text)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,78 @@
1
+ require 'ostruct'
2
+
3
+ class Ufo::TaskDefinition
4
+ class Erb < Ufo::CLI::Base
5
+ extend Memoist
6
+ include Context
7
+
8
+ delegate :name, :role, to: :task_definition
9
+ alias_method :task_definition_name, :name
10
+ alias_method :family, :name
11
+
12
+ def run
13
+ logger.debug "Building Task Definition"
14
+ clean
15
+ load_context
16
+ data = evaluate_code
17
+ check_empty!(data)
18
+ data = squeeze(data)
19
+ write(data)
20
+ logger.info "Task Definition built: #{output_path}"
21
+ end
22
+
23
+ def check_empty!(data)
24
+ return unless data == true || data == false || data.empty?
25
+ logger.error "ERROR: Empty task definition results".color(:red)
26
+ logger.error <<~EOL
27
+ The resulting task definition is empty.
28
+ Please double check that the task definition code is not empty.
29
+
30
+ #{pretty_path(@task_definition.path)}
31
+
32
+ EOL
33
+ exit 1
34
+ end
35
+
36
+ def evaluate_code
37
+ path = @task_definition.path
38
+ text = RenderMePretty.result(path, context: self)
39
+ rendered_path = "/tmp/ufo/task_definition#{File.extname(path)}"
40
+ FileUtils.mkdir_p(File.dirname(rendered_path))
41
+ IO.write(rendered_path, text)
42
+
43
+ o = @options.merge(path: rendered_path, task_definition: @task_definition)
44
+ if path.ends_with?('.json')
45
+ Json.new(o).data
46
+ else
47
+ Yaml.new(o).data
48
+ end
49
+ end
50
+
51
+ def squeeze(data)
52
+ Ufo::Utils::Squeezer.new(data).squeeze
53
+ end
54
+
55
+ def write(data)
56
+ data = override_image(data)
57
+ json = JSON.pretty_generate(data)
58
+ FileUtils.mkdir_p(File.dirname(output_path))
59
+ IO.write(output_path, json)
60
+ end
61
+
62
+ def override_image(data)
63
+ return data unless @options[:image]
64
+ data["containerDefinitions"].each do |container_definition|
65
+ container_definition["image"] = @options[:image]
66
+ end
67
+ data
68
+ end
69
+
70
+ def output_path
71
+ "#{Ufo.root}/.ufo/output/task_definition.json".sub(/^\.\//,'') # remove leading ./
72
+ end
73
+
74
+ def clean
75
+ FileUtils.rm_rf("#{Ufo.root}/.ufo/output")
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,18 @@
1
+ module Ufo::TaskDefinition::Helpers
2
+ module AwsDataHelper
3
+ extend Memoist
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ delegate :account, :region, to: :aws_data
8
+ alias_method :aws_region, :region
9
+ alias_method :current_region, :region
10
+ end
11
+
12
+ # Duplicated in vars.rb
13
+ def aws_data
14
+ AwsData.new
15
+ end
16
+ memoize :aws_data
17
+ end
18
+ end
@@ -0,0 +1,50 @@
1
+ # Core helper methods.
2
+ #
3
+ # * docker_image - Docker image name to be used when a the docker image is build. This is defined in .ufo/config.rb
4
+ # * dockerfile_port - Exposed port in the Dockerfile. Only supports one exposed port, the first one that is encountered.
5
+ #
6
+ module Ufo::TaskDefinition::Helpers
7
+ module Core
8
+ extend Memoist
9
+
10
+ def dockerfile_port
11
+ dockerfile_path = "#{Ufo.root}/Dockerfile"
12
+ if File.exist?(dockerfile_path)
13
+ parse_for_dockerfile_port(dockerfile_path)
14
+ end
15
+ end
16
+
17
+ def docker_image
18
+ # Dont need to use @options here. Helps simplify the Helper initialization.
19
+ Ufo::Docker::Builder.new({}).docker_image
20
+ end
21
+
22
+ def env(text)
23
+ Vars.new(text: text).env
24
+ end
25
+ alias_method :env_vars, :env
26
+ alias_method :environment, :env
27
+
28
+ def env_file(path)
29
+ Vars.new(file: path).env
30
+ end
31
+
32
+ def secrets(text)
33
+ Vars.new(text: text).secrets
34
+ end
35
+
36
+ def secrets_file(path)
37
+ Vars.new(file: path).secrets
38
+ end
39
+
40
+ def parse_for_dockerfile_port(dockerfile_path)
41
+ lines = IO.read(dockerfile_path).split("\n")
42
+ expose_line = lines.find { |l| l =~ /^EXPOSE / }
43
+ if expose_line
44
+ md = expose_line.match(/EXPOSE (\d+)/)
45
+ port = md[1] if md
46
+ end
47
+ port.to_i if port
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,39 @@
1
+ module Ufo::TaskDefinition::Helpers::Ssm
2
+ class Fetcher
3
+ include Ufo::AwsServices
4
+ include Ufo::Utils::Logging
5
+ include Ufo::Concerns::Names
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ @base64 = options[:base64]
10
+ end
11
+
12
+ def fetch(name)
13
+ name = names.expansion(name, dasherize: false)
14
+ parameter = fetch_parameter(name)
15
+ return unless parameter
16
+ value = parameter.value
17
+ value = Base64.strict_encode64(value).strip if base64?(parameter.type)
18
+ value
19
+ end
20
+
21
+ def base64?(type)
22
+ if @base64.nil?
23
+ type == "SecureString"
24
+ else
25
+ @base64
26
+ end
27
+ end
28
+
29
+ # Note: Cannot use logger if since if ssm helper is used in config it'll cause an infinite loop
30
+ def fetch_parameter(name)
31
+ resp = ssm_client.get_parameter(name: name, with_decryption: true)
32
+ resp.parameter
33
+ rescue Aws::SSM::Errors::ParameterNotFound => e
34
+ puts "WARN: name #{name} not found".color(:yellow)
35
+ puts e.message
36
+ nil
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,8 @@
1
+ module Ufo::TaskDefinition::Helpers
2
+ module Ssm
3
+ def ssm(name, options={})
4
+ fetcher = Ssm::Fetcher.new(options)
5
+ fetcher.fetch(name)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,23 @@
1
+ module Ufo::TaskDefinition::Helpers
2
+ module StackOutput
3
+ include Ufo::AwsServices
4
+ include Ufo::Concerns::Names
5
+
6
+ def stack_output(name)
7
+ stack_name, output_key = name.split(".")
8
+ stack_name = names.expansion(stack_name)
9
+ resp = cloudformation.describe_stacks(stack_name: stack_name)
10
+ stack = resp.stacks.first
11
+ if stack
12
+ o = stack.outputs.detect { |h| h.output_key == output_key }
13
+ end
14
+
15
+ if o
16
+ o.output_value
17
+ else
18
+ logger.info "WARN: NOT FOUND: output #{key} for stack #{stack_name}"
19
+ nil
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,8 +1,11 @@
1
1
  require "aws_data"
2
2
 
3
- class Ufo::DSL::Helper
3
+ module Ufo::TaskDefinition::Helpers
4
4
  class Vars
5
5
  extend Memoist
6
+ include AwsDataHelper
7
+ include Ufo::Concerns::Names
8
+ include Ufo::Utils::Pretty
6
9
 
7
10
  def initialize(options={})
8
11
  # use either file or text. text takes higher precedence
@@ -17,7 +20,7 @@ class Ufo::DSL::Helper
17
20
  def read(path)
18
21
  full_path = "#{Ufo.root}/#{path}"
19
22
  unless File.exist?(full_path)
20
- puts "The #{full_path} env file could not be found. Are you sure it exists?"
23
+ puts "The #{pretty_path(full_path)} env file could not be found. Are you sure it exists?"
21
24
  exit 1
22
25
  end
23
26
  IO.read(full_path)
@@ -41,24 +44,55 @@ class Ufo::DSL::Helper
41
44
  secrets = env
42
45
  secrets.map do |item|
43
46
  value = item.delete(:value)
44
- item[:valueFrom] = substitute(expand_secret(value))
47
+ arn = normalize_to_arn(item[:name], value)
48
+ value = expansion(arn)
49
+ value = value.sub('parameter//','parameter/') # auto fix accidental leading slash for user
50
+ item[:valueFrom] = value
45
51
  end
46
52
  secrets
47
53
  end
48
54
 
49
- def expand_secret(value)
55
+ def normalize_to_arn(name, value)
50
56
  case value
51
57
  when /^ssm:/i
52
58
  value.sub(/^ssm:/i, "arn:aws:ssm:#{region}:#{account}:parameter/")
53
59
  when /^secretsmanager:/i
54
60
  value.sub(/^secretsmanager:/i, "arn:aws:secretsmanager:#{region}:#{account}:secret:")
61
+ when '' # blank string will mean use convention
62
+ conventional_pattern(name, value)
55
63
  else
56
64
  value # assume full arn has been passed
57
65
  end
58
66
  end
59
67
 
60
- def substitute(value)
61
- value.gsub(":UFO_ENV", Ufo.env)
68
+ # arn:aws:ssm:us-west-2:536766270177:parameter/demo/dev/DB-NAME
69
+ # arn:aws:ssm:us-west-2:536766270177:parameter/demo/dev/DB-NAME
70
+ def expansion(arn)
71
+ # performance improvement only run names.expansion on the name portion
72
+ md = arn.match(/(.*:)(parameter\/|secret:)(.*)/)
73
+ prefix, type, name = md[1], md[2], md[3]
74
+ expanded_name = names.expansion(name, dasherize: false) # dasherize: false. dont turn SECRET_NAME => SECRET-NAME
75
+ "#{prefix}#{type}#{expanded_name}"
76
+ end
77
+
78
+ # Examples with config.secrets.provider = "ssm"
79
+ #
80
+ # .secrets
81
+ #
82
+ # DB_NAME
83
+ #
84
+ # Results
85
+ #
86
+ # DB_NAME=:APP/:ENV/:SECRET_NAME # expansion will use => demo/dev/DB_NAME
87
+ #
88
+ def conventional_pattern(name, value)
89
+ secrets = Ufo.config.secrets
90
+ provider = secrets.provider # ssm or secretsmanager
91
+ namespace = provider == "ssm" ? "parameter/" : "secret:"
92
+ pattern = secrets.pattern[provider] # IE: Ufo.config.secrets.pattern.ssm => :APP/:ENV/:SECRET_NAME
93
+ # replace :SECRET_NAME since names expand doesnt know how to nor do we want to add logic there
94
+ pattern = pattern.sub(':SECRET_NAME', name)
95
+ "arn:aws:#{provider}:#{region}:#{account}:#{namespace}#{pattern}"
62
96
  end
63
97
 
64
98
  def remove_surrounding_quotes(s)
@@ -80,18 +114,5 @@ class Ufo::DSL::Helper
80
114
  # filter out empty lines
81
115
  lines = lines.reject { |l| l.strip.empty? }
82
116
  end
83
-
84
- def aws_data
85
- AwsData.new
86
- end
87
- memoize :aws_data
88
-
89
- def region
90
- aws_data.region
91
- end
92
-
93
- def account
94
- aws_data.account
95
- end
96
117
  end
97
118
  end
@@ -0,0 +1,48 @@
1
+ module Ufo::TaskDefinition::Helpers
2
+ module Vpc
3
+ extend Memoist
4
+ include Ufo::AwsServices
5
+
6
+ def default_vpc
7
+ resp = ec2.describe_vpcs(filters: [name: "isDefault", values: ["true"]])
8
+ vpc = resp.vpcs.first
9
+ if vpc
10
+ vpc.vpc_id
11
+ else
12
+ logger.error "No default vpc found".color(:red)
13
+ logger.error <<~EOL
14
+ Please configure the `config.vpc` settings.
15
+
16
+ Docs: https://ufoships.com/config/vpc/
17
+
18
+ EOL
19
+ exit 1
20
+ end
21
+ end
22
+ memoize :default_vpc
23
+
24
+ def subnets_for(vpc_id)
25
+ resp = ec2.describe_subnets(filters: [name: "vpc-id", values: [vpc_id]])
26
+ subnets = resp.subnets
27
+ subnets.map(&:subnet_id)
28
+ end
29
+
30
+ def default_subnets
31
+ if default_vpc.nil?
32
+ logger.error "ERROR: no default subnets because no default vpc found".color(:red)
33
+ exit 1
34
+ end
35
+ resp = ec2.describe_subnets(filters: [name: "vpc-id", values: [default_vpc]])
36
+ subnets = resp.subnets
37
+ subnets.map(&:subnet_id)
38
+ end
39
+ memoize :default_subnets
40
+
41
+ def key_pairs(regexp=nil)
42
+ resp = ec2.describe_key_pairs
43
+ key_names = resp.key_pairs.map(&:key_name)
44
+ key_names.select! { |k| k =~ regexp } if regexp
45
+ key_names
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,5 @@
1
+ class Ufo::TaskDefinition
2
+ module Helpers
3
+ include_modules("helpers") # builtin helpers
4
+ end
5
+ end
@@ -0,0 +1,19 @@
1
+ module Ufo
2
+ class TaskDefinition
3
+ extend Memoist
4
+ include Ufo::Concerns # for names
5
+
6
+ attr_reader :name, :role
7
+ def initialize(options={})
8
+ @options = options
9
+ @role = Ufo.role
10
+ @name = names.task_definition # IE: :APP-:ROLE-:ENV => demo-web-dev
11
+ end
12
+
13
+ def path
14
+ expr = "#{Ufo.root}/.ufo/resources/task_definitions/{#{@role},web,default}.{json,yml}"
15
+ Dir.glob(expr).first
16
+ end
17
+ memoize :path
18
+ end
19
+ end
@@ -38,7 +38,7 @@ class Ufo::Upgrade
38
38
  lines.map! do |line|
39
39
  line.sub(/[\/]?ufo/, '.ufo')
40
40
  end
41
- lines << [".ufo/data\n"] # new ignore rule
41
+ lines << [".ufo/tmp/state\n"] # new ignore rule
42
42
  text = lines.join
43
43
  IO.write(".gitignore", text)
44
44
  end
@@ -36,8 +36,8 @@ class Ufo::Upgrade
36
36
  private
37
37
  def update_task_definitions
38
38
  text = <<-EOL
39
- # HINT: shows how Ufo.env_extra can to create different log groups
40
- # awslogs_group: ["ecs/TASK_DEFINITION_NAME", Ufo.env_extra].compact.join('-'),
39
+ # HINT: shows how Ufo.extra can to create different log groups
40
+ # awslogs_group: ["ecs/TASK_DEFINITION_NAME", Ufo.extra].compact.join('-'),
41
41
  EOL
42
42
  insert_into_file ".ufo/task_definitions.rb", text, :before => / awslogs_group:/
43
43
  end
@@ -112,7 +112,7 @@ EOL
112
112
  def upsert_gitignore
113
113
  text =<<-EOL
114
114
  .ufo/current
115
- .ufo/data
115
+ .ufo/tmp/state
116
116
  .ufo/log
117
117
  .ufo/output
118
118
  EOL
@@ -0,0 +1,30 @@
1
+ module Ufo::Utils
2
+ module Execute
3
+ def execute(command, options={})
4
+ log = options[:log]
5
+ if log
6
+ command += " >> #{log}"
7
+ logger.info "=> #{command}"
8
+ FileUtils.mkdir_p(File.dirname(log))
9
+ File.open(log, 'a') { |f| f.puts "=> #{command}" }
10
+ out = `#{command}`
11
+ success = $?.success?
12
+ unless success
13
+ logger.error out
14
+ exit 1
15
+ end
16
+ out
17
+ else
18
+ logger.info "=> #{command}"
19
+ system(command)
20
+ end
21
+ end
22
+
23
+ # TODO: remove these other metohds
24
+ # Custom user params from .ufo/params.yml
25
+ # Param keys are symbols for the aws-sdk calls.
26
+ def user_params
27
+ @user_params ||= Param.new.data
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,7 @@
1
+ module Ufo::Utils
2
+ module Logging
3
+ def logger
4
+ Ufo.logger
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,18 @@
1
+ module Ufo::Utils
2
+ module Pretty
3
+ def pretty_path(path)
4
+ path.sub("#{Ufo.root}/",'').sub(/^\.\//,'')
5
+ end
6
+
7
+ # http://stackoverflow.com/questions/4175733/convert-duration-to-hoursminutesseconds-or-similar-in-rails-3-or-ruby
8
+ def pretty_time(total_seconds)
9
+ minutes = (total_seconds / 60) % 60
10
+ seconds = total_seconds % 60
11
+ if total_seconds < 60
12
+ "#{seconds.to_i}s"
13
+ else
14
+ "#{minutes.to_i}m #{seconds.to_i}s"
15
+ end
16
+ end
17
+ end
18
+ end
@@ -13,7 +13,7 @@ module Ufo::Utils
13
13
  when Hash
14
14
  data.each_with_object({}) do |(k,v), squeezed|
15
15
  # only remove nil and empty Array values within Hash structures
16
- squeezed[k] = squeeze(v) unless v.nil? || v.is_a?(Array) && v.empty?
16
+ squeezed[k] = squeeze(v) unless v.nil? # || v.is_a?(Array) && v.empty?
17
17
  squeezed
18
18
  end
19
19
  else
@@ -0,0 +1,23 @@
1
+ module Ufo::Utils
2
+ module Sure
3
+ def sure?(message=nil)
4
+ confirm = 'Are you sure?'
5
+ if @options[:yes]
6
+ yes = 'y'
7
+ else
8
+ out = if message
9
+ "#{message}\n#{confirm} (y/N) "
10
+ else
11
+ "#{confirm} (y/N) "
12
+ end
13
+ print out
14
+ yes = $stdin.gets
15
+ end
16
+
17
+ unless yes =~ /^y/
18
+ puts "Whew! Exiting."
19
+ exit 0
20
+ end
21
+ end
22
+ end
23
+ end
data/lib/ufo/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Ufo
2
- VERSION = "5.0.7"
2
+ VERSION = "6.0.0"
3
3
  end
@@ -0,0 +1,48 @@
1
+ require "yaml"
2
+
3
+ class Ufo::Yaml
4
+ class Loader
5
+ def initialize(text)
6
+ @text = text
7
+ end
8
+
9
+ def load
10
+ add_domain_types!
11
+ YAML.load(@text)
12
+ end
13
+
14
+ private
15
+ def add_domain_types!
16
+ intrinsic_functions.each do |name|
17
+ YAML.add_domain_type('', name) do |type,val|
18
+ key = type.split('::').last
19
+ key = "Fn::" + key unless name == 'Ref'
20
+ { key => val }
21
+ end
22
+ end
23
+ end
24
+
25
+ def intrinsic_functions
26
+ %w[
27
+ And
28
+ Base64
29
+ Cidr
30
+ Equals
31
+ FindInMap
32
+ GetAtt
33
+ GetAZs
34
+ If
35
+ If
36
+ ImportValue
37
+ Join
38
+ Not
39
+ Or
40
+ Ref
41
+ Select
42
+ Split
43
+ Sub
44
+ Transform
45
+ ]
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,51 @@
1
+ class Ufo::Yaml
2
+ class Validator
3
+ def initialize(path)
4
+ @path = path
5
+ end
6
+
7
+ def validate!
8
+ validate_yaml(@path)
9
+ end
10
+
11
+ def validate_yaml(path)
12
+ text = IO.read(path)
13
+ begin
14
+ YAML.load(text)
15
+ rescue Psych::SyntaxError => e
16
+ handle_yaml_syntax_error(e, path)
17
+ end
18
+ end
19
+
20
+ def handle_yaml_syntax_error(e, path)
21
+ io = StringIO.new
22
+ io.puts "Invalid yaml. Output written for debugging: #{path}".color(:red)
23
+ io.puts "ERROR: #{e.message}".color(:red)
24
+
25
+ # Grab line info. Example error:
26
+ # ERROR: (<unknown>): could not find expected ':' while scanning a simple key at line 2 column 1
27
+ md = e.message.match(/at line (\d+) column (\d+)/)
28
+ line = md[1].to_i
29
+
30
+ lines = IO.read(path).split("\n")
31
+ context = 5 # lines of context
32
+ top, bottom = [line-context-1, 0].max, line+context-1
33
+ spacing = lines.size.to_s.size
34
+ lines[top..bottom].each_with_index do |line_content, index|
35
+ line_number = top+index+1
36
+ if line_number == line
37
+ io.printf("%#{spacing}d %s\n".color(:red), line_number, line_content)
38
+ else
39
+ io.printf("%#{spacing}d %s\n", line_number, line_content)
40
+ end
41
+ end
42
+
43
+ if ENV['LONO_TEST']
44
+ io.string
45
+ else
46
+ puts io.string
47
+ exit 1
48
+ end
49
+ end
50
+ end
51
+ end