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,221 @@
|
|
|
1
|
+
module Jets::Resource::Lambda
|
|
2
|
+
class Function < Jets::Resource::Base
|
|
3
|
+
include Environment
|
|
4
|
+
|
|
5
|
+
def initialize(task)
|
|
6
|
+
@task = task
|
|
7
|
+
@app_class = task.class_name.to_s
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def definition
|
|
11
|
+
{
|
|
12
|
+
function_logical_id => {
|
|
13
|
+
type: "AWS::Lambda::Function",
|
|
14
|
+
properties: combined_properties
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def function_logical_id
|
|
20
|
+
"{namespace}_lambda_function".underscore
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def replacements
|
|
24
|
+
@task.replacements # has namespace replacement
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def combined_properties
|
|
28
|
+
props = env_properties
|
|
29
|
+
.deep_merge(global_properties)
|
|
30
|
+
.deep_merge(class_properties)
|
|
31
|
+
.deep_merge(function_properties)
|
|
32
|
+
finalize_properties!(props)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Global properties example:
|
|
36
|
+
# jets defaults are in jets/default/application.rb.
|
|
37
|
+
# Your application's default config/application.rb then get used. Example:
|
|
38
|
+
#
|
|
39
|
+
# Jets.application.configure do
|
|
40
|
+
# config.function = ActiveSupport::OrderedOptions.new
|
|
41
|
+
# config.function.timeout = 30
|
|
42
|
+
# config.function.runtime = "nodejs8.10"
|
|
43
|
+
# config.function.memory_size = 1536
|
|
44
|
+
# end
|
|
45
|
+
def global_properties
|
|
46
|
+
baseline = {
|
|
47
|
+
code: {
|
|
48
|
+
s3_bucket: "!Ref S3Bucket",
|
|
49
|
+
s3_key: code_s3_key
|
|
50
|
+
},
|
|
51
|
+
role: "!Ref IamRole",
|
|
52
|
+
environment: { variables: environment },
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
application_config = Jets.application.config.function.to_h
|
|
56
|
+
baseline.merge(application_config)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Class properties example:
|
|
60
|
+
#
|
|
61
|
+
# class PostsController < ApplicationController
|
|
62
|
+
# class_timeout 22
|
|
63
|
+
# ...
|
|
64
|
+
# end
|
|
65
|
+
#
|
|
66
|
+
# Also handles iam policy override at the class level. Example:
|
|
67
|
+
#
|
|
68
|
+
# class_iam_policy("logs:*")
|
|
69
|
+
#
|
|
70
|
+
def class_properties
|
|
71
|
+
# klass is PostsController, HardJob, GameRule, Hello or HelloFunction
|
|
72
|
+
klass = Jets::Klass.from_task(@task)
|
|
73
|
+
|
|
74
|
+
class_properties = lookup_class_properties(klass)
|
|
75
|
+
if klass.build_class_iam?
|
|
76
|
+
iam_policy = Jets::Resource::Iam::ClassRole.new(klass)
|
|
77
|
+
class_properties[:role] = "!GetAtt #{iam_policy.logical_id}.Arn"
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
class_properties
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Accounts for inherited class_properties
|
|
84
|
+
def lookup_class_properties(klass)
|
|
85
|
+
all_classes = []
|
|
86
|
+
while klass != Object
|
|
87
|
+
all_classes << klass
|
|
88
|
+
klass = klass.superclass
|
|
89
|
+
end
|
|
90
|
+
class_properties = {}
|
|
91
|
+
# Go back down class heirachry top to down
|
|
92
|
+
all_classes.reverse.each do |k|
|
|
93
|
+
class_properties.merge!(k.class_properties)
|
|
94
|
+
end
|
|
95
|
+
class_properties
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Function properties example:
|
|
99
|
+
#
|
|
100
|
+
# class PostsController < ApplicationController
|
|
101
|
+
# timeout 18
|
|
102
|
+
# def index
|
|
103
|
+
# ...
|
|
104
|
+
# end
|
|
105
|
+
#
|
|
106
|
+
# Also handles iam policy override at the function level. Example:
|
|
107
|
+
#
|
|
108
|
+
# iam_policy("ec2:*")
|
|
109
|
+
# def new
|
|
110
|
+
# render json: params.merge(action: "new")
|
|
111
|
+
# end
|
|
112
|
+
#
|
|
113
|
+
def function_properties
|
|
114
|
+
properties = @task.properties
|
|
115
|
+
if @task.build_function_iam?
|
|
116
|
+
iam_policy = Jets::Resource::Iam::FunctionRole.new(@task)
|
|
117
|
+
properties[:role] = "!GetAtt #{iam_policy.logical_id}.Arn"
|
|
118
|
+
end
|
|
119
|
+
properties
|
|
120
|
+
end
|
|
121
|
+
|
|
122
|
+
# Properties managed by Jets with merged with finality.
|
|
123
|
+
def finalize_properties!(props)
|
|
124
|
+
handler = full_handler(props)
|
|
125
|
+
runtime = get_runtime(props)
|
|
126
|
+
description = get_descripton(props)
|
|
127
|
+
managed = {
|
|
128
|
+
handler: handler,
|
|
129
|
+
runtime: runtime,
|
|
130
|
+
description: description,
|
|
131
|
+
}
|
|
132
|
+
managed[:function_name] = function_name if function_name
|
|
133
|
+
layers = get_layers(runtime)
|
|
134
|
+
managed[:layers] = layers if layers
|
|
135
|
+
props.merge!(managed)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
def get_layers(runtime)
|
|
139
|
+
return nil unless runtime =~ /^ruby/
|
|
140
|
+
return Jets.config.lambda.layers if Jets.config.gems.disable
|
|
141
|
+
|
|
142
|
+
["!Ref GemLayer"] + Jets.config.lambda.layers
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def get_runtime(props)
|
|
146
|
+
props[:runtime] || default_runtime
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def default_runtime
|
|
150
|
+
map = {
|
|
151
|
+
node: "nodejs8.10",
|
|
152
|
+
python: "python3.6",
|
|
153
|
+
ruby: Jets.ruby_runtime,
|
|
154
|
+
}
|
|
155
|
+
map[@task.lang]
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def default_handler
|
|
159
|
+
map = {
|
|
160
|
+
node: @task.full_handler(:handler), # IE: handlers/controllers/posts/show.handler
|
|
161
|
+
python: @task.full_handler(:lambda_handler), # IE: handlers/controllers/posts/show.lambda_handler
|
|
162
|
+
ruby: handler, # IE: handlers/controllers/posts_controllers.index
|
|
163
|
+
}
|
|
164
|
+
map[@task.lang]
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def handler
|
|
168
|
+
handler_value(@task.meth) # IE: handlers/controllers/posts_controllers.index
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
# Used for node-shim also
|
|
172
|
+
def handler_value(meth)
|
|
173
|
+
"handlers/#{@task.type.pluralize}/#{@app_class.underscore}.#{meth}"
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
# Ensure that the handler path is normalized.
|
|
177
|
+
def full_handler(props)
|
|
178
|
+
if props[:handler]
|
|
179
|
+
handler_value(props[:handler])
|
|
180
|
+
else
|
|
181
|
+
default_handler
|
|
182
|
+
end
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
def code_s3_key
|
|
186
|
+
checksum = Jets::Builders::Md5.checksums["stage/code"]
|
|
187
|
+
"jets/code/code-#{checksum}.zip" # s3_key
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
# Examples:
|
|
191
|
+
# "#{Jets.config.project_namespace}-sleep_job-perform"
|
|
192
|
+
# "demo-dev-sleep_job-perform"
|
|
193
|
+
def function_name
|
|
194
|
+
# Example values:
|
|
195
|
+
# @app_class: admin/pages_controller
|
|
196
|
+
# @task.meth: index
|
|
197
|
+
# method: admin/pages_controller
|
|
198
|
+
# method: admin-pages_controller-index
|
|
199
|
+
method = @app_class.underscore
|
|
200
|
+
method = method.gsub('/','-').gsub(/[^0-9a-z\-_]/i, '') + "-#{@task.meth}"
|
|
201
|
+
function_name = "#{Jets.config.project_namespace}-#{method}"
|
|
202
|
+
# Returns nil if function name is too long.
|
|
203
|
+
# CloudFormation will managed the the function name in this case.
|
|
204
|
+
# A pretty function name won't be generated but the deploy will be successful.
|
|
205
|
+
function_name.size > Jets::MAX_FUNCTION_NAME_SIZE ? nil : function_name
|
|
206
|
+
end
|
|
207
|
+
|
|
208
|
+
def get_descripton(props)
|
|
209
|
+
props[:description] || default_description
|
|
210
|
+
end
|
|
211
|
+
|
|
212
|
+
def default_description
|
|
213
|
+
# Example values:
|
|
214
|
+
# @app_class: Admin/PagesController
|
|
215
|
+
# @task.meth: index
|
|
216
|
+
# Returns:
|
|
217
|
+
# Admin/PagesController#index
|
|
218
|
+
"#{@app_class}##{@task.meth}"
|
|
219
|
+
end
|
|
220
|
+
end
|
|
221
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Jets::Resource::Lambda
|
|
2
|
+
class GemLayer < LayerVersion
|
|
3
|
+
def description
|
|
4
|
+
"Jets Ruby Gems"
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def layer_name
|
|
8
|
+
# Do not include the Jets.extra_env to group the layers in same app together
|
|
9
|
+
"#{Jets.config.short_env}-#{Jets.config.project_name}-gems"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
def code_s3_key
|
|
13
|
+
checksum = Jets::Builders::Md5.checksums["stage/opt"]
|
|
14
|
+
"jets/code/opt-#{checksum}.zip" # s3_key
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Type: "AWS::Lambda::LayerVersion"
|
|
2
|
+
# Properties:
|
|
3
|
+
# CompatibleRuntimes:
|
|
4
|
+
# - String
|
|
5
|
+
# - ...
|
|
6
|
+
# Content:
|
|
7
|
+
# Content
|
|
8
|
+
# Description: String
|
|
9
|
+
# LayerName: String
|
|
10
|
+
# LicenseInfo: String
|
|
11
|
+
module Jets::Resource::Lambda
|
|
12
|
+
class LayerVersion < Jets::Resource::Base
|
|
13
|
+
def definition
|
|
14
|
+
{
|
|
15
|
+
layer_version_logical_id => {
|
|
16
|
+
type: "AWS::Lambda::LayerVersion",
|
|
17
|
+
properties: {
|
|
18
|
+
content: {
|
|
19
|
+
s3_bucket: s3_bucket,
|
|
20
|
+
s3_key: code_s3_key,
|
|
21
|
+
},
|
|
22
|
+
description: description,
|
|
23
|
+
layer_name: layer_name,
|
|
24
|
+
license_info: "MIT",
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def s3_bucket
|
|
31
|
+
"!Ref S3Bucket"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def layer_version_logical_id
|
|
35
|
+
self.class.name.split('::').last
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def outputs
|
|
39
|
+
{
|
|
40
|
+
logical_id => "!Ref #{logical_id}",
|
|
41
|
+
}
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# CloudFormation Log Subscription docs: https://amzn.to/2SNiSpr
|
|
2
|
+
module Jets::Resource::Logs
|
|
3
|
+
class SubscriptionFilter < Jets::Resource::Base
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
{
|
|
10
|
+
log_logical_id => {
|
|
11
|
+
type: "AWS::Logs::SubscriptionFilter",
|
|
12
|
+
properties: merged_properties,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Do not name this method properties, that is a computed method of `Jets::Resource::Base`
|
|
18
|
+
def merged_properties
|
|
19
|
+
{
|
|
20
|
+
destination_arn: "!GetAtt {namespace}LambdaFunction.Arn",
|
|
21
|
+
filter_pattern: "", # matches everything https://amzn.to/2N3b39I
|
|
22
|
+
# log_group_name: string # will be set by log_event
|
|
23
|
+
# role_arn: string # only required for kinensis, we dont use this for Lambda
|
|
24
|
+
}.deep_merge(@props)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def log_logical_id
|
|
28
|
+
"{namespace}_subscription_filter"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
class Jets::Resource
|
|
2
|
+
class Permission < Jets::Resource::Base
|
|
3
|
+
def initialize(replacements, associated_resource)
|
|
4
|
+
@replacements = replacements
|
|
5
|
+
@associated_resource = associated_resource
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
logical_id = permission_logical_id
|
|
10
|
+
|
|
11
|
+
definition = {
|
|
12
|
+
logical_id => {
|
|
13
|
+
type: "AWS::Lambda::Permission",
|
|
14
|
+
properties: {
|
|
15
|
+
function_name: "!GetAtt {namespace}LambdaFunction.Arn",
|
|
16
|
+
action: "lambda:InvokeFunction",
|
|
17
|
+
principal: principal
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
# From AWS docs: https://amzn.to/2N0QXQL
|
|
23
|
+
# source_arn is "not supported by all event sources"
|
|
24
|
+
definition[logical_id][:properties][:source_arn] = source_arn if source_arn
|
|
25
|
+
|
|
26
|
+
definition
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def permission_logical_id
|
|
30
|
+
logical_id = "{namespace}_permission"
|
|
31
|
+
md = @associated_resource.logical_id.match(/(\d+)$/)
|
|
32
|
+
counter = md[1] if md
|
|
33
|
+
[logical_id, counter].compact.join('').underscore
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
# Auto-detect principal from the associated resources.
|
|
37
|
+
def principal
|
|
38
|
+
Replacer.principal_map(@associated_resource.type)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def source_arn
|
|
42
|
+
Replacer.source_arn_map(@associated_resource.type)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
class Jets::Resource
|
|
2
|
+
class Replacer
|
|
3
|
+
extend Memoist
|
|
4
|
+
|
|
5
|
+
def initialize(replacements={})
|
|
6
|
+
@replacements = replacements
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Replace placeholder hash values with replacements. This does a deep replacement
|
|
10
|
+
# to the hash values. The replacement "key" is the string value within the value.
|
|
11
|
+
#
|
|
12
|
+
# Example:
|
|
13
|
+
#
|
|
14
|
+
# attributes = {whatever: "foo REPLACE_KEY bar" }
|
|
15
|
+
# replace_placeholders(attributes, REPLACE_KEY: "blah:arn")
|
|
16
|
+
# => {whatever: "foo blah:arn bar" }
|
|
17
|
+
#
|
|
18
|
+
# Also, we always replace the special {namespace} value in the hash values. Example:
|
|
19
|
+
#
|
|
20
|
+
# attributes = {whatever: "{namespace}LambdaFunction" }
|
|
21
|
+
# replace_placeholders(attributes, {})
|
|
22
|
+
# => {whatever: "foo PostsControllerIndexLambdaFunction bar" }
|
|
23
|
+
#
|
|
24
|
+
def replace_placeholders(attributes)
|
|
25
|
+
update_values(attributes)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def update_values(original)
|
|
29
|
+
case original
|
|
30
|
+
when Array
|
|
31
|
+
original.map { |v| update_values(v) }
|
|
32
|
+
when Hash
|
|
33
|
+
initializer = original.map do |k, v|
|
|
34
|
+
[k, update_values(v)]
|
|
35
|
+
end
|
|
36
|
+
Hash[initializer]
|
|
37
|
+
else
|
|
38
|
+
replace_value(original)
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def replace_value(value)
|
|
43
|
+
# Dont perform replacement on Integers
|
|
44
|
+
return value if value.is_a?(Integer)
|
|
45
|
+
# return value unless value.is_a?(String) or value.is_a?(Symbol)
|
|
46
|
+
|
|
47
|
+
value = value.to_s # normalize to String
|
|
48
|
+
@replacements.each do |k,v|
|
|
49
|
+
# IE: Replaces {namespace} => SecurityJobCheck
|
|
50
|
+
value = value.gsub("{#{k}}", v)
|
|
51
|
+
end
|
|
52
|
+
value
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
class << self
|
|
56
|
+
# Examples:
|
|
57
|
+
# "AWS::Events::Rule" => "events.amazonaws.com",
|
|
58
|
+
# "AWS::Config::ConfigRule" => "config.amazonaws.com",
|
|
59
|
+
# "AWS::ApiGateway::Method" => "apigateway.amazonaws.com"
|
|
60
|
+
def principal_map(type)
|
|
61
|
+
service = type.split('::')[1].downcase
|
|
62
|
+
service = special_principal_map(service)
|
|
63
|
+
"#{service}.amazonaws.com"
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def special_principal_map(service)
|
|
67
|
+
# special map
|
|
68
|
+
# s3_event actually uses sns topic events to trigger a Lambda function
|
|
69
|
+
map = { "s3" => "sns" }
|
|
70
|
+
map[service] || service
|
|
71
|
+
end
|
|
72
|
+
|
|
73
|
+
# From AWS docs: https://amzn.to/2N0QXQL
|
|
74
|
+
# source_arn is "not supported by all event sources"
|
|
75
|
+
#
|
|
76
|
+
# When it is not available the resource definition should add it.
|
|
77
|
+
def source_arn_map(type)
|
|
78
|
+
map = {
|
|
79
|
+
"AWS::ApiGateway::Method" => "!Sub arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:${RestApi}/*/*",
|
|
80
|
+
}
|
|
81
|
+
map[type]
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# CloudFormation Docs AWS::Route53::RecordSet: https://amzn.to/2BtP9s5
|
|
2
|
+
#
|
|
3
|
+
# Example:
|
|
4
|
+
#
|
|
5
|
+
# DnsRecord:
|
|
6
|
+
# Type: AWS::Route53::RecordSet
|
|
7
|
+
# Properties:
|
|
8
|
+
# HostedZoneName: !Ref 'HostedZoneResource'
|
|
9
|
+
# Comment: DNS name for my instance.
|
|
10
|
+
# Name: !Join ['', [!Ref 'Ec2Instance', ., !Ref 'AWS::Region', ., !Ref 'HostedZone', .]]
|
|
11
|
+
# Type: A
|
|
12
|
+
# TTL: '900'
|
|
13
|
+
# ResourceRecords:
|
|
14
|
+
# - !GetAtt Ec2Instance.PublicIp
|
|
15
|
+
module Jets::Resource::Route53
|
|
16
|
+
class RecordSet < Jets::Resource::Base
|
|
17
|
+
def definition
|
|
18
|
+
{
|
|
19
|
+
dns_record: {
|
|
20
|
+
type: "AWS::Route53::RecordSet",
|
|
21
|
+
properties: record_set_properties
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def record_set_properties
|
|
27
|
+
base = {
|
|
28
|
+
comment: "DNS record managed by Jets",
|
|
29
|
+
name: name,
|
|
30
|
+
}
|
|
31
|
+
hosted_zone_id = Jets.config.domain.hosted_zone_id
|
|
32
|
+
if hosted_zone_id
|
|
33
|
+
base[:hosted_zone_id] = hosted_zone_id
|
|
34
|
+
else
|
|
35
|
+
base[:hosted_zone_name] = hosted_zone_name
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
if Jets.config.domain.apex
|
|
39
|
+
base.merge(
|
|
40
|
+
alias_target: {
|
|
41
|
+
dns_name: cname,
|
|
42
|
+
hosted_zone_id: domain_name_hosted_zone,
|
|
43
|
+
},
|
|
44
|
+
type: "A",
|
|
45
|
+
)
|
|
46
|
+
else
|
|
47
|
+
base.merge({
|
|
48
|
+
type: "CNAME",
|
|
49
|
+
ttl: "60",
|
|
50
|
+
resource_records: [cname],
|
|
51
|
+
})
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def domain_name_hosted_zone
|
|
56
|
+
if endpoint_types.include?("REGIONAL")
|
|
57
|
+
"!GetAtt DomainName.RegionalHostedZoneId"
|
|
58
|
+
else
|
|
59
|
+
"!GetAtt DomainName.DistributionHostedZoneId"
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def cname
|
|
64
|
+
if endpoint_types.include?("REGIONAL")
|
|
65
|
+
"!GetAtt DomainName.RegionalDomainName"
|
|
66
|
+
else
|
|
67
|
+
"!GetAtt DomainName.DistributionDomainName"
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def domain_name
|
|
72
|
+
Jets::Resource::ApiGateway::DomainName.new
|
|
73
|
+
end
|
|
74
|
+
memoize :domain_name
|
|
75
|
+
|
|
76
|
+
def endpoint_types
|
|
77
|
+
domain_name.endpoint_types
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# IE: demo-dev.mydomain.com
|
|
81
|
+
def name
|
|
82
|
+
# Weird looking but correct: domain_name is object and domain_name is also method
|
|
83
|
+
domain_name.domain_name
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# IE: mydomain.com
|
|
87
|
+
def hosted_zone_name
|
|
88
|
+
name = Jets.config.domain.hosted_zone_name
|
|
89
|
+
name.ends_with?('.') ? name : "#{name}." # add trailing period if missing
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def outputs
|
|
93
|
+
{
|
|
94
|
+
"DnsRecord" => "!Ref DnsRecord",
|
|
95
|
+
}
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Jets::Resource::S3
|
|
2
|
+
class Bucket < Jets::Resource::Base
|
|
3
|
+
attr_reader :bucket_logical_id
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
@bucket_logical_id = props.delete(:logical_id) || "{namespace}_s3_bucket"
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def definition
|
|
10
|
+
{
|
|
11
|
+
bucket_logical_id => {
|
|
12
|
+
type: "AWS::S3::Bucket",
|
|
13
|
+
properties: @props,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def outputs
|
|
19
|
+
{
|
|
20
|
+
bucket_logical_id => "!Ref #{bucket_logical_id.to_s.camelize}",
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# CloudFormation SNS Subscription docs: https://amzn.to/2SJtN3C
|
|
2
|
+
module Jets::Resource::Sns
|
|
3
|
+
class Subscription < Jets::Resource::Base
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
{
|
|
10
|
+
subscription_logical_id => {
|
|
11
|
+
type: "AWS::SNS::Subscription",
|
|
12
|
+
properties: merged_properties,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Do not name this method properties, that is a computed method of `Jets::Resource::Base`
|
|
18
|
+
def merged_properties
|
|
19
|
+
{
|
|
20
|
+
endpoint: "!GetAtt {namespace}LambdaFunction.Arn",
|
|
21
|
+
protocol: "lambda",
|
|
22
|
+
}.deep_merge(@props)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def subscription_logical_id
|
|
26
|
+
"{namespace}_sns_subscription"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# CloudFormation SNS Topic docs: https://amzn.to/2MYbUZc
|
|
2
|
+
module Jets::Resource::Sns
|
|
3
|
+
class Topic < Jets::Resource::Base
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
{
|
|
10
|
+
topic_logical_id => {
|
|
11
|
+
type: "AWS::SNS::Topic",
|
|
12
|
+
properties: merged_properties,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Do not name this method properties, that is a computed method of `Jets::Resource::Base`
|
|
18
|
+
def merged_properties
|
|
19
|
+
display_name = "{namespace} Topic"[0..99] # limit is 100 chars
|
|
20
|
+
{
|
|
21
|
+
display_name: display_name,
|
|
22
|
+
# Not setting subscription this way but instead with a SNS::Subscription resource so the interface
|
|
23
|
+
# is consistent. Leaving comment in here to remind me and in case decide to change this.
|
|
24
|
+
# subscription: [
|
|
25
|
+
# endpoint: "!GetAtt {namespace}LambdaFunction.Arn",
|
|
26
|
+
# protocol: "lambda"
|
|
27
|
+
# ]
|
|
28
|
+
}.deep_merge(@props)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def topic_logical_id
|
|
32
|
+
"{namespace}_sns_topic"
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# CloudFormation SNS TopicPolicy docs: https://amzn.to/2SBMq9v
|
|
2
|
+
module Jets::Resource::Sns
|
|
3
|
+
class TopicPolicy < Jets::Resource::Base
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
{
|
|
10
|
+
policy_logical_id => {
|
|
11
|
+
type: "AWS::SNS::TopicPolicy",
|
|
12
|
+
properties: merged_properties,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# Do not name this method properties, that is a computed method of `Jets::Resource::Base`
|
|
18
|
+
def merged_properties
|
|
19
|
+
{
|
|
20
|
+
policy_document: {
|
|
21
|
+
version: "2012-10-17",
|
|
22
|
+
statement: {
|
|
23
|
+
effect: "Allow",
|
|
24
|
+
principal: { service: "s3.amazonaws.com"},
|
|
25
|
+
action: "sns:Publish",
|
|
26
|
+
resource: "*", # TODO: figure out good syntax to limit easily
|
|
27
|
+
# Condition:
|
|
28
|
+
# ArnLike:
|
|
29
|
+
# aws:SourceArn: arn:aws:s3:::aa-test-95872017
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
topics: ["!Ref {namespace}SnsTopic"],
|
|
33
|
+
}.deep_merge(@props)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def policy_logical_id
|
|
37
|
+
"{namespace}_sns_topic_policy"
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# CloudFormation SQS Queue docs: https://amzn.to/2MVWk0j
|
|
2
|
+
module Jets::Resource::Sqs
|
|
3
|
+
class Queue < Jets::Resource::Base
|
|
4
|
+
def initialize(props={})
|
|
5
|
+
@props = props # associated_properties from dsl.rb
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def definition
|
|
9
|
+
{
|
|
10
|
+
queue_logical_id => {
|
|
11
|
+
type: "AWS::SQS::Queue",
|
|
12
|
+
properties: @props,
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def queue_logical_id
|
|
18
|
+
"{namespace}_sqs_queue"
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|