jets 0.8.0 → 0.8.1
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/Gemfile.lock +3 -1
- data/jets.gemspec +2 -0
- data/lib/jets/application.rb +1 -1
- data/lib/jets/cfn.rb +1 -2
- data/lib/jets/cfn/builders.rb +19 -0
- data/lib/jets/cfn/builders/api_deployment_builder.rb +32 -0
- data/lib/jets/cfn/{template_builders → builders}/api_gateway_builder.rb +10 -21
- data/lib/jets/cfn/builders/base_child_builder.rb +49 -0
- data/lib/jets/cfn/{template_builders → builders}/controller_builder.rb +7 -7
- data/lib/jets/cfn/{template_builders → builders}/function_builder.rb +1 -2
- data/lib/jets/cfn/builders/interface.rb +128 -0
- data/lib/jets/cfn/{template_builders → builders}/job_builder.rb +2 -2
- data/lib/jets/cfn/builders/parent_builder.rb +84 -0
- data/lib/jets/cfn/{template_builders → builders}/rule_builder.rb +4 -5
- data/lib/jets/commands/base.rb +1 -1
- data/lib/jets/commands/build.rb +11 -15
- data/lib/jets/commands/delete.rb +12 -0
- data/lib/jets/commands/templates/skeleton/Gemfile.tt +1 -0
- data/lib/jets/commands/templates/skeleton/config/application.rb.tt +1 -1
- data/lib/jets/commands/url.rb +10 -12
- data/lib/jets/controller/base.rb +2 -2
- data/lib/jets/core.rb +1 -1
- data/lib/jets/core_ext/kernel.rb +11 -1
- data/lib/jets/internal/app/controllers/jets/public_controller.rb +11 -8
- data/lib/jets/lambda/dsl.rb +1 -1
- data/lib/jets/lambda/task.rb +9 -1
- data/lib/jets/naming.rb +2 -2
- data/lib/jets/pascalize.rb +9 -1
- data/lib/jets/poly_fun/base_executor.rb +2 -2
- data/lib/jets/preheat.rb +2 -2
- data/lib/jets/rails_overrides/common_methods.rb +1 -1
- data/lib/jets/resource.rb +55 -5
- data/lib/jets/resource/api_gateway.rb +7 -0
- data/lib/jets/resource/{route → api_gateway}/cors.rb +11 -10
- data/lib/jets/resource/api_gateway/deployment.rb +75 -0
- data/lib/jets/resource/{route.rb → api_gateway/method.rb} +26 -22
- data/lib/jets/{cfn/template_mappers/gateway_resource_mapper.rb → resource/api_gateway/resource.rb} +41 -27
- data/lib/jets/resource/api_gateway/rest_api.rb +23 -0
- data/lib/jets/resource/base.rb +17 -0
- data/lib/jets/resource/child_stack.rb +5 -0
- data/lib/jets/resource/child_stack/api_deployment.rb +58 -0
- data/lib/jets/resource/child_stack/api_gateway.rb +29 -0
- data/lib/jets/resource/child_stack/app_class.rb +81 -0
- data/lib/jets/resource/function.rb +184 -0
- data/lib/jets/resource/iam.rb +8 -0
- data/lib/jets/resource/iam/application_role.rb +27 -0
- data/lib/jets/resource/iam/base_role_definition.rb +44 -0
- data/lib/jets/resource/iam/class_role.rb +25 -0
- data/lib/jets/resource/iam/function_role.rb +25 -0
- data/lib/jets/{cfn/template_builders/managed_iam_policy/base_policy.rb → resource/iam/managed_policy.rb} +6 -6
- data/lib/jets/resource/iam/policy_document.rb +43 -0
- data/lib/jets/resource/permission.rb +38 -21
- data/lib/jets/resource/replacer.rb +50 -17
- data/lib/jets/resource/s3.rb +17 -0
- data/lib/jets/route.rb +3 -1
- data/lib/jets/rule/dsl.rb +7 -1
- data/lib/jets/server/route_matcher.rb +2 -1
- data/lib/jets/version.rb +1 -1
- metadata +46 -52
- data/lib/jets/cfn/template_builders.rb +0 -25
- data/lib/jets/cfn/template_builders/api_gateway_deployment_builder.rb +0 -38
- data/lib/jets/cfn/template_builders/base_child_builder.rb +0 -72
- data/lib/jets/cfn/template_builders/function_properties.rb +0 -6
- data/lib/jets/cfn/template_builders/function_properties/base_builder.rb +0 -128
- data/lib/jets/cfn/template_builders/function_properties/node_builder.rb +0 -12
- data/lib/jets/cfn/template_builders/function_properties/python_builder.rb +0 -12
- data/lib/jets/cfn/template_builders/function_properties/ruby_builder.rb +0 -13
- data/lib/jets/cfn/template_builders/iam_policy.rb +0 -6
- data/lib/jets/cfn/template_builders/iam_policy/application_policy.rb +0 -19
- data/lib/jets/cfn/template_builders/iam_policy/base_policy.rb +0 -57
- data/lib/jets/cfn/template_builders/iam_policy/class_policy.rb +0 -20
- data/lib/jets/cfn/template_builders/iam_policy/function_policy.rb +0 -21
- data/lib/jets/cfn/template_builders/interface.rb +0 -97
- data/lib/jets/cfn/template_builders/managed_iam_policy.rb +0 -6
- data/lib/jets/cfn/template_builders/managed_iam_policy/application_policy.rb +0 -11
- data/lib/jets/cfn/template_builders/managed_iam_policy/class_policy.rb +0 -10
- data/lib/jets/cfn/template_builders/managed_iam_policy/function_policy.rb +0 -10
- data/lib/jets/cfn/template_builders/parent_builder.rb +0 -95
- data/lib/jets/cfn/template_builders/templates/minimal-stack.yml +0 -9
- data/lib/jets/cfn/template_mappers.rb +0 -22
- data/lib/jets/cfn/template_mappers/api_gateway_deployment_mapper.rb +0 -48
- data/lib/jets/cfn/template_mappers/api_gateway_mapper.rb +0 -4
- data/lib/jets/cfn/template_mappers/child_mapper.rb +0 -41
- data/lib/jets/cfn/template_mappers/controller_mapper.rb +0 -36
- data/lib/jets/cfn/template_mappers/function_mapper.rb +0 -4
- data/lib/jets/cfn/template_mappers/iam_policy.rb +0 -6
- data/lib/jets/cfn/template_mappers/iam_policy/application_policy_mapper.rb +0 -37
- data/lib/jets/cfn/template_mappers/iam_policy/base_policy_mapper.rb +0 -49
- data/lib/jets/cfn/template_mappers/iam_policy/class_policy_mapper.rb +0 -42
- data/lib/jets/cfn/template_mappers/iam_policy/function_policy_mapper.rb +0 -42
- data/lib/jets/cfn/template_mappers/job_mapper.rb +0 -4
- data/lib/jets/cfn/template_mappers/lambda_function_mapper.rb +0 -52
- data/lib/jets/cfn/template_mappers/rule_mapper.rb +0 -5
- data/lib/jets/resource/attributes.rb +0 -46
- data/lib/jets/resource/creator.rb +0 -17
- data/lib/jets/resource/replacer/base.rb +0 -98
- data/lib/jets/resource/replacer/config_rule.rb +0 -18
- data/lib/jets/resource/route/attributes.rb +0 -8
@@ -1,9 +1,9 @@
|
|
1
|
-
class Jets::Cfn::
|
1
|
+
class Jets::Cfn::Builders
|
2
2
|
class RuleBuilder < BaseChildBuilder
|
3
3
|
def compose
|
4
4
|
add_common_parameters
|
5
5
|
add_functions
|
6
|
-
|
6
|
+
add_resources
|
7
7
|
add_managed_rules
|
8
8
|
end
|
9
9
|
|
@@ -11,10 +11,9 @@ class Jets::Cfn::TemplateBuilders
|
|
11
11
|
# List of AWS Config Managed Rules: https://amzn.to/2BOt9KN
|
12
12
|
def add_managed_rules
|
13
13
|
@app_klass.managed_rules.each do |rule|
|
14
|
-
|
15
|
-
|
14
|
+
resource = Jets::Resource.new(rule[:definition], rule[:replacements])
|
15
|
+
add_resource(resource)
|
16
16
|
end
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
20
|
-
|
data/lib/jets/commands/base.rb
CHANGED
@@ -64,7 +64,7 @@ class Jets::Commands::Base < Thor
|
|
64
64
|
class_name.sub!(/Task$/, "Tasks") # special rule here for Tasks class
|
65
65
|
# NOTE: Weird thing where Jets::Commands::Db::Task => Thor::Command
|
66
66
|
# because Task is a class available to Thor I believe.
|
67
|
-
puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
|
67
|
+
# puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
|
68
68
|
class_name.constantize # dont have to worry about order.
|
69
69
|
end
|
70
70
|
end
|
data/lib/jets/commands/build.rb
CHANGED
@@ -41,8 +41,7 @@ module Jets::Commands
|
|
41
41
|
|
42
42
|
def build_all_templates
|
43
43
|
clean_templates
|
44
|
-
#
|
45
|
-
## CloudFormation templates
|
44
|
+
# CloudFormation templates
|
46
45
|
puts "Building Lambda functions as CloudFormation templates."
|
47
46
|
# 1. Shared templates - child templates needs them
|
48
47
|
build_api_gateway_templates
|
@@ -53,15 +52,12 @@ module Jets::Commands
|
|
53
52
|
end
|
54
53
|
|
55
54
|
def build_minimal_template
|
56
|
-
|
57
|
-
parent.build
|
55
|
+
Jets::Cfn::Builders::ParentBuilder.new(@options).build
|
58
56
|
end
|
59
57
|
|
60
58
|
def build_api_gateway_templates
|
61
|
-
|
62
|
-
|
63
|
-
deployment = Jets::Cfn::TemplateBuilders::ApiGatewayDeploymentBuilder.new(@options)
|
64
|
-
deployment.build
|
59
|
+
Jets::Cfn::Builders::ApiGatewayBuilder.new(@options).build
|
60
|
+
Jets::Cfn::Builders::ApiDeploymentBuilder.new(@options).build
|
65
61
|
end
|
66
62
|
|
67
63
|
def build_child_templates
|
@@ -79,21 +75,21 @@ module Jets::Commands
|
|
79
75
|
|
80
76
|
md = path.match(%r{app/(.*?)/}) # extract: controller, job or function
|
81
77
|
process_class = md[1].classify
|
82
|
-
builder_class = "Jets::Cfn::
|
78
|
+
builder_class = "Jets::Cfn::Builders::#{process_class}Builder".constantize
|
83
79
|
|
84
80
|
# Examples:
|
85
|
-
# Jets::Cfn::
|
86
|
-
# Jets::Cfn::
|
87
|
-
# Jets::Cfn::
|
88
|
-
# Jets::Cfn::
|
81
|
+
# Jets::Cfn::Builders::ControllerBuilder.new(PostsController)
|
82
|
+
# Jets::Cfn::Builders::JobBuilder.new(EasyJob)
|
83
|
+
# Jets::Cfn::Builders::RuleBuilder.new(CheckRule)
|
84
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(Hello)
|
85
|
+
# Jets::Cfn::Builders::FunctionBuilder.new(HelloFunction)
|
89
86
|
app_klass = Jets::Klass.from_path(path)
|
90
87
|
builder = builder_class.new(app_klass)
|
91
88
|
builder.build
|
92
89
|
end
|
93
90
|
|
94
91
|
def build_parent_template
|
95
|
-
|
96
|
-
parent.build
|
92
|
+
Jets::Cfn::Builders::ParentBuilder.new(@options).build
|
97
93
|
end
|
98
94
|
|
99
95
|
def clean_templates
|
data/lib/jets/commands/delete.rb
CHANGED
@@ -74,6 +74,7 @@ class Jets::Commands::Delete
|
|
74
74
|
|
75
75
|
def s3_bucket_name
|
76
76
|
return @s3_bucket_name if defined?(@s3_bucket_name)
|
77
|
+
return unless bucket_exists?
|
77
78
|
|
78
79
|
resp = cfn.describe_stacks(stack_name: parent_stack_name)
|
79
80
|
outputs = resp.stacks[0].outputs
|
@@ -84,6 +85,17 @@ class Jets::Commands::Delete
|
|
84
85
|
end
|
85
86
|
end
|
86
87
|
|
88
|
+
# Thanks: https://docs.aws.amazon.com/sdk-for-ruby/v3/developer-guide/s3-example-does-bucket-exist.html
|
89
|
+
def bucket_exists?
|
90
|
+
bucket_exists = false
|
91
|
+
begin
|
92
|
+
resp = s3.head_bucket(bucket: @s3_bucket_name, use_accelerate_endpoint: false)
|
93
|
+
bucket_exists = true
|
94
|
+
rescue
|
95
|
+
end
|
96
|
+
bucket_exists
|
97
|
+
end
|
98
|
+
|
87
99
|
def parent_stack_name
|
88
100
|
Jets::Naming.parent_stack_name
|
89
101
|
end
|
@@ -12,6 +12,7 @@ gem "webpacker", git: "https://github.com/tongueroo/webpacker.git", branch: "jet
|
|
12
12
|
<% end -%>
|
13
13
|
# Include pg gem if you are using ActiveRecord
|
14
14
|
gem "pg", "~> 0.21"
|
15
|
+
gem "mimemagic"
|
15
16
|
|
16
17
|
group :development, :test do
|
17
18
|
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
|
@@ -9,7 +9,7 @@ Jets.application.configure do
|
|
9
9
|
config.cors = true # for '*''
|
10
10
|
# config.cors = '*.mydomain.com' # for specific domain
|
11
11
|
|
12
|
-
config.function.timeout =
|
12
|
+
config.function.timeout = 20
|
13
13
|
# config.function.role = "arn:aws:iam::#{Jets.aws.account}:role/service-role/pre-created"
|
14
14
|
# config.function.memory_size= 1536
|
15
15
|
|
data/lib/jets/commands/url.rb
CHANGED
@@ -8,18 +8,18 @@ module Jets::Commands
|
|
8
8
|
|
9
9
|
def display
|
10
10
|
stack_name = Jets::Naming.parent_stack_name
|
11
|
-
|
12
|
-
|
13
|
-
unless stack
|
14
|
-
puts "Stack for '#{Jets.config.project_name} project for environment #{Jets.env}. Couldn't find '#{stack_name}' stack."
|
11
|
+
unless stack_exists?(stack_name)
|
12
|
+
puts "Stack for #{Jets.config.project_name.colorize(:green)} project for environment #{Jets.env.colorize(:green)}. Couldn't find #{stack_name.colorize(:green)} stack."
|
15
13
|
exit
|
16
14
|
end
|
17
15
|
|
16
|
+
stack = cfn.describe_stacks(stack_name: stack_name).stacks.first
|
17
|
+
|
18
18
|
api_gateway_stack_arn = lookup(stack[:outputs], "ApiGateway")
|
19
19
|
if api_gateway_stack_arn
|
20
20
|
STDOUT.puts get_url(api_gateway_stack_arn)
|
21
21
|
else
|
22
|
-
puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app."
|
22
|
+
puts "API Gateway not found. This jets app does have an API Gateway associated with it. Please double check your config/routes.rb if you were expecting to see a url for the app. Also check that #{stack_name.colorize(:green)} is a jets app."
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
@@ -27,19 +27,17 @@ module Jets::Commands
|
|
27
27
|
stack = cfn.describe_stacks(stack_name: api_gateway_stack_arn).stacks.first
|
28
28
|
rest_api = lookup(stack[:outputs], "RestApi")
|
29
29
|
region_id = lookup(stack[:outputs], "Region")
|
30
|
-
|
31
|
-
|
32
|
-
# not using any methods that rely on the initialization parameters
|
33
|
-
map = Jets::Cfn::TemplateMappers::ApiGatewayDeploymentMapper.new(path=nil,s3_bucket=nil)
|
30
|
+
stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
|
31
|
+
|
34
32
|
# https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-call-api.html
|
35
33
|
# https://my-api-id.execute-api.region-id.amazonaws.com/stage-name/{resourcePath}
|
36
|
-
"https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{
|
34
|
+
"https://#{rest_api}.execute-api.#{region_id}.amazonaws.com/#{stage_name}"
|
37
35
|
end
|
38
36
|
|
39
37
|
# Lookup output value
|
40
38
|
def lookup(outputs, key)
|
41
|
-
|
42
|
-
|
39
|
+
out = outputs.find { |o| o.output_key == key }
|
40
|
+
out&.output_value
|
43
41
|
end
|
44
42
|
end
|
45
43
|
end
|
data/lib/jets/controller/base.rb
CHANGED
@@ -25,8 +25,8 @@ class Jets::Controller
|
|
25
25
|
resp = controller.ensure_render
|
26
26
|
controller.run_after_actions
|
27
27
|
|
28
|
-
|
29
|
-
Jets.logger.info "Completed Status Code #{resp["statusCode"]} in #{
|
28
|
+
took = Time.now - t1
|
29
|
+
Jets.logger.info "Completed Status Code #{resp["statusCode"]} in #{took}s"
|
30
30
|
|
31
31
|
resp
|
32
32
|
end
|
data/lib/jets/core.rb
CHANGED
@@ -135,7 +135,7 @@ module Jets::Core
|
|
135
135
|
.sub(/^\.\//,'') # remove ./
|
136
136
|
.sub(/app\/\w+\//,'') # remove app/controllers or app/jobs etc
|
137
137
|
.classify
|
138
|
-
puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
|
138
|
+
# puts "eager_load! loading path: #{path} class_name: #{class_name}" if ENV['JETS_DEBUG']
|
139
139
|
class_name.constantize # use constantize instead of require so dont have to worry about order.
|
140
140
|
end
|
141
141
|
end
|
data/lib/jets/core_ext/kernel.rb
CHANGED
@@ -16,8 +16,18 @@ module Kernel
|
|
16
16
|
@@io_buffer
|
17
17
|
end
|
18
18
|
|
19
|
+
# Note: Writing binary data to the log will crash the process with an error like this:
|
20
|
+
# jets/lib/jets/core_ext/kernel.rb:20:in `write': "\x89" from ASCII-8BIT to UTF-8 (Encoding::UndefinedConversionError)
|
21
|
+
# Rescue and discard it to keep the process alive.
|
19
22
|
def io_flush
|
20
|
-
|
23
|
+
chunk = @@io_buffer.join("\n")
|
24
|
+
begin
|
25
|
+
IO.write("/tmp/jets-output.log", chunk)
|
26
|
+
# Writing to log with binary content will crash the process so rescuing it and writing an info message.
|
27
|
+
rescue Encoding::UndefinedConversionError => e
|
28
|
+
error_message = "Encoding::UndefinedConversionError: Binary data was written to Jets::IO buffer. Writing binary data to the log will crash the process, so discarding it. This is an info message only. If you want to return binary data please base64 encode the data."
|
29
|
+
IO.write("/tmp/jets-output.log", error_message)
|
30
|
+
end
|
21
31
|
@@io_buffer = []
|
22
32
|
end
|
23
33
|
end
|
@@ -1,26 +1,29 @@
|
|
1
1
|
require "rack/mime"
|
2
|
+
require "mimemagic"
|
2
3
|
|
3
|
-
# Works for utf8 text files.
|
4
|
-
# TODO: Add support to public_controller for binary data like images.
|
5
|
-
# Tricky because API Gateway is not respecting the Accept header the same way as browsers.
|
6
4
|
class Jets::PublicController < Jets::Controller::Base
|
7
5
|
layout false
|
8
6
|
internal true
|
9
7
|
|
10
|
-
# # Use python until ruby support is added.
|
11
|
-
# python :show
|
12
|
-
|
13
8
|
if Jets::Commands::Build.poly_only?
|
14
9
|
# Use python if poly only so we don't have to upload rubuy
|
15
10
|
python :show
|
16
11
|
else
|
17
|
-
# TODO: When ruby support is relesed, switch to it only.
|
18
12
|
def show
|
19
13
|
public_path = Jets.root + "public"
|
20
14
|
catchall_path = "#{public_path}/#{params[:catchall]}"
|
21
15
|
if File.exist?(catchall_path)
|
22
16
|
content_type = Rack::Mime.mime_type(File.extname(catchall_path))
|
23
|
-
|
17
|
+
binary = !MimeMagic.by_path(catchall_path).text?
|
18
|
+
puts "content_type #{content_type.inspect}"
|
19
|
+
puts "binary #{binary}"
|
20
|
+
|
21
|
+
if binary
|
22
|
+
encoded_content = Base64.encode64(IO.read(catchall_path))
|
23
|
+
render plain: encoded_content, content_type: content_type, base64: true
|
24
|
+
else
|
25
|
+
render file: catchall_path, content_type: content_type
|
26
|
+
end
|
24
27
|
else
|
25
28
|
render file: "#{public_path}/404", status: 404
|
26
29
|
end
|
data/lib/jets/lambda/dsl.rb
CHANGED
data/lib/jets/lambda/task.rb
CHANGED
@@ -2,7 +2,7 @@ class Jets::Lambda::Task
|
|
2
2
|
attr_accessor :class_name, :type
|
3
3
|
attr_reader :meth, :resources, :properties, :iam_policy, :managed_iam_policy, :lang
|
4
4
|
def initialize(class_name, meth, options={})
|
5
|
-
@class_name = class_name.to_s
|
5
|
+
@class_name = class_name.to_s
|
6
6
|
@meth = meth
|
7
7
|
@options = options
|
8
8
|
@type = options[:type] || get_type # controller, job, or function
|
@@ -81,4 +81,12 @@ class Jets::Lambda::Task
|
|
81
81
|
def poly_src_path
|
82
82
|
handler_path.sub("handlers/", "app/")
|
83
83
|
end
|
84
|
+
|
85
|
+
###
|
86
|
+
# Useful for Jets::Resource late building.
|
87
|
+
def replacements
|
88
|
+
{
|
89
|
+
namespace: "#{@class_name.gsub('::','')}#{@meth.to_s.camelize}", # camelized because used in not just keys but also values
|
90
|
+
}
|
91
|
+
end
|
84
92
|
end
|
data/lib/jets/naming.rb
CHANGED
@@ -23,8 +23,8 @@ class Jets::Naming
|
|
23
23
|
"#{template_path_prefix}-api-gateway.yml"
|
24
24
|
end
|
25
25
|
|
26
|
-
def
|
27
|
-
"#{template_path_prefix}-api-
|
26
|
+
def api_deployment_template_path
|
27
|
+
"#{template_path_prefix}-api-deployment.yml"
|
28
28
|
end
|
29
29
|
|
30
30
|
def parent_stack_name
|
data/lib/jets/pascalize.rb
CHANGED
@@ -43,7 +43,15 @@ module Jets
|
|
43
43
|
|
44
44
|
def pascalize_string(s)
|
45
45
|
s = s.to_s.camelize
|
46
|
-
s.slice(0,1).capitalize + s.slice(1..-1) # capitalize first letter only
|
46
|
+
s = s.slice(0,1).capitalize + s.slice(1..-1) # capitalize first letter only
|
47
|
+
special_map[s] || s
|
48
|
+
end
|
49
|
+
|
50
|
+
# Some keys have special mappings
|
51
|
+
def special_map
|
52
|
+
{
|
53
|
+
"TemplateUrl" => "TemplateURL"
|
54
|
+
}
|
47
55
|
end
|
48
56
|
end
|
49
57
|
end
|
@@ -118,8 +118,8 @@ class Jets::PolyFun
|
|
118
118
|
# the mutiple sources of how the handler can get set.
|
119
119
|
# puts "handler path #{@task.handler_path}"
|
120
120
|
#
|
121
|
-
# IE: Jets::Cfn::
|
122
|
-
builder_class = "Jets::Cfn::
|
121
|
+
# IE: Jets::Cfn::Builders::FunctionProperties::PythonBuilder
|
122
|
+
builder_class = "Jets::Cfn::Builders::FunctionProperties::#{@task.lang.to_s.classify}Builder".constantize
|
123
123
|
builder = builder_class.new(@task)
|
124
124
|
full_handler = builder.properties["Handler"] # full handler here
|
125
125
|
File.extname(full_handler).sub(/^./,'') # the extension of the full handler is the handler
|
data/lib/jets/preheat.rb
CHANGED
@@ -20,12 +20,12 @@ module Jets
|
|
20
20
|
@options[:mute_output] = true if @options[:mute_output].nil?
|
21
21
|
end
|
22
22
|
|
23
|
+
# Makes remote call to the Lambda function.
|
23
24
|
def warm(function_name)
|
24
25
|
Jets::Commands::Call.new(function_name, '{"_prewarm": "1"}', @options).run unless ENV['TEST']
|
25
26
|
end
|
26
27
|
|
27
|
-
#
|
28
|
-
# make the special prewarm call to keep them warm
|
28
|
+
# Loop through all methods for each class and makes special prewarm call to each method.
|
29
29
|
def warm_all
|
30
30
|
threads = []
|
31
31
|
all_functions.each do |function_name|
|
@@ -4,7 +4,7 @@ module Jets::CommonMethods
|
|
4
4
|
if request.host.include?("amazonaws.com") &&
|
5
5
|
url.starts_with?('/') &&
|
6
6
|
!url.starts_with?('http')
|
7
|
-
stage_name = Jets::
|
7
|
+
stage_name = Jets::Resource::ApiGateway::Deployment.stage_name
|
8
8
|
url = "/#{stage_name}#{url}"
|
9
9
|
end
|
10
10
|
|
data/lib/jets/resource.rb
CHANGED
@@ -1,7 +1,57 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
autoload :
|
1
|
+
class Jets::Resource
|
2
|
+
extend Memoist
|
3
|
+
|
4
|
+
autoload :Base, 'jets/resource/base'
|
5
5
|
autoload :Replacer, 'jets/resource/replacer'
|
6
|
-
autoload :
|
6
|
+
autoload :Permission, 'jets/resource/permission'
|
7
|
+
autoload :ApiGateway, 'jets/resource/api_gateway'
|
8
|
+
autoload :ChildStack, 'jets/resource/child_stack'
|
9
|
+
autoload :Function, 'jets/resource/function'
|
10
|
+
autoload :Iam, 'jets/resource/iam'
|
11
|
+
autoload :S3, 'jets/resource/s3'
|
12
|
+
|
13
|
+
attr_reader :definition, :replacements
|
14
|
+
def initialize(definition, replacements={})
|
15
|
+
@definition = definition
|
16
|
+
@replacements = replacements
|
17
|
+
end
|
18
|
+
|
19
|
+
def logical_id
|
20
|
+
id = definition.keys.first
|
21
|
+
# replace possible {namespace} in the logical id
|
22
|
+
id = replacer.replace_value(id)
|
23
|
+
Jets::Pascalize.pascalize_string(id)
|
24
|
+
end
|
25
|
+
|
26
|
+
def type
|
27
|
+
attributes['Type']
|
28
|
+
end
|
29
|
+
|
30
|
+
def properties
|
31
|
+
attributes['Properties']
|
32
|
+
end
|
33
|
+
|
34
|
+
def attributes
|
35
|
+
attributes = definition.values.first
|
36
|
+
attributes = replacer.replace_placeholders(attributes)
|
37
|
+
Jets::Pascalize.pascalize(attributes)
|
38
|
+
end
|
39
|
+
|
40
|
+
def parameters
|
41
|
+
{}
|
42
|
+
end
|
43
|
+
|
44
|
+
def outputs
|
45
|
+
{}
|
46
|
+
end
|
47
|
+
|
48
|
+
def replacer
|
49
|
+
Replacer.new(replacements)
|
50
|
+
end
|
51
|
+
memoize :replacer
|
52
|
+
|
53
|
+
def permission
|
54
|
+
Permission.new(replacements, self)
|
55
|
+
end
|
56
|
+
memoize :permission
|
7
57
|
end
|
@@ -0,0 +1,7 @@
|
|
1
|
+
module Jets::Resource::ApiGateway
|
2
|
+
autoload :Resource, 'jets/resource/api_gateway/resource'
|
3
|
+
autoload :RestApi, 'jets/resource/api_gateway/rest_api'
|
4
|
+
autoload :Deployment, 'jets/resource/api_gateway/deployment'
|
5
|
+
autoload :Method, 'jets/resource/api_gateway/method'
|
6
|
+
autoload :Cors, 'jets/resource/api_gateway/cors'
|
7
|
+
end
|
@@ -1,8 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module Jets::Resource::ApiGateway
|
2
|
+
# Might be weird inheriting from Method because Method has Method#cors also
|
3
|
+
# but Cors is essentially a Method class.
|
4
|
+
class Cors < Method
|
5
|
+
def definition
|
6
|
+
{
|
7
|
+
cors_logical_id => {
|
6
8
|
type: "AWS::ApiGateway::Method",
|
7
9
|
|
8
10
|
properties: {
|
@@ -41,12 +43,11 @@ class Jets::Resource::Route
|
|
41
43
|
} # closes integration
|
42
44
|
} # closes properties
|
43
45
|
} # closes logical id
|
44
|
-
} # closes
|
46
|
+
} # closes definition
|
47
|
+
end
|
45
48
|
|
46
|
-
|
47
|
-
|
48
|
-
resources: definitions)
|
49
|
-
Attributes.new(attributes, task)
|
49
|
+
def cors_logical_id
|
50
|
+
"#{resource_logical_id}_cors_api_method"
|
50
51
|
end
|
51
52
|
|
52
53
|
def allow_origin
|