jets 0.2.0 → 0.5.0
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 +5 -5
- data/.circleci/bin/commit_docs.sh +26 -0
- data/.circleci/config.yml +126 -0
- data/.codebuild/README.md +57 -0
- data/.codebuild/bin/jets +3 -0
- data/.codebuild/buildspec-base.yml +14 -0
- data/.codebuild/integration.sh +54 -0
- data/.codebuild/jets.postman_collection.json +323 -0
- data/.codebuild/scripts/install-docker.sh +12 -0
- data/.codebuild/scripts/install-dynamodb-local.sh +22 -0
- data/.codebuild/scripts/install-java.sh +20 -0
- data/.codebuild/scripts/install-node.sh +4 -0
- data/.gitignore +3 -0
- data/.gitmodules +9 -0
- data/.python-version +1 -0
- data/.rspec +2 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +3 -0
- data/Dockerfile +16 -0
- data/Dockerfile.base +53 -0
- data/Gemfile +8 -1
- data/Gemfile.lock +132 -28
- data/LICENSE.txt +1 -1
- data/Procfile +2 -0
- data/README.md +116 -17
- data/Rakefile +6 -0
- data/buildspec.yml +18 -0
- data/exe/jets +14 -0
- data/jets.gemspec +31 -3
- data/lib/jets.rb +56 -8
- data/lib/jets/application.rb +121 -0
- data/lib/jets/application/middleware.rb +23 -0
- data/lib/jets/aws_services.rb +71 -0
- data/lib/jets/booter.rb +95 -0
- data/lib/jets/builders.rb +6 -0
- data/lib/jets/builders/code_builder.rb +431 -0
- data/lib/jets/builders/deducer.rb +73 -0
- data/lib/jets/builders/gem_replacer.rb +154 -0
- data/lib/jets/builders/handler_generator.rb +76 -0
- data/lib/jets/builders/node-hello.js +73 -0
- data/lib/jets/builders/node-shim.js +151 -0
- data/lib/jets/cfn.rb +5 -4
- data/lib/jets/cfn/ship.rb +178 -0
- data/lib/jets/cfn/status.rb +208 -0
- data/lib/jets/cfn/template_builders.rb +21 -0
- data/lib/jets/cfn/template_builders/api_gateway_builder.rb +73 -0
- data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +38 -0
- data/lib/jets/cfn/template_builders/base_child_builder.rb +38 -0
- data/lib/jets/cfn/template_builders/controller_builder.rb +107 -0
- data/lib/jets/cfn/template_builders/function_builder.rb +20 -0
- data/lib/jets/cfn/template_builders/function_properties.rb +6 -0
- data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +106 -0
- data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +12 -0
- data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +12 -0
- data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +13 -0
- data/lib/jets/cfn/template_builders/interface.rb +91 -0
- data/lib/jets/cfn/template_builders/job_builder.rb +63 -0
- data/lib/jets/cfn/template_builders/parent_builder.rb +97 -0
- data/lib/jets/cfn/template_builders/rule_builder.rb +55 -0
- data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +45 -0
- data/lib/jets/cfn/template_mappers.rb +23 -0
- data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +48 -0
- data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/child_mapper.rb +41 -0
- data/lib/jets/cfn/template_mappers/config_rule_mapper.rb +34 -0
- data/lib/jets/cfn/template_mappers/controller_mapper.rb +36 -0
- data/lib/jets/cfn/template_mappers/events_rule_mapper.rb +40 -0
- data/lib/jets/cfn/template_mappers/function_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/gateway_method_mapper.rb +56 -0
- data/lib/jets/cfn/template_mappers/gateway_resource_mapper.rb +62 -0
- data/lib/jets/cfn/template_mappers/job_mapper.rb +4 -0
- data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +50 -0
- data/lib/jets/cfn/template_mappers/rule_mapper.rb +5 -0
- data/lib/jets/cli.rb +180 -15
- data/lib/jets/commands.rb +22 -0
- data/lib/jets/commands/base.rb +151 -0
- data/lib/jets/commands/build.rb +186 -0
- data/lib/jets/commands/call.rb +175 -0
- data/lib/jets/commands/call/anonymous_guesser.rb +96 -0
- data/lib/jets/commands/call/autoload_guesser.rb +112 -0
- data/lib/jets/commands/call/base_guesser.rb +33 -0
- data/lib/jets/commands/call/guesser.rb +51 -0
- data/lib/jets/commands/console.rb +12 -0
- data/lib/jets/commands/db.rb +15 -0
- data/lib/jets/commands/db/environment-task.rake +3 -0
- data/lib/jets/commands/db/tasks.rb +30 -0
- data/lib/jets/commands/dbconsole.rb +131 -0
- data/lib/jets/commands/delete.rb +119 -0
- data/lib/jets/commands/deploy.rb +53 -0
- data/lib/jets/commands/dynamodb.rb +22 -0
- data/lib/jets/commands/dynamodb/migrate.rb +9 -0
- data/lib/jets/commands/dynamodb/migrator.rb +36 -0
- data/lib/jets/commands/help.rb +9 -0
- data/lib/jets/commands/help/build.md +1 -0
- data/lib/jets/commands/help/call.md +55 -0
- data/lib/jets/commands/help/console.md +4 -0
- data/lib/jets/commands/help/db/generate.md +8 -0
- data/lib/jets/commands/help/dbconsole.md +5 -0
- data/lib/jets/commands/help/delete.md +9 -0
- data/lib/jets/commands/help/deploy.md +5 -0
- data/lib/jets/commands/help/dynamodb/generate.md +50 -0
- data/lib/jets/commands/help/dynamodb/migrate.md +4 -0
- data/lib/jets/commands/help/generate.md +5 -0
- data/lib/jets/commands/help/new.md +9 -0
- data/lib/jets/commands/help/process/controller.md +6 -0
- data/lib/jets/commands/help/process/function.md +5 -0
- data/lib/jets/commands/help/process/job.md +5 -0
- data/lib/jets/commands/help/process/rule.md +5 -0
- data/lib/jets/commands/help/routes.md +3 -0
- data/lib/jets/commands/help/server.md +6 -0
- data/lib/jets/commands/help/status.md +1 -0
- data/lib/jets/commands/help/url.md +5 -0
- data/lib/jets/commands/main.rb +111 -0
- data/lib/jets/commands/markdown.rb +8 -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 +110 -0
- data/lib/jets/commands/rake_command.rb +61 -0
- data/lib/jets/commands/rake_tasks.rb +45 -0
- data/lib/jets/commands/sequence.rb +44 -0
- data/lib/jets/commands/stack_info.rb +30 -0
- data/lib/jets/commands/templates/skeleton/.env +2 -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/.gitignore +14 -0
- data/lib/jets/commands/templates/skeleton/.jetskeep +1 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +27 -0
- data/lib/jets/commands/templates/skeleton/Procfile +7 -0
- data/lib/jets/commands/templates/skeleton/README.md +4 -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 +2 -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 +24 -0
- data/lib/jets/commands/templates/skeleton/bin/ruby_server +18 -0
- data/lib/jets/commands/templates/skeleton/bin/ruby_server.rb +2 -0
- data/lib/jets/commands/templates/skeleton/config.ru +4 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +26 -0
- data/lib/jets/commands/templates/skeleton/config/database.yml.tt +27 -0
- data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +25 -0
- data/lib/jets/commands/templates/skeleton/config/routes.rb +8 -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 +79 -0
- data/lib/jets/commands/templates/skeleton/spec/controllers/posts_controller_spec.rb +18 -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 +27 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +14 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +24 -0
- data/lib/jets/commands/templates/webpacker/app/javascript/src/jets/crud.js +87 -0
- data/lib/jets/commands/url.rb +45 -0
- data/lib/jets/commands/webpacker_template.rb +19 -0
- data/lib/jets/controller.rb +9 -0
- data/lib/jets/controller/base.rb +50 -0
- data/lib/jets/controller/callbacks.rb +43 -0
- data/lib/jets/controller/layout.rb +17 -0
- data/lib/jets/controller/params.rb +53 -0
- data/lib/jets/controller/redirection.rb +55 -0
- data/lib/jets/controller/renderers.rb +5 -0
- data/lib/jets/controller/renderers/aws_proxy_renderer.rb +69 -0
- data/lib/jets/controller/renderers/base_renderer.rb +16 -0
- data/lib/jets/controller/renderers/template_renderer.rb +107 -0
- data/lib/jets/controller/rendering.rb +80 -0
- data/lib/jets/controller/request.rb +55 -0
- data/lib/jets/core.rb +81 -0
- data/lib/jets/default/application.rb +20 -0
- data/lib/jets/dotenv.rb +37 -0
- data/lib/jets/erb.rb +51 -0
- data/lib/jets/generator.rb +40 -0
- data/lib/jets/generator/templates/erb/controller/view.html.erb +2 -0
- data/lib/jets/generator/templates/erb/scaffold/_form.html.erb +39 -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 +71 -0
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +30 -0
- data/lib/jets/internal/app/controllers/jets/public_controller/python/show.py +47 -0
- data/lib/jets/internal/app/controllers/jets/public_controller/python/show.pyc +0 -0
- data/lib/jets/internal/app/controllers/jets/welcome_controller.rb +22 -0
- data/lib/jets/internal/app/controllers/jets/welcome_controller/python/index.py +24 -0
- data/lib/jets/internal/app/jobs/jets/preheat_job.rb +52 -0
- data/lib/jets/job.rb +5 -0
- data/lib/jets/job/base.rb +29 -0
- data/lib/jets/job/dsl.rb +58 -0
- data/lib/jets/job/task.rb +17 -0
- data/lib/jets/klass.rb +71 -0
- data/lib/jets/lambda.rb +18 -0
- data/lib/jets/lambda/dsl.rb +153 -0
- data/lib/jets/lambda/function.rb +29 -0
- data/lib/jets/lambda/function_constructor.rb +60 -0
- data/lib/jets/lambda/functions.rb +22 -0
- data/lib/jets/lambda/task.rb +77 -0
- data/lib/jets/naming.rb +61 -0
- data/lib/jets/pascalize.rb +30 -0
- data/lib/jets/poly_fun.rb +61 -0
- data/lib/jets/poly_fun/base_executor.rb +129 -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/preheat.rb +72 -0
- data/lib/jets/processors.rb +4 -0
- data/lib/jets/processors/deducer.rb +54 -0
- data/lib/jets/processors/main_processor.rb +57 -0
- data/lib/jets/rails_overrides.rb +4 -0
- data/lib/jets/rails_overrides/asset_tag_helper.rb +41 -0
- data/lib/jets/rails_overrides/common_methods.rb +13 -0
- data/lib/jets/rails_overrides/rendering_helper.rb +26 -0
- data/lib/jets/rails_overrides/url_helper.rb +26 -0
- data/lib/jets/route.rb +145 -0
- data/lib/jets/router.rb +115 -0
- data/lib/jets/ruby_server.rb +91 -0
- data/lib/jets/rule.rb +5 -0
- data/lib/jets/rule/base.rb +19 -0
- data/lib/jets/rule/dsl.rb +64 -0
- data/lib/jets/rule/task.rb +44 -0
- data/lib/jets/server.rb +16 -0
- data/lib/jets/server/api_gateway.rb +39 -0
- data/lib/jets/server/lambda_aws_proxy.rb +122 -0
- data/lib/jets/server/route_matcher.rb +96 -0
- data/lib/jets/server/timing_middleware.rb +16 -0
- data/lib/jets/server/webpacker_setup.rb +7 -0
- data/lib/jets/timing.rb +65 -0
- data/lib/jets/timing/report.rb +82 -0
- data/lib/jets/util.rb +7 -12
- data/lib/jets/version.rb +1 -1
- data/support/clean +3 -0
- data/support/console +3 -0
- metadata +473 -76
- data/bin/jets +0 -14
- data/lib/jets/base_controller.rb +0 -54
- data/lib/jets/build.rb +0 -46
- data/lib/jets/build/handler_generator.rb +0 -46
- data/lib/jets/build/lambda_deducer.rb +0 -23
- data/lib/jets/build/templates/handler.js +0 -149
- data/lib/jets/build/traveling_ruby.rb +0 -133
- data/lib/jets/cfn/base.rb +0 -17
- data/lib/jets/cfn/builder.rb +0 -53
- data/lib/jets/cfn/namer.rb +0 -30
- data/lib/jets/cli/help.rb +0 -19
- data/lib/jets/command.rb +0 -25
- data/lib/jets/process.rb +0 -18
- data/lib/jets/process/base_processor.rb +0 -23
- data/lib/jets/process/controller_processor.rb +0 -36
- data/lib/jets/process/help.rb +0 -11
- data/lib/jets/process/processor_deducer.rb +0 -51
- data/lib/jets/project.rb +0 -23
- data/notes/design.md +0 -107
- data/notes/faq.md +0 -3
- data/notes/lambda_ruby_info.md +0 -34
- data/notes/traveling-ruby-packaging-jets.md +0 -26
- data/notes/traveling-ruby-packaging.md +0 -103
- data/notes/traveling-ruby-structure.md +0 -6
- data/notes/traveling-ruby.md +0 -82
- data/spec/fixtures/classes.rb +0 -5
- data/spec/fixtures/project/.gitignore +0 -3
- data/spec/fixtures/project/.ruby-version +0 -1
- data/spec/fixtures/project/Gemfile +0 -4
- data/spec/fixtures/project/Gemfile.lock +0 -23
- data/spec/fixtures/project/app/controllers/application_controller.rb +0 -2
- data/spec/fixtures/project/app/controllers/posts_controller.rb +0 -12
- data/spec/fixtures/project/bin/jets +0 -22
- data/spec/fixtures/project/config/routes.rb +0 -6
- data/spec/fixtures/project/handlers/controllers/posts.js +0 -212
- data/spec/lib/cli_spec.rb +0 -20
- data/spec/lib/jets/base_controller_spec.rb +0 -18
- data/spec/lib/jets/build/handler_generator_spec.rb +0 -20
- data/spec/lib/jets/build/lambda_deducer_spec.rb +0 -15
- data/spec/lib/jets/build_spec.rb +0 -34
- data/spec/lib/jets/cfn/builder_spec.rb +0 -18
- data/spec/lib/jets/cfn/namer_spec.rb +0 -16
- data/spec/lib/jets/process/controller_processor_spec.rb +0 -22
- data/spec/lib/jets/process/infer_spec.rb +0 -24
- data/spec/lib/jets/process_spec.rb +0 -18
- data/spec/lib/jets/project_spec.rb +0 -14
- data/spec/spec_helper.rb +0 -28
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
class Jets::Cfn::TemplateBuilders
|
|
2
|
+
class JobBuilder < BaseChildBuilder
|
|
3
|
+
def compose
|
|
4
|
+
add_common_parameters
|
|
5
|
+
add_functions
|
|
6
|
+
add_scheduled_tasks
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def add_scheduled_tasks
|
|
10
|
+
# @app_klass is PostsController, HardJob, Hello, or HelloFunction
|
|
11
|
+
@app_klass.tasks.each do |task|
|
|
12
|
+
map = Jets::Cfn::TemplateMappers::EventsRuleMapper.new(task)
|
|
13
|
+
|
|
14
|
+
# If there's no scheduled expression dont add a scheduled Events::Rule
|
|
15
|
+
if task.schedule_expression
|
|
16
|
+
add_event_rule(task, map)
|
|
17
|
+
add_permission(map)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def add_event_rule(task, map)
|
|
23
|
+
add_resource(map.logical_id, "AWS::Events::Rule",
|
|
24
|
+
ScheduleExpression: task.schedule_expression,
|
|
25
|
+
State: task.state,
|
|
26
|
+
Targets: [
|
|
27
|
+
{
|
|
28
|
+
Arn: "!GetAtt #{map.lambda_function_logical_id}.Arn",
|
|
29
|
+
Id: map.rule_target_id
|
|
30
|
+
}
|
|
31
|
+
]
|
|
32
|
+
)
|
|
33
|
+
# Example:
|
|
34
|
+
# add_resource("HardJobDigScheduledEvent", "AWS::Events::Rule",
|
|
35
|
+
# ScheduleExpression: "rate(1 minute)",
|
|
36
|
+
# State: "ENABLED",
|
|
37
|
+
# Targets: [
|
|
38
|
+
# {
|
|
39
|
+
# Arn: "!GetAtt HardJobDigLambdaFunction.Arn",
|
|
40
|
+
# Id: "RuleTargetHardJobDig"
|
|
41
|
+
# }
|
|
42
|
+
# ]
|
|
43
|
+
# )
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def add_permission(map)
|
|
47
|
+
add_resource(map.permission_logical_id, "AWS::Lambda::Permission",
|
|
48
|
+
FunctionName: "!GetAtt #{map.lambda_function_logical_id}.Arn",
|
|
49
|
+
Action: "lambda:InvokeFunction",
|
|
50
|
+
Principal: "events.amazonaws.com",
|
|
51
|
+
SourceArn: "!GetAtt #{map.logical_id}.Arn"
|
|
52
|
+
)
|
|
53
|
+
# Example:
|
|
54
|
+
# add_resource("HardJobDigEventsRulePermission", "AWS::Lambda::Permission",
|
|
55
|
+
# FunctionName: "!GetAtt HardJobDigLambdaFunction.Arn",
|
|
56
|
+
# Action: "lambda:InvokeFunction",
|
|
57
|
+
# Principal: "events.amazonaws.com",
|
|
58
|
+
# SourceArn: "!GetAtt HardJobDigScheduledEvent.Arn"
|
|
59
|
+
# )
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
require 'erb'
|
|
2
|
+
|
|
3
|
+
class Jets::Cfn::TemplateBuilders
|
|
4
|
+
class ParentBuilder
|
|
5
|
+
include Interface
|
|
6
|
+
include Jets::AwsServices
|
|
7
|
+
|
|
8
|
+
def initialize(options={})
|
|
9
|
+
@options = options
|
|
10
|
+
@template = ActiveSupport::HashWithIndifferentAccess.new(Resources: {})
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# compose is an interface method
|
|
14
|
+
def compose
|
|
15
|
+
puts "Building parent template."
|
|
16
|
+
|
|
17
|
+
add_minimal_resources
|
|
18
|
+
add_child_resources unless @options[:stack_type] == :minimal
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# template_path is an interface method
|
|
22
|
+
def template_path
|
|
23
|
+
Jets::Naming.parent_template_path
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def add_minimal_resources
|
|
27
|
+
# variables for minimal-stack.yml
|
|
28
|
+
path = File.expand_path("../templates/minimal-stack.yml", __FILE__)
|
|
29
|
+
variables = {
|
|
30
|
+
policy_name: "lambda-#{Jets.config.project_namespace}-policy",
|
|
31
|
+
role_name: "lambda-#{Jets.config.project_namespace}-role",
|
|
32
|
+
}
|
|
33
|
+
rendered_result = Jets::Erb.result(path, variables)
|
|
34
|
+
minimal_template = YAML.load(rendered_result)
|
|
35
|
+
|
|
36
|
+
# minimal_template = YAML.load(IO.read(path))
|
|
37
|
+
@template.deep_merge!(minimal_template)
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def add_child_resources
|
|
41
|
+
expression = "#{Jets::Naming.template_path_prefix}-*"
|
|
42
|
+
# IE: path: #{Jets.build_root}/templates/demo-dev-2-comments_controller.yml
|
|
43
|
+
Dir.glob(expression).each do |path|
|
|
44
|
+
next unless File.file?(path)
|
|
45
|
+
next if path =~ /api-gateway/ # treated specially
|
|
46
|
+
|
|
47
|
+
# Example of produced code:
|
|
48
|
+
#
|
|
49
|
+
# map = Jets::Cfn::TemplateMappers::ControllerMapper.new(path, s3_bucket)
|
|
50
|
+
# map = Jets::Cfn::TemplateMappers::JobMapper.new(path, s3_bucket)
|
|
51
|
+
# map = Jets::Cfn::TemplateMappers::FunctionMapper.new(path, s3_bucket)
|
|
52
|
+
#
|
|
53
|
+
mapper_class_name = File.basename(path, '.yml').split('_').last
|
|
54
|
+
mapper_class_name = mapper_class_name.classify
|
|
55
|
+
mapper_class = "Jets::Cfn::TemplateMappers::#{mapper_class_name}Mapper".constantize # ControllerMapper or JobMapper
|
|
56
|
+
map = mapper_class.new(path, @options[:s3_bucket])
|
|
57
|
+
|
|
58
|
+
# map.logical_id example: PostsController, HardJob, Hello, HelloFunction
|
|
59
|
+
add_resource(map.logical_id, "AWS::CloudFormation::Stack",
|
|
60
|
+
TemplateURL: map.template_url,
|
|
61
|
+
Parameters: map.parameters,
|
|
62
|
+
)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
if @options[:stack_type] == :full and !Jets::Router.routes.empty?
|
|
66
|
+
add_api_gateway
|
|
67
|
+
add_api_gateway_deployment
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
# Each shared stacks has different logic.
|
|
72
|
+
# Handle in ugly case statement until we see the common patterns between them.
|
|
73
|
+
# TODO: clean up the add_shared_stack logical after we figure out the common interface pattern
|
|
74
|
+
def add_api_gateway
|
|
75
|
+
path = "#{Jets.config.project_namespace}-api-gateway.yml"
|
|
76
|
+
map = Jets::Cfn::TemplateMappers::ApiGatewayMapper.new(path, @options[:s3_bucket])
|
|
77
|
+
|
|
78
|
+
add_resource(map.logical_id, "AWS::CloudFormation::Stack",
|
|
79
|
+
Properties: { TemplateURL: map.template_url }
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
add_output(map.logical_id, Value: "!Ref #{map.logical_id}")
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def add_api_gateway_deployment
|
|
86
|
+
path = "#{Jets.config.project_namespace}-api-gateway-deployment.yml"
|
|
87
|
+
map = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.new(path, @options[:s3_bucket])
|
|
88
|
+
add_resource(map.logical_id, "AWS::CloudFormation::Stack",
|
|
89
|
+
Properties: {
|
|
90
|
+
TemplateURL: map.template_url,
|
|
91
|
+
Parameters: map.parameters
|
|
92
|
+
},
|
|
93
|
+
DependsOn: map.depends_on
|
|
94
|
+
)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
end
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
class Jets::Cfn::TemplateBuilders
|
|
2
|
+
class RuleBuilder < BaseChildBuilder
|
|
3
|
+
def compose
|
|
4
|
+
add_common_parameters
|
|
5
|
+
add_functions
|
|
6
|
+
add_config_rules
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def add_config_rules
|
|
10
|
+
# @app_klass is PostsController, HardRule, Hello, or HelloFunction, or GameRule
|
|
11
|
+
@app_klass.tasks.each do |task|
|
|
12
|
+
map = Jets::Cfn::TemplateMappers::ConfigRuleMapper.new(task)
|
|
13
|
+
|
|
14
|
+
add_config_rule(task, map)
|
|
15
|
+
add_permission(map)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def add_config_rule(task, map)
|
|
21
|
+
# Usually we build the properties with the mappers but in the case for
|
|
22
|
+
# a config_rule it makes more sense to grab properties from the task
|
|
23
|
+
# using config_rule_properties
|
|
24
|
+
add_resource(map.logical_id, "AWS::Config::ConfigRule",
|
|
25
|
+
Properties: task.config_rule_properties,
|
|
26
|
+
DependsOn: map.permission_logical_id
|
|
27
|
+
)
|
|
28
|
+
# Example:
|
|
29
|
+
# add_resource("GameRuleProtectConfigRule", "AWS::Config::ConfigRule",
|
|
30
|
+
# "ConfigRuleName" : String,
|
|
31
|
+
# "Description" : String,
|
|
32
|
+
# "InputParameters" : { ParameterName : Value },
|
|
33
|
+
# "MaximumExecutionFrequency" : String,
|
|
34
|
+
# "Scope" : Scope,
|
|
35
|
+
# "Source" : Source
|
|
36
|
+
# )
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def add_permission(map)
|
|
40
|
+
add_resource(map.permission_logical_id, "AWS::Lambda::Permission",
|
|
41
|
+
FunctionName: "!GetAtt #{map.lambda_function_logical_id}.Arn",
|
|
42
|
+
Action: "lambda:InvokeFunction",
|
|
43
|
+
Principal: "config.amazonaws.com"
|
|
44
|
+
)
|
|
45
|
+
# Example:
|
|
46
|
+
# add_resource("GameRuleProtectConfigRulePermission", "AWS::Lambda::Permission",
|
|
47
|
+
# FunctionName: "!GetAtt GameRuleProtectLambdaFunction.Arn",
|
|
48
|
+
# Action: "lambda:InvokeFunction",
|
|
49
|
+
# Principal: "config.amazonaws.com",
|
|
50
|
+
# SourceArn: "!GetAtt ScheduledEventHardRuleDig.Arn"
|
|
51
|
+
# )
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
---
|
|
2
|
+
Resources:
|
|
3
|
+
S3Bucket:
|
|
4
|
+
Type: AWS::S3::Bucket
|
|
5
|
+
IamRole:
|
|
6
|
+
Type: AWS::IAM::Role
|
|
7
|
+
Properties:
|
|
8
|
+
AssumeRolePolicyDocument:
|
|
9
|
+
Version: '2012-10-17'
|
|
10
|
+
Statement:
|
|
11
|
+
- Effect: Allow
|
|
12
|
+
Principal:
|
|
13
|
+
Service:
|
|
14
|
+
- lambda.amazonaws.com
|
|
15
|
+
Action:
|
|
16
|
+
- sts:AssumeRole
|
|
17
|
+
Policies:
|
|
18
|
+
- PolicyName: <%= @policy_name %>
|
|
19
|
+
PolicyDocument:
|
|
20
|
+
Version: '2012-10-17'
|
|
21
|
+
Statement:
|
|
22
|
+
- Effect: Allow
|
|
23
|
+
Action:
|
|
24
|
+
- logs:*
|
|
25
|
+
Resource: '*'
|
|
26
|
+
# TODO: Make IAM permissions more fine grain for mimimal stack
|
|
27
|
+
# - Fn::Sub: arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/quiz-dev-hello:*:*
|
|
28
|
+
# - Fn::Sub: arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/quiz-dev-quiz:*:*
|
|
29
|
+
# TODO: Allow hook so user can configure IAM themselves and support managed polices
|
|
30
|
+
- Effect: Allow
|
|
31
|
+
Action:
|
|
32
|
+
- dynamodb:*
|
|
33
|
+
Resource: "*"
|
|
34
|
+
# required for PreheatJob which calls the other lambda functions repeatedly
|
|
35
|
+
- Effect: Allow
|
|
36
|
+
Action:
|
|
37
|
+
- lambda:*
|
|
38
|
+
Resource: "*"
|
|
39
|
+
Path: "/"
|
|
40
|
+
RoleName: <%= @role_name %>
|
|
41
|
+
Outputs:
|
|
42
|
+
S3Bucket:
|
|
43
|
+
Value: "!Ref S3Bucket" # not a valid cfn notation, surrounding double quotes is handled by post processing.
|
|
44
|
+
IamRole:
|
|
45
|
+
Value: "!Ref IamRole"
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require 'active_support/core_ext/hash'
|
|
2
|
+
require 'yaml'
|
|
3
|
+
|
|
4
|
+
class Jets::Cfn
|
|
5
|
+
class TemplateMappers
|
|
6
|
+
# used in the parent_template.rb
|
|
7
|
+
autoload :ChildMapper, "jets/cfn/template_mappers/child_mapper"
|
|
8
|
+
autoload :ControllerMapper, "jets/cfn/template_mappers/controller_mapper"
|
|
9
|
+
autoload :JobMapper, "jets/cfn/template_mappers/job_mapper"
|
|
10
|
+
autoload :FunctionMapper, "jets/cfn/template_mappers/function_mapper"
|
|
11
|
+
autoload :RuleMapper, "jets/cfn/template_mappers/rule_mapper"
|
|
12
|
+
|
|
13
|
+
autoload :ApiGatewayMapper, "jets/cfn/template_mappers/api_gateway_mapper"
|
|
14
|
+
autoload :ApiGatewayDeploymentMapper, "jets/cfn/template_mappers/api_gateway_deployment_mapper"
|
|
15
|
+
# used in the child_template.rb
|
|
16
|
+
autoload :GatewayMethodMapper, "jets/cfn/template_mappers/gateway_method_mapper"
|
|
17
|
+
autoload :GatewayResourceMapper, "jets/cfn/template_mappers/gateway_resource_mapper"
|
|
18
|
+
autoload :LambdaFunctionMapper, "jets/cfn/template_mappers/lambda_function_mapper"
|
|
19
|
+
|
|
20
|
+
autoload :EventsRuleMapper, "jets/cfn/template_mappers/events_rule_mapper"
|
|
21
|
+
autoload :ConfigRuleMapper, "jets/cfn/template_mappers/config_rule_mapper"
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
class Jets::Cfn::TemplateMappers
|
|
2
|
+
class ApiGatewayDeploymentMapper < ChildMapper
|
|
3
|
+
def logical_id
|
|
4
|
+
self.class.logical_id
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def timestamp
|
|
8
|
+
self.class.timestamp
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
# stage_name: stag, stag-1, stag-2, etc
|
|
12
|
+
def stage_name
|
|
13
|
+
self.class.stage_name
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def parameters
|
|
17
|
+
{
|
|
18
|
+
RestApi: "!GetAtt ApiGateway.Outputs.RestApi"
|
|
19
|
+
}
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def depends_on
|
|
23
|
+
expression = "#{Jets::Naming.template_path_prefix}-*_controller*"
|
|
24
|
+
controller_logical_ids = []
|
|
25
|
+
Dir.glob(expression).each do |path|
|
|
26
|
+
next unless File.file?(path)
|
|
27
|
+
# @s3_bucket is available from the inherited ChildMapper class
|
|
28
|
+
map = ChildMapper.new(path, @s3_bucket)
|
|
29
|
+
controller_logical_ids << map.logical_id
|
|
30
|
+
end
|
|
31
|
+
controller_logical_ids
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Returns: "ApiGatewayDeployment[timestamp]"
|
|
35
|
+
def self.logical_id
|
|
36
|
+
"ApiGatewayDeployment#{timestamp}"
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
@@timestamp = nil
|
|
40
|
+
def self.timestamp
|
|
41
|
+
@@timestamp ||= Time.now.strftime("%Y%m%d%H%M%S")
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.stage_name
|
|
45
|
+
[Jets.config.short_env, Jets.config.env_extra].compact.join('_').gsub('-','_') # Stage name only allows a-zA-Z0-9_
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Jets::Cfn::TemplateMappers
|
|
2
|
+
class ChildMapper
|
|
3
|
+
attr_reader :path
|
|
4
|
+
def initialize(path, s3_bucket)
|
|
5
|
+
# "#{Jets.build_root}/templates/demo-dev-posts_controller.yml"
|
|
6
|
+
@path = path
|
|
7
|
+
@s3_bucket = s3_bucket
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
# common parameters to all child stacks
|
|
11
|
+
def parameters
|
|
12
|
+
parameters = {
|
|
13
|
+
# YAML.dump converts it to a string
|
|
14
|
+
# !GetAtt Base.Outputs.IamRole => "!GetAtt Base.Outputs.IamRole"
|
|
15
|
+
# But post processing of the template fixes this
|
|
16
|
+
IamRole: "!GetAtt IamRole.Arn",
|
|
17
|
+
S3Bucket: "!Ref S3Bucket",
|
|
18
|
+
}
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Example: PostsController
|
|
22
|
+
def logical_id
|
|
23
|
+
regexp = Regexp.new(".*#{Jets.config.project_namespace}-")
|
|
24
|
+
contoller_name = @path.sub(regexp, '').sub('.yml', '')
|
|
25
|
+
# map the path to a camelized logical_id. Example:
|
|
26
|
+
# /tmp/jets/demo/templates/demo-dev-2-posts_controller.yml to
|
|
27
|
+
# PostsController
|
|
28
|
+
contoller_name.underscore.camelize
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def template_url
|
|
32
|
+
# here's where it gets interesting with the bucket. The bucket will
|
|
33
|
+
# need to exist for the child templates. But wont be created until the stack
|
|
34
|
+
# has been first launched. We can create the bucket in a separate stack
|
|
35
|
+
# And then grab it and then store it in a cache file.
|
|
36
|
+
basename = File.basename(@path)
|
|
37
|
+
# IE: https://s3.amazonaws.com/[bucket]/jets/cfn-templates/demo-dev-posts_controller.yml"
|
|
38
|
+
"https://s3.amazonaws.com/#{@s3_bucket}/jets/cfn-templates/#{basename}"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# Used in cfn/template_builders/rule_builder.rb to build AWS::Config::ConfigRule
|
|
2
|
+
class Jets::Cfn::TemplateMappers
|
|
3
|
+
class ConfigRuleMapper
|
|
4
|
+
# task is a Jets::Job::Task
|
|
5
|
+
def initialize(task)
|
|
6
|
+
@task = task
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Example: "ConfigRuleGameRuleProtect"
|
|
10
|
+
def logical_id
|
|
11
|
+
"#{full_task_name}ConfigRule"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
# Example: "GameRuleProtectLambdaFunction"
|
|
15
|
+
def lambda_function_logical_id
|
|
16
|
+
"#{full_task_name}LambdaFunction"
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Example: GameRuleProtectConfigRulePermission
|
|
20
|
+
def permission_logical_id
|
|
21
|
+
"#{full_task_name}ConfigRulePermission"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
# Full camelized task name including the class
|
|
26
|
+
# Example: GameRuleProtect
|
|
27
|
+
def full_task_name
|
|
28
|
+
class_name = @task.class_name
|
|
29
|
+
task_name = @task.meth.to_s.camelize
|
|
30
|
+
"#{class_name}#{task_name}"
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
class Jets::Cfn::TemplateMappers
|
|
2
|
+
class ControllerMapper < ChildMapper
|
|
3
|
+
# Parameters that are common to all controller stacks
|
|
4
|
+
def parameters
|
|
5
|
+
parameters = super
|
|
6
|
+
return parameters if Jets::Router.routes.empty?
|
|
7
|
+
|
|
8
|
+
# Add the API Gateway parameters
|
|
9
|
+
parameters[:RestApi] = "!GetAtt ApiGateway.Outputs.RestApi"
|
|
10
|
+
scoped_routes.each do |route|
|
|
11
|
+
map = GatewayResourceMapper.new(route.path)
|
|
12
|
+
parameters[map.logical_id] = "!GetAtt ApiGateway.Outputs.#{map.logical_id}"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
parameters
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def scoped_routes
|
|
19
|
+
@routes ||= Jets::Router.routes.select do |route|
|
|
20
|
+
route.controller_name == current_class
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Example:
|
|
25
|
+
# 1. demo-stag-admin-related_pages_controller.yml
|
|
26
|
+
# 2. admin/posts_controller
|
|
27
|
+
# 3. Admin::PostsController
|
|
28
|
+
def current_class
|
|
29
|
+
templates_prefix = "#{Jets::Naming.template_path_prefix}-"
|
|
30
|
+
@path.sub(templates_prefix, '')
|
|
31
|
+
.sub(/\.yml$/,'')
|
|
32
|
+
.gsub('-','/')
|
|
33
|
+
.classify
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|