jets_bb_fork 0.0.4
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 +84 -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 +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +734 -0
- data/CONDUCT.md +1 -0
- data/CONTRIBUTING.md +1 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +14 -0
- data/Guardfile +22 -0
- data/LICENSE.txt +22 -0
- data/Procfile +2 -0
- data/README.md +203 -0
- data/Rakefile +24 -0
- data/backers.md +16 -0
- data/bin/release +9 -0
- data/buildspec.yml +18 -0
- data/exe/jets_bb_fork +14 -0
- data/jets.gemspec +68 -0
- data/lib/jets.rb +27 -0
- data/lib/jets/application.rb +216 -0
- data/lib/jets/application/defaults.rb +172 -0
- data/lib/jets/autoloaders.rb +97 -0
- data/lib/jets/aws_info.rb +113 -0
- data/lib/jets/aws_services.rb +65 -0
- data/lib/jets/aws_services/global_memoist.rb +57 -0
- data/lib/jets/aws_services/s3_bucket.rb +34 -0
- data/lib/jets/aws_services/stack_status.rb +59 -0
- data/lib/jets/booter.rb +119 -0
- data/lib/jets/builders/code_builder.rb +399 -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 +186 -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/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/bundle.rb +82 -0
- data/lib/jets/camelizer.rb +71 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +63 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +157 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +75 -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 +137 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/paged.rb +37 -0
- data/lib/jets/cfn/builders/parent_builder.rb +100 -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 +185 -0
- data/lib/jets/cfn/status.rb +212 -0
- data/lib/jets/cfn/upload.rb +139 -0
- data/lib/jets/cli.rb +194 -0
- data/lib/jets/commands/base.rb +146 -0
- data/lib/jets/commands/build.rb +234 -0
- data/lib/jets/commands/call.rb +169 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +136 -0
- data/lib/jets/commands/call/base_guesser.rb +60 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/clean.rb +19 -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 +12 -0
- data/lib/jets/commands/db.rb +13 -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 +141 -0
- data/lib/jets/commands/dynamodb.rb +19 -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/destroy.md +16 -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 +12 -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/rails.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 +157 -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 +46 -0
- data/lib/jets/commands/runner.rb +16 -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 +38 -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 +67 -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 +7 -0
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +9 -0
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +7 -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 +145 -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 +3 -0
- data/lib/jets/controller/base.rb +108 -0
- data/lib/jets/controller/callbacks.rb +68 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -0
- data/lib/jets/controller/middleware/local.rb +116 -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 +106 -0
- data/lib/jets/controller/middleware/main.rb +46 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/params.rb +87 -0
- data/lib/jets/controller/rack/adapter.rb +88 -0
- data/lib/jets/controller/rack/env.rb +105 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/rendering.rb +79 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +250 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +33 -0
- data/lib/jets/core.rb +149 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/dotenv/ssm.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +48 -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/mailers_controller.rb +97 -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 +157 -0
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +9 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +70 -0
- data/lib/jets/internal/app/shared/functions/jets/s3_bucket_config.rb +43 -0
- data/lib/jets/internal/app/views/jets/mailers/email.html.erb +145 -0
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/lib/jets/internal/turbines/jets/mailer.rb +51 -0
- data/lib/jets/job/base.rb +39 -0
- data/lib/jets/job/dsl.rb +40 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +65 -0
- data/lib/jets/job/dsl/event_source_mapping.rb +11 -0
- data/lib/jets/job/dsl/iot_event.rb +24 -0
- data/lib/jets/job/dsl/kinesis_event.rb +46 -0
- data/lib/jets/job/dsl/log_event.rb +15 -0
- data/lib/jets/job/dsl/rule_event.rb +75 -0
- data/lib/jets/job/dsl/s3_event.rb +36 -0
- data/lib/jets/job/dsl/sns_event.rb +54 -0
- data/lib/jets/job/dsl/sqs_event.rb +96 -0
- data/lib/jets/job/helpers/kinesis_event_helper.rb +13 -0
- data/lib/jets/job/helpers/log_event_helper.rb +17 -0
- data/lib/jets/job/helpers/s3_event_helper.rb +13 -0
- data/lib/jets/klass.rb +109 -0
- data/lib/jets/lambda/dsl.rb +419 -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 +21 -0
- data/lib/jets/mega/hash_converter.rb +25 -0
- data/lib/jets/mega/request.rb +139 -0
- data/lib/jets/mega/request/source.rb +21 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +51 -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 +13 -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 +73 -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/deducer.rb +65 -0
- data/lib/jets/processors/main_processor.rb +61 -0
- data/lib/jets/rack_server.rb +86 -0
- data/lib/jets/rdoc.rb +30 -0
- data/lib/jets/resource.rb +71 -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 +101 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +56 -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 +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +8 -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 +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/associated.rb +37 -0
- data/lib/jets/resource/base.rb +28 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +56 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +53 -0
- data/lib/jets/resource/child_stack/app_class.rb +107 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/shared.rb +92 -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/rule.rb +31 -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/iot/topic_rule.rb +34 -0
- data/lib/jets/resource/lambda/event_source_mapping.rb +31 -0
- data/lib/jets/resource/lambda/function.rb +214 -0
- data/lib/jets/resource/lambda/function/environment.rb +62 -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/logs/subscription_filter.rb +31 -0
- data/lib/jets/resource/permission.rb +45 -0
- data/lib/jets/resource/replacer.rb +85 -0
- data/lib/jets/resource/route53/record_set.rb +70 -0
- data/lib/jets/resource/s3/bucket.rb +24 -0
- data/lib/jets/resource/sns/subscription.rb +29 -0
- data/lib/jets/resource/sns/topic.rb +35 -0
- data/lib/jets/resource/sns/topic_policy.rb +40 -0
- data/lib/jets/resource/sqs/queue.rb +21 -0
- data/lib/jets/resource/standardizer.rb +42 -0
- data/lib/jets/route.rb +166 -0
- data/lib/jets/router.rb +177 -0
- data/lib/jets/router/scope.rb +30 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +110 -0
- data/lib/jets/spec_helpers.rb +54 -0
- data/lib/jets/spec_helpers/params.rb +10 -0
- data/lib/jets/spec_helpers/request.rb +78 -0
- data/lib/jets/spec_helpers/response.rb +5 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/depends/item.rb +9 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/main/dsl.rb +28 -0
- data/lib/jets/stack/main/dsl/base.rb +49 -0
- data/lib/jets/stack/main/dsl/cloudwatch.rb +19 -0
- data/lib/jets/stack/main/dsl/iam.rb +8 -0
- data/lib/jets/stack/main/dsl/lambda.rb +83 -0
- data/lib/jets/stack/main/dsl/s3.rb +12 -0
- data/lib/jets/stack/main/dsl/sns.rb +16 -0
- data/lib/jets/stack/main/dsl/sqs.rb +10 -0
- data/lib/jets/stack/output.rb +35 -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 +37 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/tmp_loader.rb +52 -0
- data/lib/jets/turbine.rb +41 -0
- data/lib/jets/turbo.rb +55 -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/rails.rb +127 -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 +1004 -0
|
@@ -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
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
module Jets::Commands
|
|
2
|
+
class Deploy
|
|
3
|
+
extend Memoist
|
|
4
|
+
include StackInfo
|
|
5
|
+
def initialize(options)
|
|
6
|
+
@options = options
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def run
|
|
10
|
+
deployment_env = Jets.config.project_namespace.color(:green)
|
|
11
|
+
puts "Deploying to Lambda #{deployment_env} environment..."
|
|
12
|
+
return if @options[:noop]
|
|
13
|
+
|
|
14
|
+
check_dev_mode
|
|
15
|
+
validate_routes!
|
|
16
|
+
|
|
17
|
+
# deploy full nested stack when stack already exists
|
|
18
|
+
# Delete existing rollback stack from previous bad minimal deploy
|
|
19
|
+
delete_minimal_stack if minimal_rollback_complete?
|
|
20
|
+
exit_unless_updateable! # Stack could be in a weird rollback state or in progress state
|
|
21
|
+
|
|
22
|
+
if first_run?
|
|
23
|
+
ship(stack_type: :minimal)
|
|
24
|
+
Jets.application.reload_configs!
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Build code after the minimal stack because need s3 bucket for assets
|
|
28
|
+
# on_aws? and s3_base_url logic
|
|
29
|
+
# TODO: possible deploy hook point: before_build
|
|
30
|
+
build_code
|
|
31
|
+
|
|
32
|
+
# TODO: possible deploy hook point: before_ship
|
|
33
|
+
create_s3_event_buckets
|
|
34
|
+
ship(stack_type: :full, s3_bucket: s3_bucket)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def create_s3_event_buckets
|
|
38
|
+
buckets = Jets::Job::Base.s3_events.keys
|
|
39
|
+
buckets.each do |bucket|
|
|
40
|
+
Jets::AwsServices::S3Bucket.ensure_exists(bucket)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def delete_minimal_stack
|
|
45
|
+
puts "Existing stack is in ROLLBACK_COMPLETE state from a previous failed minimal deploy. Deleting stack and continuing."
|
|
46
|
+
cfn.delete_stack(stack_name: stack_name)
|
|
47
|
+
status.wait
|
|
48
|
+
status.reset
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def check_dev_mode
|
|
52
|
+
if File.exist?("#{Jets.root}/dev.mode")
|
|
53
|
+
puts "The dev.mode file exists. Please removed it and run bundle update before you deploy.".color(:red)
|
|
54
|
+
exit 1
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def build_code
|
|
59
|
+
Jets::Commands::Build.new(@options).build_code
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def validate_routes!
|
|
63
|
+
check_route_connected_functions
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Checks that all routes are validate and have corresponding lambda functions
|
|
67
|
+
def check_route_connected_functions
|
|
68
|
+
return if Jets::Router.all_routes_valid
|
|
69
|
+
|
|
70
|
+
puts "Deploy fail: The jets application contain invalid routes.".color(:red)
|
|
71
|
+
puts "Please double check the routes below map to valid controllers:"
|
|
72
|
+
Jets::Router.invalid_routes.each do |route|
|
|
73
|
+
puts " /#{route.path} => #{route.controller_name}##{route.action_name}"
|
|
74
|
+
end
|
|
75
|
+
exit 1
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def ship(stack_options)
|
|
79
|
+
options = @options.merge(stack_options) # includes stack_type and s3_bucket
|
|
80
|
+
Jets::Commands::Build.new(options).build_templates
|
|
81
|
+
Jets::Cfn::Ship.new(options).run
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def status
|
|
85
|
+
Jets::Cfn::Status.new(stack_name)
|
|
86
|
+
end
|
|
87
|
+
memoize :status
|
|
88
|
+
|
|
89
|
+
def stack_name
|
|
90
|
+
Jets::Naming.parent_stack_name
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# Checks for a few things before deciding to delete the parent stack
|
|
94
|
+
#
|
|
95
|
+
# * Parent stack status status is ROLLBACK_COMPLETE
|
|
96
|
+
# * Parent resources are in the DELETE_COMPLETE state
|
|
97
|
+
#
|
|
98
|
+
def minimal_rollback_complete?
|
|
99
|
+
stack = find_stack(stack_name)
|
|
100
|
+
return false unless stack
|
|
101
|
+
|
|
102
|
+
return false unless stack.stack_status == 'ROLLBACK_COMPLETE'
|
|
103
|
+
|
|
104
|
+
# Finally check if all the minimal resources in the parent template have been deleted
|
|
105
|
+
resp = cfn.describe_stack_resources(stack_name: stack_name)
|
|
106
|
+
resource_statuses = resp.stack_resources.map(&:resource_status).uniq
|
|
107
|
+
resource_statuses == ['DELETE_COMPLETE']
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def find_stack(stack_name)
|
|
111
|
+
resp = cfn.describe_stacks(stack_name: stack_name)
|
|
112
|
+
resp.stacks.first
|
|
113
|
+
rescue Aws::CloudFormation::Errors::ValidationError => e
|
|
114
|
+
# example: Stack with id demo-dev does not exist
|
|
115
|
+
if e.message =~ /Stack with/ && e.message =~ /does not exist/
|
|
116
|
+
nil
|
|
117
|
+
else
|
|
118
|
+
raise
|
|
119
|
+
end
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
123
|
+
def exit_unless_updateable!
|
|
124
|
+
stack_name = Jets::Naming.parent_stack_name
|
|
125
|
+
exists = stack_exists?(stack_name)
|
|
126
|
+
return unless exists # continue because stack could be updating
|
|
127
|
+
|
|
128
|
+
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
|
129
|
+
status = stack["stack_status"]
|
|
130
|
+
if status =~ /^ROLLBACK_/ ||
|
|
131
|
+
status =~ /_IN_PROGRESS$/
|
|
132
|
+
region = `aws configure get region`.strip rescue "us-east-1"
|
|
133
|
+
url = "https://console.aws.amazon.com/cloudformation/home?region=#{region}#/stacks"
|
|
134
|
+
puts "The parent stack of the #{Jets.config.project_name.color(:green)} project is not in an updateable state."
|
|
135
|
+
puts "Stack name #{stack_name.color(:yellow)} status #{stack["stack_status"].color(:yellow)}"
|
|
136
|
+
puts "Here's the CloudFormation url to check for more details #{url}"
|
|
137
|
+
exit 1
|
|
138
|
+
end
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
end
|