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,49 @@
|
|
|
1
|
+
require 'json'
|
|
2
|
+
|
|
3
|
+
# Job public methods get turned into Lambda functions.
|
|
4
|
+
#
|
|
5
|
+
# Jets::Job::Base < Jets::Lambda::Functions
|
|
6
|
+
# Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
|
|
7
|
+
# So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
|
|
8
|
+
module Jets::Job
|
|
9
|
+
class Base < Jets::Lambda::Functions
|
|
10
|
+
include Dsl
|
|
11
|
+
|
|
12
|
+
# non-DSL methods
|
|
13
|
+
include Helpers::KinesisEventHelper
|
|
14
|
+
include Helpers::LogEventHelper
|
|
15
|
+
include Helpers::S3EventHelper
|
|
16
|
+
|
|
17
|
+
# Tracks bucket each time an s3_event is declared
|
|
18
|
+
# Map of bucket_name => stack_name (nested part)
|
|
19
|
+
cattr_accessor :s3_events # dont want this to be inheritable intentionally
|
|
20
|
+
self.s3_events = {}
|
|
21
|
+
|
|
22
|
+
class << self
|
|
23
|
+
def process(event, context, meth)
|
|
24
|
+
job = new(event, context, meth)
|
|
25
|
+
job.send(meth)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def perform_now(meth, event={}, context={})
|
|
29
|
+
new(event.try(:to_unsafe_h), context, meth).send(meth)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def perform_later(meth, event={}, context={})
|
|
33
|
+
if on_lambda?
|
|
34
|
+
function_name = "#{self.to_s.underscore}-#{meth}"
|
|
35
|
+
call = Jets::Commands::Call.new(function_name, JSON.dump(event.try(:to_unsafe_h)), invocation_type: "Event")
|
|
36
|
+
call.run
|
|
37
|
+
else
|
|
38
|
+
puts "INFO: Not on AWS Lambda. In local mode perform_later executes the job with perform_now instead."
|
|
39
|
+
perform_now(meth, event, context)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
private
|
|
44
|
+
def on_lambda?
|
|
45
|
+
!!ENV['AWS_LAMBDA_FUNCTION_NAME']
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module DynamodbEvent
|
|
3
|
+
def dynamodb_event(table_name, options={})
|
|
4
|
+
return if ENV['JETS_BUILD_NO_INTERNET'] # Disable during build since jets build tries to init this
|
|
5
|
+
|
|
6
|
+
stream_arn = full_dynamodb_stream_arn(table_name)
|
|
7
|
+
default_iam_policy = default_dynamodb_stream_policy(stream_arn)
|
|
8
|
+
|
|
9
|
+
# Create iam policy allows access to queue
|
|
10
|
+
# Allow disabling in case use wants to add permission application-wide and not have extra IAM policy
|
|
11
|
+
iam_policy_props = options.delete(:iam_policy) || @iam_policy || default_iam_policy
|
|
12
|
+
iam_policy(iam_policy_props) unless iam_policy_props == :disable
|
|
13
|
+
|
|
14
|
+
props = options # by this time options only has EventSourceMapping properties
|
|
15
|
+
default = {
|
|
16
|
+
event_source_arn: stream_arn,
|
|
17
|
+
starting_position: "TRIM_HORIZON",
|
|
18
|
+
}
|
|
19
|
+
props = default.merge(props)
|
|
20
|
+
|
|
21
|
+
event_source_mapping(props)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
# Expands table name to the full stream arn. Example:
|
|
26
|
+
#
|
|
27
|
+
# test-table
|
|
28
|
+
# To:
|
|
29
|
+
# arn:aws:dynamodb:us-west-2:112233445566:table/test-table/stream/2019-02-15T21:41:15.217
|
|
30
|
+
#
|
|
31
|
+
# Note, this does not check if the stream has been disabled.
|
|
32
|
+
def full_dynamodb_stream_arn(table_name)
|
|
33
|
+
return table_name if table_name.include?("arn:aws:dynamodb") # assume full stream arn
|
|
34
|
+
|
|
35
|
+
begin
|
|
36
|
+
resp = dynamodb.describe_table(table_name: table_name)
|
|
37
|
+
rescue Aws::DynamoDB::Errors::ResourceNotFoundException => e
|
|
38
|
+
puts e.message
|
|
39
|
+
puts "ERROR: Was not able to find the DynamoDB table: #{table_name}.".color(:red)
|
|
40
|
+
code_line = caller.grep(%r{/app/jobs}).first
|
|
41
|
+
puts "Please check: #{code_line}"
|
|
42
|
+
puts "Exiting"
|
|
43
|
+
exit 1
|
|
44
|
+
end
|
|
45
|
+
stream_arn = resp.table.latest_stream_arn
|
|
46
|
+
return stream_arn if stream_arn
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def default_dynamodb_stream_policy(stream_name_arn='*')
|
|
50
|
+
stream = {
|
|
51
|
+
action: ["dynamodb:GetRecords",
|
|
52
|
+
"dynamodb:GetShardIterator",
|
|
53
|
+
"dynamodb:DescribeStream",
|
|
54
|
+
"dynamodb:ListStreams"],
|
|
55
|
+
effect: "Allow",
|
|
56
|
+
resource: stream_name_arn,
|
|
57
|
+
}
|
|
58
|
+
table_name_arn = stream_name_arn.gsub(%r{/stream/20.*},'')
|
|
59
|
+
table = {
|
|
60
|
+
action: ["dynamodb:DescribeTable"],
|
|
61
|
+
effect: "Allow",
|
|
62
|
+
resource: table_name_arn,
|
|
63
|
+
}
|
|
64
|
+
[stream, table]
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# SqsEvent uses this module
|
|
2
|
+
module Jets::Job::Dsl
|
|
3
|
+
module EventSourceMapping
|
|
4
|
+
def event_source_mapping(props={})
|
|
5
|
+
r = Jets::Resource::Lambda::EventSourceMapping.new(props)
|
|
6
|
+
with_fresh_properties do
|
|
7
|
+
resource(r.definition) # add associated resource immediately
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module IotEvent
|
|
3
|
+
# The user must at least pass in an SQL statement
|
|
4
|
+
def iot_event(props={})
|
|
5
|
+
if props.is_a?(String) # SQL Statement
|
|
6
|
+
props = {sql: props}
|
|
7
|
+
topic_props = {topic_rule_payload: props}
|
|
8
|
+
elsif props.key?(:topic_rule_payload) # full properties structure
|
|
9
|
+
topic_props = props
|
|
10
|
+
else # just the topic_rule_payload
|
|
11
|
+
topic_props = {topic_rule_payload: props}
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
declare_iot_topic(topic_props)
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def declare_iot_topic(props={})
|
|
18
|
+
r = Jets::Resource::Iot::TopicRule.new(props)
|
|
19
|
+
with_fresh_properties do
|
|
20
|
+
resource(r.definition) # add associated resource immediately
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module KinesisEvent
|
|
3
|
+
def kinesis_event(stream_name, options={})
|
|
4
|
+
stream_arn = full_kinesis_stream_arn(stream_name)
|
|
5
|
+
default_iam_policy = default_kinesis_stream_policy(stream_arn)
|
|
6
|
+
|
|
7
|
+
# Create iam policy allows access to queue
|
|
8
|
+
# Allow disabling in case use wants to add permission application-wide and not have extra IAM policy
|
|
9
|
+
iam_policy_props = options.delete(:iam_policy) || @iam_policy || default_iam_policy
|
|
10
|
+
iam_policy(iam_policy_props) unless iam_policy_props == :disable
|
|
11
|
+
|
|
12
|
+
props = options # by this time options only has EventSourceMapping properties
|
|
13
|
+
default = {
|
|
14
|
+
event_source_arn: stream_arn,
|
|
15
|
+
starting_position: "LATEST",
|
|
16
|
+
}
|
|
17
|
+
props = default.merge(props)
|
|
18
|
+
|
|
19
|
+
event_source_mapping(props)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Expands table name to the full stream arn. Example:
|
|
23
|
+
#
|
|
24
|
+
# test-table
|
|
25
|
+
# To:
|
|
26
|
+
# arn:aws:kinesis:us-west-2:112233445566:table/test-table/stream/2019-02-15T21:41:15.217
|
|
27
|
+
#
|
|
28
|
+
# Note, this does not check if the stream has been disabled.
|
|
29
|
+
def full_kinesis_stream_arn(stream_name)
|
|
30
|
+
return stream_name if stream_name.include?("arn:aws:kinesis") # assume full stream arn
|
|
31
|
+
|
|
32
|
+
"arn:aws:kinesis:#{Jets.aws.region}:#{Jets.aws.account}:stream/#{stream_name}"
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def default_kinesis_stream_policy(stream_name_arn='*')
|
|
36
|
+
{
|
|
37
|
+
action: ["kinesis:GetRecords",
|
|
38
|
+
"kinesis:GetShardIterator",
|
|
39
|
+
"kinesis:DescribeStream",
|
|
40
|
+
"kinesis:ListStreams"],
|
|
41
|
+
effect: "Allow",
|
|
42
|
+
resource: stream_name_arn,
|
|
43
|
+
}
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module LogEvent
|
|
3
|
+
def log_event(log_group_name, props={})
|
|
4
|
+
props.merge!(log_group_name: log_group_name)
|
|
5
|
+
declare_log_subscription_filter(props)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def declare_log_subscription_filter(props={})
|
|
9
|
+
r = Jets::Resource::Logs::SubscriptionFilter.new(props)
|
|
10
|
+
with_fresh_properties do
|
|
11
|
+
resource(r.definition) # add associated resource immediately
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module RuleEvent
|
|
3
|
+
# Public: Creates CloudWatch Event Rule
|
|
4
|
+
#
|
|
5
|
+
# expression - The rate expression.
|
|
6
|
+
#
|
|
7
|
+
# Examples
|
|
8
|
+
#
|
|
9
|
+
# rate("10 minutes")
|
|
10
|
+
# rate("10 minutes", description: "Hard job")
|
|
11
|
+
#
|
|
12
|
+
def rate(expression, props={})
|
|
13
|
+
schedule_job("rate(#{expression})", props)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
# Public: Creates CloudWatch Event Rule
|
|
17
|
+
#
|
|
18
|
+
# expression - The cron expression.
|
|
19
|
+
#
|
|
20
|
+
# Examples
|
|
21
|
+
#
|
|
22
|
+
# cron("0 */12 * * ? *")
|
|
23
|
+
# cron("0 */12 * * ? *", description: "Hard job")
|
|
24
|
+
#
|
|
25
|
+
def cron(expression, props={})
|
|
26
|
+
schedule_job("cron(#{expression})", props)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def schedule_job(expression, props={})
|
|
30
|
+
props = props.merge(schedule_expression: expression)
|
|
31
|
+
rule_event(props)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def rule_event(props={})
|
|
35
|
+
if props.key?(:detail)
|
|
36
|
+
description = props.key?(:description) ? props.delete(:description) : rule_description
|
|
37
|
+
rule_props = { event_pattern: props, description: description }
|
|
38
|
+
else # if props.key?(:event_pattern)
|
|
39
|
+
props[:description] ||= rule_description
|
|
40
|
+
rule_props = props
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
with_fresh_properties(multiple_resources: false) do
|
|
44
|
+
associated_properties(rule_props) # TODO: consider getting rid of @associated_properties concept
|
|
45
|
+
resource(events_rule_definition) # add associated resource immediately
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def rule_description
|
|
50
|
+
self.rule_counter += 1
|
|
51
|
+
"#{self.name} event rule #{rule_counter}"
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def events_rule_definition
|
|
55
|
+
resource = Jets::Resource::Events::Rule.new(associated_properties)
|
|
56
|
+
resource.definition # returns a definition to be added by associated_resources
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Deprecated methods, will be removed in the future
|
|
60
|
+
def events_rule(props)
|
|
61
|
+
puts "DEPRECATED: events_rule. Instead use rule_event. The events_rule will be removed in the future. Pausing for 5 seconds".color(:yellow)
|
|
62
|
+
puts caller[0]
|
|
63
|
+
sleep 5
|
|
64
|
+
rule_event(props)
|
|
65
|
+
end
|
|
66
|
+
# Deprecated methods, will be removed in the future
|
|
67
|
+
|
|
68
|
+
def event_pattern(props)
|
|
69
|
+
puts "DEPRECATED: events_rule. Instead use rule_event. The events_rule will be removed in the future. Pausing for 5 seconds".color(:yellow)
|
|
70
|
+
puts caller[0]
|
|
71
|
+
sleep 5
|
|
72
|
+
rule_event(props)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module S3Event
|
|
3
|
+
def s3_event(bucket_name, props={})
|
|
4
|
+
stack_name = declare_s3_bucket_resources(bucket_name) # only set up once per bucket
|
|
5
|
+
declare_sns_subscription(topic_arn: "!Ref #{stack_name}SnsTopic") # set up subscription every time
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
# Returns stack_name
|
|
9
|
+
def declare_s3_bucket_resources(bucket_name)
|
|
10
|
+
# If shared s3 bucket resources have already been declared.
|
|
11
|
+
# We will not generate them again. However, we still need to always
|
|
12
|
+
# add the depends_on declaration to ensure that the shared stack parameters
|
|
13
|
+
# are properly passed to the nested child stack.
|
|
14
|
+
stack_name = s3_events[bucket_name] # already registered
|
|
15
|
+
if stack_name
|
|
16
|
+
depends_on stack_name.underscore.to_sym, class_prefix: true # always add this
|
|
17
|
+
return stack_name
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# Create shared resources - one time
|
|
21
|
+
stack_name = declare_shared_s3_event_resources(bucket_name)
|
|
22
|
+
depends_on stack_name.underscore.to_sym, class_prefix: true # always add this
|
|
23
|
+
self.s3_events[bucket_name] = stack_name # tracks buckets already set up
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def declare_shared_s3_event_resources(bucket_name)
|
|
27
|
+
s3_stack = Jets::Stack::S3Event.new(bucket_name)
|
|
28
|
+
s3_stack.build_stack
|
|
29
|
+
s3_stack.stack_name
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def s3_events
|
|
33
|
+
Jets::Job::Base.s3_events
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
module Jets::Job::Dsl
|
|
2
|
+
module SnsEvent
|
|
3
|
+
def sns_event(topic_name, props={})
|
|
4
|
+
if topic_name.to_s =~ /generate/
|
|
5
|
+
declare_sns_topic(props.delete(:topic_properties))
|
|
6
|
+
topic_arn = "!Ref {namespace}SnsTopic"
|
|
7
|
+
props.merge!(topic_arn: topic_arn)
|
|
8
|
+
declare_sns_subscription(props)
|
|
9
|
+
elsif topic_name.include?('!Ref') # reference shared resource
|
|
10
|
+
topic_arn = topic_name # contains !Ref
|
|
11
|
+
props.merge!(topic_arn: topic_arn)
|
|
12
|
+
declare_sns_subscription(props)
|
|
13
|
+
else # existing topic: short name or full arn
|
|
14
|
+
topic_arn = full_sns_topic_arn(topic_name)
|
|
15
|
+
props.merge!(topic_arn: topic_arn)
|
|
16
|
+
declare_sns_subscription(props)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def declare_sns_topic(props={})
|
|
21
|
+
props ||= {} # props.delete(:topic_properties) can be nil
|
|
22
|
+
r = Jets::Resource::Sns::Topic.new(props)
|
|
23
|
+
with_fresh_properties do
|
|
24
|
+
resource(r.definition) # add associated resource immediately
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def declare_sns_topic_policy(props={})
|
|
29
|
+
props ||= {} # options.delete(:topic_policy_properties) can be nil
|
|
30
|
+
r = Jets::Resource::Sns::TopicPolicy.new(props)
|
|
31
|
+
with_fresh_properties do
|
|
32
|
+
resource(r.definition) # add associated resource immediately
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def declare_sns_subscription(props={})
|
|
37
|
+
r = Jets::Resource::Sns::Subscription.new(props)
|
|
38
|
+
with_fresh_properties do
|
|
39
|
+
resource(r.definition) # add associated resource immediately
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Expands simple topic name to full arn. Example:
|
|
44
|
+
#
|
|
45
|
+
# hello-topic
|
|
46
|
+
# To:
|
|
47
|
+
# arn:aws:sns:us-west-2:112233445566:hello-topic
|
|
48
|
+
def full_sns_topic_arn(topic_name)
|
|
49
|
+
return topic_name if topic_name.include?("arn:aws:sns")
|
|
50
|
+
|
|
51
|
+
"arn:aws:sns:#{Jets.aws.region}:#{Jets.aws.account}:#{topic_name}"
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# ## Event Source Mapping
|
|
2
|
+
#
|
|
3
|
+
# Underneath the hood, the `sqs_event` method sets up a [Lambda::EventSourceMapping](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-eventsourcemapping.html). So:
|
|
4
|
+
#
|
|
5
|
+
# ```ruby
|
|
6
|
+
# class HardJob
|
|
7
|
+
# class_timeout 30 # must be less than or equal to the SQS queue default timeout
|
|
8
|
+
#
|
|
9
|
+
# sqs_event "hello-queue"
|
|
10
|
+
# def dig
|
|
11
|
+
# puts "dig event #{JSON.dump(event)}"
|
|
12
|
+
# end
|
|
13
|
+
# end
|
|
14
|
+
# ```
|
|
15
|
+
#
|
|
16
|
+
# Cloud also be written with something like this:
|
|
17
|
+
#
|
|
18
|
+
# ```ruby
|
|
19
|
+
# class HardJob
|
|
20
|
+
# class_timeout 30 # must be less than or equal to the SQS queue default timeout
|
|
21
|
+
#
|
|
22
|
+
# event_source_mapping(
|
|
23
|
+
# event_source_arn: "arn:aws:sqs:us-west-2:112233445566:hello-queue",
|
|
24
|
+
# )
|
|
25
|
+
# iam_policy(
|
|
26
|
+
# action: ["sqs:ReceiveMessage",
|
|
27
|
+
# "sqs:DeleteMessage",
|
|
28
|
+
# "sqs:GetQueueAttributes"],
|
|
29
|
+
# effect: "Allow",
|
|
30
|
+
# resource: "arn:aws:sqs:us-west-2:112233445566:hello-queue",
|
|
31
|
+
# )
|
|
32
|
+
# def dig
|
|
33
|
+
# puts "dig event #{JSON.dump(event)}"
|
|
34
|
+
# end
|
|
35
|
+
# end
|
|
36
|
+
# ```
|
|
37
|
+
#
|
|
38
|
+
module Jets::Job::Dsl
|
|
39
|
+
module SqsEvent
|
|
40
|
+
def sqs_event(queue_name, options={})
|
|
41
|
+
if queue_name.to_s =~ /generate/
|
|
42
|
+
queue_arn = "!GetAtt {namespace}SqsQueue.Arn"
|
|
43
|
+
default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
|
|
44
|
+
declare_sqs_queue(options.delete(:queue_properties)) # delete to avoid using them for event_source_mapping
|
|
45
|
+
elsif queue_name.include?('!Ref') # reference shared resource
|
|
46
|
+
queue_arn = queue_name
|
|
47
|
+
default_iam_policy = default_sqs_iam_policy('*') # Dont have access to full ARN on initial creation
|
|
48
|
+
else # existing queue: short name or full arn
|
|
49
|
+
queue_arn = full_sqs_queue_arn(queue_name)
|
|
50
|
+
default_iam_policy = default_sqs_iam_policy(queue_arn)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Create iam policy allows access to queue
|
|
54
|
+
# Allow disabling in case use wants to add permission application-wide and not have extra IAM policy
|
|
55
|
+
iam_policy_props = options.delete(:iam_policy) || @iam_policy || default_iam_policy
|
|
56
|
+
iam_policy(iam_policy_props) unless iam_policy_props == :disable
|
|
57
|
+
|
|
58
|
+
props = options # by this time options only has EventSourceMapping properties
|
|
59
|
+
default = {
|
|
60
|
+
event_source_arn: queue_arn
|
|
61
|
+
}
|
|
62
|
+
props = default.merge(props)
|
|
63
|
+
|
|
64
|
+
event_source_mapping(props)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def declare_sqs_queue(props)
|
|
68
|
+
props ||= {} # since options.delete(:queue_properties) can be nil
|
|
69
|
+
r = Jets::Resource::Sqs::Queue.new(props)
|
|
70
|
+
with_fresh_properties do
|
|
71
|
+
resource(r.definition) # add associated resource immediately
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Expands simple queue name to full arn. Example:
|
|
76
|
+
#
|
|
77
|
+
# hello-queue
|
|
78
|
+
# To:
|
|
79
|
+
# arn:aws:sqs:us-west-2:112233445566:hello-queue
|
|
80
|
+
def full_sqs_queue_arn(queue_name)
|
|
81
|
+
return queue_name if queue_name.include?("arn:aws:sqs")
|
|
82
|
+
|
|
83
|
+
"arn:aws:sqs:#{Jets.aws.region}:#{Jets.aws.account}:#{queue_name}"
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
def default_sqs_iam_policy(queue_name_arn='*')
|
|
87
|
+
{
|
|
88
|
+
action: ["sqs:ReceiveMessage",
|
|
89
|
+
"sqs:DeleteMessage",
|
|
90
|
+
"sqs:GetQueueAttributes"],
|
|
91
|
+
effect: "Allow",
|
|
92
|
+
resource: queue_name_arn,
|
|
93
|
+
}
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
data/lib/jets/job/dsl.rb
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require 'active_support'
|
|
2
|
+
require 'active_support/core_ext/class'
|
|
3
|
+
|
|
4
|
+
# Jets::Job::Base < Jets::Lambda::Functions
|
|
5
|
+
# Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
|
|
6
|
+
# So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
|
|
7
|
+
#
|
|
8
|
+
# Implements:
|
|
9
|
+
#
|
|
10
|
+
# default_associated_resource_definition
|
|
11
|
+
#
|
|
12
|
+
module Jets::Job::Dsl
|
|
13
|
+
extend ActiveSupport::Concern
|
|
14
|
+
|
|
15
|
+
included do
|
|
16
|
+
class << self
|
|
17
|
+
include Jets::AwsServices
|
|
18
|
+
|
|
19
|
+
include DynamodbEvent
|
|
20
|
+
include EventSourceMapping
|
|
21
|
+
include IotEvent
|
|
22
|
+
include KinesisEvent
|
|
23
|
+
include LogEvent
|
|
24
|
+
include RuleEvent
|
|
25
|
+
include S3Event
|
|
26
|
+
include SnsEvent
|
|
27
|
+
include SqsEvent
|
|
28
|
+
|
|
29
|
+
# Used to provide a little more identifiable event rule auto-descriptions
|
|
30
|
+
class_attribute :rule_counter
|
|
31
|
+
self.rule_counter = 0
|
|
32
|
+
|
|
33
|
+
# TODO: Get rid of default_associated_resource_definition concept.
|
|
34
|
+
# Also gets rid of the need to keep track of running @associated_properties too.
|
|
35
|
+
def default_associated_resource_definition(meth)
|
|
36
|
+
events_rule_definition
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'base64'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'stringio'
|
|
4
|
+
require 'zlib'
|
|
5
|
+
|
|
6
|
+
module Jets::Job::Helpers
|
|
7
|
+
module LogEventHelper
|
|
8
|
+
def log_event
|
|
9
|
+
encoded = event["awslogs"]["data"]
|
|
10
|
+
compressed_string = Base64.decode64(encoded)
|
|
11
|
+
gz = Zlib::GzipReader.new(StringIO.new(compressed_string))
|
|
12
|
+
uncompressed_string = gz.read
|
|
13
|
+
data = JSON.load(uncompressed_string)
|
|
14
|
+
ActiveSupport::HashWithIndifferentAccess.new(data)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Jets::Job::Helpers
|
|
2
|
+
module S3EventHelper
|
|
3
|
+
def s3_event
|
|
4
|
+
message = event["Records"][0]["Sns"]["Message"]
|
|
5
|
+
h = JSON.load(message)
|
|
6
|
+
ActiveSupport::HashWithIndifferentAccess.new(h)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def s3_object
|
|
10
|
+
s3_event["Records"][0]["s3"]["object"]
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/jets/klass.rb
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# Loading a class can usually be loaded via .constantize.
|
|
2
|
+
# But app/functions files are anonymous ruby classes created with
|
|
3
|
+
# Class.new. Anonymous classes cannot be loaded via .constantize and
|
|
4
|
+
# go through standard autoloading.
|
|
5
|
+
#
|
|
6
|
+
# Jets::Klass provides a way to load app classes in app/controllers, app/jobs,
|
|
7
|
+
# app/functions in a consistent way without having to worry about the anonymous
|
|
8
|
+
# class loading quirk. Classes that are not anonymously defined like controllers
|
|
9
|
+
# and jobs are loaded via autoloading with .constantize. Anonymously defined
|
|
10
|
+
# classes like functions are loaded via Object.const_set.
|
|
11
|
+
#
|
|
12
|
+
# Examples:
|
|
13
|
+
#
|
|
14
|
+
# Jets::Klass.from_path("app/controllers/posts_controller.rb")
|
|
15
|
+
# Jets::Klass.from_path("app/jobs/hard_job.rb")
|
|
16
|
+
# Jets::Klass.from_path("app/functions/hello.rb")
|
|
17
|
+
# Jets::Klass.from_path("app/functions/hello_function.rb")
|
|
18
|
+
# Jets::Klass.from_path("app/shared/functions/whatever.rb")
|
|
19
|
+
#
|
|
20
|
+
# Jets::Klass.from_task(task)
|
|
21
|
+
#
|
|
22
|
+
# The from_task method takes a Jets::Lambda::Task as an argument and is useful
|
|
23
|
+
# for the CloudFormation child stack generation there the registered task info
|
|
24
|
+
# is available but the path info is now.
|
|
25
|
+
class Jets::Klass
|
|
26
|
+
class << self
|
|
27
|
+
# from_path allows us to load any app classes in consistent way for
|
|
28
|
+
# app/controllers, app/jobs, and app/functions.
|
|
29
|
+
def from_path(path)
|
|
30
|
+
class_name = class_name(path)
|
|
31
|
+
if path.include?("/functions/") # simple function
|
|
32
|
+
class_name = load_anonymous_class(class_name, path)
|
|
33
|
+
class_name.constantize # removed :: for anonymous classes
|
|
34
|
+
else
|
|
35
|
+
class_name.constantize # autoload
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# app/controllers/posts_controller.rb => PostsController
|
|
40
|
+
def class_name(path)
|
|
41
|
+
if path.include?("/shared/")
|
|
42
|
+
path.sub(%r{.*app/shared/(.*?)/},'').sub(/\.rb$/,'').camelize
|
|
43
|
+
else
|
|
44
|
+
path.sub(%r{.*app/(.*?)/},'').sub(/\.rb$/,'').camelize
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
APP_TYPES = %w[controller job rule authorizer]
|
|
49
|
+
def from_task(task)
|
|
50
|
+
class_name = task.class_name
|
|
51
|
+
filename = class_name.underscore
|
|
52
|
+
|
|
53
|
+
# Examples of filename: posts_controller, hard_job, security_rule, main_authorizer
|
|
54
|
+
# hello_function, hello
|
|
55
|
+
type = filename.split('_').last
|
|
56
|
+
type = "function" unless APP_TYPES.include?(type)
|
|
57
|
+
|
|
58
|
+
path = "app/#{type.pluralize}/#{filename}.rb"
|
|
59
|
+
from_path(path)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
@@loaded_anonymous_classes = []
|
|
63
|
+
def load_anonymous_class(class_name, path)
|
|
64
|
+
parent_mod = modularize(class_name)
|
|
65
|
+
|
|
66
|
+
constructor = Jets::Lambda::FunctionConstructor.new(path)
|
|
67
|
+
# Dont load anonyomous class more than once to avoid these warnings:
|
|
68
|
+
# warning: already initialized constant Hello
|
|
69
|
+
# warning: previous definition of Hello was here
|
|
70
|
+
unless @@loaded_anonymous_classes.include?(class_name)
|
|
71
|
+
# use class_name as the variable name for prettier class name.
|
|
72
|
+
leaf_class_name = class_name.split('::').last
|
|
73
|
+
parent_mod.const_set(leaf_class_name, constructor.build)
|
|
74
|
+
@@loaded_anonymous_classes << class_name
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
class_name
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Ensures the parent namespace modules are defined. Example:
|
|
81
|
+
#
|
|
82
|
+
# modularize("Foo::Bar::Test")
|
|
83
|
+
# => Foo::Bar # is a now defined as a module if it wasnt before
|
|
84
|
+
#
|
|
85
|
+
# Also returns the parent module, so we can use it to do a const_set if needed. IE:
|
|
86
|
+
#
|
|
87
|
+
# parent_mod = modularize("Foo::Bar::Test")
|
|
88
|
+
# parent_mod.const_set("Test")
|
|
89
|
+
def modularize(class_name)
|
|
90
|
+
leaves = []
|
|
91
|
+
mods = class_name.split('::')[0..-2] # drop the last word
|
|
92
|
+
# puts "mods: #{mods}"
|
|
93
|
+
return Object if mods.empty?
|
|
94
|
+
|
|
95
|
+
leaves = []
|
|
96
|
+
mods.each do |leaf_mod|
|
|
97
|
+
leaves += [leaf_mod]
|
|
98
|
+
namespace = leaves.join('::')
|
|
99
|
+
previous_namespace = leaves[0..-2].join('::')
|
|
100
|
+
previous_namespace = "Object" if previous_namespace.empty?
|
|
101
|
+
previous_namespace = previous_namespace.constantize
|
|
102
|
+
previous_namespace.const_set(leaf_mod, Module.new) unless Object.const_defined?(namespace)
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
mods.join('::').constantize
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
end
|
|
109
|
+
end
|