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
data/lib/ufo/stack/context.rb
DELETED
|
@@ -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
|
data/lib/ufo/stack/helper.rb
DELETED
|
@@ -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
|
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
|