jets 3.1.0 → 5.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/.github/FUNDING.yml +1 -0
- data/.gitignore +5 -1
- data/CHANGELOG.md +141 -0
- data/Gemfile +1 -5
- data/LICENSE.txt +1 -1
- data/README.md +21 -43
- data/Rakefile +3 -3
- data/backers.md +0 -5
- data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
- data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
- data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
- data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
- data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
- data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
- data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
- data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
- data/engines/internal/app/functions/jets/base_path.rb +109 -0
- data/engines/internal/app/functions/jets/base_path_mapping.rb +191 -0
- data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
- data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
- data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
- data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
- data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
- data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
- data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
- data/engines/internal/app/views/layouts/application.html.erb +51 -0
- data/engines/internal/lib/internal/actiondispatch.rb +39 -0
- data/engines/internal/lib/internal/actionmailer.rb +51 -0
- data/engines/internal/lib/internal/actionview.rb +152 -0
- data/engines/internal/lib/internal/activerecord.rb +37 -0
- data/engines/internal/lib/internal/activesupport.rb +47 -0
- data/engines/internal/lib/internal/engine.rb +13 -0
- data/engines/internal/lib/internal/i18n_engine.rb +19 -0
- data/engines/internal/lib/internal/jets_controller.rb +46 -0
- data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
- data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
- data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
- data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
- data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
- data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
- data/exe/jets +1 -10
- data/jets.gemspec +16 -13
- data/lib/jets/app_loader.rb +77 -0
- data/lib/jets/application/bootstrap.rb +100 -0
- data/lib/jets/application/configuration/defaults.rb +256 -0
- data/lib/jets/application/configuration.rb +494 -0
- data/lib/jets/application/default_middleware_stack.rb +140 -0
- data/lib/jets/application/dummy_erb_compiler.rb +18 -0
- data/lib/jets/application/finisher.rb +266 -0
- data/lib/jets/application/routes_reloader.rb +80 -0
- data/lib/jets/application.rb +515 -199
- data/lib/jets/authorizer/base.rb +1 -0
- data/lib/jets/authorizer/dsl.rb +15 -11
- data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
- data/lib/jets/autoloaders/gem.rb +70 -0
- data/lib/jets/autoloaders/inflector.rb +21 -0
- data/lib/jets/autoloaders.rb +38 -101
- data/lib/jets/aws_info.rb +2 -2
- data/lib/jets/aws_services/stack_status.rb +1 -1
- data/lib/jets/aws_services.rb +8 -0
- data/lib/jets/backtrace_cleaner.rb +27 -0
- data/lib/jets/booter.rb +30 -118
- data/lib/jets/builders/code_builder.rb +64 -122
- data/lib/jets/builders/code_size.rb +1 -0
- data/lib/jets/builders/gem_replacer.rb +6 -12
- data/lib/jets/builders/handler_generator.rb +34 -14
- data/lib/jets/builders/lambda_layer.rb +2 -7
- data/lib/jets/builders/purger.rb +1 -1
- data/lib/jets/builders/rack_packager.rb +1 -1
- data/lib/jets/builders/ruby_packager.rb +54 -10
- data/lib/jets/builders/shim_vars/app.rb +10 -6
- data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
- data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
- data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
- data/lib/jets/bundle.rb +2 -9
- data/lib/jets/cfn/base.rb +82 -0
- data/lib/jets/cfn/builder/api/base.rb +12 -0
- data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +11 -21
- data/lib/jets/cfn/builder/api/gateway.rb +104 -0
- data/lib/jets/cfn/builder/api/mapping.rb +54 -0
- data/lib/jets/cfn/builder/api/methods.rb +72 -0
- data/lib/jets/cfn/builder/api/paged.rb +30 -0
- data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
- data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
- data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
- data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
- data/lib/jets/cfn/builder/api/resources.rb +40 -0
- data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
- data/lib/jets/cfn/builder/controller.rb +28 -0
- data/lib/jets/cfn/builder/function.rb +9 -0
- data/lib/jets/cfn/builder/interface.rb +146 -0
- data/lib/jets/cfn/builder/job.rb +10 -0
- data/lib/jets/cfn/builder/nested.rb +130 -0
- data/lib/jets/cfn/builder/one_controller.rb +53 -0
- data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
- data/lib/jets/cfn/builder/parent.rb +149 -0
- data/lib/jets/cfn/builder/post_process.rb +25 -0
- data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
- data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +5 -4
- data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
- data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
- data/lib/jets/cfn/deployment.rb +45 -0
- data/lib/jets/cfn/download.rb +39 -0
- data/lib/jets/cfn/params/api/base.rb +39 -0
- data/lib/jets/cfn/params/api/cors.rb +10 -0
- data/lib/jets/cfn/params/api/methods.rb +69 -0
- data/lib/jets/cfn/params/api/resources.rb +28 -0
- data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
- data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
- data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
- data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
- data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
- data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
- data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +14 -4
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +2 -2
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +15 -41
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +3 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +6 -6
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
- data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +22 -12
- data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
- data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
- data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
- data/lib/jets/cfn/resource/iam/base_role_definition.rb +56 -0
- data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
- data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
- data/lib/jets/cfn/resource/iam/policy.rb +31 -0
- data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
- data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
- data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
- data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +9 -7
- data/lib/jets/cfn/resource/lambda/function.rb +266 -0
- data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
- data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
- data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
- data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
- data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
- data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
- data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
- data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
- data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
- data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
- data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
- data/lib/jets/cfn/resource/nested/base.rb +38 -0
- data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
- data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
- data/lib/jets/cfn/resource/one/function.rb +66 -0
- data/lib/jets/cfn/resource/one/permission.rb +17 -0
- data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
- data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
- data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
- data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
- data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
- data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
- data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
- data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
- data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
- data/lib/jets/cfn/resource.rb +8 -0
- data/lib/jets/cfn/ship.rb +30 -16
- data/lib/jets/cfn/status.rb +1 -1
- data/lib/jets/cfn/template.rb +89 -0
- data/lib/jets/cfn/upload.rb +26 -23
- data/lib/jets/cli.rb +28 -203
- data/lib/jets/command/actions.rb +49 -0
- data/lib/jets/command/api_helpers.rb +41 -0
- data/lib/jets/command/aws_helpers.rb +26 -0
- data/lib/jets/command/base.rb +204 -0
- data/lib/jets/command/behavior.rb +83 -0
- data/lib/jets/command/environment_argument.rb +42 -0
- data/lib/jets/command/help/call.md +48 -0
- data/lib/jets/{commands → command}/help/deploy.md +1 -1
- data/lib/jets/command/help/logs.md +21 -0
- data/lib/jets/{commands → command}/help/new.md +3 -4
- data/lib/jets/command/help/projects.md +6 -0
- data/lib/jets/command/help/releases.md +37 -0
- data/lib/jets/command/help/rollback.md +5 -0
- data/lib/jets/command/help/routes.md +15 -0
- data/lib/jets/command/help/runner.md +40 -0
- data/lib/jets/command/help/stacks.md +6 -0
- data/lib/jets/command/help.rb +17 -0
- data/lib/jets/command/helpers/editor.rb +35 -0
- data/lib/jets/command.rb +133 -0
- data/lib/jets/commands/application/application_command.rb +40 -0
- data/lib/jets/commands/build/build_command.rb +33 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
- data/lib/jets/commands/call/autoload_guesser.rb +2 -2
- data/lib/jets/commands/call/base_guesser.rb +5 -5
- data/lib/jets/commands/call/call_command.rb +27 -0
- data/lib/jets/commands/call/caller.rb +184 -0
- data/lib/jets/commands/call/guesser.rb +1 -1
- data/lib/jets/commands/clean/base.rb +1 -1
- data/lib/jets/commands/clean/build.rb +1 -1
- data/lib/jets/commands/clean/clean_command.rb +15 -0
- data/lib/jets/commands/clean/log.rb +4 -4
- data/lib/jets/commands/configure/configure_command.rb +9 -0
- data/lib/jets/commands/console/console_command.rb +38 -0
- data/lib/jets/commands/credentials/USAGE +103 -0
- data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
- data/lib/jets/commands/credentials/credentials_command.rb +139 -0
- data/lib/jets/commands/db/system/change/change_command.rb +24 -0
- data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
- data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
- data/lib/jets/commands/delete/delete_command.rb +155 -0
- data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +30 -49
- data/lib/jets/commands/dev/dev_command.rb +19 -0
- data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
- data/lib/jets/commands/encrypted/USAGE +46 -0
- data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
- data/lib/jets/commands/gems/gems_command.rb +14 -0
- data/lib/jets/commands/generate/generate_command.rb +95 -0
- data/lib/jets/commands/help/USAGE +20 -0
- data/lib/jets/commands/help/help_command.rb +15 -0
- data/lib/jets/commands/initializers/initializers_command.rb +19 -0
- data/lib/jets/commands/logs/logs_command.rb +45 -0
- data/lib/jets/commands/new/new_command.rb +19 -0
- data/lib/jets/commands/notes/notes_command.rb +30 -0
- data/lib/jets/commands/plugin/plugin_command.rb +45 -0
- data/lib/jets/commands/projects/projects_command.rb +30 -0
- data/lib/jets/commands/rake/rake_command.rb +59 -0
- data/lib/jets/commands/releases/releases_command.rb +72 -0
- data/lib/jets/commands/rollback/rollback_command.rb +41 -0
- data/lib/jets/commands/routes/routes_command.rb +19 -0
- data/lib/jets/commands/runner/runner_command.rb +60 -0
- data/lib/jets/commands/server/server_command.rb +291 -0
- data/lib/jets/commands/stacks/stacks_command.rb +39 -0
- data/lib/jets/commands/status/status_command.rb +9 -0
- data/lib/jets/commands/url/url_command.rb +92 -0
- data/lib/jets/commands/version/version_command.rb +11 -0
- data/lib/jets/commands.rb +17 -0
- data/lib/jets/configuration.rb +166 -0
- data/lib/jets/controller/base.rb +105 -183
- data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
- data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
- data/lib/jets/controller/compat/caching.rb +13 -0
- data/lib/jets/controller/compat/future.rb +13 -0
- data/lib/jets/controller/compat/route_set.rb +47 -0
- data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
- data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
- data/lib/jets/controller/decorate/logging.rb +90 -0
- data/lib/jets/controller/decorate/redirecting.rb +16 -0
- data/lib/jets/controller/decorate/url_for.rb +10 -0
- data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
- data/lib/jets/controller/handler.rb +41 -0
- data/lib/jets/controller/middleware/main.rb +16 -8
- data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +41 -4
- data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
- data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
- data/lib/jets/controller/rack_adapter/action.rb +35 -0
- data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -18
- data/lib/jets/controller/request/compat/params.rb +144 -0
- data/lib/jets/controller/request/compat/request.rb +125 -0
- data/lib/jets/controller/request.rb +35 -18
- data/lib/jets/controller/response/compat/response.rb +67 -0
- data/lib/jets/controller/response.rb +91 -8
- data/lib/jets/core.rb +153 -50
- data/lib/jets/core_ext/file.rb +9 -0
- data/lib/jets/core_ext/kernel.rb +2 -2
- data/lib/jets/core_ext/symbol.rb +5 -0
- data/lib/jets/core_ext.rb +4 -0
- data/lib/jets/dev_caching.rb +44 -0
- data/lib/jets/dotenv/ssm.rb +5 -2
- data/lib/jets/dotenv.rb +4 -3
- data/lib/jets/engine/configuration.rb +96 -0
- data/lib/jets/engine/turbines.rb +23 -0
- data/lib/jets/engine.rb +380 -0
- data/lib/jets/erb.rb +1 -1
- data/lib/jets/exception_reporting.rb +43 -0
- data/lib/jets/generators/job/job_generator.rb +41 -0
- data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
- data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
- data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
- data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
- data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
- data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
- data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
- data/lib/jets/generators/overrides/app/USAGE +38 -0
- data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
- data/lib/jets/generators/overrides/app/helpers.rb +139 -0
- data/lib/jets/generators/overrides/app/templates/.env +10 -0
- data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
- data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
- data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
- data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
- data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
- data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
- data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
- data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
- data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
- data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
- data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
- data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
- data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
- data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
- data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
- data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
- data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
- data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
- data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
- data/lib/jets/generators.rb +112 -0
- data/lib/jets/inflections.rb +1 -1
- data/lib/jets/info.rb +116 -0
- data/lib/jets/initializable.rb +95 -0
- data/lib/jets/job/base.rb +5 -2
- data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
- data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
- data/lib/jets/job/dsl/iot_event.rb +6 -6
- data/lib/jets/job/dsl/kinesis_event.rb +5 -5
- data/lib/jets/job/dsl/log_event.rb +2 -2
- data/lib/jets/job/dsl/rule_event.rb +7 -4
- data/lib/jets/job/dsl/s3_event.rb +1 -1
- data/lib/jets/job/dsl/sns_event.rb +6 -6
- data/lib/jets/job/dsl/sqs_event.rb +11 -11
- data/lib/jets/job/helpers/sns_event_helper.rb +8 -0
- data/lib/jets/job/helpers/sqs_event_helper.rb +8 -0
- data/lib/jets/klass.rb +5 -6
- data/lib/jets/lambda/definition.rb +118 -0
- data/lib/jets/lambda/dsl/warnings.rb +57 -0
- data/lib/jets/lambda/dsl.rb +73 -54
- data/lib/jets/lambda/function.rb +3 -3
- data/lib/jets/lambda/function_constructor.rb +6 -6
- data/lib/jets/lambda/functions.rb +36 -1
- data/lib/jets/mega/hash_converter.rb +2 -2
- data/lib/jets/mega/request/source.rb +1 -2
- data/lib/jets/mega/request.rb +4 -4
- data/lib/jets/names.rb +79 -0
- data/lib/jets/overrides/dummy/rails.rb +11 -0
- data/lib/jets/overrides/lambda/marshaller.rb +10 -0
- data/lib/jets/overrides/puma.rb +10 -0
- data/lib/jets/paths.rb +243 -0
- data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
- data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
- data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
- data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
- data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
- data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
- data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
- data/lib/jets/preheat.rb +26 -33
- data/lib/jets/processors/deducer.rb +2 -2
- data/lib/jets/processors/main_processor.rb +6 -13
- data/lib/jets/rack/logger.rb +77 -0
- data/lib/jets/router/compat/route_set.rb +177 -0
- data/lib/jets/router/dsl/mount.rb +40 -6
- data/lib/jets/router/dsl.rb +125 -105
- data/lib/jets/router/engine_mount.rb +36 -0
- data/lib/jets/router/help.rb +130 -0
- data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
- data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
- data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
- data/lib/jets/router/matcher.rb +140 -17
- data/lib/jets/router/resources/options.rb +6 -4
- data/lib/jets/router/route/after_initialize.rb +64 -0
- data/lib/jets/router/route/as.rb +93 -0
- data/lib/jets/router/route/authorizer.rb +1 -0
- data/lib/jets/router/route/compat.rb +45 -0
- data/lib/jets/router/route/info.rb +74 -0
- data/lib/jets/router/route/node.rb +137 -0
- data/lib/jets/router/route/path.rb +93 -0
- data/lib/jets/router/route.rb +109 -90
- data/lib/jets/router/route_set.rb +214 -0
- data/lib/jets/router/scope.rb +204 -69
- data/lib/jets/router/state.rb +67 -0
- data/lib/jets/router/util.rb +1 -31
- data/lib/jets/router.rb +64 -150
- data/lib/jets/ruby_version_check.rb +15 -0
- data/lib/jets/rule/base.rb +1 -0
- data/lib/jets/rule/dsl.rb +7 -7
- data/lib/jets/secrets.rb +110 -0
- data/lib/jets/spec_helpers/controllers/request.rb +22 -16
- data/lib/jets/spec_helpers/controllers.rb +32 -24
- data/lib/jets/spec_helpers.rb +0 -6
- data/lib/jets/stack/builder.rb +3 -2
- data/lib/jets/stack/definition.rb +1 -4
- data/lib/jets/stack/function.rb +2 -2
- data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
- data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
- data/lib/jets/stack/main/dsl/lambda.rb +26 -19
- data/lib/jets/stack/main/dsl/sqs.rb +2 -2
- data/lib/jets/stack/output/lookup.rb +1 -1
- data/lib/jets/stack/output.rb +2 -2
- data/lib/jets/stack/parameter.rb +2 -2
- data/lib/jets/stack/resource.rb +3 -3
- data/lib/jets/stack/s3_event.rb +51 -37
- data/lib/jets/stack.rb +1 -1
- data/lib/jets/tasks/engine.rake +85 -0
- data/lib/jets/tasks/framework.rake +66 -0
- data/lib/jets/tasks/log.rake +41 -0
- data/lib/jets/tasks/middleware.rake +9 -0
- data/lib/jets/tasks/misc.rake +81 -0
- data/lib/jets/tasks/statistics.rake +37 -0
- data/lib/jets/tasks/tmp.rake +51 -0
- data/lib/jets/tasks/yarn.rake +29 -0
- data/lib/jets/tasks/zeitwerk.rake +61 -0
- data/lib/jets/tasks.rb +18 -0
- data/lib/jets/tmp_loader.rb +1 -1
- data/lib/jets/turbine/configurable.rb +36 -0
- data/lib/jets/turbine/configuration.rb +101 -0
- data/lib/jets/turbine.rb +164 -20
- data/lib/jets/util/camelize.rb +24 -0
- data/lib/jets/util/yamler.rb +16 -0
- data/lib/jets/version.rb +1 -1
- data/lib/jets.rb +8 -14
- metadata +444 -347
- data/.python-version +0 -1
- data/.ruby-version +0 -1
- data/bin/release +0 -9
- data/lib/jets/application/defaults.rb +0 -200
- data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
- data/lib/jets/builders/reconfigure_rails.rb +0 -114
- data/lib/jets/cfn/builders/api_gateway_builder.rb +0 -123
- data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
- data/lib/jets/cfn/builders/base_child_builder.rb +0 -69
- data/lib/jets/cfn/builders/controller_builder.rb +0 -50
- data/lib/jets/cfn/builders/function_builder.rb +0 -14
- data/lib/jets/cfn/builders/interface.rb +0 -133
- data/lib/jets/cfn/builders/job_builder.rb +0 -14
- data/lib/jets/cfn/builders/parent_builder.rb +0 -130
- data/lib/jets/cfn/built_template.rb +0 -15
- data/lib/jets/cfn/template_source.rb +0 -61
- data/lib/jets/commands/base.rb +0 -145
- data/lib/jets/commands/call.rb +0 -182
- data/lib/jets/commands/clean.rb +0 -19
- data/lib/jets/commands/configure.rb +0 -51
- data/lib/jets/commands/console.rb +0 -12
- data/lib/jets/commands/db/environment-task.rake +0 -3
- data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
- data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
- data/lib/jets/commands/db/tasks.rb +0 -34
- data/lib/jets/commands/db.rb +0 -13
- data/lib/jets/commands/dbconsole.rb +0 -134
- data/lib/jets/commands/delete.rb +0 -136
- data/lib/jets/commands/dynamodb/migrate.rb +0 -9
- data/lib/jets/commands/dynamodb/migrator.rb +0 -36
- data/lib/jets/commands/dynamodb.rb +0 -19
- data/lib/jets/commands/gems.rb +0 -13
- data/lib/jets/commands/help/call.md +0 -69
- data/lib/jets/commands/help/dynamodb/generate.md +0 -52
- data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
- data/lib/jets/commands/help/routes.md +0 -16
- data/lib/jets/commands/help/runner.md +0 -17
- data/lib/jets/commands/help.rb +0 -9
- data/lib/jets/commands/import/base.rb +0 -49
- data/lib/jets/commands/import/cheatsheet.rb +0 -35
- data/lib/jets/commands/import/rack.rb +0 -16
- data/lib/jets/commands/import/rails.rb +0 -74
- data/lib/jets/commands/import/sequence.rb +0 -90
- data/lib/jets/commands/import/templates/config/database.yml +0 -30
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
- data/lib/jets/commands/import.rb +0 -12
- data/lib/jets/commands/main.rb +0 -166
- data/lib/jets/commands/markdown/creator.rb +0 -58
- data/lib/jets/commands/markdown/index.rb +0 -27
- data/lib/jets/commands/markdown/page.rb +0 -125
- data/lib/jets/commands/markdown/shell.rb +0 -11
- data/lib/jets/commands/new.rb +0 -173
- data/lib/jets/commands/rake_command.rb +0 -61
- data/lib/jets/commands/rake_tasks.rb +0 -50
- data/lib/jets/commands/runner.rb +0 -16
- data/lib/jets/commands/sequence.rb +0 -105
- data/lib/jets/commands/stack_info.rb +0 -30
- data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
- data/lib/jets/commands/templates/skeleton/.env.test +0 -3
- data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
- data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
- data/lib/jets/commands/templates/skeleton/Procfile +0 -7
- data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
- data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
- data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -71
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
- data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
- data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
- data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
- data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
- data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
- data/lib/jets/commands/upgrade/version1.rb +0 -136
- data/lib/jets/commands/upgrade.rb +0 -105
- data/lib/jets/commands/url.rb +0 -69
- data/lib/jets/commands/webpacker_template.rb +0 -18
- data/lib/jets/controller/callbacks.rb +0 -73
- data/lib/jets/controller/cookies/jar.rb +0 -269
- data/lib/jets/controller/cookies.rb +0 -38
- data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
- data/lib/jets/controller/error.rb +0 -4
- data/lib/jets/controller/forgery_protection.rb +0 -43
- data/lib/jets/controller/layout.rb +0 -17
- data/lib/jets/controller/middleware/cors.rb +0 -60
- data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
- data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
- data/lib/jets/controller/middleware/reloader.rb +0 -15
- data/lib/jets/controller/parameters_filter.rb +0 -29
- data/lib/jets/controller/params.rb +0 -117
- data/lib/jets/controller/redirection.rb +0 -61
- data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
- data/lib/jets/controller/rendering.rb +0 -96
- data/lib/jets/controller/stage.rb +0 -34
- data/lib/jets/controller.rb +0 -3
- data/lib/jets/db.rb +0 -15
- data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
- data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
- data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
- data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
- data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
- data/lib/jets/generator.rb +0 -112
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
- data/lib/jets/internal/app/functions/jets/base_path.rb +0 -18
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +0 -100
- data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -70
- data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
- data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
- data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
- data/lib/jets/lambda/task.rb +0 -111
- data/lib/jets/logger.rb +0 -21
- data/lib/jets/middleware/configurator.rb +0 -84
- data/lib/jets/middleware/default_stack.rb +0 -53
- data/lib/jets/middleware/layer.rb +0 -34
- data/lib/jets/middleware/stack.rb +0 -77
- data/lib/jets/middleware.rb +0 -33
- data/lib/jets/naming.rb +0 -63
- data/lib/jets/overrides/rails/action_controller.rb +0 -13
- data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
- data/lib/jets/overrides/rails/common_methods.rb +0 -13
- data/lib/jets/overrides/rails/migration_checker.rb +0 -34
- data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
- data/lib/jets/overrides/rails/url_helper.rb +0 -88
- data/lib/jets/overrides/rails.rb +0 -6
- data/lib/jets/rack_server.rb +0 -86
- data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
- data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
- data/lib/jets/resource/api_gateway/cors.rb +0 -61
- data/lib/jets/resource/api_gateway/method.rb +0 -102
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
- data/lib/jets/resource/base.rb +0 -28
- data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
- data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
- data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
- data/lib/jets/resource/child_stack/api_resource.rb +0 -54
- data/lib/jets/resource/child_stack/base.rb +0 -24
- data/lib/jets/resource/iam/base_role_definition.rb +0 -47
- data/lib/jets/resource/lambda/function.rb +0 -221
- data/lib/jets/resource/logs/subscription_filter.rb +0 -31
- data/lib/jets/resource/permission.rb +0 -45
- data/lib/jets/resource.rb +0 -71
- data/lib/jets/router/error.rb +0 -4
- data/lib/jets/router/finder.rb +0 -47
- data/lib/jets/router/helpers/core_helper.rb +0 -27
- data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
- data/lib/jets/router/helpers.rb +0 -4
- data/lib/jets/router/method_creator/code.rb +0 -99
- data/lib/jets/router/method_creator/edit.rb +0 -12
- data/lib/jets/router/method_creator/generic.rb +0 -11
- data/lib/jets/router/method_creator/index.rb +0 -48
- data/lib/jets/router/method_creator/new.rb +0 -12
- data/lib/jets/router/method_creator/root.rb +0 -15
- data/lib/jets/router/method_creator/show.rb +0 -12
- data/lib/jets/router/method_creator.rb +0 -50
- data/lib/jets/turbo/database_yaml.rb +0 -41
- data/lib/jets/turbo/project/.gitignore +0 -12
- data/lib/jets/turbo/project/.jetskeep +0 -1
- data/lib/jets/turbo/project/Gemfile +0 -16
- data/lib/jets/turbo/project/Rakefile +0 -2
- data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
- data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
- data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
- data/lib/jets/turbo/project/config/application.rb +0 -5
- data/lib/jets/turbo/project/config/routes.rb +0 -4
- data/lib/jets/turbo/project/config.ru +0 -5
- data/lib/jets/turbo/rails.rb +0 -127
- data/lib/jets/turbo/templates/config/database.yml +0 -30
- data/lib/jets/turbo.rb +0 -56
- data/readme/prerelease.md +0 -6
- data/readme/testing.md +0 -60
- /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
- /data/lib/jets/{commands → command}/help/build.md +0 -0
- /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
- /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
- /data/lib/jets/{commands → command}/help/console.md +0 -0
- /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
- /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
- /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
- /data/lib/jets/{commands → command}/help/delete.md +0 -0
- /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
- /data/lib/jets/{commands → command}/help/generate.md +0 -0
- /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
- /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
- /data/lib/jets/{commands → command}/help/server.md +0 -0
- /data/lib/jets/{commands → command}/help/status.md +0 -0
- /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
- /data/lib/jets/{commands → command}/help/url.md +0 -0
- /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
- /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
- /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
- /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
- /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
## Storing Encrypted Credentials in Source Control
|
|
2
|
+
|
|
3
|
+
The Jets `credentials` commands provide access to encrypted credentials,
|
|
4
|
+
so you can safely store access tokens, database passwords, and the like
|
|
5
|
+
safely inside the app without relying on a mess of ENVs.
|
|
6
|
+
|
|
7
|
+
This also allows for atomic deploys: no need to coordinate key changes
|
|
8
|
+
to get everything working as the keys are shipped with the code.
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
Applications after Jets 5 automatically have a basic credentials file generated
|
|
13
|
+
that just contains the secret_key_base used by MessageVerifiers/MessageEncryptors, like the ones
|
|
14
|
+
signing and encrypting cookies.
|
|
15
|
+
|
|
16
|
+
For applications created prior to Jets 5, we'll automatically generate a new
|
|
17
|
+
credentials file in `config/credentials.yml.enc` the first time you run `bin/jets credentials:edit`.
|
|
18
|
+
If you didn't have a master key saved in `config/master.key`, that'll be created too.
|
|
19
|
+
|
|
20
|
+
Don't lose this master key! Put it in a password manager your team can access.
|
|
21
|
+
Should you lose it no one, including you, will be able to access any encrypted
|
|
22
|
+
credentials.
|
|
23
|
+
|
|
24
|
+
Don't commit the key! Add `config/master.key` to your source control's
|
|
25
|
+
ignore file. If you use Git, Jets handles this for you.
|
|
26
|
+
|
|
27
|
+
Jets also looks for the master key in `ENV["JETS_MASTER_KEY"]`, if that's easier to manage.
|
|
28
|
+
|
|
29
|
+
You could prepend that to your server's start command like this:
|
|
30
|
+
|
|
31
|
+
JETS_MASTER_KEY="very-secret-and-secure" server.start
|
|
32
|
+
|
|
33
|
+
## Set up Git to Diff Credentials
|
|
34
|
+
|
|
35
|
+
Jets provides `bin/jets credentials:diff --enroll` to instruct Git to call
|
|
36
|
+
`bin/jets credentials:diff` when `git diff` is run on a credentials file.
|
|
37
|
+
|
|
38
|
+
Running the command enrolls the project such that all credentials files use the
|
|
39
|
+
"jets_credentials" diff driver in .gitattributes.
|
|
40
|
+
|
|
41
|
+
Additionally since Git requires the driver itself to be set up in a config file
|
|
42
|
+
that isn't tracked Jets automatically ensures it's configured when running
|
|
43
|
+
`credentials:edit`.
|
|
44
|
+
|
|
45
|
+
Otherwise each co-worker would have to run enable manually, including on each new
|
|
46
|
+
repo clone.
|
|
47
|
+
|
|
48
|
+
To disenroll from this feature, run `bin/jets credentials:diff --disenroll`.
|
|
49
|
+
|
|
50
|
+
## Editing Credentials
|
|
51
|
+
|
|
52
|
+
This will open a temporary file in `$EDITOR` with the decrypted contents to edit
|
|
53
|
+
the encrypted credentials.
|
|
54
|
+
|
|
55
|
+
When the temporary file is next saved the contents are encrypted and written to
|
|
56
|
+
`config/credentials.yml.enc` while the file itself is destroyed to prevent credentials
|
|
57
|
+
from leaking.
|
|
58
|
+
|
|
59
|
+
## Environment Specific Credentials
|
|
60
|
+
|
|
61
|
+
The `credentials` command supports passing an `--environment` option to create an
|
|
62
|
+
environment specific override. That override will take precedence over the
|
|
63
|
+
global `config/credentials.yml.enc` file when running in that environment. So:
|
|
64
|
+
|
|
65
|
+
bin/jets credentials:edit --environment development
|
|
66
|
+
|
|
67
|
+
will create `config/credentials/development.yml.enc` with the corresponding
|
|
68
|
+
encryption key in `config/credentials/development.key` if the credentials file
|
|
69
|
+
doesn't exist.
|
|
70
|
+
|
|
71
|
+
The encryption key can also be put in `ENV["JETS_MASTER_KEY"]`, which takes
|
|
72
|
+
precedence over the file encryption key.
|
|
73
|
+
|
|
74
|
+
In addition to that, the default credentials lookup paths can be overridden through
|
|
75
|
+
`config.credentials.content_path` and `config.credentials.key_path`.
|
|
76
|
+
|
|
77
|
+
## Editor wait
|
|
78
|
+
|
|
79
|
+
For editors that fork and exit immediately, it's important to pass a wait flag,
|
|
80
|
+
otherwise the credentials will be saved immediately with no chance to edit.
|
|
81
|
+
|
|
82
|
+
EDITOR="code --wait" jets credentials:edit
|
|
83
|
+
|
|
84
|
+
## Accessing in App
|
|
85
|
+
|
|
86
|
+
Let's say you have credentials like so:
|
|
87
|
+
|
|
88
|
+
❯ jets credentials:show
|
|
89
|
+
secret_key_base: somesecretvalue
|
|
90
|
+
foo: bar
|
|
91
|
+
|
|
92
|
+
You can access them in the app like so:
|
|
93
|
+
|
|
94
|
+
❯ jets console
|
|
95
|
+
> Jets.application.credentials.secret_key_base
|
|
96
|
+
=> "somesecretvalue"
|
|
97
|
+
> Jets.application.credentials.foo
|
|
98
|
+
=> "bar"
|
|
99
|
+
> Jets.application.credentials.does_not_exist
|
|
100
|
+
=> nil
|
|
101
|
+
|
|
102
|
+
Remember, when you deploy this to Lambda you should set the `JETS_MASTER_KEY`. You set it with [Env Files](https://rubyonjets.com/docs/env-files/). Otherwise the `Jets.application.credentials.xx` values will return `nil`.
|
|
103
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Jets::Command::CredentialsCommand::Diffing # :nodoc:
|
|
4
|
+
GITATTRIBUTES_ENTRY = <<~END
|
|
5
|
+
config/credentials/*.yml.enc diff=jets_credentials
|
|
6
|
+
config/credentials.yml.enc diff=jets_credentials
|
|
7
|
+
END
|
|
8
|
+
|
|
9
|
+
def enroll_project_in_credentials_diffing
|
|
10
|
+
if enrolled_in_credentials_diffing?
|
|
11
|
+
say "Project is already enrolled in credentials file diffing."
|
|
12
|
+
else
|
|
13
|
+
gitattributes.write(GITATTRIBUTES_ENTRY, mode: "a")
|
|
14
|
+
|
|
15
|
+
say "Enrolled project in credentials file diffing!"
|
|
16
|
+
say "Jets ensures the jets_credentials diff driver is set when running `credentials:edit`. See `credentials:help` for more."
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def disenroll_project_from_credentials_diffing
|
|
21
|
+
if enrolled_in_credentials_diffing?
|
|
22
|
+
gitattributes.write(gitattributes.read.gsub(GITATTRIBUTES_ENTRY, ""))
|
|
23
|
+
gitattributes.delete if gitattributes.empty?
|
|
24
|
+
|
|
25
|
+
say "Disenrolled project from credentials file diffing!"
|
|
26
|
+
else
|
|
27
|
+
say "Project is not enrolled in credentials file diffing."
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def ensure_diffing_driver_is_configured
|
|
32
|
+
configure_diffing_driver if enrolled_in_credentials_diffing? && !diffing_driver_configured?
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
private
|
|
36
|
+
def enrolled_in_credentials_diffing?
|
|
37
|
+
gitattributes.file? && gitattributes.read.include?(GITATTRIBUTES_ENTRY)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def diffing_driver_configured?
|
|
41
|
+
system "git config --get diff.jets_credentials.textconv", out: File::NULL
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def configure_diffing_driver
|
|
45
|
+
system "git config diff.jets_credentials.textconv 'bin/jets credentials:diff'"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def gitattributes
|
|
49
|
+
Jets.root.join(".gitattributes")
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "pathname"
|
|
4
|
+
require "shellwords"
|
|
5
|
+
require "active_support"
|
|
6
|
+
|
|
7
|
+
module Jets
|
|
8
|
+
module Command
|
|
9
|
+
class CredentialsCommand < Jets::Command::Base # :nodoc:
|
|
10
|
+
include Helpers::Editor
|
|
11
|
+
include EnvironmentArgument
|
|
12
|
+
|
|
13
|
+
require_relative "credentials_command/diffing"
|
|
14
|
+
include Diffing
|
|
15
|
+
|
|
16
|
+
self.environment_desc = "Uses credentials from config/credentials/:environment.yml.enc encrypted by config/credentials/:environment.key key"
|
|
17
|
+
|
|
18
|
+
no_commands do
|
|
19
|
+
def help
|
|
20
|
+
say "Usage:\n #{self.class.banner}"
|
|
21
|
+
say ""
|
|
22
|
+
say self.class.desc
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def edit
|
|
27
|
+
extract_environment_option_from_argument(default_environment: nil)
|
|
28
|
+
require_application!
|
|
29
|
+
|
|
30
|
+
ensure_editor_available(command: "bin/jets credentials:edit") || (return)
|
|
31
|
+
|
|
32
|
+
ensure_encryption_key_has_been_added if credentials.key.nil?
|
|
33
|
+
ensure_credentials_have_been_added
|
|
34
|
+
ensure_diffing_driver_is_configured
|
|
35
|
+
|
|
36
|
+
catch_editing_exceptions do
|
|
37
|
+
change_credentials_in_system_editor
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
say "File encrypted and saved."
|
|
41
|
+
rescue ActiveSupport::MessageEncryptor::InvalidMessage
|
|
42
|
+
say "Couldn't decrypt #{content_path}. Perhaps you passed the wrong key?"
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def show
|
|
46
|
+
extract_environment_option_from_argument(default_environment: nil)
|
|
47
|
+
require_application!
|
|
48
|
+
|
|
49
|
+
say credentials.read.presence || missing_credentials_message
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
option :enroll, type: :boolean, default: false,
|
|
53
|
+
desc: "Enrolls project in credentials file diffing with `git diff`"
|
|
54
|
+
|
|
55
|
+
option :disenroll, type: :boolean, default: false,
|
|
56
|
+
desc: "Disenrolls project from credentials file diffing"
|
|
57
|
+
|
|
58
|
+
def diff(content_path = nil)
|
|
59
|
+
if @content_path = content_path
|
|
60
|
+
extract_environment_option_from_argument(default_environment: extract_environment_from_path(content_path))
|
|
61
|
+
require_application!
|
|
62
|
+
|
|
63
|
+
say credentials.read.presence || credentials.content_path.read
|
|
64
|
+
else
|
|
65
|
+
require_application!
|
|
66
|
+
disenroll_project_from_credentials_diffing if options[:disenroll]
|
|
67
|
+
enroll_project_in_credentials_diffing if options[:enroll]
|
|
68
|
+
end
|
|
69
|
+
rescue ActiveSupport::MessageEncryptor::InvalidMessage
|
|
70
|
+
say credentials.content_path.read
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
private
|
|
74
|
+
def credentials
|
|
75
|
+
Jets.application.encrypted(content_path, key_path: key_path)
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def ensure_encryption_key_has_been_added
|
|
79
|
+
encryption_key_file_generator.add_key_file(key_path)
|
|
80
|
+
encryption_key_file_generator.ignore_key_file(key_path)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def ensure_credentials_have_been_added
|
|
84
|
+
if options[:environment]
|
|
85
|
+
encrypted_file_generator.add_encrypted_file_silently(content_path, key_path)
|
|
86
|
+
else
|
|
87
|
+
credentials_generator.add_credentials_file_silently
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def change_credentials_in_system_editor
|
|
92
|
+
credentials.change do |tmp_path|
|
|
93
|
+
system(*Shellwords.split(ENV["EDITOR"]), tmp_path.to_s)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def missing_credentials_message
|
|
98
|
+
if credentials.key.nil?
|
|
99
|
+
"Missing '#{key_path}' to decrypt credentials. See `bin/jets credentials:help`"
|
|
100
|
+
else
|
|
101
|
+
"File '#{content_path}' does not exist. Use `bin/jets credentials:edit` to change that."
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def content_path
|
|
106
|
+
@content_path ||= options[:environment] ? "config/credentials/#{options[:environment]}.yml.enc" : "config/credentials.yml.enc"
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
def key_path
|
|
110
|
+
options[:environment] ? "config/credentials/#{options[:environment]}.key" : "config/master.key"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
def extract_environment_from_path(path)
|
|
114
|
+
available_environments.find { |env| path.include? env } if path.end_with?(".yml.enc")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def encryption_key_file_generator
|
|
118
|
+
require "rails/generators"
|
|
119
|
+
require "rails/generators/rails/encryption_key_file/encryption_key_file_generator"
|
|
120
|
+
|
|
121
|
+
Rails::Generators::EncryptionKeyFileGenerator.new
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def encrypted_file_generator
|
|
125
|
+
require "rails/generators"
|
|
126
|
+
require "rails/generators/rails/encrypted_file/encrypted_file_generator"
|
|
127
|
+
|
|
128
|
+
Rails::Generators::EncryptedFileGenerator.new
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def credentials_generator
|
|
132
|
+
require "rails/generators"
|
|
133
|
+
require "rails/generators/rails/credentials/credentials_generator"
|
|
134
|
+
|
|
135
|
+
Rails::Generators::CredentialsGenerator.new
|
|
136
|
+
end
|
|
137
|
+
end
|
|
138
|
+
end
|
|
139
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Jets
|
|
4
|
+
module Command
|
|
5
|
+
module Db
|
|
6
|
+
module System
|
|
7
|
+
class ChangeCommand < Base # :nodoc:
|
|
8
|
+
class_option :to, desc: "The database system to switch to."
|
|
9
|
+
|
|
10
|
+
def initialize(positional_args, option_args, *)
|
|
11
|
+
@argv = positional_args + option_args
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def perform
|
|
16
|
+
require "rails/generators"
|
|
17
|
+
require "rails/generators/rails/db/system/change/change_generator"
|
|
18
|
+
Rails::Generators::Db::System::ChangeGenerator.start(@argv)
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "active_support/core_ext/string/filters"
|
|
4
|
+
require "active_support/deprecation"
|
|
5
|
+
|
|
6
|
+
module Jets
|
|
7
|
+
class DBConsole
|
|
8
|
+
def self.start(*args)
|
|
9
|
+
new(*args).start
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def initialize(options = {})
|
|
13
|
+
@options = options
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def start
|
|
17
|
+
ENV["JETS_ENV"] ||= @options[:environment] || environment
|
|
18
|
+
config = db_config.configuration_hash
|
|
19
|
+
|
|
20
|
+
case db_config.adapter
|
|
21
|
+
when /^(jdbc)?mysql/
|
|
22
|
+
args = {
|
|
23
|
+
host: "--host",
|
|
24
|
+
port: "--port",
|
|
25
|
+
socket: "--socket",
|
|
26
|
+
username: "--user",
|
|
27
|
+
encoding: "--default-character-set",
|
|
28
|
+
sslca: "--ssl-ca",
|
|
29
|
+
sslcert: "--ssl-cert",
|
|
30
|
+
sslcapath: "--ssl-capath",
|
|
31
|
+
sslcipher: "--ssl-cipher",
|
|
32
|
+
sslkey: "--ssl-key"
|
|
33
|
+
}.filter_map { |opt, arg| "#{arg}=#{config[opt]}" if config[opt] }
|
|
34
|
+
|
|
35
|
+
if config[:password] && @options[:include_password]
|
|
36
|
+
args << "--password=#{config[:password]}"
|
|
37
|
+
elsif config[:password] && !config[:password].to_s.empty?
|
|
38
|
+
args << "-p"
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
args << db_config.database
|
|
42
|
+
|
|
43
|
+
find_cmd_and_exec(["mysql", "mysql5"], *args)
|
|
44
|
+
|
|
45
|
+
when /^postgres|^postgis/
|
|
46
|
+
ENV["PGUSER"] = config[:username] if config[:username]
|
|
47
|
+
ENV["PGHOST"] = config[:host] if config[:host]
|
|
48
|
+
ENV["PGPORT"] = config[:port].to_s if config[:port]
|
|
49
|
+
ENV["PGPASSWORD"] = config[:password].to_s if config[:password] && @options[:include_password]
|
|
50
|
+
ENV["PGSSLMODE"] = config[:sslmode].to_s if config[:sslmode]
|
|
51
|
+
ENV["PGSSLCERT"] = config[:sslcert].to_s if config[:sslcert]
|
|
52
|
+
ENV["PGSSLKEY"] = config[:sslkey].to_s if config[:sslkey]
|
|
53
|
+
ENV["PGSSLROOTCERT"] = config[:sslrootcert].to_s if config[:sslrootcert]
|
|
54
|
+
find_cmd_and_exec("psql", db_config.database)
|
|
55
|
+
|
|
56
|
+
when "sqlite3"
|
|
57
|
+
args = []
|
|
58
|
+
|
|
59
|
+
args << "-#{@options[:mode]}" if @options[:mode]
|
|
60
|
+
args << "-header" if @options[:header]
|
|
61
|
+
args << File.expand_path(db_config.database, Jets.respond_to?(:root) ? Jets.root : nil)
|
|
62
|
+
|
|
63
|
+
find_cmd_and_exec("sqlite3", *args)
|
|
64
|
+
|
|
65
|
+
when "oracle", "oracle_enhanced"
|
|
66
|
+
logon = ""
|
|
67
|
+
|
|
68
|
+
if config[:username]
|
|
69
|
+
logon = config[:username].dup
|
|
70
|
+
logon << "/#{config[:password]}" if config[:password] && @options[:include_password]
|
|
71
|
+
logon << "@#{db_config.database}" if db_config.database
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
find_cmd_and_exec("sqlplus", logon)
|
|
75
|
+
|
|
76
|
+
when "sqlserver"
|
|
77
|
+
args = []
|
|
78
|
+
|
|
79
|
+
args += ["-d", "#{db_config.database}"] if db_config.database
|
|
80
|
+
args += ["-U", "#{config[:username]}"] if config[:username]
|
|
81
|
+
args += ["-P", "#{config[:password]}"] if config[:password]
|
|
82
|
+
|
|
83
|
+
if config[:host]
|
|
84
|
+
host_arg = +"tcp:#{config[:host]}"
|
|
85
|
+
host_arg << ",#{config[:port]}" if config[:port]
|
|
86
|
+
args += ["-S", host_arg]
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
find_cmd_and_exec("sqlcmd", *args)
|
|
90
|
+
|
|
91
|
+
else
|
|
92
|
+
abort "Unknown command-line client for #{db_config.database}."
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def db_config
|
|
97
|
+
return @db_config if defined?(@db_config)
|
|
98
|
+
|
|
99
|
+
# If the user provided a database, use that. Otherwise find
|
|
100
|
+
# the first config in the database.yml
|
|
101
|
+
if database
|
|
102
|
+
@db_config = configurations.configs_for(env_name: environment, name: database, include_hidden: true)
|
|
103
|
+
else
|
|
104
|
+
@db_config = configurations.find_db_config(environment)
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
unless @db_config
|
|
108
|
+
missing_db = database ? "'#{database}' database is not" : "No databases are"
|
|
109
|
+
raise ActiveRecord::AdapterNotSpecified,
|
|
110
|
+
"#{missing_db} configured for '#{environment}'. Available configuration: #{configurations.inspect}"
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
@db_config
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def environment
|
|
117
|
+
Jets.respond_to?(:env) ? Jets.env : Jets::Command.environment
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def database
|
|
121
|
+
@options[:database]
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
private
|
|
125
|
+
def configurations # :doc:
|
|
126
|
+
# require APP_PATH
|
|
127
|
+
ActiveRecord::Base.configurations = Jets.application.config.database_configuration
|
|
128
|
+
ActiveRecord::Base.configurations
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
def find_cmd_and_exec(commands, *args) # :doc:
|
|
132
|
+
commands = Array(commands)
|
|
133
|
+
|
|
134
|
+
dirs_on_path = ENV["PATH"].to_s.split(File::PATH_SEPARATOR)
|
|
135
|
+
unless (ext = RbConfig::CONFIG["EXEEXT"]).empty?
|
|
136
|
+
commands = commands.map { |cmd| "#{cmd}#{ext}" }
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
full_path_command = nil
|
|
140
|
+
found = commands.detect do |cmd|
|
|
141
|
+
dirs_on_path.detect do |path|
|
|
142
|
+
full_path_command = File.join(path, cmd)
|
|
143
|
+
begin
|
|
144
|
+
stat = File.stat(full_path_command)
|
|
145
|
+
rescue SystemCallError
|
|
146
|
+
else
|
|
147
|
+
stat.file? && stat.executable?
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
if found
|
|
153
|
+
exec full_path_command, *args
|
|
154
|
+
else
|
|
155
|
+
abort("Couldn't find database client: #{commands.join(', ')}. Check your $PATH and try again.")
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
module Command
|
|
161
|
+
class DbconsoleCommand < Base # :nodoc:
|
|
162
|
+
include EnvironmentArgument
|
|
163
|
+
|
|
164
|
+
class_option :include_password, aliases: "-p", type: :boolean,
|
|
165
|
+
desc: "Automatically provide the password from database.yml"
|
|
166
|
+
|
|
167
|
+
class_option :mode, enum: %w( html list line column ), type: :string,
|
|
168
|
+
desc: "Automatically put the sqlite3 database in the specified mode (html, list, line, column)."
|
|
169
|
+
|
|
170
|
+
class_option :header, type: :boolean
|
|
171
|
+
|
|
172
|
+
class_option :database, aliases: "--db", type: :string,
|
|
173
|
+
desc: "Specifies the database to use."
|
|
174
|
+
|
|
175
|
+
desc "dbconsole", "Starts DB REPL console"
|
|
176
|
+
long_desc Help.text(:dbconsole)
|
|
177
|
+
def perform
|
|
178
|
+
extract_environment_option_from_argument
|
|
179
|
+
require_application_and_environment!
|
|
180
|
+
Jets::DBConsole.start(options)
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "jets/generators"
|
|
4
|
+
require "jets/commands/generate/generate_command"
|
|
5
|
+
|
|
6
|
+
module Jets
|
|
7
|
+
module Command
|
|
8
|
+
class DegenerateCommand < GenerateCommand # :nodoc:
|
|
9
|
+
desc "Degenerate", "Opposite of generate. Removes the generated code."
|
|
10
|
+
long_desc Help.text(:degenerate)
|
|
11
|
+
def perform(*)
|
|
12
|
+
super
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
def behavior
|
|
17
|
+
:revoke
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
module Jets::Command
|
|
2
|
+
class DeleteCommand < Base # :nodoc:
|
|
3
|
+
desc "delete", "Delete the Jets project and all its resources"
|
|
4
|
+
long_desc Help.text(:delete)
|
|
5
|
+
option :yes, aliases: %w[y], type: :boolean, desc: "Skip are you sure prompt."
|
|
6
|
+
option :wait, type: :boolean, default: true, desc: "Wait for stack deletion to complete."
|
|
7
|
+
def perform
|
|
8
|
+
Delete.new(options).run
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
class Delete
|
|
13
|
+
include Jets::AwsServices
|
|
14
|
+
include AwsHelpers
|
|
15
|
+
|
|
16
|
+
def initialize(options={})
|
|
17
|
+
@options = options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def run
|
|
21
|
+
puts("Deleting project...")
|
|
22
|
+
return if @options[:noop]
|
|
23
|
+
|
|
24
|
+
are_you_sure?
|
|
25
|
+
confirm_project_exists
|
|
26
|
+
|
|
27
|
+
# Must first remove all objects from s3 bucket in order to delete stack
|
|
28
|
+
puts "First, deleting objects in s3 bucket #{s3_bucket_name}" if s3_bucket_name
|
|
29
|
+
empty_s3_bucket
|
|
30
|
+
|
|
31
|
+
stack_in_progress?(parent_stack_name)
|
|
32
|
+
|
|
33
|
+
cfn.delete_stack(stack_name: parent_stack_name)
|
|
34
|
+
puts "Deleting #{Jets.project_namespace.color(:green)}..."
|
|
35
|
+
|
|
36
|
+
if @options[:wait]
|
|
37
|
+
stack = find_stack(parent_stack_name)
|
|
38
|
+
wait_for_stack
|
|
39
|
+
Jets::Cfn::Deployment.new(stack_name: stack.stack_id, message: "Deleted").create
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
delete_logs
|
|
43
|
+
|
|
44
|
+
puts "Project #{Jets.project_namespace.color(:green)} deleted!"
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def wait_for_stack
|
|
48
|
+
status = Jets::Cfn::Status.new(@options)
|
|
49
|
+
start_time = Time.now
|
|
50
|
+
status.wait
|
|
51
|
+
took = Time.now - start_time
|
|
52
|
+
puts "Time took for deletion: #{status.pretty_time(took).color(:green)}."
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def delete_logs
|
|
56
|
+
puts "Deleting CloudWatch logs"
|
|
57
|
+
log = Jets::Commands::Clean::Log.new(mute: true, yes: true)
|
|
58
|
+
log.clean
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def confirm_project_exists
|
|
62
|
+
stack = find_stack(parent_stack_name)
|
|
63
|
+
return if stack
|
|
64
|
+
puts "ERROR: Project #{parent_stack_name} does not exist".color(:red)
|
|
65
|
+
exit 1
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def empty_s3_bucket
|
|
69
|
+
return unless s3_bucket_name # Happens when minimal stack fails to build
|
|
70
|
+
return unless bucket_exists?(s3_bucket_name)
|
|
71
|
+
|
|
72
|
+
resp = s3.list_objects(bucket: s3_bucket_name)
|
|
73
|
+
if resp.contents.size > 0
|
|
74
|
+
# IE: objects = [{key: "objectkey1"}, {key: "objectkey2"}]
|
|
75
|
+
objects = resp.contents.map { |item| {key: item.key} }
|
|
76
|
+
s3.delete_objects(
|
|
77
|
+
bucket: s3_bucket_name,
|
|
78
|
+
delete: {
|
|
79
|
+
objects: objects,
|
|
80
|
+
quiet: false,
|
|
81
|
+
}
|
|
82
|
+
)
|
|
83
|
+
empty_s3_bucket # keep deleting objects until bucket is empty
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
def s3_bucket_name
|
|
88
|
+
return @s3_bucket_name if defined?(@s3_bucket_name)
|
|
89
|
+
|
|
90
|
+
resp = cfn.describe_stacks(stack_name: parent_stack_name)
|
|
91
|
+
outputs = resp.stacks[0].outputs
|
|
92
|
+
if outputs.empty?
|
|
93
|
+
@s3_bucket_name = false
|
|
94
|
+
else
|
|
95
|
+
@s3_bucket_name = outputs.find {|o| o.output_key == 'S3Bucket'}.output_value
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
|
|
100
|
+
def bucket_exists?(bucket_name)
|
|
101
|
+
bucket_exists = false
|
|
102
|
+
begin
|
|
103
|
+
resp = s3.head_bucket(bucket: bucket_name, use_accelerate_endpoint: false)
|
|
104
|
+
bucket_exists = true
|
|
105
|
+
rescue
|
|
106
|
+
end
|
|
107
|
+
bucket_exists
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def parent_stack_name
|
|
111
|
+
Jets::Names.parent_stack_name
|
|
112
|
+
end
|
|
113
|
+
|
|
114
|
+
def are_you_sure?
|
|
115
|
+
if @options[:yes]
|
|
116
|
+
sure = 'y'
|
|
117
|
+
else
|
|
118
|
+
puts "Are you sure you want to want to delete the #{Jets.project_namespace.color(:green)} project? (y/N)"
|
|
119
|
+
sure = $stdin.gets
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
unless sure =~ /^y/
|
|
123
|
+
puts "Phew! Jets #{Jets.project_namespace.color(:green)} project was not deleted."
|
|
124
|
+
exit 0
|
|
125
|
+
end
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
# All CloudFormation states listed here: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-describing-stacks.html
|
|
129
|
+
#
|
|
130
|
+
# Returns resp so we can use it to grab data about the stack without calling api again.
|
|
131
|
+
def check_deleteable_status
|
|
132
|
+
return true if !stack_exists?(@parent_stack_name)
|
|
133
|
+
|
|
134
|
+
# Assumes stack exists
|
|
135
|
+
resp = cfn.describe_stacks(stack_name: @parent_stack_name)
|
|
136
|
+
status = resp.stacks[0].stack_status
|
|
137
|
+
|
|
138
|
+
return true if status == 'ROLLBACK_COMPLETE'
|
|
139
|
+
|
|
140
|
+
if status =~ /_IN_PROGRESS$/
|
|
141
|
+
puts "The '#{@parent_stack_name}' stack status is #{status}. " \
|
|
142
|
+
"It is not in an updateable status. Please wait until the stack is ready and try again.".color(:red)
|
|
143
|
+
exit 0
|
|
144
|
+
elsif resp.stacks[0].outputs.empty?
|
|
145
|
+
# This Happens when the miminal stack fails at the very beginning.
|
|
146
|
+
# There is no s3 bucket at all. User should delete the stack.
|
|
147
|
+
puts "The minimal stack failed to create. Please delete the stack first and try again. " \
|
|
148
|
+
"You can delete the CloudFormation stack or use the `jets delete` command"
|
|
149
|
+
exit 0
|
|
150
|
+
else
|
|
151
|
+
true
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
end
|