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.
- checksums.yaml +4 -4
- data/.cody/README.md +19 -0
- data/.cody/acceptance/bin/build.sh +90 -0
- data/.cody/acceptance/buildspec.yml +10 -0
- data/.cody/acceptance/project.rb +11 -0
- data/.cody/acceptance/role.rb +28 -0
- data/.cody/shared/script/install/ufo.sh +40 -0
- data/.cody/shared/script/install.sh +5 -0
- data/.github/workflows/main.yml +28 -0
- data/CHANGELOG.md +4 -1
- data/Gemfile +0 -2
- data/README.md +1 -32
- data/lib/templates/docker/Dockerfile +4 -0
- data/lib/templates/helper/%underscore_name%_helper.rb.tt +6 -0
- data/lib/templates/init/.ufo/config/web/base.rb +6 -0
- data/lib/templates/init/.ufo/config/web/dev.rb +6 -0
- data/lib/templates/init/.ufo/config/web/prod.rb +6 -0
- data/lib/templates/init/.ufo/config.rb.tt +39 -0
- data/lib/templates/init/.ufo/resources/iam_roles/execution_role.rb +23 -0
- data/lib/templates/init/.ufo/resources/iam_roles/task_role.rb +20 -0
- data/lib/templates/init/.ufo/resources/task_definitions/web.yml +29 -0
- data/lib/templates/init/.ufo/vars/base.rb +20 -0
- data/lib/templates/init/.ufo/vars/dev.rb +4 -0
- data/lib/templates/init/.ufo/vars/prod.rb +4 -0
- data/lib/ufo/aws_services.rb +118 -0
- data/lib/ufo/booter.rb +27 -0
- data/lib/ufo/cfn/base.rb +7 -0
- data/lib/ufo/cfn/deploy.rb +54 -0
- data/lib/ufo/{stack → cfn/stack}/builder/base.rb +12 -23
- data/lib/ufo/cfn/stack/builder/conditions.rb +25 -0
- data/lib/ufo/{stack → cfn/stack}/builder/outputs.rb +2 -2
- data/lib/ufo/cfn/stack/builder/parameters.rb +34 -0
- data/lib/ufo/cfn/stack/builder/resources/base.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/dns.rb +47 -0
- data/lib/ufo/{stack/builder/resources/ecs.rb → cfn/stack/builder/resources/ecs_service.rb} +11 -10
- data/lib/ufo/cfn/stack/builder/resources/elb.rb +35 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/base.rb +32 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/execution_role.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/iam_roles/task_role.rb +4 -0
- data/lib/ufo/cfn/stack/builder/resources/listener.rb +65 -0
- data/lib/ufo/cfn/stack/builder/resources/listener_ssl.rb +44 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/base.rb +5 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/policy.rb +27 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/role.rb +33 -0
- data/lib/ufo/cfn/stack/builder/resources/scaling/target.rb +22 -0
- data/lib/ufo/cfn/stack/builder/resources/security_group/base.rb +4 -0
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/ecs_rule.rb +2 -2
- data/lib/ufo/{stack → cfn/stack}/builder/resources/security_group/elb.rb +5 -6
- data/lib/ufo/{stack → cfn/stack}/builder/resources/target_group.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition/reconstructor.rb +4 -4
- data/lib/ufo/{stack → cfn/stack}/builder/resources/task_definition.rb +4 -4
- data/lib/ufo/cfn/stack/builder/resources.rb +24 -0
- data/lib/ufo/cfn/stack/builder.rb +30 -0
- data/lib/ufo/{stack → cfn/stack}/custom_properties.rb +21 -5
- data/lib/ufo/cfn/stack/params.rb +51 -0
- data/lib/ufo/{stack → cfn/stack}/status.rb +2 -2
- data/lib/ufo/cfn/stack/template.rb +8 -0
- data/lib/ufo/cfn/stack/vars.rb +110 -0
- data/lib/ufo/cfn/stack/vpc.rb +31 -0
- data/lib/ufo/cfn/stack.rb +175 -0
- data/lib/ufo/cli/base.rb +18 -0
- data/lib/ufo/cli/build.rb +30 -0
- data/lib/ufo/cli/cancel.rb +18 -0
- data/lib/ufo/cli/central/update.rb +80 -0
- data/lib/ufo/cli/central.rb +12 -0
- data/lib/ufo/cli/clean.rb +17 -0
- data/lib/ufo/cli/destroy.rb +31 -0
- data/lib/ufo/{docker.rb → cli/docker.rb} +18 -18
- data/lib/ufo/cli/exec.rb +82 -0
- data/lib/ufo/cli/help/central/update.md +20 -0
- data/lib/ufo/{help → cli/help}/completion.md +0 -0
- data/lib/ufo/{help → cli/help}/completion_script.md +0 -0
- data/lib/ufo/cli/help/destroy.md +9 -0
- data/lib/ufo/cli/help/docker/base.md +39 -0
- data/lib/ufo/{help → cli/help}/docker/build.md +9 -9
- data/lib/ufo/{help → cli/help}/docker/clean.md +8 -8
- data/lib/ufo/{help → cli/help}/docker/compile.md +0 -0
- data/lib/ufo/cli/help/docker/name.md +16 -0
- data/lib/ufo/{help → cli/help}/docker/push.md +0 -0
- data/lib/ufo/cli/help/docker.md +6 -0
- data/lib/ufo/{help → cli/help}/help.md +1 -1
- data/lib/ufo/cli/help/init.md +27 -0
- data/lib/ufo/{help → cli/help}/logs.md +5 -4
- data/lib/ufo/cli/help/ps.md +12 -0
- data/lib/ufo/cli/help/releases.md +15 -0
- data/lib/ufo/cli/help/rollback.md +40 -0
- data/lib/ufo/cli/help/scale.md +7 -0
- data/lib/ufo/cli/help/ship.md +41 -0
- data/lib/ufo/cli/help/stop.md +3 -0
- data/lib/ufo/cli/help.rb +62 -0
- data/lib/ufo/{logs.rb → cli/logs.rb} +13 -6
- data/lib/ufo/cli/new/concerns.rb +16 -0
- data/lib/ufo/cli/new/helper.rb +24 -0
- data/lib/ufo/cli/new/init.rb +68 -0
- data/lib/ufo/{sequence.rb → cli/new/sequence.rb} +26 -4
- data/lib/ufo/cli/new.rb +10 -0
- data/lib/ufo/cli/opts.rb +35 -0
- data/lib/ufo/{ps → cli/ps}/task.rb +22 -29
- data/lib/ufo/cli/ps.rb +190 -0
- data/lib/ufo/{releases.rb → cli/releases.rb} +4 -4
- data/lib/ufo/{rollback.rb → cli/rollback.rb} +24 -12
- data/lib/ufo/cli/scale.rb +76 -0
- data/lib/ufo/cli/ship.rb +28 -0
- data/lib/ufo/cli/status.rb +8 -0
- data/lib/ufo/cli/stop.rb +49 -0
- data/lib/ufo/{tasks.rb → cli/tasks.rb} +2 -2
- data/lib/ufo/{upgrade.rb → cli/upgrade.rb} +2 -2
- data/lib/ufo/cli.rb +82 -172
- data/lib/ufo/command.rb +56 -1
- data/lib/ufo/concerns/autoscaling.rb +11 -0
- data/lib/ufo/concerns/names.rb +9 -0
- data/lib/ufo/concerns.rb +26 -0
- data/lib/ufo/config/inits.rb +13 -0
- data/lib/ufo/config.rb +187 -0
- data/lib/ufo/core.rb +32 -44
- data/lib/ufo/docker/builder.rb +44 -40
- data/lib/ufo/docker/cleaner.rb +9 -12
- data/lib/ufo/docker/compiler.rb +10 -4
- data/lib/ufo/docker/concerns.rb +7 -0
- data/lib/ufo/docker/dockerfile.rb +13 -9
- data/lib/ufo/docker/pusher.rb +13 -25
- data/lib/ufo/docker/state.rb +63 -0
- data/lib/ufo/ecr/auth.rb +8 -7
- data/lib/ufo/ecr/cleaner.rb +10 -14
- data/lib/ufo/ext/core/module.rb +31 -0
- data/lib/ufo/ext/core/nil_class.rb +11 -0
- data/lib/ufo/ext.rb +2 -0
- data/lib/ufo/{role → iam_role}/builder.rb +1 -1
- data/lib/ufo/{role → iam_role}/dsl.rb +8 -2
- data/lib/ufo/{role → iam_role}/registry.rb +1 -1
- data/lib/ufo/info.rb +22 -4
- data/lib/ufo/layering/layer.rb +95 -0
- data/lib/ufo/layering.rb +23 -0
- data/lib/ufo/log_group.rb +18 -10
- data/lib/ufo/logger/formatter.rb +13 -0
- data/lib/ufo/logger.rb +32 -0
- data/lib/ufo/names.rb +69 -0
- data/lib/ufo/param.rb +2 -1
- data/lib/ufo/task_definition/builder.rb +7 -0
- data/lib/ufo/task_definition/context.rb +45 -0
- data/lib/ufo/task_definition/erb/base.rb +18 -0
- data/lib/ufo/task_definition/erb/json.rb +28 -0
- data/lib/ufo/task_definition/erb/yaml.rb +18 -0
- data/lib/ufo/task_definition/erb.rb +78 -0
- data/lib/ufo/task_definition/helpers/aws_data_helper.rb +18 -0
- data/lib/ufo/task_definition/helpers/core.rb +50 -0
- data/lib/ufo/task_definition/helpers/ssm/fetcher.rb +39 -0
- data/lib/ufo/task_definition/helpers/ssm.rb +8 -0
- data/lib/ufo/task_definition/helpers/stack_output.rb +23 -0
- data/lib/ufo/{dsl/helper → task_definition/helpers}/vars.rb +40 -19
- data/lib/ufo/task_definition/helpers/vpc.rb +48 -0
- data/lib/ufo/task_definition/helpers.rb +5 -0
- data/lib/ufo/task_definition.rb +19 -0
- data/lib/ufo/upgrade/upgrade3.rb +1 -1
- data/lib/ufo/upgrade/upgrade4.rb +3 -3
- data/lib/ufo/utils/execute.rb +30 -0
- data/lib/ufo/utils/logging.rb +7 -0
- data/lib/ufo/utils/pretty.rb +18 -0
- data/lib/ufo/utils/squeezer.rb +1 -1
- data/lib/ufo/utils/sure.rb +23 -0
- data/lib/ufo/version.rb +1 -1
- data/lib/ufo/yaml/loader.rb +48 -0
- data/lib/ufo/yaml/validator.rb +51 -0
- data/lib/ufo/yaml.rb +13 -0
- data/lib/ufo.rb +12 -2
- data/spec/spec_helper.rb +4 -26
- data/spec/{lib → ufo}/ecr_auth_spec.rb +0 -0
- data/spec/{lib → ufo}/ecr_cleaner_spec.rb +0 -2
- data/spec/{lib/role → ufo/iam_role}/builder_spec.rb +5 -5
- data/spec/{lib/role → ufo/iam_role}/dsl_spec.rb +3 -3
- data/spec/{lib → ufo}/logs_spec.rb +2 -2
- data/ufo.gemspec +9 -3
- metadata +244 -341
- data/.circleci/bin/commit_docs.sh +0 -26
- data/.circleci/config.yml +0 -78
- data/.gitmodules +0 -0
- data/docs/.gitignore +0 -5
- data/docs/CNAME +0 -1
- data/docs/Gemfile +0 -4
- data/docs/LICENSE +0 -21
- data/docs/README.md +0 -20
- data/docs/_config.yml +0 -75
- data/docs/_docs/aws-ecs-task-execution-role.md +0 -28
- data/docs/_docs/conventions.md +0 -47
- data/docs/_docs/extras/codebuild-iam-role.md +0 -46
- data/docs/_docs/extras/dockerfile-erb.md +0 -60
- data/docs/_docs/extras/ecs-network-mode.md +0 -37
- data/docs/_docs/extras/load-balancer.md +0 -83
- data/docs/_docs/extras/minimal-deploy-iam.md +0 -79
- data/docs/_docs/extras/notification-arns.md +0 -21
- data/docs/_docs/extras/redirection-support.md +0 -27
- data/docs/_docs/extras/route53-support.md +0 -27
- data/docs/_docs/extras/security-groups.md +0 -36
- data/docs/_docs/extras/ssl-support.md +0 -20
- data/docs/_docs/faq.md +0 -100
- data/docs/_docs/fargate.md +0 -5
- data/docs/_docs/helpers.md +0 -24
- data/docs/_docs/iam-roles.md +0 -112
- data/docs/_docs/install.md +0 -25
- data/docs/_docs/more/auto-completion.md +0 -24
- data/docs/_docs/more/automated-cleanup.md +0 -14
- data/docs/_docs/more/customize-cloudformation.md +0 -35
- data/docs/_docs/more/migrations.md +0 -25
- data/docs/_docs/more/run-in-pieces.md +0 -30
- data/docs/_docs/more/single-task.md +0 -25
- data/docs/_docs/more/stuck-cloudformation.md +0 -29
- data/docs/_docs/more/why-cloudformation.md +0 -21
- data/docs/_docs/next-steps.md +0 -16
- data/docs/_docs/quick-start-ec2.md +0 -86
- data/docs/_docs/secrets.md +0 -135
- data/docs/_docs/settings/aws_profile.md +0 -36
- data/docs/_docs/settings/cfn.md +0 -12
- data/docs/_docs/settings/cluster.md +0 -66
- data/docs/_docs/settings/manage-security-groups.md +0 -24
- data/docs/_docs/settings/network.md +0 -45
- data/docs/_docs/settings.md +0 -55
- data/docs/_docs/ssl_errors.md +0 -40
- data/docs/_docs/structure.md +0 -41
- data/docs/_docs/tutorial-ufo-docker-build.md +0 -61
- data/docs/_docs/tutorial-ufo-init.md +0 -86
- data/docs/_docs/tutorial-ufo-ship.md +0 -95
- data/docs/_docs/tutorial-ufo-ships.md +0 -38
- data/docs/_docs/tutorial-ufo-tasks-build.md +0 -177
- data/docs/_docs/tutorial.md +0 -14
- data/docs/_docs/ufo-current.md +0 -49
- data/docs/_docs/ufo-env-extra.md +0 -22
- data/docs/_docs/ufo-env.md +0 -46
- data/docs/_docs/ufo-logs.md +0 -49
- data/docs/_docs/ufo-task-params.md +0 -43
- data/docs/_docs/ufo-tasks-register.md +0 -21
- data/docs/_docs/upgrading/upgrade4.5.md +0 -52
- data/docs/_docs/upgrading/upgrade4.md +0 -48
- data/docs/_docs/upgrading/upgrade5.md +0 -19
- data/docs/_docs/upgrading.md +0 -13
- data/docs/_docs/variables.md +0 -55
- data/docs/_includes/about.html +0 -19
- data/docs/_includes/banner/foot.html +0 -2
- data/docs/_includes/banner/head.html +0 -5
- data/docs/_includes/cfn-customize.md +0 -53
- data/docs/_includes/commands.html +0 -80
- data/docs/_includes/contact.html +0 -17
- data/docs/_includes/contact_disqus.html +0 -16
- data/docs/_includes/contact_static.html +0 -17
- data/docs/_includes/content.html +0 -26
- data/docs/_includes/css/bootstrap.min.css +0 -7
- data/docs/_includes/css/main.css +0 -501
- data/docs/_includes/css/quotes.css +0 -102
- data/docs/_includes/css/syntax.css +0 -65
- data/docs/_includes/css/table.css +0 -53
- data/docs/_includes/css/timeline.css +0 -201
- data/docs/_includes/css/ufo.css +0 -218
- data/docs/_includes/edit-on-github.html +0 -11
- data/docs/_includes/example.html +0 -63
- data/docs/_includes/footer.html +0 -44
- data/docs/_includes/google_analytics.html +0 -10
- data/docs/_includes/head.html +0 -32
- data/docs/_includes/header.html +0 -15
- data/docs/_includes/js.html +0 -32
- data/docs/_includes/js_disqus.html +0 -21
- data/docs/_includes/modals.html +0 -40
- data/docs/_includes/nav.html +0 -27
- data/docs/_includes/prev_next.md +0 -19
- data/docs/_includes/quotes.html +0 -19
- data/docs/_includes/reference.md +0 -5
- data/docs/_includes/repo_push_access.md +0 -11
- data/docs/_includes/subnav.html +0 -78
- data/docs/_includes/summary.html +0 -22
- data/docs/_includes/ufo-ship-options.md +0 -12
- data/docs/_includes/uses.html +0 -19
- data/docs/_layouts/default.html +0 -13
- data/docs/_layouts/style.css +0 -6
- data/docs/_reference/ufo-apps.md +0 -37
- data/docs/_reference/ufo-cancel.md +0 -24
- data/docs/_reference/ufo-completion.md +0 -46
- data/docs/_reference/ufo-completion_script.md +0 -27
- data/docs/_reference/ufo-current.md +0 -93
- data/docs/_reference/ufo-deploy.md +0 -76
- data/docs/_reference/ufo-destroy.md +0 -36
- data/docs/_reference/ufo-docker-base.md +0 -71
- data/docs/_reference/ufo-docker-build.md +0 -91
- data/docs/_reference/ufo-docker-clean.md +0 -44
- data/docs/_reference/ufo-docker-compile.md +0 -19
- data/docs/_reference/ufo-docker-help.md +0 -15
- data/docs/_reference/ufo-docker-name.md +0 -37
- data/docs/_reference/ufo-docker-push.md +0 -49
- data/docs/_reference/ufo-docker.md +0 -38
- data/docs/_reference/ufo-init.md +0 -125
- data/docs/_reference/ufo-logs.md +0 -40
- data/docs/_reference/ufo-network-help.md +0 -15
- data/docs/_reference/ufo-network-init.md +0 -39
- data/docs/_reference/ufo-network.md +0 -26
- data/docs/_reference/ufo-ps.md +0 -56
- data/docs/_reference/ufo-releases.md +0 -40
- data/docs/_reference/ufo-resources.md +0 -44
- data/docs/_reference/ufo-rollback.md +0 -61
- data/docs/_reference/ufo-scale.md +0 -50
- data/docs/_reference/ufo-ship.md +0 -129
- data/docs/_reference/ufo-ships.md +0 -68
- data/docs/_reference/ufo-status.md +0 -23
- data/docs/_reference/ufo-stop.md +0 -31
- data/docs/_reference/ufo-task.md +0 -56
- data/docs/_reference/ufo-tasks-build.md +0 -178
- data/docs/_reference/ufo-tasks-help.md +0 -15
- data/docs/_reference/ufo-tasks-register.md +0 -29
- data/docs/_reference/ufo-tasks.md +0 -35
- data/docs/_reference/ufo-upgrade-help.md +0 -15
- data/docs/_reference/ufo-upgrade-v2to3.md +0 -15
- data/docs/_reference/ufo-upgrade-v33to34.md +0 -15
- data/docs/_reference/ufo-upgrade-v3to4.md +0 -27
- data/docs/_reference/ufo-upgrade-v43to45.md +0 -15
- data/docs/_reference/ufo-upgrade.md +0 -29
- data/docs/_reference/ufo-version.md +0 -23
- data/docs/articles.md +0 -14
- data/docs/bin/web +0 -4
- data/docs/css/font-awesome/css/font-awesome.css +0 -1566
- data/docs/css/font-awesome/css/font-awesome.min.css +0 -4
- data/docs/css/font-awesome/fonts/FontAwesome.otf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.eot +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.svg +0 -504
- data/docs/css/font-awesome/fonts/fontawesome-webfont.ttf +0 -0
- data/docs/css/font-awesome/fonts/fontawesome-webfont.woff +0 -0
- data/docs/docs.md +0 -29
- data/docs/img/docs/cloudformation-resources.png +0 -0
- data/docs/img/logos/boltops-logo-full.png +0 -0
- data/docs/img/logos/boltops-logo.png +0 -0
- data/docs/img/logos/ufo-logo-2.png +0 -0
- data/docs/img/logos/ufo-logo.png +0 -0
- data/docs/img/logos/ufo-site-header.png +0 -0
- data/docs/img/logos/ufo.jpg +0 -0
- data/docs/img/tutorials/ecs-console-task-definitions.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ship.png +0 -0
- data/docs/img/tutorials/ecs-console-ufo-ships.png +0 -0
- data/docs/index.html +0 -10
- data/docs/js/bootstrap.js +0 -2114
- data/docs/js/bootstrap.min.js +0 -6
- data/docs/js/cbpAnimatedHeader.js +0 -44
- data/docs/js/cbpAnimatedHeader.min.js +0 -11
- data/docs/js/classie.js +0 -80
- data/docs/js/contact_me.js +0 -70
- data/docs/js/contact_me_static.js +0 -23
- data/docs/js/freelancer.js +0 -37
- data/docs/js/jqBootstrapValidation.js +0 -912
- data/docs/js/jquery-1.11.0.js +0 -4
- data/docs/js/jquery.easing.min.js +0 -44
- data/docs/js/nav.js +0 -53
- data/docs/quick-start.md +0 -133
- data/docs/reference.md +0 -29
- data/docs/style.css +0 -3
- data/docs/utils/ssl-doctor.rb +0 -89
- data/docs/utils/test-aws-api-access.rb +0 -11
- data/docs/utils/update-cert-chains.sh +0 -11
- data/lib/template/.env +0 -3
- data/lib/template/.secrets +0 -5
- data/lib/template/.ufo/iam_roles/execution_role.rb +0 -7
- data/lib/template/.ufo/iam_roles/task_role.rb +0 -21
- data/lib/template/.ufo/params.yml.tt +0 -27
- data/lib/template/.ufo/settings/cfn/default.yml.tt +0 -72
- data/lib/template/.ufo/settings/network/default.yml.tt +0 -26
- data/lib/template/.ufo/settings.yml.tt +0 -26
- data/lib/template/.ufo/task_definitions.rb.tt +0 -61
- data/lib/template/.ufo/templates/fargate.json.erb +0 -39
- data/lib/template/.ufo/templates/main.json.erb +0 -43
- data/lib/template/.ufo/variables/base.rb.tt +0 -19
- data/lib/template/.ufo/variables/development.rb +0 -8
- data/lib/template/.ufo/variables/production.rb +0 -7
- data/lib/template/Dockerfile +0 -15
- data/lib/template/bin/deploy.tt +0 -7
- data/lib/ufo/apps/cfn_map.rb +0 -70
- data/lib/ufo/apps/cluster.rb +0 -24
- data/lib/ufo/apps/service.rb +0 -56
- data/lib/ufo/apps.rb +0 -56
- data/lib/ufo/aws_service.rb +0 -36
- data/lib/ufo/base.rb +0 -35
- data/lib/ufo/cancel.rb +0 -23
- data/lib/ufo/current.rb +0 -104
- data/lib/ufo/default/settings.yml +0 -24
- data/lib/ufo/default/templates/main.json.erb +0 -39
- data/lib/ufo/destroy.rb +0 -41
- data/lib/ufo/docker/variables.rb +0 -26
- data/lib/ufo/dsl/helper.rb +0 -79
- data/lib/ufo/dsl/outputter.rb +0 -43
- data/lib/ufo/dsl/task_definition.rb +0 -108
- data/lib/ufo/dsl.rb +0 -96
- data/lib/ufo/help/apps.md +0 -12
- data/lib/ufo/help/balancer.md +0 -3
- data/lib/ufo/help/completions.md +0 -16
- data/lib/ufo/help/completions_script.md +0 -1
- data/lib/ufo/help/current.md +0 -65
- data/lib/ufo/help/deploy.md +0 -38
- data/lib/ufo/help/destroy.md +0 -9
- data/lib/ufo/help/docker/base.md +0 -49
- data/lib/ufo/help/docker/name.md +0 -16
- data/lib/ufo/help/docker.md +0 -6
- data/lib/ufo/help/init.md +0 -91
- data/lib/ufo/help/network/init.md +0 -13
- data/lib/ufo/help/ps.md +0 -27
- data/lib/ufo/help/releases.md +0 -16
- data/lib/ufo/help/resources.md +0 -20
- data/lib/ufo/help/rollback.md +0 -35
- data/lib/ufo/help/scale.md +0 -26
- data/lib/ufo/help/ship.md +0 -95
- data/lib/ufo/help/ships.md +0 -35
- data/lib/ufo/help/stop.md +0 -7
- data/lib/ufo/help/task.md +0 -27
- data/lib/ufo/help/tasks/build.md +0 -158
- data/lib/ufo/help/tasks/register.md +0 -14
- data/lib/ufo/help/tasks.md +0 -7
- data/lib/ufo/help/upgrade/v3to4.md +0 -3
- data/lib/ufo/help.rb +0 -9
- data/lib/ufo/init.rb +0 -119
- data/lib/ufo/network/fetch.rb +0 -48
- data/lib/ufo/network/helper.rb +0 -23
- data/lib/ufo/network/init.rb +0 -26
- data/lib/ufo/network.rb +0 -21
- data/lib/ufo/ps.rb +0 -129
- data/lib/ufo/scale.rb +0 -28
- data/lib/ufo/setting/profile.rb +0 -44
- data/lib/ufo/setting/security_groups.rb +0 -22
- data/lib/ufo/setting.rb +0 -75
- data/lib/ufo/settings.rb +0 -20
- data/lib/ufo/ship.rb +0 -103
- data/lib/ufo/stack/builder/conditions.rb +0 -23
- data/lib/ufo/stack/builder/parameters.rb +0 -45
- data/lib/ufo/stack/builder/resources/base.rb +0 -4
- data/lib/ufo/stack/builder/resources/dns.rb +0 -17
- data/lib/ufo/stack/builder/resources/elb.rb +0 -45
- data/lib/ufo/stack/builder/resources/listener.rb +0 -42
- data/lib/ufo/stack/builder/resources/listener_ssl.rb +0 -16
- data/lib/ufo/stack/builder/resources/roles/base.rb +0 -22
- data/lib/ufo/stack/builder/resources/roles/execution_role.rb +0 -4
- data/lib/ufo/stack/builder/resources/roles/task_role.rb +0 -4
- data/lib/ufo/stack/builder/resources/security_group/base.rb +0 -4
- data/lib/ufo/stack/builder/resources.rb +0 -20
- data/lib/ufo/stack/builder.rb +0 -26
- data/lib/ufo/stack/context.rb +0 -253
- data/lib/ufo/stack/helper.rb +0 -55
- data/lib/ufo/stack/template_body.rb +0 -13
- data/lib/ufo/stack.rb +0 -213
- data/lib/ufo/status.rb +0 -56
- data/lib/ufo/stop.rb +0 -49
- data/lib/ufo/task.rb +0 -225
- data/lib/ufo/tasks/builder.rb +0 -40
- data/lib/ufo/tasks/register.rb +0 -90
- data/lib/ufo/template_scope.rb +0 -57
- data/lib/ufo/util.rb +0 -69
- data/spec/lib/apps_spec.rb +0 -20
- data/spec/lib/builder_spec.rb +0 -23
- data/spec/lib/cli_spec.rb +0 -73
- data/spec/lib/completion_spec.rb +0 -18
- data/spec/lib/ps_spec.rb +0 -14
- data/spec/lib/register_spec.rb +0 -49
- data/spec/lib/setting_spec.rb +0 -18
- data/spec/lib/ship_spec.rb +0 -46
- data/spec/lib/stack/status_spec.rb +0 -76
- data/spec/lib/stop_spec.rb +0 -13
- data/spec/lib/task_spec.rb +0 -54
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
require "aws-logs"
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
|
|
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] =
|
|
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
|
-
|
|
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
|
-
|
|
12
|
-
|
|
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
|
data/lib/ufo/cli/new.rb
ADDED
data/lib/ufo/cli/opts.rb
ADDED
|
@@ -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
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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
|
-
|
|
67
|
-
|
|
68
|
-
|
|
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
|
-
|
|
3
|
+
class Ufo::CLI
|
|
4
4
|
class Releases < Base
|
|
5
5
|
def list
|
|
6
|
-
|
|
7
|
-
arns = task_definition_arns(@
|
|
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
|
-
|
|
10
|
+
logger.info " #{name}"
|
|
11
11
|
end
|
|
12
12
|
end
|
|
13
13
|
end
|
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
|
|
1
|
+
class Ufo::CLI
|
|
2
2
|
class Rollback < Base
|
|
3
|
-
|
|
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
|
-
|
|
8
|
-
|
|
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
|
-
"#{@
|
|
19
|
+
"#{@task_definition.name}:#{version}"
|
|
18
20
|
elsif version.include?(':') && !version.include?(":ufo-")
|
|
19
21
|
version
|
|
20
22
|
else # assume git sha
|
|
21
|
-
#
|
|
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
|
-
|
|
30
|
-
arns = task_definition_arns(@
|
|
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
|
-
|
|
44
|
+
logger.info '' if @final_newline
|
|
43
45
|
unless task_definition
|
|
44
|
-
|
|
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
|