jets-fs 1.6.10
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 +7 -0
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +68 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +72 -0
- data/.codebuild/jets.postman_collection.json +323 -0
- data/.codebuild/scripts/install-docker.sh +12 -0
- data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
- data/.codebuild/scripts/install-java.sh +22 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +73 -0
- data/.github/ISSUE_TEMPLATE/documentation.md +27 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +64 -0
- data/.github/ISSUE_TEMPLATE/question.md +16 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +42 -0
- data/.gitignore +24 -0
- data/.gitmodules +6 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +533 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Gemfile.lock +190 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +21 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets +14 -0
- data/jets.gemspec +61 -0
- data/lib/jets.rb +71 -0
- data/lib/jets/application.rb +308 -0
- data/lib/jets/aws_info.rb +111 -0
- data/lib/jets/aws_services.rb +60 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +130 -0
- data/lib/jets/builders.rb +16 -0
- data/lib/jets/builders/code_builder.rb +379 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +76 -0
- data/lib/jets/builders/handler_generator.rb +172 -0
- data/lib/jets/builders/lambda_layer.rb +69 -0
- data/lib/jets/builders/md5.rb +60 -0
- data/lib/jets/builders/md5_zip.rb +61 -0
- data/lib/jets/builders/purger.rb +35 -0
- data/lib/jets/builders/rack_packager.rb +51 -0
- data/lib/jets/builders/rackup_wrappers/rackup +19 -0
- data/lib/jets/builders/rackup_wrappers/rackup.rb +7 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/ruby_packager.rb +207 -0
- data/lib/jets/builders/shim_vars.rb +5 -0
- data/lib/jets/builders/shim_vars/app.rb +78 -0
- data/lib/jets/builders/shim_vars/base.rb +25 -0
- data/lib/jets/builders/shim_vars/shared.rb +37 -0
- data/lib/jets/builders/templates/handler.rb +12 -0
- data/lib/jets/builders/tidy.rb +107 -0
- data/lib/jets/builders/util.rb +31 -0
- data/lib/jets/camelizer.rb +67 -0
- data/lib/jets/cfn.rb +6 -0
- data/lib/jets/cfn/builders.rb +20 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +58 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +80 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +82 -0
- data/lib/jets/cfn/builders/controller_builder.rb +42 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +127 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder.rb +93 -0
- data/lib/jets/cfn/builders/rule_builder.rb +24 -0
- data/lib/jets/cfn/builders/shared_builder.rb +14 -0
- data/lib/jets/cfn/ship.rb +189 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +189 -0
- data/lib/jets/commands.rb +27 -0
- data/lib/jets/commands/base.rb +164 -0
- data/lib/jets/commands/build.rb +217 -0
- data/lib/jets/commands/call.rb +174 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +112 -0
- data/lib/jets/commands/call/base_guesser.rb +33 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +23 -0
- data/lib/jets/commands/clean/base.rb +24 -0
- data/lib/jets/commands/clean/build.rb +13 -0
- data/lib/jets/commands/clean/log.rb +107 -0
- data/lib/jets/commands/console.rb +13 -0
- data/lib/jets/commands/db.rb +15 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks.rb +44 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +143 -0
- data/lib/jets/commands/deploy.rb +131 -0
- data/lib/jets/commands/dynamodb.rb +22 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/gems.rb +21 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +61 -0
- data/lib/jets/commands/help/clean/build.md +5 -0
- data/lib/jets/commands/help/clean/log.md +5 -0
- data/lib/jets/commands/help/console.md +18 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +9 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +8 -0
- data/lib/jets/commands/help/generate.md +22 -0
- data/lib/jets/commands/help/import/rack.md +13 -0
- data/lib/jets/commands/help/import/rails.md +11 -0
- data/lib/jets/commands/help/new.md +42 -0
- data/lib/jets/commands/help/routes.md +16 -0
- data/lib/jets/commands/help/runner.md +17 -0
- data/lib/jets/commands/help/server.md +15 -0
- data/lib/jets/commands/help/status.md +14 -0
- data/lib/jets/commands/help/upgrade.md +5 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/import.rb +18 -0
- data/lib/jets/commands/import/base.rb +49 -0
- data/lib/jets/commands/import/cheatsheet.rb +35 -0
- data/lib/jets/commands/import/rack.rb +16 -0
- data/lib/jets/commands/import/rail.rb +74 -0
- data/lib/jets/commands/import/sequence.rb +90 -0
- data/lib/jets/commands/import/templates/config/database.yml +26 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/main.rb +152 -0
- data/lib/jets/commands/markdown.rb +8 -0
- data/lib/jets/commands/markdown/creator.rb +58 -0
- data/lib/jets/commands/markdown/index.rb +27 -0
- data/lib/jets/commands/markdown/page.rb +125 -0
- data/lib/jets/commands/markdown/shell.rb +11 -0
- data/lib/jets/commands/new.rb +157 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +45 -0
- data/lib/jets/commands/runner.rb +18 -0
- data/lib/jets/commands/sequence.rb +99 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.gitignore +12 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/.rspec +3 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +35 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +11 -0
- data/lib/jets/commands/templates/skeleton/Rakefile +2 -0
- data/lib/jets/commands/templates/skeleton/app/controllers/application_controller.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/helpers/application_helper.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/jobs/application_job.rb +4 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +2 -0
- data/lib/jets/commands/templates/skeleton/app/models/application_record.rb +3 -0
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +25 -0
- data/lib/jets/commands/templates/skeleton/config.ru +5 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +66 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +22 -0
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +4 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +4 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +9 -0
- data/lib/jets/commands/templates/skeleton/db/.gitkeep +0 -0
- data/lib/jets/commands/templates/skeleton/public/404.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/422.html +67 -0
- data/lib/jets/commands/templates/skeleton/public/500.html +66 -0
- data/lib/jets/commands/templates/skeleton/public/favicon.ico +0 -0
- data/lib/jets/commands/templates/skeleton/public/index.html.tt +91 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +15 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-index.json +51 -0
- data/lib/jets/commands/templates/skeleton/spec/fixtures/payloads/posts-show.json +53 -0
- data/lib/jets/commands/templates/skeleton/spec/spec_helper.rb.tt +30 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
- data/lib/jets/commands/upgrade.rb +146 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack +19 -0
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +19 -0
- data/lib/jets/commands/url.rb +68 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller.rb +16 -0
- data/lib/jets/controller/base.rb +103 -0
- data/lib/jets/controller/callbacks.rb +62 -0
- data/lib/jets/controller/cookies.rb +40 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware.rb +5 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +119 -0
- data/lib/jets/controller/middleware/local/api_gateway.rb +93 -0
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +38 -0
- data/lib/jets/controller/middleware/local/route_matcher.rb +97 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack.rb +5 -0
- data/lib/jets/controller/rack/adapter.rb +63 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +84 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +238 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/core.rb +211 -0
- data/lib/jets/core_ext/kernel.rb +56 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +39 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +41 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -0
- data/lib/jets/generator/templates/erb/scaffold/edit.html.erb +6 -0
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +29 -0
- data/lib/jets/generator/templates/erb/scaffold/new.html.erb +5 -0
- data/lib/jets/generator/templates/erb/scaffold/show.html.erb +9 -0
- data/lib/jets/generator/templates/rails/assets/javascript.js +2 -0
- data/lib/jets/generator/templates/rails/assets/stylesheet.css +4 -0
- data/lib/jets/generator/templates/rails/controller/controller.rb +13 -0
- data/lib/jets/generator/templates/rails/helper/helper.rb +4 -0
- data/lib/jets/generator/templates/rails/scaffold/scaffold.css +80 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/api_controller.rb +62 -0
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +79 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +25 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +153 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +62 -0
- data/lib/jets/io.rb +14 -0
- data/lib/jets/job.rb +4 -0
- data/lib/jets/job/base.rb +29 -0
- data/lib/jets/job/dsl.rb +108 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda.rb +18 -0
- data/lib/jets/lambda/dsl.rb +384 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +34 -0
- data/lib/jets/lambda/task.rb +111 -0
- data/lib/jets/logger.rb +24 -0
- data/lib/jets/mega.rb +7 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +140 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +38 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +49 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/naming.rb +49 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/rails.rb +4 -0
- data/lib/jets/overrides/rails/asset_tag_helper.rb +114 -0
- data/lib/jets/overrides/rails/common_methods.rb +20 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +26 -0
- data/lib/jets/overrides/rails/url_helper.rb +25 -0
- data/lib/jets/poly_fun.rb +82 -0
- data/lib/jets/poly_fun/base_executor.rb +125 -0
- data/lib/jets/poly_fun/lambda_executor.rb +16 -0
- data/lib/jets/poly_fun/node_error.rb +8 -0
- data/lib/jets/poly_fun/node_executor.rb +54 -0
- data/lib/jets/poly_fun/python_error.rb +8 -0
- data/lib/jets/poly_fun/python_executor.rb +23 -0
- data/lib/jets/preheat.rb +117 -0
- data/lib/jets/processors.rb +4 -0
- data/lib/jets/processors/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +59 -0
- data/lib/jets/rack_server.rb +80 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +74 -0
- data/lib/jets/resource/api_gateway.rb +9 -0
- data/lib/jets/resource/api_gateway/base_path.rb +5 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +42 -0
- data/lib/jets/resource/api_gateway/base_path/mapping.rb +44 -0
- data/lib/jets/resource/api_gateway/base_path/role.rb +76 -0
- data/lib/jets/resource/api_gateway/cors.rb +61 -0
- data/lib/jets/resource/api_gateway/deployment.rb +78 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +59 -0
- data/lib/jets/resource/api_gateway/method.rb +98 -0
- data/lib/jets/resource/api_gateway/resource.rb +78 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +60 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +42 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +63 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +11 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +12 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +130 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +29 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +39 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +123 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +26 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack.rb +7 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
- data/lib/jets/resource/child_stack/app_class.rb +112 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +90 -0
- data/lib/jets/resource/config.rb +4 -0
- data/lib/jets/resource/config/config_rule.rb +74 -0
- data/lib/jets/resource/config/managed_rule.rb +15 -0
- data/lib/jets/resource/events.rb +3 -0
- data/lib/jets/resource/events/rule.rb +31 -0
- data/lib/jets/resource/iam.rb +8 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +47 -0
- data/lib/jets/resource/iam/class_role.rb +74 -0
- data/lib/jets/resource/iam/function_role.rb +54 -0
- data/lib/jets/resource/iam/managed_policy.rb +22 -0
- data/lib/jets/resource/iam/policy_document.rb +41 -0
- data/lib/jets/resource/lambda.rb +5 -0
- data/lib/jets/resource/lambda/function.rb +216 -0
- data/lib/jets/resource/lambda/function/environment.rb +61 -0
- data/lib/jets/resource/lambda/gem_layer.rb +17 -0
- data/lib/jets/resource/lambda/layer_version.rb +44 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +77 -0
- data/lib/jets/resource/route53.rb +3 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3.rb +17 -0
- data/lib/jets/resource/sns.rb +3 -0
- data/lib/jets/resource/sqs.rb +3 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +175 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule.rb +4 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +52 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +98 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +103 -0
- data/lib/jets/stack/builder.rb +38 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/function.rb +60 -0
- data/lib/jets/stack/main.rb +5 -0
- data/lib/jets/stack/main/dsl.rb +33 -0
- data/lib/jets/stack/main/extensions/base.rb +45 -0
- data/lib/jets/stack/main/extensions/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/extensions/lambda.rb +71 -0
- data/lib/jets/stack/main/extensions/sns.rb +12 -0
- data/lib/jets/stack/main/extensions/sqs.rb +36 -0
- data/lib/jets/stack/output.rb +38 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/parameter.rb +38 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +32 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +30 -0
- data/lib/jets/turbo.rb +47 -0
- data/lib/jets/turbo/database_yaml.rb +41 -0
- data/lib/jets/turbo/project/.gitignore +12 -0
- data/lib/jets/turbo/project/.jetskeep +1 -0
- data/lib/jets/turbo/project/Gemfile +16 -0
- data/lib/jets/turbo/project/Rakefile +2 -0
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +2 -0
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +2 -0
- data/lib/jets/turbo/project/app/jobs/application_job.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/project/config/application.rb +4 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/rail.rb +113 -0
- data/lib/jets/turbo/templates/config/database.yml +26 -0
- data/lib/jets/util.rb +38 -0
- data/lib/jets/version.rb +3 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +859 -0
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module Jets::Commands
|
|
2
|
+
class Clean < Jets::Commands::Base
|
|
3
|
+
autoload :Base, 'jets/commands/clean/base'
|
|
4
|
+
autoload :Log, 'jets/commands/clean/log'
|
|
5
|
+
autoload :Build, 'jets/commands/clean/build'
|
|
6
|
+
|
|
7
|
+
class_option :noop, type: :boolean, desc: "noop or dry-run mode"
|
|
8
|
+
class_option :mute, type: :boolean, desc: "mute output"
|
|
9
|
+
class_option :sure, type: :boolean, desc: "bypass are you sure prompt"
|
|
10
|
+
|
|
11
|
+
desc "log", "Cleans CloudWatch log groups assocated with app"
|
|
12
|
+
long_desc Help.text('clean:log')
|
|
13
|
+
def log
|
|
14
|
+
Log.new(options).clean
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
desc "build", "Cleans jets build"
|
|
18
|
+
long_desc Help.text('clean:build')
|
|
19
|
+
def build
|
|
20
|
+
Build.new(options).clean
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
class Jets::Commands::Clean
|
|
2
|
+
class Base
|
|
3
|
+
def initialize(options={})
|
|
4
|
+
@options = options
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
def say(message)
|
|
9
|
+
prefix = 'NOOP ' if @options[:noop]
|
|
10
|
+
puts "#{prefix}#{message}" unless @options[:mute]
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def are_you_sure?(message)
|
|
14
|
+
return true if @options[:sure]
|
|
15
|
+
|
|
16
|
+
puts "Are you sure that you want to #{message}? (y/N)"
|
|
17
|
+
yes = $stdin.gets.strip
|
|
18
|
+
unless yes =~ /^y/
|
|
19
|
+
puts "Phew that was close!"
|
|
20
|
+
exit 0
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
# The thing that limits this implementation is that there needs to be at least
|
|
2
|
+
# one lambda function created from an internal jets function. Example:
|
|
3
|
+
#
|
|
4
|
+
# /aws/lambda/demo-dev-2-jets-preheat_job-warm
|
|
5
|
+
# /aws/lambda/demo-dev-2-jets-public_controller-show
|
|
6
|
+
#
|
|
7
|
+
# We're doing this because JETS_ENV_EXTRA environments can create additional matching
|
|
8
|
+
# log groups and we don't want to overly-aggressively delete them.
|
|
9
|
+
#
|
|
10
|
+
# The `keep_prefixes(log_group_names)` method calcuates the log groups to keep.
|
|
11
|
+
class Jets::Commands::Clean
|
|
12
|
+
class Log < Base
|
|
13
|
+
extend Memoist
|
|
14
|
+
include Jets::AwsServices
|
|
15
|
+
|
|
16
|
+
def clean
|
|
17
|
+
are_you_sure?("delete CloudWatch logs")
|
|
18
|
+
|
|
19
|
+
say "Removing CloudWatch logs for #{prefix_guess}..."
|
|
20
|
+
log_groups.each do |g|
|
|
21
|
+
next if keep_log_group?(g.log_group_name)
|
|
22
|
+
logs.delete_log_group(log_group_name: g.log_group_name) unless @options[:noop]
|
|
23
|
+
say "Removed log group: #{g.log_group_name}"
|
|
24
|
+
end
|
|
25
|
+
say "Removed CloudWatch logs for #{prefix_guess}"
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def clean_deploys
|
|
29
|
+
groups = deploy_log_groups.sort_by do |g|
|
|
30
|
+
g.log_group_name
|
|
31
|
+
end
|
|
32
|
+
# Keep the last 2 recent log groups so we can see the deleted logic
|
|
33
|
+
groups = groups[0..-3]
|
|
34
|
+
groups.each do |g|
|
|
35
|
+
logs.delete_log_group(log_group_name: g.log_group_name) unless @options[:noop]
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def deploy_log_groups
|
|
40
|
+
log_groups.select do |g|
|
|
41
|
+
!keep_log_group?(g.log_group_name) &&
|
|
42
|
+
g.log_group_name.include?('jets-base-path')
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
private
|
|
47
|
+
def prefix_guess
|
|
48
|
+
Jets::Naming.parent_stack_name
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def log_groups
|
|
52
|
+
groups, next_token = [], true
|
|
53
|
+
while next_token
|
|
54
|
+
next_token = nil if next_token == true # just at start the loop
|
|
55
|
+
resp = logs.describe_log_groups(
|
|
56
|
+
log_group_name_prefix: "/aws/lambda/#{prefix_guess}-",
|
|
57
|
+
next_token: next_token,
|
|
58
|
+
)
|
|
59
|
+
groups += resp.log_groups
|
|
60
|
+
next_token = resp.next_token
|
|
61
|
+
end
|
|
62
|
+
groups
|
|
63
|
+
end
|
|
64
|
+
memoize :log_groups
|
|
65
|
+
|
|
66
|
+
def log_group_names
|
|
67
|
+
log_groups.map(&:log_group_name)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def all_prefixes(log_group_names)
|
|
71
|
+
log_prefixes(log_group_names)
|
|
72
|
+
end
|
|
73
|
+
memoize :all_prefixes
|
|
74
|
+
|
|
75
|
+
# Check for the prefixes to keep. The slightly tricky thing to watch for is
|
|
76
|
+
# for the prefix matching addiitonal log groups that belong to other
|
|
77
|
+
# JETS_ENV_EXTRA=xxx created environments.
|
|
78
|
+
#
|
|
79
|
+
# We find and store the prefixes to keep so we don't over aggressively delete
|
|
80
|
+
# log groups.
|
|
81
|
+
def keep_prefixes(log_group_names)
|
|
82
|
+
names = log_group_names.reject do |name|
|
|
83
|
+
name =~ %r{/aws/lambda/#{prefix_guess}-jets}
|
|
84
|
+
end
|
|
85
|
+
log_prefixes(names)
|
|
86
|
+
end
|
|
87
|
+
memoize :keep_prefixes
|
|
88
|
+
|
|
89
|
+
# Strips -jets.* from the full log group name to leave only the prefix behind
|
|
90
|
+
def log_prefixes(names)
|
|
91
|
+
names = names.select do |name|
|
|
92
|
+
name.match(Regexp.new("#{prefix_guess}-.*jets"))
|
|
93
|
+
end
|
|
94
|
+
names.map do |name|
|
|
95
|
+
name.sub(/-jets.*/,'')
|
|
96
|
+
end.uniq.sort
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Check if it is safe to delete the log group
|
|
100
|
+
def keep_log_group?(log_group_name)
|
|
101
|
+
keep_prefixes = keep_prefixes(log_group_names)
|
|
102
|
+
!!keep_prefixes.detect do |keep_prefix|
|
|
103
|
+
log_group_name =~ Regexp.new(keep_prefix)
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
class Jets::Commands::Console
|
|
2
|
+
def self.run
|
|
3
|
+
puts Jets::Booter.message
|
|
4
|
+
Jets.boot
|
|
5
|
+
|
|
6
|
+
# Thanks: https://mutelight.org/bin-console
|
|
7
|
+
require "irb"
|
|
8
|
+
require "irb/completion"
|
|
9
|
+
|
|
10
|
+
ARGV.clear # https://stackoverflow.com/questions/33070092/irb-start-not-starting/33136762
|
|
11
|
+
IRB.start
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Jets::Commands
|
|
2
|
+
class Db < Jets::Commands::Base
|
|
3
|
+
autoload :Tasks, 'jets/commands/db/tasks'
|
|
4
|
+
|
|
5
|
+
desc "generate", "Creates a migration to change a db table"
|
|
6
|
+
long_desc Help.text('db:generate')
|
|
7
|
+
def generate(*args)
|
|
8
|
+
require "rails/generators"
|
|
9
|
+
require "rails/generators/active_record/migration/migration_generator"
|
|
10
|
+
|
|
11
|
+
generator = ActiveRecord::Generators::MigrationGenerator.new(args)
|
|
12
|
+
generator.create_migration_file
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
class Jets::Commands::Db::Tasks
|
|
2
|
+
# Ugly but it loads ActiveRecord database tasks
|
|
3
|
+
def self.load!
|
|
4
|
+
# Lazy require rails so Rails const is only defined in jets db:* tasks
|
|
5
|
+
require "rails"
|
|
6
|
+
require "active_record"
|
|
7
|
+
require "recursive-open-struct"
|
|
8
|
+
|
|
9
|
+
# Jets.boot # Jets.boot here screws up jets -h, the db_config doesnt seem to match exactly
|
|
10
|
+
# but seems to be working anyway.
|
|
11
|
+
db_configs = Jets.application.config.database
|
|
12
|
+
ActiveRecord::Tasks::DatabaseTasks.database_configuration = db_configs
|
|
13
|
+
ActiveRecord::Tasks::DatabaseTasks.migrations_paths = ["db/migrate"]
|
|
14
|
+
ActiveRecord::Tasks::DatabaseTasks.seed_loader = Seeder.new("#{Jets.root}/db/seeds.rb")
|
|
15
|
+
|
|
16
|
+
# Need to mock out the usage of Rails.application in:
|
|
17
|
+
# activerecord-5.1.4/lib/active_record/tasks/database_tasks.rb
|
|
18
|
+
Rails.application = RecursiveOpenStruct.new(
|
|
19
|
+
config: {
|
|
20
|
+
paths: {
|
|
21
|
+
db: ["db"],
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
paths: {
|
|
25
|
+
"db/migrate": ["db/migrate"]
|
|
26
|
+
}
|
|
27
|
+
)
|
|
28
|
+
load "active_record/railties/databases.rake"
|
|
29
|
+
|
|
30
|
+
load File.expand_path("../environment-task.rake", __FILE__)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Thanks: https://stackoverflow.com/questions/19206764/how-can-i-load-activerecord-database-tasks-on-a-ruby-project-outside-rails/24840749
|
|
34
|
+
class Seeder
|
|
35
|
+
def initialize(seed_file)
|
|
36
|
+
@seed_file = seed_file
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def load_seed
|
|
40
|
+
raise "Seed file '#{@seed_file}' does not exist" unless File.file?(@seed_file)
|
|
41
|
+
load @seed_file
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# Thanks: Rails dbconsole_command.rb
|
|
2
|
+
module Jets::Commands
|
|
3
|
+
class Dbconsole
|
|
4
|
+
def self.start(*args)
|
|
5
|
+
new(*args).start
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def initialize(options = {})
|
|
9
|
+
@options = options
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def start
|
|
13
|
+
ENV["RAILS_ENV"] ||= @options[:environment] || environment
|
|
14
|
+
|
|
15
|
+
case config["adapter"]
|
|
16
|
+
when /^(jdbc)?mysql/
|
|
17
|
+
args = {
|
|
18
|
+
"host" => "--host",
|
|
19
|
+
"port" => "--port",
|
|
20
|
+
"socket" => "--socket",
|
|
21
|
+
"username" => "--user",
|
|
22
|
+
"encoding" => "--default-character-set",
|
|
23
|
+
"sslca" => "--ssl-ca",
|
|
24
|
+
"sslcert" => "--ssl-cert",
|
|
25
|
+
"sslcapath" => "--ssl-capath",
|
|
26
|
+
"sslcipher" => "--ssl-cipher",
|
|
27
|
+
"sslkey" => "--ssl-key"
|
|
28
|
+
}.map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }.compact
|
|
29
|
+
|
|
30
|
+
if config["password"] && @options["include_password"]
|
|
31
|
+
args << "--password=#{config['password']}"
|
|
32
|
+
elsif config["password"] && !config["password"].to_s.empty?
|
|
33
|
+
args << "-p"
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
args << config["database"]
|
|
37
|
+
|
|
38
|
+
find_cmd_and_exec(["mysql", "mysql5"], *args)
|
|
39
|
+
|
|
40
|
+
when /^postgres|^postgis/
|
|
41
|
+
ENV["PGUSER"] = config["username"] if config["username"]
|
|
42
|
+
ENV["PGHOST"] = config["host"] if config["host"]
|
|
43
|
+
ENV["PGPORT"] = config["port"].to_s if config["port"]
|
|
44
|
+
ENV["PGPASSWORD"] = config["password"].to_s if config["password"] && @options["include_password"]
|
|
45
|
+
find_cmd_and_exec("psql", config["database"])
|
|
46
|
+
|
|
47
|
+
when "sqlite3"
|
|
48
|
+
args = []
|
|
49
|
+
|
|
50
|
+
args << "-#{@options['mode']}" if @options["mode"]
|
|
51
|
+
args << "-header" if @options["header"]
|
|
52
|
+
args << File.expand_path(config["database"], Jets.root)
|
|
53
|
+
|
|
54
|
+
find_cmd_and_exec("sqlite3", *args)
|
|
55
|
+
|
|
56
|
+
when "oracle", "oracle_enhanced"
|
|
57
|
+
logon = ""
|
|
58
|
+
|
|
59
|
+
if config["username"]
|
|
60
|
+
logon = config["username"]
|
|
61
|
+
logon << "/#{config['password']}" if config["password"] && @options["include_password"]
|
|
62
|
+
logon << "@#{config['database']}" if config["database"]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
find_cmd_and_exec("sqlplus", logon)
|
|
66
|
+
|
|
67
|
+
when "sqlserver"
|
|
68
|
+
args = []
|
|
69
|
+
|
|
70
|
+
args += ["-D", "#{config['database']}"] if config["database"]
|
|
71
|
+
args += ["-U", "#{config['username']}"] if config["username"]
|
|
72
|
+
args += ["-P", "#{config['password']}"] if config["password"]
|
|
73
|
+
|
|
74
|
+
if config["host"]
|
|
75
|
+
host_arg = "#{config['host']}"
|
|
76
|
+
host_arg << ":#{config['port']}" if config["port"]
|
|
77
|
+
args += ["-S", host_arg]
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
find_cmd_and_exec("sqsh", *args)
|
|
81
|
+
|
|
82
|
+
else
|
|
83
|
+
abort "Unknown command-line client for #{config['database']}."
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def config
|
|
88
|
+
@config ||= begin
|
|
89
|
+
if configurations[environment].blank?
|
|
90
|
+
raise ActiveRecord::AdapterNotSpecified, "'#{environment}' database is not configured. Available configuration: #{configurations.inspect}"
|
|
91
|
+
else
|
|
92
|
+
configurations[environment]
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def environment
|
|
98
|
+
Jets.env.to_s
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
private
|
|
102
|
+
def configurations # :doc:
|
|
103
|
+
db_config = Jets.application.config.database
|
|
104
|
+
ActiveRecord::Base.configurations = db_config
|
|
105
|
+
ActiveRecord::Base.configurations
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
def find_cmd_and_exec(commands, *args) # :doc:
|
|
109
|
+
commands = Array(commands)
|
|
110
|
+
|
|
111
|
+
dirs_on_path = ENV["PATH"].to_s.split(File::PATH_SEPARATOR)
|
|
112
|
+
unless (ext = RbConfig::CONFIG["EXEEXT"]).empty?
|
|
113
|
+
commands = commands.map { |cmd| "#{cmd}#{ext}" }
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
full_path_command = nil
|
|
117
|
+
found = commands.detect do |cmd|
|
|
118
|
+
dirs_on_path.detect do |path|
|
|
119
|
+
full_path_command = File.join(path, cmd)
|
|
120
|
+
File.file?(full_path_command) && File.executable?(full_path_command)
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
if found
|
|
125
|
+
exec full_path_command, *args
|
|
126
|
+
else
|
|
127
|
+
abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
class Jets::Commands::Delete
|
|
2
|
+
include Jets::AwsServices
|
|
3
|
+
|
|
4
|
+
def initialize(options)
|
|
5
|
+
@options = options
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def run
|
|
9
|
+
puts("Deleting project...")
|
|
10
|
+
return if @options[:noop]
|
|
11
|
+
|
|
12
|
+
are_you_sure?
|
|
13
|
+
|
|
14
|
+
confirm_project_exists
|
|
15
|
+
|
|
16
|
+
# Must first remove all objects from s3 bucket in order to delete stack
|
|
17
|
+
puts "First, deleting objects in s3 bucket #{s3_bucket_name}" if s3_bucket_name
|
|
18
|
+
empty_s3_bucket
|
|
19
|
+
|
|
20
|
+
stack_in_progress?(parent_stack_name)
|
|
21
|
+
|
|
22
|
+
cfn.delete_stack(stack_name: parent_stack_name)
|
|
23
|
+
puts "Deleting #{Jets.config.project_namespace.color(:green)}..."
|
|
24
|
+
|
|
25
|
+
wait_for_stack if @options[:wait]
|
|
26
|
+
|
|
27
|
+
delete_logs
|
|
28
|
+
|
|
29
|
+
puts "Project #{Jets.config.project_namespace.color(:green)} deleted!"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def wait_for_stack
|
|
33
|
+
status = Jets::Cfn::Status.new(@options)
|
|
34
|
+
start_time = Time.now
|
|
35
|
+
status.wait
|
|
36
|
+
took = Time.now - start_time
|
|
37
|
+
puts "Time took for deletion: #{status.pretty_time(took).color(:green)}."
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def delete_logs
|
|
41
|
+
puts "Deleting CloudWatch logs"
|
|
42
|
+
log = Jets::Commands::Clean::Log.new(mute: true, sure: true)
|
|
43
|
+
log.clean
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def confirm_project_exists
|
|
47
|
+
begin
|
|
48
|
+
resp = cfn.describe_stacks(stack_name: parent_stack_name)
|
|
49
|
+
rescue Aws::CloudFormation::Errors::ValidationError
|
|
50
|
+
# Aws::CloudFormation::Errors::ValidationError is thrown when the stack
|
|
51
|
+
# does not exist
|
|
52
|
+
puts "The parent stack #{Jets.config.project_namespace.color(:green)} for the project #{Jets.config.project_name.color(:green)} does not exist. So it cannot be deleted."
|
|
53
|
+
exit 0
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def empty_s3_bucket
|
|
58
|
+
return unless s3_bucket_name # Happens when minimal stack fails to build
|
|
59
|
+
return unless bucket_exists?(s3_bucket_name)
|
|
60
|
+
|
|
61
|
+
resp = s3.list_objects(bucket: s3_bucket_name)
|
|
62
|
+
if resp.contents.size > 0
|
|
63
|
+
# IE: objects = [{key: "objectkey1"}, {key: "objectkey2"}]
|
|
64
|
+
objects = resp.contents.map { |item| {key: item.key} }
|
|
65
|
+
s3.delete_objects(
|
|
66
|
+
bucket: s3_bucket_name,
|
|
67
|
+
delete: {
|
|
68
|
+
objects: objects,
|
|
69
|
+
quiet: false,
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
empty_s3_bucket # keep deleting objects until bucket is empty
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def s3_bucket_name
|
|
77
|
+
return @s3_bucket_name if defined?(@s3_bucket_name)
|
|
78
|
+
|
|
79
|
+
resp = cfn.describe_stacks(stack_name: parent_stack_name)
|
|
80
|
+
outputs = resp.stacks[0].outputs
|
|
81
|
+
if outputs.empty?
|
|
82
|
+
@s3_bucket_name = false
|
|
83
|
+
else
|
|
84
|
+
@s3_bucket_name = outputs.find {|o| o.output_key == 'S3Bucket'}.output_value
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
# Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
|
|
89
|
+
def bucket_exists?(bucket_name)
|
|
90
|
+
bucket_exists = false
|
|
91
|
+
begin
|
|
92
|
+
resp = s3.head_bucket(bucket: bucket_name, use_accelerate_endpoint: false)
|
|
93
|
+
bucket_exists = true
|
|
94
|
+
rescue
|
|
95
|
+
end
|
|
96
|
+
bucket_exists
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def parent_stack_name
|
|
100
|
+
Jets::Naming.parent_stack_name
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def are_you_sure?
|
|
104
|
+
if @options[:sure]
|
|
105
|
+
sure = 'y'
|
|
106
|
+
else
|
|
107
|
+
puts "Are you sure you want to want to delete the #{Jets.config.project_namespace.color(:green)} project? (y/N)"
|
|
108
|
+
sure = $stdin.gets
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
unless sure =~ /^y/
|
|
112
|
+
puts "Phew! Jets #{Jets.config.project_namespace.color(:green)} project was not deleted."
|
|
113
|
+
exit 0
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
118
|
+
#
|
|
119
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
|
120
|
+
def check_deleteable_status
|
|
121
|
+
return true if !stack_exists?(@parent_stack_name)
|
|
122
|
+
|
|
123
|
+
# Assumes stack exists
|
|
124
|
+
resp = cfn.describe_stacks(stack_name: @parent_stack_name)
|
|
125
|
+
status = resp.stacks[0].stack_status
|
|
126
|
+
|
|
127
|
+
return true if status == 'ROLLBACK_COMPLETE'
|
|
128
|
+
|
|
129
|
+
if status =~ /_IN_PROGRESS$/
|
|
130
|
+
puts "The '#{@parent_stack_name}' stack status is #{status}. " \
|
|
131
|
+
"It is not in an updateable status. Please wait until the stack is ready and try again.".color(:red)
|
|
132
|
+
exit 0
|
|
133
|
+
elsif resp.stacks[0].outputs.empty?
|
|
134
|
+
# This Happens when the miminal stack fails at the very beginning.
|
|
135
|
+
# There is no s3 bucket at all. User should delete the stack.
|
|
136
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
|
137
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
|
138
|
+
exit 0
|
|
139
|
+
else
|
|
140
|
+
true
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
end
|