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,123 @@
|
|
|
1
|
+
module Jets::Cfn::Builders
|
|
2
|
+
class ApiGatewayBuilder
|
|
3
|
+
extend Memoist
|
|
4
|
+
include Interface
|
|
5
|
+
include Jets::AwsServices
|
|
6
|
+
|
|
7
|
+
def initialize(options={})
|
|
8
|
+
@options = options
|
|
9
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# compose is an interface method
|
|
13
|
+
def compose
|
|
14
|
+
add_gateway_routes # "child template": build before add_gateway_rest_api. RestApi logical id and change detection is dependent on it.
|
|
15
|
+
add_gateway_rest_api # changes parent template
|
|
16
|
+
add_custom_domain # changes parent template
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# template_path is an interface method
|
|
20
|
+
def template_path
|
|
21
|
+
Jets::Naming.api_gateway_template_path
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# do not bother writing a template if routes are empty
|
|
25
|
+
def write
|
|
26
|
+
super unless Jets::Router.routes.empty?
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# If the are routes in config/routes.rb add Gateway API in parent stack
|
|
30
|
+
def add_gateway_rest_api
|
|
31
|
+
rest_api = Jets::Resource::ApiGateway::RestApi.new
|
|
32
|
+
add_resource(rest_api)
|
|
33
|
+
add_outputs(rest_api.outputs)
|
|
34
|
+
|
|
35
|
+
deployment = Jets::Resource::ApiGateway::Deployment.new
|
|
36
|
+
outputs = deployment.outputs(true)
|
|
37
|
+
add_output("RestApiUrl", Value: outputs["RestApiUrl"])
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def add_custom_domain
|
|
41
|
+
return unless Jets.custom_domain?
|
|
42
|
+
add_domain_name
|
|
43
|
+
add_route53_dns if Jets.config.domain.route53
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def add_domain_name
|
|
47
|
+
add_outputs(create_domain_name)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def add_route53_dns
|
|
51
|
+
dns = Jets::Resource::Route53::RecordSet.new
|
|
52
|
+
if !existing_domain_name?(dns.domain_name) or existing_dns_record_on_stack?
|
|
53
|
+
add_resource(dns)
|
|
54
|
+
add_outputs(dns.outputs)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def create_domain_name()
|
|
59
|
+
resource = Jets::Resource::ApiGateway::DomainName.new
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
"DomainName" => resource.domain_name
|
|
63
|
+
} if (existing_domain_name?(resource) and !existing_domain_name_on_stack?)
|
|
64
|
+
|
|
65
|
+
add_resource(resource)
|
|
66
|
+
return resource.outputs
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def existing_domain_name?(resource)
|
|
70
|
+
apigateway.get_domain_name({
|
|
71
|
+
domain_name: resource.domain_name
|
|
72
|
+
})
|
|
73
|
+
return true
|
|
74
|
+
rescue
|
|
75
|
+
return false
|
|
76
|
+
end
|
|
77
|
+
memoize :existing_domain_name?
|
|
78
|
+
|
|
79
|
+
def existing_domain_name_on_stack?
|
|
80
|
+
cfn.describe_stack_resource({
|
|
81
|
+
stack_name: api_gateway_physical_resource_id,
|
|
82
|
+
logical_resource_id: "DomainName"
|
|
83
|
+
})
|
|
84
|
+
return true
|
|
85
|
+
rescue
|
|
86
|
+
return false
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def existing_dns_record_on_stack?
|
|
90
|
+
cfn.describe_stack_resource({
|
|
91
|
+
stack_name: api_gateway_physical_resource_id,
|
|
92
|
+
logical_resource_id: "DnsRecord"
|
|
93
|
+
})
|
|
94
|
+
return true
|
|
95
|
+
rescue
|
|
96
|
+
return false
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def api_gateway_physical_resource_id
|
|
100
|
+
cfn.describe_stack_resource({
|
|
101
|
+
stack_name: Jets::Naming.parent_stack_name,
|
|
102
|
+
logical_resource_id: "ApiGateway"
|
|
103
|
+
})
|
|
104
|
+
.stack_resource_detail
|
|
105
|
+
.physical_resource_id
|
|
106
|
+
rescue
|
|
107
|
+
return nil
|
|
108
|
+
end
|
|
109
|
+
memoize :api_gateway_physical_resource_id
|
|
110
|
+
|
|
111
|
+
# Adds route related Resources and Outputs
|
|
112
|
+
# Delegates to ApiResourcesBuilder
|
|
113
|
+
PAGE_LIMIT = Integer(ENV['JETS_AWS_OUTPUTS_LIMIT'] || 200) # Allow override for testing
|
|
114
|
+
def add_gateway_routes
|
|
115
|
+
# Reject homepage. Otherwise we have 200 - 1 resources on the first page.
|
|
116
|
+
# There's a next call in ApiResources.add_gateway_resources to skip the homepage.
|
|
117
|
+
all_paths = Jets::Router.all_paths.reject { |p| p == '' }
|
|
118
|
+
all_paths.each_slice(PAGE_LIMIT).each_with_index do |paths, i|
|
|
119
|
+
ApiResourcesBuilder.new(@options, paths, i+1).build
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Jets::Cfn::Builders
|
|
2
|
+
class ApiResourcesBuilder
|
|
3
|
+
include Interface
|
|
4
|
+
include Jets::AwsServices
|
|
5
|
+
|
|
6
|
+
def initialize(options={}, paths=[], page)
|
|
7
|
+
@options, @paths, @page = options, paths, page
|
|
8
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# compose is an interface method
|
|
12
|
+
def compose
|
|
13
|
+
add_rest_api_parameter
|
|
14
|
+
add_gateway_routes
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
# template_path is an interface method
|
|
18
|
+
def template_path
|
|
19
|
+
Jets::Naming.api_resources_template_path(@page)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_rest_api_parameter
|
|
23
|
+
add_parameter("RestApi", Description: "RestApi")
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_gateway_routes
|
|
27
|
+
@paths.each do |path|
|
|
28
|
+
homepage = path == ''
|
|
29
|
+
next if homepage # handled by RootResourceId output already
|
|
30
|
+
|
|
31
|
+
resource = Jets::Resource::ApiGateway::Resource.new(path)
|
|
32
|
+
add_resource(resource)
|
|
33
|
+
add_outputs(resource.outputs)
|
|
34
|
+
|
|
35
|
+
parent_path = resource.parent_path_parameter
|
|
36
|
+
add_parameter(parent_path) unless part_of_template?(parent_path)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def part_of_template?(parent_path)
|
|
41
|
+
@template["Resources"].key?(parent_path)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class AuthorizerBuilder < BaseChildBuilder
|
|
8
|
+
include Interface
|
|
9
|
+
include Jets::AwsServices
|
|
10
|
+
|
|
11
|
+
def initialize(path)
|
|
12
|
+
@path = path # IE: app/authorizers/main_authorizer.rb
|
|
13
|
+
@app_class = Jets::Klass.from_path(path)
|
|
14
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def compose
|
|
18
|
+
add_common_parameters
|
|
19
|
+
add_api_gateway_parameters
|
|
20
|
+
add_functions
|
|
21
|
+
add_resources
|
|
22
|
+
add_outputs
|
|
23
|
+
# These dont have lambda functions associated with them
|
|
24
|
+
add_cognito_authorizers
|
|
25
|
+
add_cognito_outputs
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def add_cognito_authorizers
|
|
29
|
+
@app_class.cognito_authorizers.each do |authorizer|
|
|
30
|
+
resource = Jets::Resource.new(authorizer[:definition], authorizer[:replacements])
|
|
31
|
+
add_resource(resource)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def add_outputs
|
|
36
|
+
# IE: @app_class = MainAuthorizer
|
|
37
|
+
# The associated resource is the Jets::Resource::ApiGateway::Authorizer definition built during evaluation
|
|
38
|
+
# of the user defined Authorizer class. We'll use it to compute the logical id.
|
|
39
|
+
@app_class.tasks.each do |task|
|
|
40
|
+
authorizer = task.associated_resources.first
|
|
41
|
+
next unless authorizer
|
|
42
|
+
|
|
43
|
+
resource = Jets::Resource.new(authorizer.definition, task.replacements)
|
|
44
|
+
logical_id = resource.logical_id
|
|
45
|
+
add_output(logical_id, value: "!Ref #{logical_id}")
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def add_cognito_outputs
|
|
50
|
+
@app_class.cognito_authorizers.each do |authorizer|
|
|
51
|
+
resource = Jets::Resource.new(authorizer[:definition], authorizer[:replacements])
|
|
52
|
+
logical_id = resource.logical_id
|
|
53
|
+
add_output(logical_id, value: "!Ref #{logical_id}")
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def add_api_gateway_parameters
|
|
58
|
+
return if Jets::Router.routes.empty?
|
|
59
|
+
|
|
60
|
+
add_parameter("RestApi", Description: "RestApi")
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def template_path
|
|
64
|
+
Jets::Naming.authorizer_template_path(@path)
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# * template_path
|
|
4
|
+
#
|
|
5
|
+
# FYI
|
|
6
|
+
#
|
|
7
|
+
# * compose implemented by the classes that include this
|
|
8
|
+
module Jets::Cfn::Builders
|
|
9
|
+
class BaseChildBuilder
|
|
10
|
+
include Interface
|
|
11
|
+
|
|
12
|
+
# The app_class is can be a controller, job or anonymous function class.
|
|
13
|
+
# IE: PostsController, HardJob
|
|
14
|
+
def initialize(app_class)
|
|
15
|
+
@app_class = app_class
|
|
16
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# template_path is an interface method for Interface module
|
|
20
|
+
def template_path
|
|
21
|
+
Jets::Naming.app_template_path(@app_class)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def add_common_parameters
|
|
25
|
+
common_parameters = Jets::Resource::ChildStack::CommonParameters.common_parameters
|
|
26
|
+
common_parameters.each do |k,_|
|
|
27
|
+
add_parameter(k, Description: k.to_s)
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
depends_on_params.each do |output_key, output_value|
|
|
31
|
+
desc = output_value.gsub("!GetAtt ", "") # desc doesnt allow !GetAtt
|
|
32
|
+
add_parameter(output_key, Description: desc)
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def depends_on_params
|
|
37
|
+
return {} unless @app_class.depends_on
|
|
38
|
+
depends = Jets::Stack::Depends.new(@app_class.depends_on)
|
|
39
|
+
depends.params
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def add_functions
|
|
43
|
+
add_class_iam_policy
|
|
44
|
+
@app_class.tasks.each do |task|
|
|
45
|
+
add_function(task)
|
|
46
|
+
add_function_iam_policy(task)
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def add_function(task)
|
|
51
|
+
resource = Jets::Resource::Lambda::Function.new(task)
|
|
52
|
+
add_resource(resource)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def add_class_iam_policy
|
|
56
|
+
return unless @app_class.build_class_iam?
|
|
57
|
+
|
|
58
|
+
resource = Jets::Resource::Iam::ClassRole.new(@app_class)
|
|
59
|
+
add_resource(resource)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def add_function_iam_policy(task)
|
|
63
|
+
return unless task.build_function_iam?
|
|
64
|
+
|
|
65
|
+
resource = Jets::Resource::Iam::FunctionRole.new(task)
|
|
66
|
+
add_resource(resource)
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class ControllerBuilder < BaseChildBuilder
|
|
8
|
+
# compose is an interface method for Interface module
|
|
9
|
+
def compose
|
|
10
|
+
add_common_parameters
|
|
11
|
+
add_api_gateway_parameters
|
|
12
|
+
add_functions
|
|
13
|
+
add_routes
|
|
14
|
+
add_resources
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def add_api_gateway_parameters
|
|
18
|
+
return if Jets::Router.routes.empty?
|
|
19
|
+
|
|
20
|
+
add_parameter("RestApi", Description: "RestApi")
|
|
21
|
+
scoped_routes.each do |route|
|
|
22
|
+
resource = Jets::Resource::ApiGateway::Resource.new(route.path)
|
|
23
|
+
add_parameter(resource.logical_id, description: resource.desc)
|
|
24
|
+
if route.authorizer
|
|
25
|
+
add_parameter(route.authorizer_id, description: route.authorizer_metadata)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
if @app_class.authorizer
|
|
30
|
+
add_parameter(@app_class.authorizer_id, description: @app_class.authorizer_metadata)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def add_routes
|
|
35
|
+
scoped_routes.each_with_index do |route, i|
|
|
36
|
+
method = Jets::Resource::ApiGateway::Method.new(route)
|
|
37
|
+
add_resource(method)
|
|
38
|
+
add_resource(method.permission)
|
|
39
|
+
add_resource(method.cors) if Jets.config.cors
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# routes scoped to this controller template.
|
|
44
|
+
def scoped_routes
|
|
45
|
+
@routes ||= Jets::Router.routes.select do |route|
|
|
46
|
+
route.controller_name == @app_class.to_s
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Implements:
|
|
2
|
+
#
|
|
3
|
+
# compose
|
|
4
|
+
# template_path
|
|
5
|
+
#
|
|
6
|
+
module Jets::Cfn::Builders
|
|
7
|
+
class FunctionBuilder < BaseChildBuilder
|
|
8
|
+
# compose is an interface method for Interface module
|
|
9
|
+
def compose
|
|
10
|
+
add_common_parameters
|
|
11
|
+
add_functions
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
# The class including this module should implement these methods:
|
|
2
|
+
#
|
|
3
|
+
# * compose
|
|
4
|
+
# * template_path
|
|
5
|
+
module Jets::Cfn::Builders
|
|
6
|
+
module Interface
|
|
7
|
+
extend Memoist
|
|
8
|
+
|
|
9
|
+
def build(parent=false)
|
|
10
|
+
# Do not bother building or writing the template unless there are functions defined
|
|
11
|
+
return if @app_class && !@app_class.build?
|
|
12
|
+
|
|
13
|
+
if @options.nil? || @options[:templates] || @options[:stack_type] != :minimal || parent
|
|
14
|
+
compose # must be implemented by subclass
|
|
15
|
+
end
|
|
16
|
+
write
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def write
|
|
20
|
+
FileUtils.mkdir_p(File.dirname(template_path))
|
|
21
|
+
IO.write(template_path, text)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def template
|
|
25
|
+
# need the to_hash or the YAML dump has
|
|
26
|
+
# !ruby/hash:ActiveSupport::HashWithIndifferentAccess
|
|
27
|
+
@template.to_hash
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def text
|
|
31
|
+
text = YAML.dump(template)
|
|
32
|
+
post_process_template(text)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# post process the text so that
|
|
36
|
+
# "!Ref IamRole" => !Ref IamRole
|
|
37
|
+
# We strip the surrounding quotes
|
|
38
|
+
def post_process_template(text)
|
|
39
|
+
results = text.split("\n").map do |line|
|
|
40
|
+
if line.include?(': "!') # IE: IamRole: "!Ref IamRole",
|
|
41
|
+
# IamRole: "!Ref IamRole" => IamRole: !Ref IamRole
|
|
42
|
+
line.sub(/: "(.*)"/, ': \1')
|
|
43
|
+
elsif line.include?('- "!') # IE: - "!GetAtt Foo.Arn"
|
|
44
|
+
# IamRole: - "!GetAtt Foo.Arn" => - !GetAtt Foo.Arn
|
|
45
|
+
line.sub(/- "(.*)"/, '- \1')
|
|
46
|
+
else
|
|
47
|
+
line
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
results.join("\n") + "\n"
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def add_description(desc)
|
|
54
|
+
@template[:Description] = desc
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def add_parameters(attributes)
|
|
58
|
+
attributes.each do |name,value|
|
|
59
|
+
add_parameter(name.to_s.camelize, Description: value)
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def add_parameter(name, options={})
|
|
64
|
+
defaults = { Type: "String" }
|
|
65
|
+
options = defaults.merge(options)
|
|
66
|
+
@template[:Parameters] ||= {}
|
|
67
|
+
@template[:Parameters][name.to_s.camelize] = Jets::Camelizer.transform(options)
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def add_outputs(attributes)
|
|
71
|
+
attributes.each do |name,value|
|
|
72
|
+
add_output(name.to_s.camelize, Value: value)
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def add_output(name, options={})
|
|
77
|
+
@template[:Outputs] ||= {}
|
|
78
|
+
@template[:Outputs][name.camelize] = Jets::Camelizer.transform(options)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def add_resources
|
|
82
|
+
@app_class.tasks.each do |task|
|
|
83
|
+
task.associated_resources.each do |associated|
|
|
84
|
+
resource = Jets::Resource.new(associated.definition, task.replacements)
|
|
85
|
+
add_resource(resource)
|
|
86
|
+
add_resource(resource.permission)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def add_resource(resource)
|
|
92
|
+
add_template_resource(resource.logical_id, resource.type, resource.attributes)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# The add_resource method can take an options Hash with both with either
|
|
96
|
+
# top level attributes or properties.
|
|
97
|
+
#
|
|
98
|
+
# Example:
|
|
99
|
+
#
|
|
100
|
+
# Top level options:
|
|
101
|
+
#
|
|
102
|
+
# add_template_resource("MyId", "AWS::ApiGateway::RestApi",
|
|
103
|
+
# type: "AWS::ApiGateway::RestApi",
|
|
104
|
+
# properties: {
|
|
105
|
+
# name: "my-api"
|
|
106
|
+
# },
|
|
107
|
+
# depends_on: ["AnotherResource"]
|
|
108
|
+
# )
|
|
109
|
+
#
|
|
110
|
+
# Simple options with properties only:
|
|
111
|
+
#
|
|
112
|
+
# add_template_resource("MyId", "AWS::CloudFormationStack",
|
|
113
|
+
# template_url: "template_url",
|
|
114
|
+
# parameters: {},
|
|
115
|
+
# )
|
|
116
|
+
#
|
|
117
|
+
def add_template_resource(logical_id, type, options)
|
|
118
|
+
options = Jets::Camelizer.transform(options)
|
|
119
|
+
|
|
120
|
+
attributes = if options.include?('Type')
|
|
121
|
+
base = { 'Type' => type }
|
|
122
|
+
base.merge(options) # options are top-level attributes
|
|
123
|
+
else
|
|
124
|
+
{
|
|
125
|
+
'Type' => type,
|
|
126
|
+
'Properties' => options # options are properties
|
|
127
|
+
}
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
@template['Resources'][logical_id] = attributes
|
|
131
|
+
end
|
|
132
|
+
end
|
|
133
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
class Jets::Cfn::Builders::ParentBuilder
|
|
2
|
+
module Stagger
|
|
3
|
+
def add_stagger(resource)
|
|
4
|
+
batch_size = stagger_batch_size # shorter convenience variable
|
|
5
|
+
return if !stagger_enabled || batch_size.nil? || batch_size == 0
|
|
6
|
+
|
|
7
|
+
# initialize all here to keep logic together
|
|
8
|
+
@previous_stacks ||= []
|
|
9
|
+
@added_count ||= 0
|
|
10
|
+
|
|
11
|
+
if @previous_stacks.size >= batch_size
|
|
12
|
+
at_boundary = @added_count % batch_size == 0
|
|
13
|
+
if at_boundary
|
|
14
|
+
@left = @added_count - batch_size
|
|
15
|
+
@right = @left + batch_size - 1
|
|
16
|
+
end
|
|
17
|
+
previous_stack_batch = @previous_stacks[@left..@right]
|
|
18
|
+
resource.add_stagger_depends_on(previous_stack_batch)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
@added_count += 1
|
|
22
|
+
@previous_stacks << resource
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def stagger_batch_size
|
|
26
|
+
Jets.config.deploy.stagger.batch_size
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# for spec-ing
|
|
30
|
+
def stagger_enabled
|
|
31
|
+
Jets.config.deploy.stagger.enabled
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
module Jets::Cfn::Builders
|
|
4
|
+
class ParentBuilder
|
|
5
|
+
include Interface
|
|
6
|
+
include Jets::AwsServices
|
|
7
|
+
include Stagger
|
|
8
|
+
|
|
9
|
+
def initialize(options={})
|
|
10
|
+
@options = options
|
|
11
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# compose is an interface method
|
|
15
|
+
def compose
|
|
16
|
+
build_minimal_resources
|
|
17
|
+
build_child_resources if full?
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
# template_path is an interface method
|
|
21
|
+
def template_path
|
|
22
|
+
Jets::Naming.parent_template_path
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def build_minimal_resources
|
|
26
|
+
add_description("Jets: #{Jets.version} Code: #{Util::Source.version}")
|
|
27
|
+
|
|
28
|
+
# Initial s3 bucket, used to store code zipfile and templates Jets generates
|
|
29
|
+
resource = Jets::Resource::S3::Bucket.new(logical_id: "s3_bucket",
|
|
30
|
+
bucket_encryption: {
|
|
31
|
+
server_side_encryption_configuration: [
|
|
32
|
+
server_side_encryption_by_default: {
|
|
33
|
+
sse_algorithm: "AES256"
|
|
34
|
+
}]}
|
|
35
|
+
)
|
|
36
|
+
add_resource(resource)
|
|
37
|
+
add_outputs(resource.outputs)
|
|
38
|
+
|
|
39
|
+
return unless full?
|
|
40
|
+
# Add application-wide IAM policy from Jets.config.iam_role
|
|
41
|
+
resource = Jets::Resource::Iam::ApplicationRole.new
|
|
42
|
+
add_resource(resource)
|
|
43
|
+
add_outputs(resource.outputs)
|
|
44
|
+
|
|
45
|
+
return if Jets.poly_only?
|
|
46
|
+
resource = Jets::Resource::Lambda::GemLayer.new
|
|
47
|
+
add_resource(resource)
|
|
48
|
+
add_outputs(resource.outputs)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def build_child_resources
|
|
52
|
+
for_each_path(:app) do |path|
|
|
53
|
+
add_app_class_stack(path)
|
|
54
|
+
end
|
|
55
|
+
for_each_path(:shared) do |path|
|
|
56
|
+
add_shared_resources(path)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if full? and !Jets::Router.routes.empty?
|
|
60
|
+
for_each_path(:authorizers) do |path|
|
|
61
|
+
add_authorizer_resources(path)
|
|
62
|
+
end
|
|
63
|
+
add_api_gateway
|
|
64
|
+
add_api_resources
|
|
65
|
+
add_api_deployment
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
# Example paths:
|
|
70
|
+
# #{Jets.build_root}/templates/demo-dev-2-shared-resources.yml
|
|
71
|
+
# #{Jets.build_root}/templates/demo-dev-2-app-comments_controller.yml
|
|
72
|
+
# #{Jets.build_root}/templates/demo-dev-2-authorizers-main_authorizer.yml
|
|
73
|
+
def for_each_path(type)
|
|
74
|
+
expression = "#{Jets::Naming.template_path_prefix}-#{type}-*"
|
|
75
|
+
Dir.glob(expression).each do |path|
|
|
76
|
+
next unless File.file?(path)
|
|
77
|
+
yield(path)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def full?
|
|
82
|
+
@options[:templates] || @options[:stack_type] == :full
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def add_app_class_stack(path)
|
|
86
|
+
resource = Jets::Resource::ChildStack::AppClass.new(@options[:s3_bucket], path: path)
|
|
87
|
+
add_stagger(resource)
|
|
88
|
+
add_child_resources(resource)
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
def add_authorizer_resources(path)
|
|
92
|
+
resource = Jets::Resource::ChildStack::Authorizer.new(@options[:s3_bucket], path: path)
|
|
93
|
+
add_child_resources(resource)
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
def add_shared_resources(path)
|
|
97
|
+
resource = Jets::Resource::ChildStack::Shared.new(@options[:s3_bucket], path: path)
|
|
98
|
+
add_child_resources(resource) if resource.resources?
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
def add_api_gateway
|
|
102
|
+
resource = Jets::Resource::ChildStack::ApiGateway.new(@options[:s3_bucket])
|
|
103
|
+
add_child_resources(resource)
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
def add_api_resources
|
|
107
|
+
expression = "#{Jets::Naming.template_path_prefix}-api-resources-*"
|
|
108
|
+
# IE: path: #{Jets.build_root}/templates/demo-dev-2-api-resources-1.yml"
|
|
109
|
+
Dir.glob(expression).sort.each do |path|
|
|
110
|
+
next unless File.file?(path)
|
|
111
|
+
|
|
112
|
+
regexp = Regexp.new("#{Jets.config.project_namespace}-api-resources-(\\d+).yml") # tricky to escape \d pattern
|
|
113
|
+
md = path.match(regexp)
|
|
114
|
+
page = md[1]
|
|
115
|
+
resource = Jets::Resource::ChildStack::ApiResource.new(@options[:s3_bucket], page: page)
|
|
116
|
+
add_child_resources(resource)
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def add_api_deployment
|
|
121
|
+
resource = Jets::Resource::ChildStack::ApiDeployment.new(@options[:s3_bucket])
|
|
122
|
+
add_child_resources(resource)
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def add_child_resources(resource)
|
|
126
|
+
add_resource(resource)
|
|
127
|
+
add_outputs(resource.outputs)
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
end
|