jets.benforeva 3.0.17.pre.mount.pre.fix
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/config.yml +92 -0
- data/.cody/README.md +13 -0
- data/.cody/docs/bin/build.sh +7 -0
- data/.cody/docs/bin/bundler_setup.sh +8 -0
- data/.cody/docs/bin/cli_docs.sh +6 -0
- data/.cody/docs/bin/git_commit.sh +27 -0
- data/.cody/docs/bin/git_setup.sh +12 -0
- data/.cody/docs/bin/subnav.sh +14 -0
- data/.cody/docs/buildspec.yml +10 -0
- data/.cody/docs/project.rb +10 -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 +14 -0
- data/.github/ISSUE_TEMPLATE.md +7 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +50 -0
- data/.gitignore +24 -0
- data/.gitmodules +0 -0
- data/.python-version +1 -0
- data/.rspec +4 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +1035 -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 +212 -0
- data/Rakefile +24 -0
- data/backers.md +20 -0
- data/bin/release +9 -0
- data/exe/jets.benforeva +14 -0
- data/jets.benforeva.gemspec +71 -0
- data/lib/jets/application/defaults.rb +200 -0
- data/lib/jets/application.rb +240 -0
- data/lib/jets/authorizer/base.rb +36 -0
- data/lib/jets/authorizer/dsl.rb +69 -0
- data/lib/jets/authorizer/helpers/iam_helper.rb +47 -0
- data/lib/jets/autoloaders.rb +112 -0
- data/lib/jets/aws_info.rb +111 -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 +64 -0
- data/lib/jets/aws_services.rb +95 -0
- data/lib/jets/booter.rb +167 -0
- data/lib/jets/builders/code_builder.rb +410 -0
- data/lib/jets/builders/code_size.rb +57 -0
- data/lib/jets/builders/gem_replacer.rb +89 -0
- data/lib/jets/builders/handler_generator.rb +186 -0
- data/lib/jets/builders/lambda_layer.rb +68 -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/config/initializers/jets.rb +16 -0
- data/lib/jets/builders/reconfigure_rails.rb +114 -0
- data/lib/jets/builders/ruby_packager.rb +235 -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 +88 -0
- data/lib/jets/camelizer.rb +4 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +56 -0
- data/lib/jets/cfn/builders/api_gateway_builder.rb +123 -0
- data/lib/jets/cfn/builders/api_resources_builder.rb +44 -0
- data/lib/jets/cfn/builders/authorizer_builder.rb +67 -0
- data/lib/jets/cfn/builders/base_child_builder.rb +69 -0
- data/lib/jets/cfn/builders/controller_builder.rb +50 -0
- data/lib/jets/cfn/builders/function_builder.rb +14 -0
- data/lib/jets/cfn/builders/interface.rb +133 -0
- data/lib/jets/cfn/builders/job_builder.rb +14 -0
- data/lib/jets/cfn/builders/parent_builder/stagger.rb +34 -0
- data/lib/jets/cfn/builders/parent_builder.rb +130 -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/builders/util/source.rb +21 -0
- data/lib/jets/cfn/built_template.rb +15 -0
- data/lib/jets/cfn/ship.rb +188 -0
- data/lib/jets/cfn/status.rb +10 -0
- data/lib/jets/cfn/template_source.rb +61 -0
- data/lib/jets/cfn/upload.rb +157 -0
- data/lib/jets/cli.rb +208 -0
- data/lib/jets/commands/base.rb +145 -0
- data/lib/jets/commands/build.rb +252 -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 +62 -0
- data/lib/jets/commands/call/guesser.rb +48 -0
- data/lib/jets/commands/call.rb +182 -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 +111 -0
- data/lib/jets/commands/clean.rb +19 -0
- data/lib/jets/commands/configure.rb +51 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks/dummy/app.rb +25 -0
- data/lib/jets/commands/db/tasks/dummy/config.rb +14 -0
- data/lib/jets/commands/db/tasks.rb +34 -0
- data/lib/jets/commands/db.rb +13 -0
- data/lib/jets/commands/dbconsole.rb +134 -0
- data/lib/jets/commands/delete.rb +136 -0
- data/lib/jets/commands/deploy.rb +137 -0
- data/lib/jets/commands/dotenv.rb +9 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/dynamodb.rb +19 -0
- data/lib/jets/commands/gems.rb +13 -0
- data/lib/jets/commands/help/build.md +6 -0
- data/lib/jets/commands/help/call.md +69 -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/degenerate.md +16 -0
- data/lib/jets/commands/help/delete.md +22 -0
- data/lib/jets/commands/help/deploy.md +32 -0
- data/lib/jets/commands/help/dynamodb/generate.md +52 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/gems/check.md +6 -0
- data/lib/jets/commands/help/generate.md +28 -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 +7 -0
- data/lib/jets/commands/help/url.md +6 -0
- data/lib/jets/commands/help.rb +9 -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 +30 -0
- data/lib/jets/commands/import/templates/submodules-cheatsheet.md +89 -0
- data/lib/jets/commands/import.rb +12 -0
- data/lib/jets/commands/main.rb +166 -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 +173 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +50 -0
- data/lib/jets/commands/runner.rb +16 -0
- data/lib/jets/commands/sequence.rb +105 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env.development.tt +3 -0
- data/lib/jets/commands/templates/skeleton/.env.test +3 -0
- data/lib/jets/commands/templates/skeleton/.env.tt +3 -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 +39 -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 +26 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +71 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -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/config.ru +5 -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 +23 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -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/upgrade/version1.rb +136 -0
- data/lib/jets/commands/upgrade.rb +105 -0
- data/lib/jets/commands/url.rb +69 -0
- data/lib/jets/commands/webpacker_template.rb +18 -0
- data/lib/jets/controller/authorization.rb +91 -0
- data/lib/jets/controller/base.rb +175 -0
- data/lib/jets/controller/callbacks.rb +73 -0
- data/lib/jets/controller/cookies/jar.rb +269 -0
- data/lib/jets/controller/cookies.rb +38 -0
- data/lib/jets/controller/error/invalid_authenticity_token.rb +6 -0
- data/lib/jets/controller/error.rb +4 -0
- data/lib/jets/controller/forgery_protection.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/middleware/cors.rb +60 -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 +22 -0
- data/lib/jets/controller/middleware/local.rb +120 -0
- data/lib/jets/controller/middleware/main.rb +53 -0
- data/lib/jets/controller/middleware/reloader.rb +15 -0
- data/lib/jets/controller/middleware/webpacker_setup.rb +6 -0
- data/lib/jets/controller/parameters_filter.rb +29 -0
- data/lib/jets/controller/params.rb +117 -0
- data/lib/jets/controller/rack/adapter.rb +94 -0
- data/lib/jets/controller/rack/env.rb +122 -0
- data/lib/jets/controller/redirection.rb +51 -0
- data/lib/jets/controller/rendering/rack_renderer.rb +267 -0
- data/lib/jets/controller/rendering.rb +96 -0
- data/lib/jets/controller/request.rb +29 -0
- data/lib/jets/controller/response.rb +61 -0
- data/lib/jets/controller/stage.rb +34 -0
- data/lib/jets/controller.rb +3 -0
- data/lib/jets/core.rb +157 -0
- data/lib/jets/core_ext/bundler.rb +7 -0
- data/lib/jets/core_ext/kernel.rb +13 -0
- data/lib/jets/db.rb +15 -0
- data/lib/jets/dotenv/show.rb +11 -0
- data/lib/jets/dotenv/ssm.rb +64 -0
- data/lib/jets/dotenv.rb +48 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator/templates/active_job/job/templates/application_job.rb.tt +6 -0
- data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +8 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +34 -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/generator.rb +112 -0
- data/lib/jets/inflections.rb +32 -0
- data/lib/jets/internal/app/controllers/jets/bare_controller.rb +16 -0
- data/lib/jets/internal/app/controllers/jets/mailers_controller.rb +97 -0
- data/lib/jets/internal/app/controllers/jets/mount_controller.rb +63 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +31 -0
- data/lib/jets/internal/app/controllers/jets/rack_controller.rb +12 -0
- data/lib/jets/internal/app/functions/jets/base_path.rb +18 -0
- data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +100 -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 +33 -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 +52 -0
- data/lib/jets/job/base.rb +49 -0
- data/lib/jets/job/dsl/dynamodb_event.rb +67 -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/dsl.rb +40 -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 +404 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +55 -0
- data/lib/jets/lambda/functions.rb +39 -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/source.rb +21 -0
- data/lib/jets/mega/request.rb +163 -0
- data/lib/jets/middleware/configurator.rb +84 -0
- data/lib/jets/middleware/default_stack.rb +53 -0
- data/lib/jets/middleware/layer.rb +34 -0
- data/lib/jets/middleware/stack.rb +77 -0
- data/lib/jets/middleware.rb +33 -0
- data/lib/jets/naming.rb +63 -0
- data/lib/jets/overrides/lambda/marshaller.rb +31 -0
- data/lib/jets/overrides/lambda.rb +1 -0
- data/lib/jets/overrides/rails/action_controller.rb +13 -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/migration_checker.rb +34 -0
- data/lib/jets/overrides/rails/rendering_helper.rb +27 -0
- data/lib/jets/overrides/rails/url_helper.rb +88 -0
- data/lib/jets/overrides/rails.rb +6 -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/poly_fun.rb +73 -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/api_gateway/authorizer.rb +82 -0
- data/lib/jets/resource/api_gateway/base_path/function.rb +49 -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 +80 -0
- data/lib/jets/resource/api_gateway/domain_name.rb +65 -0
- data/lib/jets/resource/api_gateway/method/authorization.rb +41 -0
- data/lib/jets/resource/api_gateway/method.rb +102 -0
- data/lib/jets/resource/api_gateway/resource.rb +82 -0
- data/lib/jets/resource/api_gateway/rest_api/change_detection.rb +10 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id/message.rb +49 -0
- data/lib/jets/resource/api_gateway/rest_api/logical_id.rb +98 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/base.rb +136 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/media_types.rb +36 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/page.rb +93 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/to.rb +25 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change/variable.rb +35 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +16 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision/variable_exception.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api/routes/collision.rb +121 -0
- data/lib/jets/resource/api_gateway/rest_api/routes.rb +7 -0
- data/lib/jets/resource/api_gateway/rest_api.rb +64 -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 +58 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +23 -0
- data/lib/jets/resource/child_stack/api_resource/page.rb +20 -0
- data/lib/jets/resource/child_stack/api_resource.rb +54 -0
- data/lib/jets/resource/child_stack/app_class.rb +149 -0
- data/lib/jets/resource/child_stack/authorizer.rb +40 -0
- data/lib/jets/resource/child_stack/base.rb +24 -0
- data/lib/jets/resource/child_stack/common_parameters.rb +14 -0
- data/lib/jets/resource/child_stack/shared.rb +85 -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/environment.rb +62 -0
- data/lib/jets/resource/lambda/function.rb +221 -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 +98 -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/resource.rb +71 -0
- data/lib/jets/router/dsl/mount.rb +13 -0
- data/lib/jets/router/dsl.rb +144 -0
- data/lib/jets/router/error.rb +4 -0
- data/lib/jets/router/finder.rb +47 -0
- data/lib/jets/router/helpers/core_helper.rb +27 -0
- data/lib/jets/router/helpers/named_routes_helper.rb +8 -0
- data/lib/jets/router/helpers.rb +4 -0
- data/lib/jets/router/matcher.rb +81 -0
- data/lib/jets/router/method_creator/code.rb +99 -0
- data/lib/jets/router/method_creator/edit.rb +12 -0
- data/lib/jets/router/method_creator/generic.rb +11 -0
- data/lib/jets/router/method_creator/index.rb +48 -0
- data/lib/jets/router/method_creator/new.rb +12 -0
- data/lib/jets/router/method_creator/root.rb +15 -0
- data/lib/jets/router/method_creator/show.rb +12 -0
- data/lib/jets/router/method_creator.rb +50 -0
- data/lib/jets/router/resources/base.rb +7 -0
- data/lib/jets/router/resources/filter.rb +15 -0
- data/lib/jets/router/resources/options.rb +13 -0
- data/lib/jets/router/route/authorizer.rb +57 -0
- data/lib/jets/router/route.rb +230 -0
- data/lib/jets/router/scope.rb +95 -0
- data/lib/jets/router/util.rb +38 -0
- data/lib/jets/router.rb +180 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +109 -0
- data/lib/jets/spec_helpers/controllers/params.rb +8 -0
- data/lib/jets/spec_helpers/controllers/request.rb +101 -0
- data/lib/jets/spec_helpers/controllers/response.rb +10 -0
- data/lib/jets/spec_helpers/controllers.rb +47 -0
- data/lib/jets/spec_helpers/fixtures.rb +11 -0
- data/lib/jets/spec_helpers.rb +21 -0
- data/lib/jets/stack/builder.rb +43 -0
- data/lib/jets/stack/definition.rb +50 -0
- data/lib/jets/stack/depends/item.rb +26 -0
- data/lib/jets/stack/depends.rb +34 -0
- data/lib/jets/stack/function.rb +69 -0
- data/lib/jets/stack/main/dsl/base.rb +63 -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/kinesis.rb +15 -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/main/dsl.rb +17 -0
- data/lib/jets/stack/main.rb +4 -0
- data/lib/jets/stack/output/dsl.rb +19 -0
- data/lib/jets/stack/output/lookup.rb +36 -0
- data/lib/jets/stack/output.rb +35 -0
- data/lib/jets/stack/parameter/dsl.rb +42 -0
- data/lib/jets/stack/parameter.rb +37 -0
- data/lib/jets/stack/resource/dsl.rb +19 -0
- data/lib/jets/stack/resource.rb +31 -0
- data/lib/jets/stack/s3_event.rb +87 -0
- data/lib/jets/stack.rb +88 -0
- data/lib/jets/tmp_loader.rb +53 -0
- data/lib/jets/turbine.rb +41 -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/application.rb +5 -0
- data/lib/jets/turbo/project/config/routes.rb +4 -0
- data/lib/jets/turbo/project/config.ru +5 -0
- data/lib/jets/turbo/rails.rb +127 -0
- data/lib/jets/turbo/templates/config/database.yml +30 -0
- data/lib/jets/turbo.rb +56 -0
- data/lib/jets/util.rb +40 -0
- data/lib/jets/version.rb +3 -0
- data/lib/jets.rb +31 -0
- data/readme/prerelease.md +6 -0
- data/readme/testing.md +60 -0
- metadata +1105 -0
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
module Jets::Stack::Main::Dsl
|
|
2
|
+
module Lambda
|
|
3
|
+
# Example:
|
|
4
|
+
#
|
|
5
|
+
# function(:hello,
|
|
6
|
+
# handler: handler("hello.lambda_hander"),
|
|
7
|
+
# runtime: "python3.6"
|
|
8
|
+
# )
|
|
9
|
+
#
|
|
10
|
+
# Defaults to ruby. So:
|
|
11
|
+
#
|
|
12
|
+
# function(:hello)
|
|
13
|
+
#
|
|
14
|
+
# is the same as:
|
|
15
|
+
#
|
|
16
|
+
# function(:hello,
|
|
17
|
+
# handler: handler("hello.hande"),
|
|
18
|
+
# runtime: :ruby
|
|
19
|
+
# )
|
|
20
|
+
#
|
|
21
|
+
def function(id, props={})
|
|
22
|
+
# Required: code, handler, role, runtime Docs: https://amzn.to/2pdot7S
|
|
23
|
+
meth = sanitize_method_name(id)
|
|
24
|
+
class_namespace = self.to_s.underscore.gsub('/','-') # IE: Jets::Domain => jets-domain
|
|
25
|
+
description = "#{self.to_s} #{meth}" # not bother adding extension
|
|
26
|
+
defaults = {
|
|
27
|
+
code: {
|
|
28
|
+
s3_bucket: "!Ref S3Bucket",
|
|
29
|
+
s3_key: code_s3_key
|
|
30
|
+
},
|
|
31
|
+
role: "!Ref IamRole",
|
|
32
|
+
handler: "#{id}.lambda_handler", # default ruby convention
|
|
33
|
+
runtime: :ruby,
|
|
34
|
+
timeout: Jets.config.function.timeout,
|
|
35
|
+
memory_size: Jets.config.function.memory_size,
|
|
36
|
+
description: description,
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
function_name = "#{Jets.config.project_namespace}-#{class_namespace}-#{meth}"
|
|
40
|
+
function_name = function_name.size > Jets::MAX_FUNCTION_NAME_SIZE ? nil : function_name
|
|
41
|
+
defaults[:function_name] = function_name if function_name
|
|
42
|
+
|
|
43
|
+
props = defaults.merge(props)
|
|
44
|
+
props[:runtime] = Jets.ruby_runtime if props[:runtime].to_s == "ruby"
|
|
45
|
+
props[:handler] = handler(props[:handler])
|
|
46
|
+
|
|
47
|
+
logical_id = id.to_s.gsub('/','_')
|
|
48
|
+
resource(logical_id, "AWS::Lambda::Function", props)
|
|
49
|
+
end
|
|
50
|
+
alias_method :ruby_function, :function
|
|
51
|
+
alias_method :lambda_function, :function
|
|
52
|
+
|
|
53
|
+
def python_function(id, props={})
|
|
54
|
+
meth = sanitize_method_name(id)
|
|
55
|
+
props[:handler] ||= "#{meth}.lambda_handler" # default python convention
|
|
56
|
+
props[:runtime] = "python3.6"
|
|
57
|
+
function(id, props)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def node_function(id, props={})
|
|
61
|
+
meth = sanitize_method_name(id)
|
|
62
|
+
props[:handler] ||= "#{meth}.handler" # default python convention
|
|
63
|
+
props[:runtime] = "nodejs8.10"
|
|
64
|
+
function(id, props)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Usage:
|
|
68
|
+
#
|
|
69
|
+
# permission(:my_permission, principal: "events.amazonaws.com")
|
|
70
|
+
#
|
|
71
|
+
def permission(id, props={})
|
|
72
|
+
defaults = { action: "lambda:InvokeFunction" }
|
|
73
|
+
props = defaults.merge(props)
|
|
74
|
+
resource(id, "AWS::Lambda::Permission", props)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
private
|
|
78
|
+
# demo-dev-hard_job-dig_me
|
|
79
|
+
def sanitize_method_name(id)
|
|
80
|
+
id.to_s.gsub('/','-')
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module Jets::Stack::Main::Dsl
|
|
2
|
+
module S3
|
|
3
|
+
def s3_bucket(id, props={})
|
|
4
|
+
resource(id, "AWS::S3::Bucket", props)
|
|
5
|
+
output(id) # Bucket name
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def s3_bucket_configuration(id, props={})
|
|
9
|
+
resource(id, "Custom::S3BucketConfiguration", props)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
module Jets::Stack::Main::Dsl
|
|
2
|
+
module Sns
|
|
3
|
+
def sns_topic(id, props={})
|
|
4
|
+
resource(id, "AWS::SNS::Topic", props)
|
|
5
|
+
output(id) # Topic Arn
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def sns_topic_policy(id, props={})
|
|
9
|
+
resource(id, "AWS::SNS::TopicPolicy", props)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def sns_subscription(id, props={})
|
|
13
|
+
resource(id, "AWS::SNS::Subscription", props)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
module Jets::Stack::Main::Dsl
|
|
2
|
+
module Sqs
|
|
3
|
+
def sqs_queue(id, props={})
|
|
4
|
+
# props[:queue_name] ||= id.to_s # comment out to allow CloudFormation to generate name
|
|
5
|
+
resource(id, "AWS::SQS::Queue", props)
|
|
6
|
+
output(id, value: get_att("#{id}.Arn")) # normal !Ref returns the sqs url the ARN is useful for nested stacks depends_on
|
|
7
|
+
output("#{id}_url", ref(id)) # useful for Stack.lookup method. IE: List.lookup(:waitlist_url)
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Jets::Stack
|
|
2
|
+
class Output
|
|
3
|
+
module Dsl
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
def outputs
|
|
7
|
+
Output.definitions(self.class)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class_methods do
|
|
11
|
+
def output(*definition)
|
|
12
|
+
# self is subclass is the stack that inherits from Jets::Stack
|
|
13
|
+
# IE: ExampleStack < Jets::Stack
|
|
14
|
+
Output.new(self, *definition).register
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
class Jets::Stack::Output
|
|
2
|
+
class Lookup
|
|
3
|
+
include Jets::AwsServices
|
|
4
|
+
|
|
5
|
+
def initialize(stack_subclass)
|
|
6
|
+
@stack_subclass = stack_subclass
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def output(logical_id)
|
|
10
|
+
child_stack_id = @stack_subclass.to_s.camelize
|
|
11
|
+
|
|
12
|
+
stack_arn = shared_stack_arn(child_stack_id)
|
|
13
|
+
resp = cfn.describe_stacks(stack_name: stack_arn)
|
|
14
|
+
child = resp.stacks.first
|
|
15
|
+
return unless child
|
|
16
|
+
|
|
17
|
+
output_value(child, logical_id)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Shared child stack arn
|
|
21
|
+
def shared_stack_arn(logical_id)
|
|
22
|
+
parent_stack = Jets.config.project_namespace
|
|
23
|
+
resp = cfn.describe_stacks(stack_name: parent_stack)
|
|
24
|
+
parent = resp.stacks.first
|
|
25
|
+
output_value(parent, logical_id)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def output_value(stack, key)
|
|
29
|
+
key = key.to_s.camelize
|
|
30
|
+
output = stack.outputs.find do |o|
|
|
31
|
+
o.output_key == key
|
|
32
|
+
end
|
|
33
|
+
output&.output_value
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Jets::Stack
|
|
6
|
+
class Output
|
|
7
|
+
include Definition
|
|
8
|
+
|
|
9
|
+
def template
|
|
10
|
+
camelize(standarize(@definition))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Value is the only required property: https://amzn.to/2xbhmk3
|
|
14
|
+
def standarize(definition)
|
|
15
|
+
first, second, _ = definition
|
|
16
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
17
|
+
first # pass through
|
|
18
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
19
|
+
logical_id, properties = first, second
|
|
20
|
+
{ logical_id => properties }
|
|
21
|
+
elsif definition.size == 2 && second.is_a?(String) # short form
|
|
22
|
+
logical_id = first
|
|
23
|
+
properties = second.is_a?(String) ? { value: second } : {}
|
|
24
|
+
{ logical_id => properties }
|
|
25
|
+
elsif definition.size == 1
|
|
26
|
+
logical_id = first.to_s
|
|
27
|
+
properties = {value: "!Ref #{logical_id.camelize}"}
|
|
28
|
+
{ logical_id => properties }
|
|
29
|
+
else # I dont know what form
|
|
30
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
class Jets::Stack
|
|
2
|
+
class Parameter
|
|
3
|
+
module Dsl
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
extend Memoist
|
|
6
|
+
|
|
7
|
+
def parameters
|
|
8
|
+
add_common_parameters
|
|
9
|
+
add_depends_on_parameters
|
|
10
|
+
Parameter.definitions(self.class)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def add_common_parameters
|
|
14
|
+
self.class.parameter(:iam_role)
|
|
15
|
+
self.class.parameter(:s3_bucket)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_depends_on_parameters
|
|
19
|
+
depends_on = self.class.depends_on
|
|
20
|
+
depends_on.each do |dependency|
|
|
21
|
+
dependency_outputs(dependency).each do |output|
|
|
22
|
+
self.class.parameter(output)
|
|
23
|
+
end
|
|
24
|
+
end if depends_on
|
|
25
|
+
end
|
|
26
|
+
memoize :add_depends_on_parameters # only run once
|
|
27
|
+
|
|
28
|
+
# Returns output keys associated with the stack. They are the resource logical ids.
|
|
29
|
+
def dependency_outputs(dependency)
|
|
30
|
+
dependency.to_s.camelize.constantize.output_keys
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
class_methods do
|
|
34
|
+
def parameter(*definition)
|
|
35
|
+
# self is subclass is the stack that inherits from Jets::Stack
|
|
36
|
+
# IE: ExampleStack < Jets::Stack
|
|
37
|
+
Parameter.new(self, *definition).register
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Jets::Stack
|
|
6
|
+
class Parameter
|
|
7
|
+
include Definition
|
|
8
|
+
|
|
9
|
+
def template
|
|
10
|
+
camelize(add_required(standarize(@definition)))
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Type is the only required property: https://amzn.to/2x8W5aD
|
|
14
|
+
def standarize(definition)
|
|
15
|
+
first, second, _ = definition
|
|
16
|
+
if definition.size == 1 && first.is_a?(Hash) # long form
|
|
17
|
+
first # pass through
|
|
18
|
+
elsif definition.size == 2 && second.is_a?(Hash) # medium form
|
|
19
|
+
logical_id, properties = first, second
|
|
20
|
+
{ logical_id => properties }
|
|
21
|
+
elsif (definition.size == 2 && second.is_a?(String)) || # short form
|
|
22
|
+
definition.size == 1
|
|
23
|
+
logical_id = first
|
|
24
|
+
properties = second.is_a?(String) ? { default: second } : {}
|
|
25
|
+
{ logical_id => properties }
|
|
26
|
+
else # I dont know what form
|
|
27
|
+
raise "Invalid form provided. definition #{definition.inspect}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def add_required(attributes)
|
|
32
|
+
properties = attributes.values.first
|
|
33
|
+
properties[:type] ||= 'String'
|
|
34
|
+
attributes
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
class Jets::Stack
|
|
2
|
+
class Resource
|
|
3
|
+
module Dsl
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
def resources
|
|
7
|
+
Resource.definitions(self.class)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
class_methods do
|
|
11
|
+
def resource(*definition)
|
|
12
|
+
# self is subclass is the stack that inherits from Jets::Stack
|
|
13
|
+
# IE: ExampleStack < Jets::Stack
|
|
14
|
+
Resource.new(self, *definition).register
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# template - uses @definition to build a CloudFormation template section
|
|
4
|
+
#
|
|
5
|
+
class Jets::Stack
|
|
6
|
+
class Resource
|
|
7
|
+
include Definition
|
|
8
|
+
|
|
9
|
+
def template
|
|
10
|
+
template = camelize(standarize(@definition))
|
|
11
|
+
template = replace_placeholers(template)
|
|
12
|
+
template
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# CloudFormation Resources reference: https://amzn.to/2NKg6ip
|
|
16
|
+
def standarize(definition)
|
|
17
|
+
Jets::Resource::Standardizer.new(definition).template
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def replace_placeholers(template)
|
|
21
|
+
attributes = template.values.first
|
|
22
|
+
s3_key = attributes.dig('Properties','Code','S3Key')
|
|
23
|
+
if s3_key == "code_s3_key_placeholder"
|
|
24
|
+
checksum = Jets::Builders::Md5.checksums["stage/code"]
|
|
25
|
+
code_zip = "code-#{checksum}.zip"
|
|
26
|
+
attributes['Properties']['Code']['S3Key'] = "jets/code/#{code_zip}"
|
|
27
|
+
end
|
|
28
|
+
template
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
class Jets::Stack
|
|
2
|
+
class S3Event
|
|
3
|
+
def initialize(bucket_name)
|
|
4
|
+
@bucket_name = bucket_name
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
# Stack names can only contain alpha numeric chars.
|
|
8
|
+
# Bucket names are limit to 64 chars: https://amzn.to/2SIzvme
|
|
9
|
+
# Stack names are limit to 128 chars: https://amzn.to/2SFkrG0
|
|
10
|
+
# This gsub should handle this.
|
|
11
|
+
def stack_name
|
|
12
|
+
@bucket_name.gsub(/[^0-9a-z\-_]/i, '').gsub('-','_').camelize
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def build_stack
|
|
16
|
+
# assign to local variable so its available in the block
|
|
17
|
+
bucket = @bucket_name
|
|
18
|
+
|
|
19
|
+
Jets::Stack.new_class(stack_name) do
|
|
20
|
+
s3_bucket_configuration(:s3_bucket_configuration,
|
|
21
|
+
service_token: "!GetAtt JetsS3BucketConfig.Arn", # Cannot change this w/o changing the logical id
|
|
22
|
+
# These properties correspond to the ruby aws-sdk s3.put_bucket_notification_configuration
|
|
23
|
+
# in jets/s3_bucket_config.rb, not the CloudFormation Bucket properties. The CloudFormation
|
|
24
|
+
# bucket properties have a similiar structure but is slightly different so it can be confusing.
|
|
25
|
+
#
|
|
26
|
+
# Ruby aws-sdk S3 Docs: https://amzn.to/2N7m5Lr
|
|
27
|
+
bucket: bucket,
|
|
28
|
+
notification_configuration: Jets.config.s3_event.notification_configuration,
|
|
29
|
+
) if Jets.config.s3_event.configure_bucket
|
|
30
|
+
|
|
31
|
+
# Important note: If we change the name of this function we should also change the
|
|
32
|
+
# logical id of the s3_bucket_configuration custom resource or we'll get this error:
|
|
33
|
+
# Modifying service token is not allowed.
|
|
34
|
+
function("jets/s3_bucket_config",
|
|
35
|
+
role: "!GetAtt BucketConfigIamRole.Arn",
|
|
36
|
+
layers: ["!Ref GemLayer"],
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
sns_topic(:sns_topic)
|
|
40
|
+
sns_topic_policy(:sns_topic_policy,
|
|
41
|
+
policy_document: {
|
|
42
|
+
version: "2012-10-17",
|
|
43
|
+
statement: {
|
|
44
|
+
effect: "Allow",
|
|
45
|
+
principal: { service: "s3.amazonaws.com"},
|
|
46
|
+
action: "sns:Publish",
|
|
47
|
+
resource: "!Ref SnsTopic",
|
|
48
|
+
condition: {
|
|
49
|
+
arn_like: {
|
|
50
|
+
"aws:SourceArn" => "!Sub arn:aws:s3:*:*:#{bucket}"
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
topics: ["!Ref SnsTopic"],
|
|
56
|
+
)
|
|
57
|
+
|
|
58
|
+
iam_role(:bucket_config_iam_role,
|
|
59
|
+
assume_role_policy_document: {
|
|
60
|
+
version: '2012-10-17',
|
|
61
|
+
statement: [
|
|
62
|
+
effect: "Allow",
|
|
63
|
+
principal: {service: ["lambda.amazonaws.com"]},
|
|
64
|
+
action: ['sts:AssumeRole'],
|
|
65
|
+
]
|
|
66
|
+
},
|
|
67
|
+
path: "/",
|
|
68
|
+
managed_policy_arns: ["arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole"],
|
|
69
|
+
policies: [
|
|
70
|
+
policy_name: "S3Policy",
|
|
71
|
+
policy_document: {
|
|
72
|
+
version: '2012-10-17',
|
|
73
|
+
statement: [
|
|
74
|
+
effect: "Allow",
|
|
75
|
+
action: [
|
|
76
|
+
's3:GetBucketNotification',
|
|
77
|
+
's3:PutBucketNotification',
|
|
78
|
+
],
|
|
79
|
+
resource: "*"
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
]
|
|
83
|
+
)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
data/lib/jets/stack.rb
ADDED
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class Stack
|
|
3
|
+
include Main::Dsl
|
|
4
|
+
include Parameter::Dsl
|
|
5
|
+
include Output::Dsl
|
|
6
|
+
include Resource::Dsl
|
|
7
|
+
|
|
8
|
+
class << self
|
|
9
|
+
extend Memoist
|
|
10
|
+
|
|
11
|
+
# Track all command subclasses.
|
|
12
|
+
def subclasses
|
|
13
|
+
@subclasses ||= []
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def inherited(base)
|
|
17
|
+
super
|
|
18
|
+
self.subclasses << base if base.name
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# klass = Jets::Stack.new_class("Bucket3")
|
|
22
|
+
def new_class(class_name, &block)
|
|
23
|
+
# https://stackoverflow.com/questions/4113479/dynamic-class-definition-with-a-class-name
|
|
24
|
+
# Defining the constant this way gets around: SyntaxError: dynamic constant assignment error
|
|
25
|
+
klass = Class.new(Jets::Stack) # First klass is an anonymous class. IE: class.name is nil
|
|
26
|
+
klass = Object.const_set(class_name, klass) # now klass is a named class
|
|
27
|
+
Jets::Stack.subclasses << klass # mimic inherited hook because
|
|
28
|
+
|
|
29
|
+
# Must run class_eval after adding to subclasses in order for the resource declarations in the
|
|
30
|
+
# so that the resources get registered to the right subclass.
|
|
31
|
+
klass.class_eval(&block)
|
|
32
|
+
klass # return klass
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Build it to figure out if we need to build the stack for the SharedBuilder
|
|
36
|
+
def build?
|
|
37
|
+
empty = template == {"Parameters"=>{"IamRole"=>{"Type"=>"String"}, "S3Bucket"=>{"Type"=>"String"}}}
|
|
38
|
+
!empty
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def functions
|
|
42
|
+
stack = new
|
|
43
|
+
# All the & because resources might be nil
|
|
44
|
+
templates = stack.resources&.map(&:template)&.select do |t|
|
|
45
|
+
attributes = t.values.first
|
|
46
|
+
attributes['Type'] == 'AWS::Lambda::Function'
|
|
47
|
+
end
|
|
48
|
+
templates ||= []
|
|
49
|
+
templates.map { |t| Function.new(t) }
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def template
|
|
53
|
+
# Pretty funny looking, creating an instance of stack to be passed to the Builder.
|
|
54
|
+
# Another way of looking at it:
|
|
55
|
+
#
|
|
56
|
+
# stack = new # MyStack.new
|
|
57
|
+
# builder = Jets::Stack::Builder.new(stack)
|
|
58
|
+
#
|
|
59
|
+
builder = Jets::Stack::Builder.new(new)
|
|
60
|
+
builder.template
|
|
61
|
+
end
|
|
62
|
+
memoize :template
|
|
63
|
+
|
|
64
|
+
# Eager loading the app/shared resources to ensure shared resources have been registered.
|
|
65
|
+
# Not being used anymore but keeping around just in case for now.
|
|
66
|
+
def eager_load_shared_resources!
|
|
67
|
+
Dir.glob("#{Jets.root}/app/shared/**").each do |path|
|
|
68
|
+
next if path.include?("app/shared/functions")
|
|
69
|
+
Jets::Autoloaders.main.preload(path)
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
def lookup(logical_id)
|
|
74
|
+
looker.output(logical_id)
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def looker
|
|
78
|
+
Jets::Stack::Output::Lookup.new(self)
|
|
79
|
+
end
|
|
80
|
+
memoize :looker
|
|
81
|
+
|
|
82
|
+
def output_keys
|
|
83
|
+
outputs = new.outputs || []
|
|
84
|
+
outputs.map(&:template).map {|o| o.keys.first}
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
end
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class TmpLoader
|
|
3
|
+
include AwsServices
|
|
4
|
+
|
|
5
|
+
def self.load!
|
|
6
|
+
new.load
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def initialize(yaml_path=nil)
|
|
10
|
+
yaml_path ||= "#{Jets.root}/handlers/data.yml"
|
|
11
|
+
return unless File.exist?(yaml_path)
|
|
12
|
+
@data = YAML.load_file(yaml_path)
|
|
13
|
+
@s3_bucket = @data['s3_bucket']
|
|
14
|
+
@rack_zip = @data['rack_zip']
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def load
|
|
18
|
+
rack
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def rack
|
|
22
|
+
return unless @rack_zip
|
|
23
|
+
download_and_extract(@rack_zip, '/tmp/rack')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def download_and_extract(zip_file, folder_dest)
|
|
27
|
+
s3_key = "jets/code/#{zip_file}" # jets/code/rack-checksum.zip
|
|
28
|
+
download_path = "/tmp/#{zip_file}" # /tmp/rack-checksum.zip
|
|
29
|
+
|
|
30
|
+
download(s3_key, download_path)
|
|
31
|
+
unzip(download_path, folder_dest)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def download(key, dest)
|
|
35
|
+
# https://docs.aws.amazon.com/sdk-for-ruby/v3/api/Aws/S3/Client.html#get_object-instance_method
|
|
36
|
+
# stream object directly to disk
|
|
37
|
+
s3.get_object(response_target: dest,
|
|
38
|
+
bucket: @s3_bucket,
|
|
39
|
+
key: key)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def unzip(zipfile, folder_dest)
|
|
43
|
+
sh "unzip -qo #{zipfile} -d #{folder_dest}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def sh(command)
|
|
47
|
+
puts "=> #{command}"
|
|
48
|
+
success = system(command)
|
|
49
|
+
raise "Command #{command} failed" unless success
|
|
50
|
+
success
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
end
|
data/lib/jets/turbine.rb
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class Turbine
|
|
3
|
+
class_attribute :after_initializers
|
|
4
|
+
class_attribute :initializers
|
|
5
|
+
class_attribute :on_exceptions
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def subclasses
|
|
9
|
+
@subclasses ||= []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def inherited(base)
|
|
13
|
+
subclasses << base
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def after_initializer(label, &block)
|
|
17
|
+
self.after_initializers ||= {}
|
|
18
|
+
self.after_initializers[label] = block
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def initializer(label, &block)
|
|
22
|
+
self.initializers ||= {}
|
|
23
|
+
self.initializers[label] = block
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def on_exception(label, &block)
|
|
27
|
+
self.on_exceptions ||= {}
|
|
28
|
+
self.on_exceptions[label] = block
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def exception_reporter(label, &block)
|
|
32
|
+
on_exception(label, &block)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Make config available in Turbine. Note only available outside of hooks like initializers.
|
|
36
|
+
def config
|
|
37
|
+
Jets.application.config
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Jets::Turbo
|
|
2
|
+
class DatabaseYaml
|
|
3
|
+
def reconfigure
|
|
4
|
+
current_yaml = "#{Jets.root}/rack/config/database.yml"
|
|
5
|
+
return unless File.exist?(current_yaml)
|
|
6
|
+
|
|
7
|
+
vars = {}
|
|
8
|
+
current_database = YAML.load_file(current_yaml)
|
|
9
|
+
database_names = infer_database_name(current_database)
|
|
10
|
+
vars.merge!(database_names)
|
|
11
|
+
vars['adapter'] = current_database['development']['adapter']
|
|
12
|
+
|
|
13
|
+
path = File.expand_path("templates/config/database.yml", File.dirname(__FILE__))
|
|
14
|
+
content = Jets::Erb.result(path, vars)
|
|
15
|
+
IO.write(current_yaml, content)
|
|
16
|
+
# puts "Reconfigured #{current_yaml}" # uncomment to inspect and debug
|
|
17
|
+
rescue Exception => e
|
|
18
|
+
puts "WARNING: Was not able to generate a database.yml. Leaving your current one in place"
|
|
19
|
+
puts e.message
|
|
20
|
+
# If unable to copy the database.yml settings just slightly fail.
|
|
21
|
+
# Do this because really unsure what is in the current database.yml
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def infer_database_name(current_database)
|
|
25
|
+
vars = {}
|
|
26
|
+
%w[development test production].each do |env|
|
|
27
|
+
if !current_database[env]['database'].include?('<%') # already has ERB
|
|
28
|
+
vars["database_#{env}"] = current_database[env]['database']
|
|
29
|
+
else
|
|
30
|
+
lines = IO.readlines("#{Jets.root}/rack/config/application.rb")
|
|
31
|
+
module_line = lines.find { |l| l =~ /^module / }
|
|
32
|
+
app_module = module_line.gsub(/^module /,'').strip
|
|
33
|
+
app_name = app_module.underscore
|
|
34
|
+
vars["database_#{env}"] = "#{app_name}_#{env}"
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
vars
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|