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
@@ -1,6 +1,6 @@
1
- class Ufo::Stack::Builder::Resources::TaskDefinition
1
+ class Ufo::Cfn::Stack::Builder::Resources::TaskDefinition
2
2
  class Reconstructor
3
- include Ufo::AwsService
3
+ include Ufo::AwsServices
4
4
 
5
5
  def initialize(task_definition, rollback=false)
6
6
  @task_definition, @rollback = task_definition, rollback
@@ -12,10 +12,10 @@ class Ufo::Stack::Builder::Resources::TaskDefinition
12
12
 
13
13
  def data
14
14
  if @rollback
15
- resp = ecs.describe_task_definition(task_definition: @task_definition)
15
+ resp = ecs.describe_task_definition(task_definition: @task_definition.name)
16
16
  resp.task_definition.to_h
17
17
  else
18
- path = "#{Ufo.root}/.ufo/output/#{@task_definition}.json"
18
+ path = "#{Ufo.root}/.ufo/output/task_definition.json"
19
19
  JSON.load(IO.read(path))
20
20
  end
21
21
  end
@@ -1,7 +1,7 @@
1
- class Ufo::Stack::Builder::Resources
1
+ class Ufo::Cfn::Stack::Builder::Resources
2
2
  class TaskDefinition < Base
3
3
  def build
4
- return if @rollback_definition_arn
4
+ return if vars[:rollback_task_definition]
5
5
 
6
6
  {
7
7
  Type: "AWS::ECS::TaskDefinition",
@@ -15,8 +15,8 @@ class Ufo::Stack::Builder::Resources
15
15
  props = Reconstructor.new(@task_definition).reconstruct
16
16
 
17
17
  # Decorate with iam roles if needed
18
- props[:TaskRoleArn] = {"Fn::GetAtt": "TaskRole.Arn"} if Roles::TaskRole.build?
19
- props[:ExecutionRoleArn] = {"Fn::GetAtt": "ExecutionRole.Arn"} if Roles::ExecutionRole.build?
18
+ props[:TaskRoleArn] = {"Fn::GetAtt": "TaskRole.Arn"} if IamRoles::TaskRole.build?
19
+ props[:ExecutionRoleArn] = {"Fn::GetAtt": "ExecutionRole.Arn"} if IamRoles::ExecutionRole.build?
20
20
 
21
21
  props
22
22
  end
@@ -0,0 +1,24 @@
1
+ class Ufo::Cfn::Stack::Builder
2
+ class Resources < Base
3
+ def build
4
+ {
5
+ Dns: Dns.build(@options),
6
+ EcsService: EcsService.build(@options),
7
+ EcsSecurityGroup: SecurityGroup::Ecs.build(@options),
8
+ EcsSecurityGroupRule: SecurityGroup::EcsRule.build(@options),
9
+ Elb: Elb.build(@options),
10
+ ElbSecurityGroup: SecurityGroup::Elb.build(@options),
11
+ ExecutionRole: IamRoles::ExecutionRole.build(@options),
12
+ Listener: Listener.build(@options),
13
+ ListenerSsl: ListenerSsl.build(@options),
14
+ TargetGroup: TargetGroup.build(@options),
15
+ TaskDefinition: TaskDefinition.build(@options),
16
+ TaskRole: IamRoles::TaskRole.build(@options),
17
+ # ECS Service AutoScaling
18
+ ScalingRole: Scaling::Role.build(@options),
19
+ ScalingTarget: Scaling::Target.build(@options),
20
+ ScalingPolicy: Scaling::Policy.build(@options),
21
+ }
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,30 @@
1
+ class Ufo::Cfn::Stack
2
+ class Builder < Ufo::Cfn::Base
3
+ include Ufo::Utils::Logging
4
+
5
+ def initialize(options={})
6
+ super
7
+ @vars = options[:vars]
8
+ @template = {Description: "UFO ECS stack #{@vars[:stack_name]}"}
9
+ end
10
+
11
+ def build
12
+ @template[:Parameters] = Parameters.build(@options)
13
+ @template[:Conditions] = Conditions.build(@options)
14
+ @template[:Resources] = Resources.build(@options)
15
+ @template[:Outputs] = Outputs.build(@options)
16
+ @template.deep_stringify_keys!
17
+ @template = Ufo::Utils::Squeezer.new(@template).squeeze
18
+ @template = CustomProperties.new(@template, @vars[:stack_name]).apply
19
+ write(@template)
20
+ end
21
+
22
+ def write(template)
23
+ text = YAML.dump(template)
24
+ path = ".ufo/output/template.yml"
25
+ IO.write("#{Ufo.root}/#{path}", text)
26
+ logger.info "Template built: #{path}"
27
+ text
28
+ end
29
+ end
30
+ end
@@ -1,7 +1,5 @@
1
- class Ufo::Stack
1
+ class Ufo::Cfn::Stack
2
2
  class CustomProperties
3
- include Ufo::Settings
4
-
5
3
  def initialize(template, stack_name)
6
4
  @template, @stack_name = template, stack_name
7
5
  end
@@ -19,9 +17,9 @@ class Ufo::Stack
19
17
  end
20
18
 
21
19
  # Keep backward compatiablity but encouraging CamelCase now because in the ufo init generator
22
- # the .ufo/settings/cfn/default.yml is now CamelCase
20
+ # the .ufo/config/cfn/default.yml is now CamelCase
23
21
  def camelize(properties)
24
- if ENV['UFO_CAMELIZE'] == '0' || settings[:auto_camelize] == false # provide a way to quickly test full camelize disable
22
+ if ENV['UFO_CAMELIZE'] == '0'
25
23
  return properties.deep_stringify_keys
26
24
  end
27
25
 
@@ -55,5 +53,23 @@ class Ufo::Stack
55
53
  end
56
54
  properties
57
55
  end
56
+
57
+ def cfn
58
+ folder = "#{Ufo.root}/.ufo/config/cfn/"
59
+ paths = ["base", Ufo.env].map do |file|
60
+ "#{folder}/#{file}.yml"
61
+ end
62
+ paths.inject({}) do |result, path|
63
+ data = yaml_load(path)
64
+ result.merge(data)
65
+ end
66
+ end
67
+
68
+ def yaml_load(path)
69
+ return {} unless File.exist?(path)
70
+ text = RenderMePretty.result(path)
71
+ result = YAML.load(text) # yaml file can contain nothing but comments
72
+ result.is_a?(Hash) ? result.deep_symbolize_keys : {}
73
+ end
58
74
  end
59
75
  end
@@ -0,0 +1,51 @@
1
+ class Ufo::Cfn::Stack
2
+ class Params < Ufo::Cfn::Stack::Builder::Base
3
+ def build
4
+ params = {
5
+ Vpc: vpc.id,
6
+ ElbSubnets: vpc.elb_subnets,
7
+ EcsSubnets: vpc.ecs_subnets,
8
+
9
+ CreateElb: vars[:create_elb] ? "true" : "false",
10
+ ElbTargetGroup: vars[:elb_target_group].to_s,
11
+
12
+ EcsSchedulingStrategy: Ufo.config.ecs.scheduling_strategy,
13
+ }
14
+ params[:EcsDesiredCount] = desired_count.to_s if desired_count # Note: cfn template is type String so it can be optional
15
+
16
+ params = Ufo::Utils::Squeezer.new(params).squeeze
17
+ parameters = params.map do |k,v|
18
+ if v == :use_previous_value
19
+ { parameter_key: k, use_previous_value: true }
20
+ else
21
+ { parameter_key: k, parameter_value: v }
22
+ end
23
+ end
24
+ save_params(parameters)
25
+ parameters
26
+ end
27
+
28
+ private
29
+ def desired_count
30
+ Ufo.config.ecs.desired_count
31
+ end
32
+
33
+ # No need to save template. That's already saved.
34
+ def save_params(parameters)
35
+ params = parameters.dup.map do |param|
36
+ param.transform_keys do |key|
37
+ key.to_s.camelize
38
+ end
39
+ end
40
+ path = "#{Ufo.root}/.ufo/output/params.json"
41
+ FileUtils.mkdir_p(File.dirname(path))
42
+ IO.write(path, JSON.pretty_generate(params))
43
+ logger.info "Parameters built: #{pretty_path(path)}"
44
+ end
45
+
46
+ def vpc
47
+ Vpc.new(@options)
48
+ end
49
+ memoize :vpc
50
+ end
51
+ end
@@ -23,9 +23,9 @@ require 'time'
23
23
  # UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS
24
24
  # UPDATE_ROLLBACK_IN_PROGRESS
25
25
  #
26
- class Ufo::Stack
26
+ class Ufo::Cfn::Stack
27
27
  class Status
28
- include Ufo::AwsService
28
+ include Ufo::AwsServices
29
29
  include Ufo::Util
30
30
 
31
31
  attr_reader :events
@@ -0,0 +1,8 @@
1
+ class Ufo::Cfn::Stack
2
+ class Template < Ufo::Cfn::Base
3
+ def body
4
+ builder = Builder.new(@options)
5
+ builder.build
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,110 @@
1
+ class Ufo::Cfn::Stack
2
+ class Vars < Ufo::Cfn::Base
3
+ attr_reader :stack_name
4
+ def initialize(options={})
5
+ super
6
+ @cluster = options[:cluster].dup # Thor options are frozen, we thaw it because CustomProperties#substitute_variables does a sub!
7
+ @stack_name = options[:stack_name] || [Ufo.app, @task_definition.role, Ufo.env].join('-')
8
+ @stack = options[:stack]
9
+ @new_stack = !@stack
10
+ end
11
+
12
+ def values
13
+ {
14
+ cluster: @cluster,
15
+ stack_name: @stack_name, # used in custom_properties
16
+ container: container,
17
+ # to reconstruct TaskDefinition in the CloudFormation template
18
+ task_definition: @task_definition,
19
+ rollback_task_definition: @options[:rollback_task_definition],
20
+ # elb options remember that their 'state'
21
+ create_elb: create_elb?, # helps set Ecs DependsOn
22
+ elb_type: elb_type,
23
+ create_route53: create_elb? && dns_configured?,
24
+ default_target_group_protocol: default_target_group_protocol,
25
+ default_listener_protocol: default_listener_protocol,
26
+ default_listener_ssl_protocol: default_listener_ssl_protocol,
27
+ create_listener_ssl: create_listener_ssl?,
28
+ }
29
+ end
30
+
31
+ def dns_configured?
32
+ !!Ufo.config.dns.domain || !!Ufo.config.dns.name
33
+ end
34
+
35
+ def default_listener_protocol
36
+ port = Ufo.config.elb.port
37
+ if elb_type == 'network'
38
+ port == 443 ? 'TLS' : 'TCP'
39
+ else
40
+ port == 443 ? 'HTTPS' : 'HTTP'
41
+ end
42
+ end
43
+
44
+ def default_listener_ssl_protocol
45
+ elb_type == 'network' ? 'TLS' : 'HTTPS'
46
+ end
47
+
48
+ def default_target_group_protocol
49
+ elb_type == 'network' ? 'TCP' : 'HTTP'
50
+ end
51
+
52
+ # if the configuration is set to anything then enable it
53
+ def create_listener_ssl?
54
+ Ufo.config.elb.ssl.enabled
55
+ end
56
+
57
+ def create_elb?
58
+ elb = Ufo.config.elb
59
+ if elb.enabled.to_s == "auto"
60
+ container[:name] == "web" # convention
61
+ else
62
+ elb.enabled # true or false
63
+ end
64
+ end
65
+
66
+ def container
67
+ task_definition = Builder::Resources::TaskDefinition::Reconstructor.new(@task_definition, @options[:rollback]).reconstruct
68
+
69
+ container_def = task_definition["ContainerDefinitions"].first
70
+ requires_compatibilities = task_definition["RequiresCompatibilities"]
71
+ fargate = requires_compatibilities && requires_compatibilities == ["FARGATE"]
72
+ network_mode = task_definition["NetworkMode"]
73
+
74
+ mappings = container_def["PortMappings"] || []
75
+ unless mappings.empty?
76
+ port = mappings.first["ContainerPort"]
77
+ end
78
+
79
+ result = {
80
+ name: container_def["Name"],
81
+ fargate: fargate,
82
+ network_mode: network_mode, # awsvpc, bridge, etc
83
+ }
84
+ result[:port] = port if port
85
+ result
86
+ end
87
+ memoize :container
88
+
89
+ def get_parameter_value(stack, key)
90
+ param = stack.parameters.find do |p|
91
+ p.parameter_key == key
92
+ end
93
+ param.parameter_value if param
94
+ end
95
+
96
+ def elb_type
97
+ elb_type = Ufo.config.elb.type
98
+ return elb_type if elb_type
99
+
100
+ # user is trying to create a network load balancer if subnet_mappings used
101
+ subnet_mappings = Ufo.config.elb.subnet_mappings
102
+ if subnet_mappings.empty?
103
+ "application" # default
104
+ else
105
+ "network"
106
+ end
107
+ end
108
+ memoize :elb_type
109
+ end
110
+ end
@@ -0,0 +1,31 @@
1
+ class Ufo::Cfn::Stack
2
+ class Vpc < Ufo::Cfn::Base
3
+ extend Memoist
4
+ include Ufo::TaskDefinition::Helpers
5
+
6
+ def id
7
+ vpc.id ? vpc.id : default_vpc
8
+ end
9
+ alias_method :vpc_id, :id
10
+
11
+ def vpc
12
+ Ufo.config.vpc
13
+ end
14
+
15
+ def elb_subnets
16
+ subnets(vpc.subnets.elb)
17
+ end
18
+
19
+ def ecs_subnets
20
+ subnets(vpc.subnets.ecs)
21
+ end
22
+
23
+ def subnets(subnets)
24
+ if subnets
25
+ subnets.is_a?(String) ? subnets : subnets.join(',')
26
+ else
27
+ subnets_for(vpc_id).join(',') # default vpc subnets or all subnets for the configured vpc
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,175 @@
1
+ # CloudFormation status codes, full list:
2
+ # https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
3
+ #
4
+ # CREATE_COMPLETE
5
+ # ROLLBACK_COMPLETE
6
+ # DELETE_COMPLETE
7
+ # UPDATE_COMPLETE
8
+ # UPDATE_ROLLBACK_COMPLETE
9
+ #
10
+ # CREATE_FAILED
11
+ # DELETE_FAILED
12
+ # ROLLBACK_FAILED
13
+ # UPDATE_ROLLBACK_FAILED
14
+ #
15
+ # CREATE_IN_PROGRESS
16
+ # DELETE_IN_PROGRESS
17
+ # REVIEW_IN_PROGRESS
18
+ # ROLLBACK_IN_PROGRESS
19
+ # UPDATE_COMPLETE_CLEANUP_IN_PROGRESS
20
+ # UPDATE_IN_PROGRESS
21
+ # UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS
22
+ # UPDATE_ROLLBACK_IN_PROGRESS
23
+ #
24
+ module Ufo::Cfn
25
+ class Stack < Base
26
+ extend Memoist
27
+
28
+ def deploy
29
+ build
30
+ @stack = find_stack(@stack_name)
31
+ if @stack && rollback_complete?(@stack)
32
+ logger.info "Existing stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
33
+ cloudformation.delete_stack(stack_name: @stack_name)
34
+ status.wait
35
+ status.reset
36
+ @stack = nil # at this point stack has been deleted
37
+ end
38
+
39
+ exit_with_message(@stack) if @stack && !updatable?(@stack)
40
+
41
+ @stack ? perform(:update) : perform(:create)
42
+
43
+ stop_old_tasks if @options[:stop_old_task]
44
+
45
+ return unless @options[:wait]
46
+ status.wait
47
+
48
+ logger.info status.rollback_error_message if status.update_rollback?
49
+
50
+ status.success?
51
+ end
52
+
53
+ def perform(action)
54
+ logger.info "#{action[0..-2].capitalize}ing stack #{@stack_name.color(:green)}"
55
+ # Example: cloudformation.send("update_stack", stack_options)
56
+
57
+ # o = stack_options.dup
58
+ # o[:template_body] = '...' if o[:template_body]
59
+ # puts "stack_options:"
60
+ # pp o
61
+ # puts "parameters:"
62
+ # pp o[:parameters]
63
+
64
+ cloudformation.send("#{action}_stack", stack_options)
65
+ rescue Aws::CloudFormation::Errors::ValidationError => e
66
+ handle_stack_error(e)
67
+ end
68
+
69
+ def stack_options
70
+ options = {
71
+ capabilities: ["CAPABILITY_IAM", "CAPABILITY_NAMED_IAM"],
72
+ parameters: @parameters,
73
+ stack_name: @stack_name,
74
+ template_body: @template_body,
75
+ }
76
+ cfn = Ufo.config.cfn
77
+ options[:notification_arns] = cfn.notification_arns if cfn.notification_arns
78
+ options[:disable_rollback] = cfn.disable_rollback unless cfn.disable_rollback.nil?
79
+ options[:tags] = tags(cfn.tags) if cfn.tags
80
+ options
81
+ end
82
+
83
+ def tags(hash)
84
+ hash.map do |k,v|
85
+ { key: v, value: v }
86
+ end
87
+ end
88
+
89
+ def build
90
+ options_with_vars = @options.dup.merge(vars: vars.values)
91
+ params = Params.new(options_with_vars)
92
+ @parameters = params.build
93
+ template = Template.new(options_with_vars)
94
+ @template_body = template.body
95
+ end
96
+
97
+ def vars
98
+ o = @options.merge(
99
+ cluster: @cluster,
100
+ stack_name: @stack_name,
101
+ stack: @stack,
102
+ )
103
+ o[:rollback_task_definition] = rollback_task_definition if rollback_task_definition
104
+ Vars.new(o)
105
+ end
106
+ memoize :vars
107
+
108
+ def scheduling_strategy
109
+ scheduling_strategy = Ufo.config.ecs.scheduling_strategy
110
+ scheduling_strategy.upcase if scheduling_strategy
111
+ end
112
+
113
+ def rollback_task_definition
114
+ return unless @options[:rollback]
115
+ @options[:rollback_task_definition]
116
+ end
117
+ memoize :rollback_task_definition
118
+
119
+ def exit_with_message(stack)
120
+ region = `aws configure get region`.strip rescue "us-east-1"
121
+ url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks"
122
+ logger.info "The stack is not in an updateable state: #{stack.stack_status.color(:yellow)}."
123
+ logger.info "Here's the CloudFormation url to check for more details #{url}"
124
+ exit 1
125
+ end
126
+
127
+ # Assume only first container_definition to get the container info.
128
+ # Stack:arn:aws:cloudformation:... is in ROLLBACK_COMPLETE state and can not be updated.
129
+ def handle_stack_error(e)
130
+ case e.message
131
+ when /state and can not be updated/
132
+ logger.info "The #{@stack_name} stack is in a state that cannot be updated. Deleted the stack and try again."
133
+ logger.info "ERROR: #{e.message}"
134
+ if message.include?('UPDATE_ROLLBACK_FAILED')
135
+ logger.info "You might be able to do a 'Continue Update Rollback' and skip some resources to get the stack back into a good state."
136
+ end
137
+ region = `aws configure get region`.strip rescue 'us-east-1'
138
+ url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}"
139
+ logger.info "Here's the CloudFormation console url: #{url}"
140
+ exit 1
141
+ when /No updates are to be performed/
142
+ logger.info "There are no updates to be performed. Exiting.".color(:yellow)
143
+ exit 1
144
+ else
145
+ raise
146
+ end
147
+ end
148
+
149
+ def rollback_complete?(stack)
150
+ stack.stack_status == 'ROLLBACK_COMPLETE'
151
+ end
152
+
153
+ def updatable?(stack)
154
+ stack.stack_status =~ /_COMPLETE$/ || stack.stack_status == 'UPDATE_ROLLBACK_FAILED'
155
+ end
156
+
157
+ def cancel
158
+ stack = find_stack(@stack_name)
159
+ unless stack
160
+ logger.error "No #{@stack_name} stack to cancel".color(:red)
161
+ exit 1
162
+ end
163
+
164
+ if stack.stack_status == "CREATE_IN_PROGRESS"
165
+ cloudformation.delete_stack(stack_name: @stack_name)
166
+ logger.info "Canceling stack creation"
167
+ elsif stack.stack_status == "UPDATE_IN_PROGRESS"
168
+ cloudformation.cancel_update_stack(stack_name: @stack_name)
169
+ logger.info "Canceling stack update"
170
+ else
171
+ logger.info "The stack is not in a state to that is cancelable: #{stack.stack_status}"
172
+ end
173
+ end
174
+ end
175
+ end
@@ -0,0 +1,18 @@
1
+ class Ufo::CLI
2
+ class Base
3
+ extend Memoist
4
+ include Ufo::AwsServices
5
+ include Ufo::Concerns
6
+ include Ufo::Utils::Logging
7
+ include Ufo::Utils::Pretty
8
+ include Ufo::Utils::Sure
9
+
10
+ attr_reader :task_definition
11
+ def initialize(options={})
12
+ @options = options
13
+ @task_definition = Ufo::TaskDefinition.new(options)
14
+ @stack_name = names.stack
15
+ @cluster = names.cluster
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ class Ufo::CLI
2
+ class Build < Base
3
+ def build
4
+ docker
5
+ task_definition
6
+ Ufo::Cfn::Stack.new(@options).build
7
+ end
8
+ alias_method :all, :build
9
+
10
+ def for_deploy
11
+ docker
12
+ task_definition
13
+ end
14
+
15
+ def task_definition
16
+ Ufo::TaskDefinition::Builder.new(@options).build
17
+ end
18
+
19
+ def docker
20
+ return if @options[:docker] == false
21
+ # The config.docker.quiet only effects: ufo ship, not ufo docker build
22
+ quiet = Ufo.config.ship.docker.quiet
23
+ o = @options.dup.merge(quiet: quiet)
24
+ builder = Ufo::Docker::Builder.new(o)
25
+ builder.build
26
+ pusher = Ufo::Docker::Pusher.new(nil, o)
27
+ pusher.push
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,18 @@
1
+ class Ufo::CLI
2
+ class Cancel < Base
3
+ def run
4
+ are_you_sure?
5
+ stack = Ufo::Cfn::Stack.new(@options)
6
+ stack.cancel
7
+ stack.status.wait
8
+ end
9
+
10
+ def are_you_sure?
11
+ if @options[:yes]
12
+ logger.info "Canceling the #{@stack_name.color(:green)} stack"
13
+ else
14
+ sure?("You are about to cancel the #{@stack_name.color(:green)} stack")
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,80 @@
1
+ class Ufo::CLI::Central
2
+ class Update
3
+ include Ufo::Utils::Logging
4
+ include Ufo::Utils::Execute
5
+ include Ufo::Utils::Sure
6
+
7
+ def initialize(options={})
8
+ @options = options
9
+ end
10
+
11
+ def run
12
+ action = File.exist?(".ufo") ? "update" : "create"
13
+ sure?("Will #{action} the .ufo folder.") # IE: Will create the .ufo folder.
14
+ validate!
15
+ logger.info "Updating .ufo with #{repo}"
16
+ FileUtils.mkdir_p(tmp_area)
17
+ pull
18
+ sync
19
+ check_gitignore
20
+ end
21
+
22
+ def pull
23
+ logger.debug "Within #{tmp_area}"
24
+ Dir.chdir(tmp_area) do
25
+ if File.exist?(repo_name)
26
+ execute "cd #{repo_name} && git pull"
27
+ else
28
+ execute "git clone #{repo}"
29
+ end
30
+ end
31
+ end
32
+
33
+ def sync
34
+ FileUtils.mv(".ufo", ".ufo.bak") if File.exist?(".ufo")
35
+ src = "#{tmp_area}/#{repo_name}"
36
+ src += "/#{folder}" if folder
37
+ FileUtils.cp_r(src, ".ufo")
38
+ FileUtils.rm_rf(".ufo.bak")
39
+ logger.info "The .ufo folder has been updated"
40
+ end
41
+
42
+ def validate!
43
+ return if repo
44
+ logger.info "ERROR: Please set the env var: UFO_CENTRAL_REPO".color(:red)
45
+ exit 1
46
+ end
47
+
48
+ def repo_name
49
+ File.basename(repo)
50
+ end
51
+
52
+ def repo
53
+ ENV['UFO_CENTRAL_REPO']
54
+ end
55
+
56
+ def folder
57
+ ENV['UFO_CENTRAL_FOLDER']
58
+ end
59
+
60
+ def tmp_area
61
+ "/tmp/ufo/central"
62
+ end
63
+
64
+ def check_gitignore
65
+ ok = true
66
+ if File.exist?('.gitignore')
67
+ lines = IO.readlines('.gitignore')
68
+ ok = lines.detect do |line|
69
+ line =~ %r{/?.ufo/?$}
70
+ end
71
+ end
72
+ return if ok
73
+ logger.info "No .ufo found in your .gitignore file".color(:yellow)
74
+ logger.info <<~EOL
75
+ It's recommended to add .ufo to the .gitignore
76
+ When using ufo in a central fashion
77
+ EOL
78
+ end
79
+ end
80
+ end