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,61 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
require 'stringio'
|
|
3
|
+
|
|
4
|
+
# Node shim calls this class to process both controllers and jobs
|
|
5
|
+
class Jets::Processors::MainProcessor
|
|
6
|
+
attr_reader :event, :context, :handler
|
|
7
|
+
def initialize(event, context, handler)
|
|
8
|
+
@event = event
|
|
9
|
+
@context = context
|
|
10
|
+
@handler = handler
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def run
|
|
14
|
+
# Use the handler to deduce app code to run.
|
|
15
|
+
# Example handlers: handlers/controllers/posts.create, handlers/jobs/sleep.perform
|
|
16
|
+
#
|
|
17
|
+
# deducer = Jets::Processors::Deducer.new("handlers/controllers/posts.create")
|
|
18
|
+
#
|
|
19
|
+
deducer = Jets::Processors::Deducer.new(handler)
|
|
20
|
+
begin
|
|
21
|
+
# Examples:
|
|
22
|
+
# deducer.code => PostsController.process(event, context, "show")
|
|
23
|
+
# deducer.path => app/controllers/posts_controller.rb
|
|
24
|
+
#
|
|
25
|
+
# deducer.code => HardJob.process(event, context, "dig")
|
|
26
|
+
# deducer.path => app/jobs/hard_job.rb
|
|
27
|
+
#
|
|
28
|
+
# deducer.code => HelloFunction.process(event, context, "world")
|
|
29
|
+
# deducer.path => app/functions/hello.rb
|
|
30
|
+
deducer.load_class
|
|
31
|
+
# result = PostsController.process(event, context, "create")
|
|
32
|
+
result = instance_eval(deducer.code, deducer.path)
|
|
33
|
+
result = HashWithIndifferentAccess.new(result) if result.is_a?(Hash)
|
|
34
|
+
|
|
35
|
+
Jets.increase_call_count
|
|
36
|
+
|
|
37
|
+
if result.is_a?(Hash) && result["headers"]
|
|
38
|
+
# API Gateway is okay with the header values as Integers but
|
|
39
|
+
# ELBs are more strict about this and require the header values to be Strings
|
|
40
|
+
result["headers"]["x-jets-call-count"] = Jets.call_count.to_s
|
|
41
|
+
result["headers"]["x-jets-prewarm-count"] = Jets.prewarm_count.to_s
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
result
|
|
45
|
+
rescue Exception => e
|
|
46
|
+
unless Jets.env.test?
|
|
47
|
+
# Customize error message slightly so nodejs shim can process the
|
|
48
|
+
# returned error message.
|
|
49
|
+
# The "RubyError: " is a marker that the javascript shim scans for.
|
|
50
|
+
$stderr.puts("RubyError: #{e.class}: #{e.message}") # js needs this as the first line
|
|
51
|
+
backtrace = e.backtrace.map {|l| " #{l}" }
|
|
52
|
+
$stderr.puts(backtrace)
|
|
53
|
+
# No need to having error in stderr above anymore because errors are handled in memory
|
|
54
|
+
# at ruby_server.rb but keeping around for posterity.
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
Jets.on_exception(e)
|
|
58
|
+
raise(e) # raise error to ruby_server.rb to rescue and handle
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
class RackServer
|
|
3
|
+
def self.start(options={})
|
|
4
|
+
new(options).start
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def initialize(options={})
|
|
8
|
+
@options = options
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def start
|
|
12
|
+
return unless File.exist?("#{rack_project}/config.ru")
|
|
13
|
+
puts "Starting additional rack server for the project under the rack subfolder..." if ENV['JETS_DEBUG']
|
|
14
|
+
|
|
15
|
+
if ENV['FOREGROUND']
|
|
16
|
+
serve
|
|
17
|
+
return
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Reaching here means we'll run the server in the background.
|
|
21
|
+
# Handle daemonzing ourselves because it keeps the stdout of the 2nd
|
|
22
|
+
# rack server. The rackup --daemonize option ends up hiding the output.
|
|
23
|
+
pid = Process.fork
|
|
24
|
+
if pid.nil?
|
|
25
|
+
# we're in the child process
|
|
26
|
+
serve
|
|
27
|
+
else
|
|
28
|
+
# we're in the parent process
|
|
29
|
+
Process.detach(pid) # dettached but still in the "foreground" since bin/rackup runs in the foreground
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Runs in the child process
|
|
34
|
+
def serve
|
|
35
|
+
# Note, looks like stopping jets server with Ctrl-C sends the TERM signal
|
|
36
|
+
# down to the sub bin/rackup command cleans up the child process fine.
|
|
37
|
+
Bundler.with_unbundled_env do
|
|
38
|
+
args = ''
|
|
39
|
+
# only forward the host option, port is always 9292 for simplicity
|
|
40
|
+
if @options[:host]
|
|
41
|
+
args << " --host #{@options[:host]}"
|
|
42
|
+
else
|
|
43
|
+
args << " --host 127.0.0.1" # using the default localhost is not starting up https://stackoverflow.com/questions/4356646/address-family-not-supported-by-protocol-family
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
command = "cd #{rack_project} && bin/rackup#{args}" # leads to the same wrapper rack scripts
|
|
48
|
+
puts "=> #{command}".color(:green)
|
|
49
|
+
system(command)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# blocks until rack server is up
|
|
54
|
+
def wait_for_socket
|
|
55
|
+
return unless Jets.rack?
|
|
56
|
+
|
|
57
|
+
retries = 0
|
|
58
|
+
max_retries = 30 # 15 seconds at a delay of 0.5s
|
|
59
|
+
delay = 0.5
|
|
60
|
+
if ENV['C9_USER'] # overrides for local testing
|
|
61
|
+
max_retries = 3
|
|
62
|
+
delay = 3
|
|
63
|
+
end
|
|
64
|
+
begin
|
|
65
|
+
server = TCPSocket.new('localhost', 9292)
|
|
66
|
+
server.close
|
|
67
|
+
rescue Errno::ECONNREFUSED, Errno::EAFNOSUPPORT
|
|
68
|
+
puts "Unable to connect to localhost:9292. Delay for #{delay} and will try to connect again." if ENV['JETS_DEBUG']
|
|
69
|
+
sleep(delay)
|
|
70
|
+
retries += 1
|
|
71
|
+
if retries < max_retries
|
|
72
|
+
retry
|
|
73
|
+
else
|
|
74
|
+
puts "Giving up on trying to connect to localhost:9292"
|
|
75
|
+
return false
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
puts "Connected to localhost:9292 successfully"
|
|
79
|
+
true
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
def rack_project
|
|
83
|
+
"#{Jets.root}/rack"
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
end
|
data/lib/jets/rdoc.rb
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
module Jets
|
|
2
|
+
module Rdoc
|
|
3
|
+
# Use for both jets.gemspec and rake rdoc task
|
|
4
|
+
def options
|
|
5
|
+
exclude = %w[
|
|
6
|
+
docs
|
|
7
|
+
spec
|
|
8
|
+
vendor
|
|
9
|
+
core.rb
|
|
10
|
+
.js
|
|
11
|
+
templates
|
|
12
|
+
commands
|
|
13
|
+
internal
|
|
14
|
+
support
|
|
15
|
+
Dockerfile
|
|
16
|
+
Dockerfile.base
|
|
17
|
+
Gemfile
|
|
18
|
+
Gemfile.lock
|
|
19
|
+
Guardfile
|
|
20
|
+
LICENSE
|
|
21
|
+
Procfile
|
|
22
|
+
Rakefile
|
|
23
|
+
bin
|
|
24
|
+
]
|
|
25
|
+
exclude = exclude.map { |word| ['-x', word] }.flatten
|
|
26
|
+
["-m", "README.md", "--markup", "tomdoc"] + exclude
|
|
27
|
+
end
|
|
28
|
+
extend self
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Jets::Resource::ApiGateway
|
|
2
|
+
class Authorizer < Jets::Resource::Base
|
|
3
|
+
def initialize(props={})
|
|
4
|
+
@props = props # associated_properties from dsl.rb
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def definition
|
|
8
|
+
{
|
|
9
|
+
authorizer_logical_id => {
|
|
10
|
+
type: "AWS::ApiGateway::Authorizer",
|
|
11
|
+
properties: props,
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def props
|
|
17
|
+
default = {
|
|
18
|
+
# authorizer_credentials: '',
|
|
19
|
+
# authorizer_result_ttl_in_seconds: '',
|
|
20
|
+
# auth_type: '',
|
|
21
|
+
# identity_source: '', # required
|
|
22
|
+
# identity_validation_expression: '',
|
|
23
|
+
# name: '',
|
|
24
|
+
# provider_arns: [],
|
|
25
|
+
rest_api_id: '!Ref RestApi', # Required: Yes
|
|
26
|
+
type: '', # Required: Yes
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
unless @props[:type].to_s.upcase == 'COGNITO_USER_POOLS'
|
|
30
|
+
@props[:authorizer_uri] = { # Required: Conditional
|
|
31
|
+
"Fn::Join" => ['', [
|
|
32
|
+
'arn:aws:apigateway:',
|
|
33
|
+
"!Ref 'AWS::Region'",
|
|
34
|
+
':lambda:path/2015-03-31/functions/',
|
|
35
|
+
{"Fn::GetAtt" => ["{namespace}LambdaFunction", "Arn"]},
|
|
36
|
+
'/invocations'
|
|
37
|
+
]]
|
|
38
|
+
}
|
|
39
|
+
end
|
|
40
|
+
@props[:authorizer_result_ttl_in_seconds] = @props.delete(:ttl) if @props[:ttl]
|
|
41
|
+
|
|
42
|
+
normalize_type!(@props)
|
|
43
|
+
normalize_identity_source!(@props)
|
|
44
|
+
default.merge(@props)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def authorizer_logical_id
|
|
48
|
+
"{namespace}_authorizer" # IE: protect_authorizer
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def outputs
|
|
52
|
+
# IE: ProtectAuthorizer: !Ref ProtectAuthorizer
|
|
53
|
+
{
|
|
54
|
+
logical_id => "!Ref #{logical_id}",
|
|
55
|
+
}
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
private
|
|
59
|
+
# Also sets a default if it's not provided
|
|
60
|
+
def normalize_type!(props)
|
|
61
|
+
type = props[:type] || :request
|
|
62
|
+
@props[:type] = type.to_s.upcase
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Also sets a default if it's not provided
|
|
66
|
+
def normalize_identity_source!(props)
|
|
67
|
+
identity_source = props[:identity_source] || Jets.config.api.authorizers.default_token_source
|
|
68
|
+
# request authorizer type can have multiple identity sources.
|
|
69
|
+
# token authorizer type has only one identity source.
|
|
70
|
+
# We handle both cases.
|
|
71
|
+
identity_sources = identity_source.split(',') # to handle multipe
|
|
72
|
+
identity_sources.map! do |source|
|
|
73
|
+
if source.include?(".") # if '.' is detected assume full identify source provided
|
|
74
|
+
source
|
|
75
|
+
else
|
|
76
|
+
"method.request.header.#{source}" # convention
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
@props[:identity_source] = identity_sources.join(',')
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module Jets::Resource::ApiGateway::BasePath
|
|
2
|
+
class Function < Jets::Resource::Base
|
|
3
|
+
include Jets::Resource::Lambda::Function::Environment
|
|
4
|
+
|
|
5
|
+
def definition
|
|
6
|
+
{
|
|
7
|
+
base_path_function: {
|
|
8
|
+
type: "AWS::Lambda::Function",
|
|
9
|
+
properties: {
|
|
10
|
+
function_name: function_name,
|
|
11
|
+
code: {
|
|
12
|
+
s3_bucket: "!Ref S3Bucket",
|
|
13
|
+
s3_key: code_s3_key,
|
|
14
|
+
},
|
|
15
|
+
role: "!GetAtt BasePathRole.Arn",
|
|
16
|
+
handler: handler,
|
|
17
|
+
runtime: Jets.ruby_runtime,
|
|
18
|
+
timeout: 60,
|
|
19
|
+
memory_size: 1536,
|
|
20
|
+
environment: env_properties[:environment],
|
|
21
|
+
layers: layers,
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def layers
|
|
28
|
+
return Jets.config.lambda.layers if Jets.config.gems.disable
|
|
29
|
+
|
|
30
|
+
["!Ref GemLayer"] + Jets.config.lambda.layers
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def function_name
|
|
34
|
+
method = "jets-base-path"
|
|
35
|
+
# need to add the deployment timestamp because or else function name collides between deploys
|
|
36
|
+
timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
|
|
37
|
+
"#{Jets.config.project_namespace}-#{method}-#{timestamp}"
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def handler
|
|
41
|
+
"handlers/functions/jets/base_path.lambda_handler"
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def code_s3_key
|
|
45
|
+
checksum = Jets::Builders::Md5.checksums["stage/code"]
|
|
46
|
+
"jets/code/code-#{checksum}.zip" # s3_key
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# CloudFormation Docs AWS::ApiGateway::DomainName: https://amzn.to/2BsrSqo
|
|
2
|
+
#
|
|
3
|
+
# Example:
|
|
4
|
+
#
|
|
5
|
+
# Type: AWS::ApiGateway::BasePathMapping
|
|
6
|
+
# Properties:
|
|
7
|
+
# BasePath: String
|
|
8
|
+
# DomainName: String
|
|
9
|
+
# RestApiId: String
|
|
10
|
+
# Stage: String
|
|
11
|
+
#
|
|
12
|
+
# Currently unable to add base path mapping in-place with CloudFormation.
|
|
13
|
+
# The workaround for this is to do it post deployment with raw API calls outside
|
|
14
|
+
# of CloudFormation. Leaving this around for now in case there's a workaround
|
|
15
|
+
# to get this into CloudFormation instead of raw API calls. Some notes:
|
|
16
|
+
# * Also tried to change the domain name of to something like demo-dev-[random].mydomain.com
|
|
17
|
+
# That does not work because the domain name has to match the route53 record exactly.
|
|
18
|
+
#
|
|
19
|
+
module Jets::Resource::ApiGateway::BasePath
|
|
20
|
+
class Mapping < Jets::Resource::Base
|
|
21
|
+
def definition
|
|
22
|
+
function_logical_id = "BasePathFunction" # lambda function that supports custom resource
|
|
23
|
+
{
|
|
24
|
+
base_path_mapping: {
|
|
25
|
+
type: "Custom::BasePathMapping",
|
|
26
|
+
properties: {
|
|
27
|
+
service_token: "!GetAtt #{function_logical_id}.Arn",
|
|
28
|
+
# base_path: '', # empty path represents root
|
|
29
|
+
# domain_name: "!Ref DomainName",
|
|
30
|
+
# rest_api_id: "!Ref RestApi", # since this is in the Deployment template
|
|
31
|
+
# stage: Deployment.stage_name,
|
|
32
|
+
},
|
|
33
|
+
depends_on: Jets::Resource::ApiGateway::Deployment.logical_id,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def outputs
|
|
39
|
+
{
|
|
40
|
+
"BasePathMapping" => "!Ref BasePathMapping",
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
module Jets::Resource::ApiGateway::BasePath
|
|
2
|
+
class Role < Jets::Resource::Base
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def definition
|
|
7
|
+
{
|
|
8
|
+
base_path_role: {
|
|
9
|
+
type: "AWS::IAM::Role",
|
|
10
|
+
properties: {
|
|
11
|
+
role_name: role_name,
|
|
12
|
+
path: "/",
|
|
13
|
+
assume_role_policy_document: {
|
|
14
|
+
version: "2012-10-17",
|
|
15
|
+
statement: [{
|
|
16
|
+
effect: "Allow",
|
|
17
|
+
principal: {service: ["lambda.amazonaws.com"]},
|
|
18
|
+
action: ["sts:AssumeRole"]}
|
|
19
|
+
]
|
|
20
|
+
},
|
|
21
|
+
policies: [
|
|
22
|
+
policy_name: "#{role_name}-policy",
|
|
23
|
+
policy_document: policy_document,
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def policy_document
|
|
31
|
+
project_namespace = Jets.config.project_namespace
|
|
32
|
+
default_policy_statements = Jets::Application.default_iam_policy # Array of Hashes
|
|
33
|
+
apigateway = [{
|
|
34
|
+
action: [ "apigateway:*" ],
|
|
35
|
+
effect: "Allow",
|
|
36
|
+
resource: "arn:aws:apigateway:#{Jets.aws.region}::/restapis/*", # scoped to all restapis because this changes
|
|
37
|
+
},{
|
|
38
|
+
action: [ "apigateway:*" ],
|
|
39
|
+
effect: "Allow",
|
|
40
|
+
resource: "arn:aws:apigateway:#{Jets.aws.region}::/domainnames/*", # scoped to all restapis because this changes
|
|
41
|
+
}]
|
|
42
|
+
cloudformation = [{
|
|
43
|
+
action: ["cloudformation:DescribeStacks"],
|
|
44
|
+
effect: "Allow",
|
|
45
|
+
resource: "arn:aws:cloudformation:#{Jets.aws.region}:#{Jets.aws.account}:stack/#{project_namespace}*",
|
|
46
|
+
}]
|
|
47
|
+
|
|
48
|
+
# Combine the statements
|
|
49
|
+
{
|
|
50
|
+
version: '2012-10-17',
|
|
51
|
+
statement: default_policy_statements + apigateway + cloudformation
|
|
52
|
+
}
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
# Duplicated in rest_api/change_detection.rb, base_path/role.rb, rest_api/routes.rb
|
|
56
|
+
def rest_api_id
|
|
57
|
+
stack_name = Jets::Naming.parent_stack_name
|
|
58
|
+
return "RestApi" unless stack_exists?(stack_name)
|
|
59
|
+
|
|
60
|
+
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
|
61
|
+
|
|
62
|
+
api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
|
|
63
|
+
|
|
64
|
+
# resources = cfn.describe_stack_resources(stack_name: api_gateway_stack_arn).stack_resources
|
|
65
|
+
stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
|
|
66
|
+
rest_api_id = lookup(stack[:outputs], "RestApi")
|
|
67
|
+
end
|
|
68
|
+
memoize :rest_api_id
|
|
69
|
+
|
|
70
|
+
def role_name
|
|
71
|
+
# TODO: dont think we should change the role name every time but have to right now because the deployment logical id changes
|
|
72
|
+
timestamp = Jets::Resource::ApiGateway::Deployment.timestamp
|
|
73
|
+
"#{Jets.config.project_namespace}-base-path-mapping-#{timestamp}"
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Jets::Resource::ApiGateway
|
|
2
|
+
# Might be weird inheriting from Method because Method has Method#cors also
|
|
3
|
+
# but Cors is essentially a Method class.
|
|
4
|
+
class Cors < Method
|
|
5
|
+
def definition
|
|
6
|
+
{
|
|
7
|
+
cors_logical_id => {
|
|
8
|
+
type: "AWS::ApiGateway::Method",
|
|
9
|
+
|
|
10
|
+
properties: {
|
|
11
|
+
resource_id: "!Ref #{resource_id}",
|
|
12
|
+
rest_api_id: "!Ref #{RestApi.logical_id}",
|
|
13
|
+
authorization_type: cors_authorization_type,
|
|
14
|
+
http_method: "OPTIONS",
|
|
15
|
+
method_responses: [{
|
|
16
|
+
status_code: '200',
|
|
17
|
+
response_parameters: response_parameters(true),
|
|
18
|
+
response_models: {},
|
|
19
|
+
}],
|
|
20
|
+
request_parameters: {},
|
|
21
|
+
integration: {
|
|
22
|
+
type: "MOCK",
|
|
23
|
+
request_templates: {
|
|
24
|
+
"application/json": "{statusCode:200}",
|
|
25
|
+
},
|
|
26
|
+
integration_responses: [{
|
|
27
|
+
status_code: '200',
|
|
28
|
+
response_parameters: response_parameters,
|
|
29
|
+
response_templates: {
|
|
30
|
+
"application/json": '',
|
|
31
|
+
},
|
|
32
|
+
}] # closes integration_responses
|
|
33
|
+
} # closes integration
|
|
34
|
+
} # closes properties
|
|
35
|
+
} # closes logical id
|
|
36
|
+
} # closes definition
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def response_parameters(method_response=false)
|
|
40
|
+
cors_headers.map do |k,v|
|
|
41
|
+
k = "method.response.header.#{k}"
|
|
42
|
+
v = method_response ? true : "'#{v}'" # surround value with single quotes
|
|
43
|
+
[k,v]
|
|
44
|
+
end.to_h
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# Always the pre-flight headers in this case
|
|
48
|
+
def cors_headers
|
|
49
|
+
rack = Jets::Controller::Middleware::Cors.new(Jets.application)
|
|
50
|
+
rack.cors_headers(true)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def cors_authorization_type
|
|
54
|
+
Jets.config.api.cors_authorization_type || @route.authorization_type || "NONE"
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def cors_logical_id
|
|
58
|
+
"#{resource_logical_id}_cors_api_method"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
module Jets::Resource::ApiGateway
|
|
2
|
+
class Deployment < Jets::Resource::Base
|
|
3
|
+
def definition
|
|
4
|
+
{
|
|
5
|
+
deployment_logical_id => {
|
|
6
|
+
type: "AWS::ApiGateway::Deployment",
|
|
7
|
+
properties: {
|
|
8
|
+
description: "Version #{timestamp} deployed by jets",
|
|
9
|
+
rest_api_id: "!Ref #{RestApi.logical_id}",
|
|
10
|
+
stage_name: stage_name,
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def parameters
|
|
17
|
+
p = {
|
|
18
|
+
"GemLayer" => "GemLayer",
|
|
19
|
+
"IamRole" => "IamRole",
|
|
20
|
+
"RestApi" => "RestApi",
|
|
21
|
+
"S3Bucket" => "S3Bucket",
|
|
22
|
+
}
|
|
23
|
+
p[:DomainName] = "DomainName" if Jets.custom_domain?
|
|
24
|
+
p[:BasePath] = "BasePath" unless Jets.config.domain.base_path.nil?
|
|
25
|
+
p
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def outputs(internal=false)
|
|
29
|
+
rest_api = internal ? RestApi.internal_logical_id : "RestApi"
|
|
30
|
+
{
|
|
31
|
+
"RestApiUrl" => "!Sub 'https://${#{rest_api}}.execute-api.${AWS::Region}.amazonaws.com/#{stage_name}/'",
|
|
32
|
+
}
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def depends_on
|
|
36
|
+
expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
|
|
37
|
+
controller_logical_ids = []
|
|
38
|
+
Dir.glob(expression).each do |path|
|
|
39
|
+
next unless File.file?(path)
|
|
40
|
+
|
|
41
|
+
regexp = Regexp.new(".*#{Jets.config.project_namespace}-")
|
|
42
|
+
controller_name = path.sub(regexp, '').sub('.yml', '')
|
|
43
|
+
# map the path to a camelized logical_id. Example:
|
|
44
|
+
# /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
|
|
45
|
+
# PostsController
|
|
46
|
+
controller_logical_id = controller_name.underscore.camelize
|
|
47
|
+
|
|
48
|
+
controller_logical_ids << controller_logical_id
|
|
49
|
+
end
|
|
50
|
+
controller_logical_ids
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# stage_name: dev, dev-1, dev-2, etc
|
|
54
|
+
def stage_name
|
|
55
|
+
self.class.stage_name
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def self.stage_name
|
|
59
|
+
# Stage name only allows a-zA-Z0-9_
|
|
60
|
+
[Jets.config.short_env, Jets.config.env_extra].compact.join('_').gsub('-','_')
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def timestamp
|
|
64
|
+
self.class.timestamp
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
@@timestamp = nil
|
|
68
|
+
def self.timestamp
|
|
69
|
+
@@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def deployment_logical_id
|
|
73
|
+
self.class.logical_id.underscore
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def self.logical_id
|
|
77
|
+
"ApiDeployment#{timestamp}"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# CloudFormation Docs AWS::ApiGateway::DomainName: https://amzn.to/2Bsnmbq
|
|
2
|
+
#
|
|
3
|
+
# Example:
|
|
4
|
+
#
|
|
5
|
+
# MyDomainName:
|
|
6
|
+
# Type: 'AWS::ApiGateway::DomainName'
|
|
7
|
+
# Properties:
|
|
8
|
+
# DomainName: api.mydomain.com
|
|
9
|
+
# CertificateArn: arn:aws:acm:us-east-1:111122223333:certificate/fb1b9770-a305-495d-aefb-27e5e101ff3
|
|
10
|
+
#
|
|
11
|
+
module Jets::Resource::ApiGateway
|
|
12
|
+
class DomainName < Jets::Resource::Base
|
|
13
|
+
def definition
|
|
14
|
+
properties = {
|
|
15
|
+
domain_name: domain_name,
|
|
16
|
+
endpoint_configuration: {
|
|
17
|
+
types: endpoint_types
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
# Can really only be REGIONAL or EDGE
|
|
21
|
+
if endpoint_types.include?("REGIONAL")
|
|
22
|
+
properties[:regional_certificate_arn] = cert_arn
|
|
23
|
+
end
|
|
24
|
+
if endpoint_types.include?("EDGE")
|
|
25
|
+
properties[:certificate_arn] = cert_arn
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
{
|
|
29
|
+
domain_name: {
|
|
30
|
+
type: "AWS::ApiGateway::DomainName",
|
|
31
|
+
properties: properties
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def outputs
|
|
37
|
+
{
|
|
38
|
+
"DomainName" => "!Ref DomainName",
|
|
39
|
+
}
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def domain_name
|
|
43
|
+
name = Jets.config.domain.name
|
|
44
|
+
if Jets.config.domain.apex
|
|
45
|
+
name ||= Jets.config.domain.hosted_zone_name
|
|
46
|
+
else
|
|
47
|
+
subdomain = Jets.project_namespace
|
|
48
|
+
managed_domain_name = "#{subdomain}.#{Jets.config.domain.hosted_zone_name}"
|
|
49
|
+
name ||= managed_domain_name
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Strip trailing period if there is one set accidentally or else get this error
|
|
53
|
+
# Trailing period should be omitted from domain name (Service: AmazonApiGateway; Status Code: 400; Error Code: BadRequestException
|
|
54
|
+
name.sub(/\.$/,'')
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def endpoint_types
|
|
58
|
+
[Jets.config.domain.endpoint_type].flatten
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def cert_arn
|
|
62
|
+
Jets.config.domain.cert_arn
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Jets::Resource::ApiGateway::Method
|
|
2
|
+
module Authorization
|
|
3
|
+
private
|
|
4
|
+
def authorizer_id
|
|
5
|
+
if @route.authorizer
|
|
6
|
+
logical_id = @route.authorizer_id
|
|
7
|
+
elsif controller_klass.authorizer
|
|
8
|
+
logical_id = controller_klass.authorizer_logical_id_for(@route.action_name)
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
"!Ref #{logical_id}" if logical_id
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def authorization_type
|
|
15
|
+
type = @route.authorization_type ||
|
|
16
|
+
controller_klass.authorization_type || # Already handles inheritance via class_attribute, applies controller-wide
|
|
17
|
+
controller_klass.infer_authorization_type_for(@route.action_name) || # Applies specifically to route
|
|
18
|
+
Jets.config.api.authorization_type
|
|
19
|
+
type.to_s.upcase
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def api_key_required?
|
|
23
|
+
api_key_required == true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def api_key_required
|
|
27
|
+
@route.api_key_required ||
|
|
28
|
+
controller_klass.api_key_required ||
|
|
29
|
+
Jets.config.api.api_key_required
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def authorization_scopes
|
|
33
|
+
if @route.authorization_scopes
|
|
34
|
+
authorization_scopes = @route.authorization_scopes
|
|
35
|
+
elsif controller_klass.authorization_scopes
|
|
36
|
+
authorization_scopes = controller_klass.authorization_scopes
|
|
37
|
+
end
|
|
38
|
+
authorization_scopes
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|