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,253 +0,0 @@
1
- class Ufo::Stack
2
- class Context
3
- extend Memoist
4
- include Helper
5
- include Ufo::Settings
6
-
7
- attr_reader :stack_name
8
- def initialize(options)
9
- @options = options
10
- @task_definition = options[:task_definition]
11
- @service = options[:service]
12
- # no need to adjust @cluster or @stack_name because it was adjusted in Stack#initialize
13
- @cluster = options[:cluster].dup # Thor options are frozen, we thaw it because CustomProperties#substitute_variables does a sub!
14
- @stack_name = options[:stack_name]
15
-
16
- @stack = options[:stack]
17
- @new_stack = !@stack
18
- end
19
-
20
- def scope
21
- scope = Ufo::TemplateScope.new(Ufo::DSL::Helper.new, nil)
22
- # Add additional variable to scope for CloudFormation template.
23
- # Dirties the scope but needed.
24
- vars = {
25
- service: @service,
26
- cluster: @cluster,
27
- stack_name: @stack_name, # used in custom_properties
28
- container: container,
29
- # to reconstruct TaskDefinition in the CloudFormation template
30
- task_definition: @task_definition,
31
- rollback_definition_arn: @options[:rollback_definition_arn],
32
- # elb options remember that their 'state'
33
- create_elb: create_elb?, # helps set Ecs DependsOn
34
- elb_type: elb_type,
35
- subnet_mappings: subnet_mappings,
36
- create_route53: create_elb? && has_dns_name?,
37
- default_target_group_protocol: default_target_group_protocol,
38
- default_listener_protocol: default_listener_protocol,
39
- default_listener_ssl_protocol: default_listener_ssl_protocol,
40
- create_listener_ssl: create_listener_ssl?,
41
- }
42
-
43
- scope.assign_instance_variables(vars)
44
- scope
45
- end
46
- memoize :scope
47
-
48
- def has_dns_name?
49
- cfn.dig(:Dns, :Name) || cfn.dig(:dns, :name) # backwards compatiblity
50
- end
51
-
52
- def default_target_group_protocol
53
- return 'TCP' if elb_type == 'network'
54
- 'HTTP'
55
- end
56
-
57
- def default_listener_protocol
58
- port = cfn.dig(:Listener, :Port) || cfn.dig(:listener, :port) # backwards compatiblity
59
- if elb_type == 'network'
60
- port == 443 ? 'TLS' : 'TCP'
61
- else
62
- port == 443 ? 'HTTPS' : 'HTTP'
63
- end
64
- end
65
-
66
- def default_listener_ssl_protocol
67
- elb_type == 'network' ? 'TLS' : 'HTTPS'
68
- end
69
-
70
- # if the configuration is set to anything then enable it
71
- def create_listener_ssl?
72
- cfn.dig(:ListenerSsl, :Port) || cfn.dig(:listener_ssl, :port) # backwards compatiblity
73
- end
74
-
75
- def create_elb?
76
- create_elb, _ = elb_options
77
- create_elb == "true" # convert to boolean
78
- end
79
-
80
- # If --elb is not set at all and is nil, then it defaults to creating the load balancer if the ecs service has
81
- # a container name "web".
82
- #
83
- # --elb '' - will not crete an elb
84
- # --elb 'auto' - creates an elb
85
- # --elb arn:... - will not create elb and use the existing target group
86
- #
87
- def elb_options
88
- case @options[:elb]
89
- when "auto", "true", "yes"
90
- create_elb = "true"
91
- elb_target_group = ""
92
- when "false", "0", "no"
93
- create_elb = "false"
94
- elb_target_group = ""
95
- when /^arn:aws:elasticloadbalancing.*targetgroup/
96
- create_elb = "false"
97
- elb_target_group = @options[:elb]
98
- when "", nil
99
- create_elb, elb_target_group = default_elb_options
100
- else
101
- puts "Invalid --elb option provided: #{@options[:elb].inspect}".color(:red)
102
- puts "Exiting."
103
- exit 1
104
- end
105
- [create_elb, elb_target_group]
106
- end
107
-
108
- def default_elb_options
109
- # cannot use :use_previous_value because need to know the create_elb value to
110
- # compile a template with the right DependsOn for the Ecs service
111
- unless @new_stack
112
- create_elb = get_parameter_value(@stack, "CreateElb")
113
- elb_target_group = get_parameter_value(@stack, "ElbTargetGroup")
114
- return [create_elb, elb_target_group]
115
- end
116
-
117
- # default is to create the load balancer is if container name is web
118
- # and no --elb option is provided
119
- create_elb = container[:name] == "web" ? "true" : "false"
120
- elb_target_group = ""
121
- [create_elb, elb_target_group]
122
- end
123
-
124
- def container
125
- task_definition = Builder::Resources::TaskDefinition::Reconstructor.new(@task_definition, @options[:rollback]).reconstruct
126
-
127
- container_def = task_definition["ContainerDefinitions"].first
128
- requires_compatibilities = task_definition["RequiresCompatibilities"]
129
- fargate = requires_compatibilities && requires_compatibilities == ["FARGATE"]
130
- network_mode = task_definition["NetworkMode"]
131
-
132
- mappings = container_def["PortMappings"] || []
133
- unless mappings.empty?
134
- port = mappings.first["ContainerPort"]
135
- end
136
-
137
- result = {
138
- name: container_def["Name"],
139
- fargate: fargate,
140
- network_mode: network_mode, # awsvpc, bridge, etc
141
- }
142
- result[:port] = port if port
143
- result
144
- end
145
- memoize :container
146
-
147
- def get_parameter_value(stack, key)
148
- param = stack.parameters.find do |p|
149
- p.parameter_key == key
150
- end
151
- param.parameter_value if param
152
- end
153
-
154
- def scheduling_strategy
155
- unless @new_stack
156
- scheduling_strategy = get_parameter_value(@stack, "EcsSchedulingStrategy")
157
- end
158
- scheduling_strategy || 'REPLICA' # defaults to REPLICA
159
- end
160
-
161
- def reset_empty_eip_ids?
162
- # reset and remove eip allocation ids check
163
- @options[:elb_eip_ids] && @options[:elb_eip_ids].detect { |x| [' ', 'empty'].include?(x) }
164
- end
165
-
166
- def subnet_mappings
167
- return [] if reset_empty_eip_ids?
168
-
169
- elb_eip_ids = normalize_elb_eip_ids
170
- return build_subnet_mappings!(elb_eip_ids) unless elb_eip_ids.empty?
171
-
172
- unless @new_stack
173
- elb_eip_ids = get_parameter_value(@stack, "ElbEipIds").split(',')
174
- build_subnet_mappings(elb_eip_ids)
175
- end
176
- end
177
-
178
- def normalize_elb_eip_ids
179
- elb_eip_ids = @options[:elb_eip_ids] || []
180
- elb_eip_ids.uniq!
181
- elb_eip_ids
182
- end
183
-
184
- # Returns string, used as CloudFormation parameter.
185
- def elb_eip_ids
186
- return '' if reset_empty_eip_ids?
187
-
188
- elb_eip_ids = normalize_elb_eip_ids
189
- return elb_eip_ids.join(',') unless elb_eip_ids.empty?
190
-
191
- unless @new_stack
192
- return get_parameter_value(@stack, "ElbEipIds")
193
- end
194
-
195
- ''
196
- end
197
-
198
- def build_subnet_mappings!(allocations)
199
- unless allocations.size == network[:elb_subnets].size
200
- puts "ERROR: The allocation_ids must match in length to the subnets.".color(:red)
201
- puts "Please double check that .ufo/settings/network/#{settings.network_profile} has the same number of subnets as the eip allocation ids are you specifying."
202
- subnets = network[:elb_subnets]
203
- puts "Conigured subnets: #{subnets.inspect}"
204
- puts "Specified allocation ids: #{allocations.inspect}"
205
- exit 1
206
- end
207
-
208
- build_subnet_mappings(allocations)
209
- end
210
-
211
- def build_subnet_mappings(allocations)
212
- mappings = []
213
- allocations.sort.each_with_index do |allocation_id, i|
214
- mappings << [allocation_id, network[:elb_subnets][i]]
215
- end
216
- mappings
217
- end
218
-
219
- def elb_type
220
- # if option explicitly specified then change the elb type
221
- return @options[:elb_type] if @options[:elb_type]
222
- # user is trying to create a network load balancer if --elb-eip-ids is used
223
- elb_eip_ids = normalize_elb_eip_ids
224
- if !elb_eip_ids.empty?
225
- return "network"
226
- end
227
-
228
- # if not explicitly set, new stack will defeault to application load balancer
229
- if @new_stack # default for new stack
230
- return "application"
231
- end
232
-
233
- # find existing load balancer for type
234
- resp = cloudformation.describe_stack_resources(stack_name: @stack_name)
235
- resources = resp.stack_resources
236
- elb_resource = resources.find do |resource|
237
- resource.logical_resource_id == "Elb"
238
- end
239
-
240
- # In the case when stack exists and there is no elb resource, the elb type
241
- # doesnt really matter because the elb wont be created since the CreateElb
242
- # parameter is set to false. The elb type only needs to be set for the
243
- # template to validate.
244
- return "application" unless elb_resource
245
-
246
- resp = elb.describe_load_balancers(load_balancer_arns: [elb_resource.physical_resource_id])
247
- load_balancer = resp.load_balancers.first
248
- load_balancer.type
249
- end
250
- memoize :elb_type
251
-
252
- end
253
- end
@@ -1,55 +0,0 @@
1
- class Ufo::Stack
2
- module Helper
3
- include Ufo::AwsService
4
- include Ufo::Util
5
- include Ufo::Settings
6
- extend Memoist
7
-
8
- def find_stack(stack_name)
9
- resp = cloudformation.describe_stacks(stack_name: stack_name)
10
- resp.stacks.first
11
- rescue Aws::CloudFormation::Errors::ValidationError => e
12
- # example: Stack with id demo-web does not exist
13
- if e.message =~ /Stack with/ && e.message =~ /does not exist/
14
- nil
15
- else
16
- raise
17
- end
18
- end
19
-
20
- def adjust_stack_name(cluster, service)
21
- if settings[:stack_naming].nil?
22
- puts "WARN: In ufo v4.5 the UFO_ENV value gets appends to the end of the CloudFormation stack name. This means a new stack gets created. You must upgrade to using the new stack and delete the old stack manually. More info: https://ufoships.com/docs/upgrading/upgrade4.5/".color(:yellow)
23
- puts "To get rid of this warning you can add `stack_naming: append_ufo_env` to your `.ufo/settings.yml config. New versions of ufo init do this automatically."
24
- puts "Pausing for 20 seconds."
25
- sleep 20
26
- end
27
-
28
- parts = case settings[:stack_naming]
29
- when "prepend_cluster" # ufo v4.3 and below
30
- [cluster, service, Ufo.env_extra] # legacy
31
- when "append_cluster" # ufo v4.5
32
- # append_env will be removed in the next major version in favor of append_cluster to avoid confusion with
33
- # append_ufo_env
34
- [service, cluster, Ufo.env_extra]
35
- when "append_env" # ufo v5.0.3 and below: append_env is a bug, it appends cluster name instead of env name
36
- puts "WARN: Deprecation: The append_env is depreciated .ufo/settings.yaml".color(:yellow)
37
- puts "It appends the cluster env instead of the UFO_ENV env. This is unexpected behavior. "
38
- puts "To been fix this, please `stack_naming: append_ufo_env` instead. "
39
- [service, cluster, Ufo.env_extra] # bug - kept for backward compatibility
40
- when "append_ufo_env" # v5.1.0 fixes bug where append_env would append cluster name instead
41
- [service, Ufo.env, Ufo.env_extra]
42
- when "append_nothing", "prepend_nothing"
43
- [service, Ufo.env_extra]
44
- else # new default. ufo v4.5 and above
45
- [service, Ufo.env.to_s, Ufo.env_extra]
46
- end
47
- parts.reject {|x| x==''}.compact.join('-') # stack_name
48
- end
49
-
50
- def status
51
- Status.new(@stack_name)
52
- end
53
- memoize :status
54
- end
55
- end
@@ -1,13 +0,0 @@
1
- class Ufo::Stack
2
- class TemplateBody
3
- def initialize(context)
4
- @context = context
5
- end
6
-
7
- def build
8
- builder = Builder.new(@context)
9
- builder.build
10
- end
11
- end
12
- end
13
-
data/lib/ufo/stack.rb DELETED
@@ -1,213 +0,0 @@
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
25
- class Stack
26
- extend Memoist
27
- include Helper
28
- include Ufo::Settings
29
-
30
- def initialize(options)
31
- @options = options
32
- @task_definition = options[:task_definition]
33
- @rollback = options[:rollback]
34
- @service = options[:service]
35
- @cluster = @options[:cluster] || default_cluster(@service)
36
- @stack_name = adjust_stack_name(@cluster, options[:service])
37
- end
38
-
39
- def deploy
40
- @stack = find_stack(@stack_name)
41
- if @stack && rollback_complete?(@stack)
42
- puts "Existing stack in ROLLBACK_COMPLETE state. Deleting stack before continuing."
43
- cloudformation.delete_stack(stack_name: @stack_name)
44
- status.wait
45
- status.reset
46
- @stack = nil # at this point stack has been deleted
47
- end
48
-
49
- exit_with_message(@stack) if @stack && !updatable?(@stack)
50
-
51
- @stack ? perform(:update) : perform(:create)
52
-
53
- stop_old_tasks if @options[:stop_old_task]
54
-
55
- return unless @options[:wait]
56
- status.wait
57
-
58
- puts status.rollback_error_message if status.update_rollback?
59
-
60
- status.success?
61
- end
62
-
63
- def perform(action)
64
- puts "#{action[0..-2].capitalize}ing stack #{@stack_name.color(:green)}..."
65
- # Example: cloudformation.send("update_stack", stack_options)
66
- cloudformation.send("#{action}_stack", stack_options)
67
- rescue Aws::CloudFormation::Errors::ValidationError => e
68
- handle_stack_error(e)
69
- end
70
-
71
- def stack_options
72
- save_template
73
- if ENV['SAVE_TEMPLATE_EXIT']
74
- puts "Template saved. Exiting."
75
- exit 1
76
- end
77
- {
78
- capabilities: ["CAPABILITY_IAM"],
79
- notification_arns: notification_arns,
80
- parameters: parameters,
81
- stack_name: @stack_name,
82
- template_body: template_body,
83
- }
84
- end
85
-
86
- def notification_arns
87
- settings[:notification_arns] || []
88
- end
89
-
90
- def parameters
91
- create_elb, elb_target_group = context.elb_options
92
-
93
- elb_subnets = network[:elb_subnets] && !network[:elb_subnets].empty? ?
94
- network[:elb_subnets] :
95
- network[:ecs_subnets]
96
-
97
- params = {
98
- Vpc: network[:vpc],
99
- ElbSubnets: elb_subnets.join(','),
100
- EcsSubnets: network[:ecs_subnets].join(','),
101
-
102
- CreateElb: create_elb,
103
- ElbTargetGroup: elb_target_group,
104
- ElbEipIds: context.elb_eip_ids,
105
-
106
- EcsDesiredCount: current_desired_count,
107
- EcsSchedulingStrategy: scheduling_strategy,
108
- }
109
-
110
- params = Ufo::Utils::Squeezer.new(params).squeeze
111
- params.map do |k,v|
112
- if v == :use_previous_value
113
- { parameter_key: k, use_previous_value: true }
114
- else
115
- { parameter_key: k, parameter_value: v }
116
- end
117
- end
118
- end
119
- memoize :parameters
120
-
121
- # do not memoize template_body it can change for a rename retry
122
- def template_body
123
- TemplateBody.new(context).build
124
- end
125
- memoize :template_body
126
-
127
- def context
128
- o = @options.merge(
129
- cluster: @cluster,
130
- stack_name: @stack_name,
131
- stack: @stack,
132
- )
133
- o[:rollback_definition_arn] = rollback_definition_arn if rollback_definition_arn
134
- Context.new(o)
135
- end
136
- memoize :context
137
-
138
- def scheduling_strategy
139
- strategy = @options[:scheduling_strategy] || context.scheduling_strategy
140
- strategy.upcase
141
- end
142
-
143
- def current_desired_count
144
- # Cannot set ECS desired count when is scheduling_strategy DAEMON
145
- return '' if scheduling_strategy == "DAEMON"
146
-
147
- info = Info.new(@service, @options)
148
- service = info.service
149
- if service
150
- service.desired_count.to_s
151
- else
152
- "1" # new service default
153
- end
154
- end
155
-
156
- def rollback_definition_arn
157
- return unless @rollback
158
- resp = ecs.describe_task_definition(task_definition: @task_definition)
159
- resp.task_definition.task_definition_arn
160
- end
161
- memoize :rollback_definition_arn
162
-
163
- # Store template in tmp in case for debugging
164
- def save_template
165
- path = "/tmp/ufo/#{@stack_name}/stack.yml"
166
- FileUtils.mkdir_p(File.dirname(path))
167
- IO.write(path, template_body)
168
- puts "Generated template saved at: #{path}"
169
-
170
- path = "/tmp/ufo/#{@stack_name}/parameters.yml"
171
- IO.write(path, JSON.pretty_generate(parameters))
172
- puts "Generated parameters saved at: #{path}"
173
- end
174
-
175
- def exit_with_message(stack)
176
- region = `aws configure get region`.strip rescue "us-east-1"
177
- url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks"
178
- puts "The stack is not in an updateable state: #{stack.stack_status.color(:yellow)}."
179
- puts "Here's the CloudFormation url to check for more details #{url}"
180
- exit 1
181
- end
182
-
183
- # Assume only first container_definition to get the container info.
184
- # Stack:arn:aws:cloudformation:... is in ROLLBACK_COMPLETE state and can not be updated.
185
- def handle_stack_error(e)
186
- case e.message
187
- when /state and can not be updated/
188
- puts "The #{@stack_name} stack is in a state that cannot be updated. Deleted the stack and try again."
189
- puts "ERROR: #{e.message}"
190
- if message.include?('UPDATE_ROLLBACK_FAILED')
191
- puts "You might be able to do a 'Continue Update Rollback' and skip some resources to get the stack back into a good state."
192
- end
193
- region = `aws configure get region`.strip rescue 'us-east-1'
194
- url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}"
195
- puts "Here's the CloudFormation console url: #{url}"
196
- exit 1
197
- when /No updates are to be performed/
198
- puts "There are no updates to be performed. Exiting.".color(:yellow)
199
- exit 1
200
- else
201
- raise
202
- end
203
- end
204
-
205
- def rollback_complete?(stack)
206
- stack.stack_status == 'ROLLBACK_COMPLETE'
207
- end
208
-
209
- def updatable?(stack)
210
- stack.stack_status =~ /_COMPLETE$/ || stack.stack_status == 'UPDATE_ROLLBACK_FAILED'
211
- end
212
- end
213
- end
data/lib/ufo/status.rb DELETED
@@ -1,56 +0,0 @@
1
- module Ufo
2
- class Status < Base
3
- # used for the ufo status command
4
- def run
5
- unless stack_exists?(@stack_name)
6
- puts "The stack #{@stack_name.color(:green)} does not exist."
7
- return
8
- end
9
-
10
- resp = cloudformation.describe_stacks(stack_name: @stack_name)
11
- stack = resp.stacks.first
12
-
13
- puts "The current status for the stack #{@stack_name.color(:green)} is #{stack.stack_status.color(:green)}"
14
-
15
- status_poller = Stack::Status.new(@stack_name)
16
-
17
- if stack.stack_status =~ /_IN_PROGRESS$/
18
- puts "Stack events (tailing):"
19
- # tail all events until done
20
- status_poller.hide_time_took = true
21
- status_poller.wait
22
- else
23
- puts "Stack events:"
24
- # show the last events that was user initiated
25
- status_poller.refresh_events
26
- status_poller.show_events(true)
27
- end
28
- end
29
-
30
- def stack_exists?(stack_name)
31
- return true if ENV['TEST']
32
- return false if @options[:noop]
33
-
34
- exist = nil
35
- begin
36
- # When the stack does not exist an exception is raised. Example:
37
- # Aws::CloudFormation::Errors::ValidationError: Stack with id blah does not exist
38
- resp = cloudformation.describe_stacks(stack_name: stack_name)
39
- exist = true
40
- rescue Aws::CloudFormation::Errors::ValidationError => e
41
- if e.message =~ /does not exist/
42
- exist = false
43
- elsif e.message.include?("'stackName' failed to satisfy constraint")
44
- # Example of e.message when describe_stack with invalid stack name
45
- # "1 validation error detected: Value 'instance_and_route53' at 'stackName' failed to satisfy constraint: Member must satisfy regular expression pattern: [a-zA-Z][-a-zA-Z0-9]*|arn:[-a-zA-Z0-9:/._+]*"
46
- puts "Invalid stack name: #{stack_name}"
47
- puts "Full error message: #{e.message}"
48
- exit 1
49
- else
50
- raise # re-raise exception because unsure what other errors can happen
51
- end
52
- end
53
- exist
54
- end
55
- end
56
- end
data/lib/ufo/stop.rb DELETED
@@ -1,49 +0,0 @@
1
- module Ufo
2
- class Stop < Base
3
- def run
4
- info = Info.new(@service, @options)
5
- service = info.service
6
- return unless service # brand new deploy
7
-
8
- @deployments = service.deployments
9
- if @deployments.size > 1
10
- stop_old_tasks(service.service_name)
11
- end
12
- end
13
-
14
- def stop_old_tasks(service_name)
15
- # json = JSON.pretty_generate(deployments.map(&:to_h))
16
- # IO.write("/tmp/deployments.json", json)
17
- tasks = service_tasks(@cluster, service_name)
18
- reason = "Ufo #{Ufo::VERSION} has deployed new code and stopping old tasks."
19
- tasks.each do |task|
20
- next if task["task_definition_arn"] == latest_deployed_arn
21
- log "Stopping task #{task["task_arn"]}"
22
- ecs.stop_task(cluster: @cluster, task: task["task_arn"], reason: reason)
23
- end
24
- end
25
-
26
- # latest deployment task definition arn
27
- def latest_deployed_arn
28
- latest = @deployments.sort_by do |deployment|
29
- Time.parse(deployment["created_at"].to_s)
30
- end.last
31
- latest["task_definition"]
32
- end
33
-
34
- def service_tasks(cluster, service_name)
35
- all_task_arns = ecs.list_tasks(cluster: cluster, service_name: service_name).task_arns
36
- return [] if all_task_arns.empty?
37
- ecs.describe_tasks(cluster: cluster, tasks: all_task_arns).tasks
38
- end
39
-
40
- def log(text)
41
- path = "#{Ufo.root}/.ufo/log/stop.log"
42
- FileUtils.mkdir_p(File.dirname(path))
43
- File.open(path, 'a') do |f|
44
- f.puts("#{Time.now} #{text}")
45
- end
46
- puts text unless @options[:mute]
47
- end
48
- end
49
- end