Class: Jets::Resource::Function
- Defined in:
- lib/jets/resource/function.rb
Instance Method Summary collapse
-
#class_properties ⇒ Object
Class properties example:.
- #code_s3_key ⇒ Object
- #combined_properties ⇒ Object
- #default_handler ⇒ Object
- #default_runtime ⇒ Object
- #definition ⇒ Object
- #env_properties ⇒ Object
- #environment ⇒ Object
-
#finalize_properties!(props) ⇒ Object
Properties managed by Jets with more finality.
-
#full_handler(props) ⇒ Object
Ensure that the handler path is normalized.
- #function_logical_id ⇒ Object
-
#function_name ⇒ Object
Examples: “#Jets.config.project_namespace-sleep_job-perform” “demo-dev-sleep_job-perform”.
-
#function_properties ⇒ Object
Function properties example:.
- #get_runtime(props) ⇒ Object
-
#global_properties ⇒ Object
Global properties example: jets defaults are in jets/default/application.rb.
- #handler ⇒ Object
-
#handler_value(meth) ⇒ Object
Used for node-shim also.
-
#initialize(task) ⇒ Function
constructor
A new instance of Function.
-
#jets_env ⇒ Object
These jets env variables are always included.
-
#lookup_class_properties(klass) ⇒ Object
Accounts for inherited class_properties.
- #replacements ⇒ Object
Methods inherited from Base
Constructor Details
#initialize(task) ⇒ Function
Returns a new instance of Function.
3 4 5 6 |
# File 'lib/jets/resource/function.rb', line 3 def initialize(task) @task = task @app_class = task.class_name.to_s end |
Instance Method Details
#class_properties ⇒ Object
Class properties example:
class PostsController < ApplicationController
class_timeout 22
...
end
Also handles iam policy override at the class level. Example:
class_iam_policy("logs:*")
88 89 90 91 92 93 94 95 96 97 98 99 |
# File 'lib/jets/resource/function.rb', line 88 def class_properties # klass is PostsController, HardJob, GameRule, Hello or HelloFunction klass = Jets::Klass.from_task(@task) class_properties = lookup_class_properties(klass) if klass.build_class_iam? iam_policy = Jets::Resource::Iam::ClassRole.new(klass) class_properties[:role] = "!GetAtt #{iam_policy.logical_id}.Arn" end class_properties end |
#code_s3_key ⇒ Object
191 192 193 194 |
# File 'lib/jets/resource/function.rb', line 191 def code_s3_key checksum = Jets::Builders::Md5.checksums["stage/code"] "jets/code/code-#{checksum}.zip" # s3_key end |
#combined_properties ⇒ Object
25 26 27 28 29 30 31 |
# File 'lib/jets/resource/function.rb', line 25 def combined_properties props = env_properties .deep_merge(global_properties) .deep_merge(class_properties) .deep_merge(function_properties) finalize_properties!(props) end |
#default_handler ⇒ Object
164 165 166 167 168 169 170 171 |
# File 'lib/jets/resource/function.rb', line 164 def default_handler map = { node: @task.full_handler(:handler), # IE: handlers/controllers/posts/show.handler python: @task.full_handler(:lambda_handler), # IE: handlers/controllers/posts/show.lambda_handler ruby: handler, # IE: handlers/controllers/posts_controllers.index } map[@task.lang] end |
#default_runtime ⇒ Object
155 156 157 158 159 160 161 162 |
# File 'lib/jets/resource/function.rb', line 155 def default_runtime map = { node: "nodejs8.10", python: "python3.6", ruby: "nodejs8.10", # node shim for ruby support } map[@task.lang] end |
#definition ⇒ Object
8 9 10 11 12 13 14 15 |
# File 'lib/jets/resource/function.rb', line 8 def definition { function_logical_id => { type: "AWS::Lambda::Function", properties: combined_properties } } end |
#env_properties ⇒ Object
33 34 35 36 37 |
# File 'lib/jets/resource/function.rb', line 33 def env_properties env_vars = Jets::Dotenv.load!(true) variables = environment.merge(env_vars) {environment: { variables: variables }} end |
#environment ⇒ Object
39 40 41 42 |
# File 'lib/jets/resource/function.rb', line 39 def environment env = Jets.config.environment ? Jets.config.environment.to_h : {} env.deep_merge(jets_env) end |
#finalize_properties!(props) ⇒ Object
Properties managed by Jets with more finality.
141 142 143 144 145 146 147 148 149 |
# File 'lib/jets/resource/function.rb', line 141 def finalize_properties!(props) handler = full_handler(props) runtime = get_runtime(props) props.merge!( function_name: function_name, handler: handler, runtime: runtime, ) end |
#full_handler(props) ⇒ Object
Ensure that the handler path is normalized.
183 184 185 186 187 188 189 |
# File 'lib/jets/resource/function.rb', line 183 def full_handler(props) if props[:handler] handler_value(props[:handler]) else default_handler end end |
#function_logical_id ⇒ Object
17 18 19 |
# File 'lib/jets/resource/function.rb', line 17 def function_logical_id "{namespace}_lambda_function".underscore end |
#function_name ⇒ Object
199 200 201 202 203 204 205 206 207 208 |
# File 'lib/jets/resource/function.rb', line 199 def function_name # Example values: # @app_class: admin/pages_controller # @task.meth: index # method: admin/pages_controller # method: admin-pages_controller-index method = @app_class.underscore method = method.sub('/','-') + "-#{@task.meth}" "#{Jets.config.project_namespace}-#{method}" end |
#function_properties ⇒ Object
Function properties example:
class PostsController < ApplicationController
timeout 18
def index
...
end
Also handles iam policy override at the function level. Example:
iam_policy("ec2:*")
def new
render json: params.merge(action: "new")
end
131 132 133 134 135 136 137 138 |
# File 'lib/jets/resource/function.rb', line 131 def function_properties properties = @task.properties if @task.build_function_iam? iam_policy = Jets::Resource::Iam::FunctionRole.new(@task) properties[:role] = "!GetAtt #{iam_policy.logical_id}.Arn" end properties end |
#get_runtime(props) ⇒ Object
151 152 153 |
# File 'lib/jets/resource/function.rb', line 151 def get_runtime(props) props[:runtime] || default_runtime end |
#global_properties ⇒ Object
Global properties example: jets defaults are in jets/default/application.rb. Your application’s default config/application.rb then get used. Example:
Jets.application.configure do
config.function = ActiveSupport::OrderedOptions.new
config.function.timeout = 30
config.function.runtime = "nodejs8.10"
config.function.memory_size = 1536
end
63 64 65 66 67 68 69 70 71 72 73 74 75 |
# File 'lib/jets/resource/function.rb', line 63 def global_properties baseline = { code: { s3_bucket: "!Ref S3Bucket", s3_key: code_s3_key }, role: "!Ref IamRole", environment: { variables: environment }, } appplication_config = Jets.application.config.function.to_h baseline.merge(appplication_config) end |
#handler ⇒ Object
173 174 175 |
# File 'lib/jets/resource/function.rb', line 173 def handler handler_value(@task.meth) # IE: handlers/controllers/posts_controllers.index end |
#handler_value(meth) ⇒ Object
Used for node-shim also
178 179 180 |
# File 'lib/jets/resource/function.rb', line 178 def handler_value(meth) "handlers/#{@task.type.pluralize}/#{@app_class.underscore}.#{meth}" end |
#jets_env ⇒ Object
These jets env variables are always included
45 46 47 48 49 50 51 |
# File 'lib/jets/resource/function.rb', line 45 def jets_env env = {} env[:JETS_ENV] = Jets.env.to_s env[:JETS_ENV_EXTRA] = Jets.config.env_extra if Jets.config.env_extra env[:JETS_STAGE] = Jets::Resource::ApiGateway::Deployment.stage_name env end |
#lookup_class_properties(klass) ⇒ Object
Accounts for inherited class_properties
102 103 104 105 106 107 108 109 110 111 112 113 114 |
# File 'lib/jets/resource/function.rb', line 102 def lookup_class_properties(klass) all_classes = [] while klass != Object all_classes << klass klass = klass.superclass end class_properties = {} # Go back down class heirachry top to down all_classes.reverse.each do |k| class_properties.merge!(k.class_properties) end class_properties end |
#replacements ⇒ Object
21 22 23 |
# File 'lib/jets/resource/function.rb', line 21 def replacements @task.replacements # has namespace replacement end |