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,14 +1,12 @@
1
1
  require "aws-logs"
2
2
 
3
- module Ufo
3
+ class Ufo::CLI
4
4
  class Logs < Base
5
- include AwsService
6
-
7
5
  delegate :service, to: :info
8
6
 
9
7
  def run
10
8
  log = find_log_group_name
11
- puts "Showing logs for log group: #{log["awslogs-group"]} and stream prefix #{log["awslogs-stream-prefix"]}"
9
+ puts "Showing logs for stack: #{@stack_name} log group: #{log["awslogs-group"]} and stream prefix: #{log["awslogs-stream-prefix"]}"
12
10
  if log
13
11
  cloudwatch_tail(log)
14
12
  else
@@ -17,7 +15,12 @@ module Ufo
17
15
  end
18
16
 
19
17
  def find_log_group_name
20
- resp = ecs.describe_task_definition(task_definition: info.service.task_definition)
18
+ unless info.service
19
+ logger.info "Cannot find ECS service for #{@stack_name}"
20
+ exit 1
21
+ end
22
+ task_definition = info.service.task_definition
23
+ resp = ecs.describe_task_definition(task_definition: task_definition)
21
24
 
22
25
  container_definitions = resp.task_definition.container_definitions
23
26
 
@@ -48,9 +51,13 @@ module Ufo
48
51
  follow: @options[:follow],
49
52
  format: @options[:format],
50
53
  }
51
- o[:filter_pattern] = @options[:filter_pattern] if @options[:filter_pattern]
54
+ o[:filter_pattern] = filter_pattern
52
55
  cw_tail = AwsLogs::Tail.new(o)
53
56
  cw_tail.run
54
57
  end
58
+
59
+ def filter_pattern
60
+ @options[:filter_pattern] ? @options[:filter_pattern] : Ufo.config.logs.filter_pattern
61
+ end
55
62
  end
56
63
  end
@@ -0,0 +1,16 @@
1
+ class Ufo::CLI::New
2
+ module Concerns
3
+ extend ActiveSupport::Concern
4
+
5
+ private
6
+ def class_name
7
+ name.underscore.camelize
8
+ end
9
+
10
+ # Files should be named with underscores instead of dashes even though project name can contain a dash.
11
+ # This is because autoloading works with underscores in the filenames only.
12
+ def underscore_name
13
+ name.underscore
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,24 @@
1
+ class Ufo::CLI::New
2
+ class Helper < Sequence
3
+ # required for name => underscore_name => .ufo/helpers/%underscore_name%_helper.rb.tt
4
+ argument :name, default: "custom"
5
+
6
+ def self.cli_options
7
+ [
8
+ [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
9
+ ]
10
+ end
11
+ cli_options.each do |args|
12
+ class_option(*args)
13
+ end
14
+
15
+ def set_source
16
+ set_template_source "helper"
17
+ end
18
+
19
+ def create_helper
20
+ logger.info "=> Creating #{name}_helper.rb"
21
+ directory ".", ".ufo/helpers"
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,68 @@
1
+ class Ufo::CLI::New
2
+ class Init < Sequence
3
+ def self.options
4
+ [
5
+ [:app, aliases: :a, desc: "App name. If not specified, it's inferred from the folder name"],
6
+ [:force, type: :boolean, desc: "Bypass overwrite are you sure prompt for existing files"],
7
+ # note: aliases: :r messes up Usage help: ufo init -h so not using it
8
+ [:repo, required: true, desc: "Docker repo to use. Example: ORG/REPO"],
9
+ ]
10
+ end
11
+ options.each { |o| class_option(*o) }
12
+
13
+ def set_source
14
+ set_template_source("init")
15
+ self.destination_root = '.'
16
+ end
17
+
18
+ def set_variables
19
+ @app = options[:app] || inferred_app
20
+ @repo = options[:repo]
21
+ end
22
+
23
+ def generate
24
+ puts "Generating .ufo structure"
25
+ directory "."
26
+ end
27
+
28
+ def update_gitignore
29
+ text =<<~EOL
30
+ .ufo/tmp
31
+ .ufo/log
32
+ .ufo/output
33
+ .secrets
34
+ EOL
35
+ if File.exist?(".gitignore")
36
+ append_to_file ".gitignore", text
37
+ else
38
+ create_file ".gitignore", text
39
+ end
40
+ end
41
+
42
+ def update_dockerignore
43
+ text = ".ufo\n"
44
+ if File.exist?(".dockerignore")
45
+ append_to_file ".dockerignore", text
46
+ else
47
+ create_file ".dockerignore", text
48
+ end
49
+ end
50
+
51
+ def create_dockefile
52
+ return if File.exist?("Dockerfile")
53
+ set_template_source("docker")
54
+ directory ".", "."
55
+ end
56
+
57
+ def user_message
58
+ puts "Starter .ufo files created"
59
+ puts <<~EOL
60
+ Congrats. You have successfully set up your project with ufo.
61
+ To deploy to ECS:
62
+
63
+ ufo ship
64
+
65
+ EOL
66
+ end
67
+ end
68
+ end
@@ -1,18 +1,40 @@
1
1
  require 'fileutils'
2
2
  require 'thor'
3
3
 
4
- module Ufo
4
+ class Ufo::CLI::New
5
5
  class Sequence < Thor::Group
6
+ include Concerns
6
7
  include Thor::Actions
8
+ include Ufo::Utils::Logging
7
9
 
8
10
  add_runtime_options! # force, pretend, quiet, skip options
9
11
  # https://github.com/erikhuda/thor/blob/master/lib/thor/actions.rb#L49
10
12
 
11
- def self.source_paths
12
- [File.expand_path("../../template", __FILE__)]
13
+ private
14
+ def self.set_template_source(folder)
15
+ path = File.expand_path("../../../templates/#{folder}", __dir__)
16
+ source_root path
17
+ end
18
+
19
+ def set_template_source(*paths)
20
+ paths = paths.flatten.map do |path|
21
+ File.expand_path("../../../templates/#{path}", __dir__)
22
+ end
23
+ set_template_paths(paths)
24
+ end
25
+
26
+ def set_template_paths(*paths)
27
+ paths.flatten!
28
+ # https://github.com/erikhuda/thor/blob/34df888d721ecaa8cf0cea97d51dc6c388002742/lib/thor/actions.rb#L128
29
+ instance_variable_set(:@source_paths, nil) # unset instance variable cache
30
+ # Using string with instance_eval because block doesnt have access to path at runtime.
31
+ instance_eval %{
32
+ def self.source_paths
33
+ #{paths.flatten.inspect}
34
+ end
35
+ }
13
36
  end
14
37
 
15
- private
16
38
  def inferred_app
17
39
  File.basename(Dir.pwd)
18
40
  end
@@ -0,0 +1,10 @@
1
+ class Ufo::CLI
2
+ class New < Ufo::Command
3
+ desc "helper", "Generate helper file"
4
+ long_desc Help.text("new/helper")
5
+ Helper.cli_options.each do |args|
6
+ option(*args)
7
+ end
8
+ register(Helper, "helper", "helper", "Generate helper file")
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ class Ufo::CLI
2
+ class Opts
3
+ def initialize(cli)
4
+ @cli = cli
5
+ end
6
+
7
+ def yes
8
+ with_cli_scope do
9
+ option :yes, aliases: :y, type: :boolean, desc: "Bypass are you sure prompt"
10
+ end
11
+ end
12
+
13
+ def docker
14
+ with_cli_scope do
15
+ option :docker, type: :boolean, default: true, desc: "Skip docker build"
16
+ end
17
+ end
18
+
19
+ # Based on https://github.com/rails/thor/blob/ab3b5be455791f4efb79f0efb4f88cc6b59c8ccf/lib/thor/actions.rb#L48
20
+ def runtime_options
21
+ with_cli_scope do
22
+ option :force, :type => :boolean, :aliases => "-f", :group => :runtime,
23
+ :desc => "Overwrite files that already exist"
24
+
25
+ option :skip, :type => :boolean, :aliases => "-s", :group => :runtime,
26
+ :desc => "Skip files that already exist"
27
+ end
28
+ end
29
+
30
+ private
31
+ def with_cli_scope(&block)
32
+ @cli.instance_eval(&block)
33
+ end
34
+ end
35
+ end
@@ -1,9 +1,7 @@
1
- class Ufo::Ps
1
+ class Ufo::CLI::Ps
2
2
  class Task
3
3
  def self.header
4
- header = %w[Id Name Release Started Status Notes]
5
- header << "Container Instance" if extra_columns
6
- header
4
+ %w[Task Name Release Started Status Notes]
7
5
  end
8
6
 
9
7
  def initialize(task)
@@ -12,7 +10,6 @@ class Ufo::Ps
12
10
 
13
11
  def to_a
14
12
  row = [id, name, release, started, status, notes]
15
- row << container_instance_arn if extra_columns
16
13
  row
17
14
  end
18
15
 
@@ -21,9 +18,12 @@ class Ufo::Ps
21
18
  end
22
19
 
23
20
  def name
24
- @task["overrides"]["container_overrides"].first["name"]
21
+ container_overrides = @task.dig("overrides", "container_overrides")
22
+ overrides = container_overrides.first # assume first is one we want
23
+ overrides["name"] if overrides # PENDING wont yet have info
25
24
  rescue NoMethodError
26
- @task["containers"].first["name"]
25
+ container = @task["containers"].first
26
+ container["name"] if container # PENDING wont yet have info
27
27
  end
28
28
 
29
29
  def container_instance_arn
@@ -48,26 +48,32 @@ class Ufo::Ps
48
48
 
49
49
  # hide stopped tasks have been stopped for more than 5 minutes
50
50
  # created_at=2018-07-05 21:52:13 -0700,
51
- # started_at=2018-07-05 21:52:15 -0700,
52
- # stopping_at=2018-07-05 22:03:44 -0700,
53
- # stopped_at=2018-07-05 22:03:45 -0700,
51
+ # started_at=2018-07-05 21:52:15 -0700,
52
+ # stopping_at=2018-07-05 22:03:44 -0700,
53
+ # stopped_at=2018-07-05 22:03:45 -0700,
54
54
  def hide?
55
55
  stopped_at = time(@task["stopped_at"])
56
- status == "STOPPED" && stopped_at < Time.now - 60 * 5
56
+ time = Time.now - 60 * Ufo.config.ps.hide_age
57
+ status == "STOPPED" && stopped_at < time
57
58
  end
58
59
 
59
60
  def status
60
61
  @task["last_status"]
61
62
  end
62
63
 
64
+ # Grab all the reasons and surface to user.
65
+ # Even though will make the table output ugly, debugging info merits it.
66
+ #
67
+ # ufo ps --format json
68
+ #
63
69
  def notes
64
70
  return unless @task["stopped_reason"]
65
-
66
- if @task["stopped_reason"] =~ /Task failed ELB health checks/
67
- "Failed ELB health check"
68
- else
69
- @task["stopped_reason"]
71
+ notes = []
72
+ notes << "Task Stopped Reason: #{@task["stopped_reason"]}."
73
+ @task.containers.each do |container|
74
+ notes << "Container #{container.name} reason: #{container.reason}" unless container.reason.blank?
70
75
  end
76
+ notes.join(" ")
71
77
  end
72
78
 
73
79
  # https://stackoverflow.com/questions/195740/how-do-you-do-relative-time-in-rails/195894
@@ -86,18 +92,5 @@ class Ufo::Ps
86
92
  start_time.strftime("%m/%d/%Y")
87
93
  end
88
94
  end
89
-
90
- @@extra_columns = false
91
- def self.extra_columns=(val)
92
- @@extra_columns = val
93
- end
94
-
95
- def self.extra_columns
96
- @@extra_columns
97
- end
98
-
99
- def extra_columns
100
- self.class.extra_columns
101
- end
102
95
  end
103
96
  end
data/lib/ufo/cli/ps.rb ADDED
@@ -0,0 +1,190 @@
1
+ require 'text-table'
2
+ require 'tty-screen'
3
+
4
+ class Ufo::CLI
5
+ class Ps < Base
6
+ include Ufo::AwsServices
7
+ include Ufo::Concerns::Autoscaling
8
+ delegate :service, to: :info
9
+
10
+ def run
11
+ unless service
12
+ logger.info info.no_service_message
13
+ return
14
+ end
15
+
16
+ summary
17
+
18
+ if task_arns.empty?
19
+ logger.info "There are 0 running tasks."
20
+ return
21
+ end
22
+
23
+ all_task_arns = task_arns.each_slice(100).map do |arns|
24
+ resp = ecs.describe_tasks(tasks: arns, cluster: @cluster)
25
+ resp["tasks"]
26
+ end.flatten
27
+
28
+ display_tasks(all_task_arns)
29
+ display_scale_help
30
+ display_target_group_help
31
+ end
32
+
33
+ def summary
34
+ return unless Ufo.config.ps.summary
35
+
36
+ logger.info "Stack: #{@stack_name}"
37
+ logger.info "Service: #{service.service_name}"
38
+ logger.info "Status: #{service.status}" unless service.status == "ACTIVE" # not very useful when ACTIVE
39
+ logger.info "Tasks: #{tasks_counts}"
40
+ logger.info "Launch type: #{service.launch_type}" if service.launch_type
41
+ elb = info.load_balancer(service)
42
+ logger.info "#{elb.type.capitalize} ELB: #{elb.dns_name}" if elb
43
+ logger.info "Url: #{info.url}" if info.url
44
+ end
45
+
46
+ def tasks_counts
47
+ message = "Running: #{service.running_count} Desired: #{service.desired_count}"
48
+ if scalable_target
49
+ message += " Min: #{scalable_target.min_capacity} Max: #{scalable_target.max_capacity}"
50
+ end
51
+ message
52
+ end
53
+
54
+ def scalable_target
55
+ return unless autoscaling_enabled?
56
+ # Docs: https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/ApplicationAutoScaling/Client.html#describe_scalable_targets-instance_method
57
+ # ECS service - The resource type is service and the unique identifier is the cluster name and service name. Example: service/default/sample-webapp.
58
+ resource_id = "service/#{@cluster}/#{service.service_name}"
59
+ resp = applicationautoscaling.describe_scalable_targets(
60
+ service_namespace: "ecs",
61
+ resource_ids: [resource_id],
62
+ )
63
+ resp.scalable_targets.first # scalable_target
64
+ end
65
+
66
+ def display_target_group_help
67
+ events = service["events"][0..4]
68
+ return if events[0].message =~ /has reached a steady state/
69
+
70
+ # The error currently happens to be the 5th element.
71
+ #
72
+ # Example:
73
+ # "(service XXX) (instance i-XXX) (port 32875) is unhealthy in (target-group arn:aws:elasticloadbalancing:us-east-1:111111111111:targetgroup/devel-Targe-1111111111111/1111111111111111) due to (reason Health checks failed with these codes: [400])">]
74
+ error_event = events.find do |e|
75
+ e.message =~ /is unhealthy in/ &&
76
+ e.message =~ /targetgroup/
77
+ end
78
+ return unless error_event
79
+
80
+ logger.error "There are targets in the target group reporting unhealthy. This can cause containers to cycle. Here's the error:"
81
+ logger.error error_event.message.color(:red)
82
+ logger.error <<~EOL
83
+ Check out the ECS console and EC2 Load Balancer console for more info.
84
+ Sometimes they may not helpful :(
85
+ Docs that may help: https://ufoships.com/docs/debug/unhealthy-targets/
86
+ EOL
87
+ end
88
+
89
+ # If the running count less than the desired account yet, check the events
90
+ # and show a message with helpful debugging information.
91
+ def display_scale_help
92
+ return if service.running_count >= service.desired_count
93
+
94
+ events = service["events"][0..3] # only check most recent 4 messages
95
+ error_event = events.find do |e|
96
+ e.message =~ /was unable to place a task/
97
+ end
98
+ return unless error_event
99
+
100
+ logger.info "There is an issue scaling the #{@service.color(:green)} service to #{service.desired_count}. Here's the error:"
101
+ logger.info error_event.message.color(:red)
102
+ if service.launch_type == "EC2"
103
+ logger.info "If AutoScaling is set up for the container instances, it can take a little time to add additional instances. You'll see this message until the capacity is added."
104
+ end
105
+ end
106
+
107
+ def display_tasks(raw_tasks)
108
+ raw_tasks.sort_by! { |t| t["task_arn"] }
109
+ tasks = raw_tasks.map { |t| Task.new(t) } # will have Task objects after this point
110
+ tasks = tasks.reject(&:hide?)
111
+ show_notes = show_notes(tasks)
112
+
113
+ format = determine_format(tasks)
114
+ o = @options.dup # Cant modify frozen Thor options
115
+ o[:format] ||= format
116
+
117
+ presenter = CliFormat::Presenter.new(o)
118
+ header = show_notes ? Task.header : Task.header[0..-2]
119
+ presenter.header = header
120
+ tasks.each do |task|
121
+ row = show_notes ? task.to_a : task.to_a[0..-2]
122
+ presenter.rows << row
123
+ end
124
+ presenter.show
125
+ end
126
+
127
+ def show_notes(tasks)
128
+ tasks.detect { |t| !t.notes.blank? }
129
+ end
130
+
131
+ # auto format will display in json if the output is to wide
132
+ # otherwise it defaults to table
133
+ def determine_format(tasks)
134
+ if Ufo.config.ps.format == "auto"
135
+ max = max_table_width(tasks)
136
+ max >= TTY::Screen.width ? "json" : "table"
137
+ else
138
+ Ufo.config.ps.format
139
+ end
140
+ end
141
+
142
+ def max_table_width(tasks)
143
+ max = 0
144
+ tasks.each do |row|
145
+ columns = row.to_a
146
+ width = columns.inject(0) do |total, column|
147
+ total += column.to_s.length
148
+ end
149
+ max = width if width >= max
150
+ end
151
+ padding = Task.header.size * 3 + 4
152
+ # max full column width. accounts for all the rows plus the padding from the table output
153
+ max + padding
154
+ end
155
+
156
+ def statuses
157
+ status = @options[:status] || "ALL" # can be nil when used from ship
158
+ status = status.upcase
159
+ valid_statuses = %w[RUNNING PENDING STOPPED]
160
+ all_statuses = valid_statuses + ["ALL"]
161
+ unless all_statuses.include?(status)
162
+ logger.error "Invalid status filter provided. Please provided one of the following:"
163
+ logger.error all_statuses.map(&:downcase).join(", ")
164
+ exit 1
165
+ end
166
+
167
+ status == "ALL" ? valid_statuses : [status]
168
+ end
169
+
170
+ def task_arns
171
+ threads, results = [], {}
172
+ statuses.each do |status|
173
+ threads << Thread.new do
174
+ options = {
175
+ service_name: service.service_name,
176
+ cluster: @cluster,
177
+ desired_status: status,
178
+ }
179
+ # Limit display of too many stopped tasks
180
+ options[:max_results] = 20 if status == "STOPPED"
181
+ resp = ecs.list_tasks(options)
182
+ results[status] = resp.task_arns
183
+ end
184
+ end
185
+ threads.map(&:join)
186
+ results.values.flatten.uniq
187
+ end
188
+ memoize :task_arns
189
+ end
190
+ end
@@ -1,13 +1,13 @@
1
1
  require 'text-table'
2
2
 
3
- module Ufo
3
+ class Ufo::CLI
4
4
  class Releases < Base
5
5
  def list
6
- puts "Recent task definitions for this service:"
7
- arns = task_definition_arns(@service)
6
+ logger.info "Latest task definitions for stack: #{@stack_name}"
7
+ arns = task_definition_arns(@task_definition.name)
8
8
  task_definitions = arns.map { |arn| arn.split('/').last }
9
9
  task_definitions.each do |name|
10
- puts " #{name}"
10
+ logger.info " #{name}"
11
11
  end
12
12
  end
13
13
  end
@@ -1,11 +1,13 @@
1
- module Ufo
1
+ class Ufo::CLI
2
2
  class Rollback < Base
3
- def deploy
4
- task_definition = normalize_version(@options[:version])
5
- puts "Rolling back ECS service to task definition #{task_definition}"
3
+ include Ufo::Concerns
6
4
 
7
- ship = Ship.new(@service, @options.merge(task_definition: task_definition, rollback: true))
8
- ship.deploy
5
+ def deploy
6
+ are_you_sure?
7
+ rollback_task_definition = normalize_version(@options[:version])
8
+ logger.info "Rolling back ECS Service to task definition: #{rollback_task_definition}"
9
+ ship = Ship.new(@options.merge(rollback_task_definition: rollback_task_definition, rollback: true, yes: true))
10
+ ship.run
9
11
  end
10
12
 
11
13
  # normalizes the task definition
@@ -14,11 +16,11 @@ module Ufo
14
16
  # demo-web:1 => demo-web:1
15
17
  def normalize_version(version)
16
18
  if version =~ /^\d+$/
17
- "#{@service}:#{version}"
19
+ "#{@task_definition.name}:#{version}"
18
20
  elsif version.include?(':') && !version.include?(":ufo-")
19
21
  version
20
22
  else # assume git sha
21
- # tongueroo/demo-ufo:ufo-2018-06-21T15-03-52-ac60240
23
+ # org/repo:ufo-2018-06-21T15-03-52-ac60240
22
24
  from_git_sha(version)
23
25
  end
24
26
  end
@@ -26,8 +28,8 @@ module Ufo
26
28
  def from_git_sha(sha)
27
29
  task_definition = nil
28
30
  max_items = 30
29
- puts "Looking for task definition based on the git sha. Searching most recent #{max_items} task definitions..."
30
- arns = task_definition_arns(@service, max_items)
31
+ logger.info "Looking for task definition based on the git sha. Searching most recent #{max_items} task definitions..."
32
+ arns = task_definition_arns(@task_definition.name, max_items)
31
33
  arns.each do |arn|
32
34
  resp = ecs.describe_task_definition(task_definition: arn)
33
35
  found = find_sha(resp.task_definition, sha)
@@ -39,9 +41,9 @@ module Ufo
39
41
  @final_newline
40
42
  end
41
43
 
42
- puts '' if @final_newline
44
+ logger.info '' if @final_newline
43
45
  unless task_definition
44
- puts "Unable to find a task definition with a image with: #{version}"
46
+ logger.info "Unable to find a task definition with a image with: #{version}"
45
47
  end
46
48
  task_definition
47
49
  end
@@ -50,5 +52,15 @@ module Ufo
50
52
  container = task_definition["container_definitions"].first # assume first
51
53
  container["image"].include?(sha)
52
54
  end
55
+
56
+ private
57
+ def are_you_sure?
58
+ message = "Will rollback to task definition version: #{@options[:version]}"
59
+ if @options[:yes]
60
+ logger.info message
61
+ else
62
+ sure?(message)
63
+ end
64
+ end
53
65
  end
54
66
  end