Class: Jets::Resource::Function

Inherits:
Base
  • Object
show all
Defined in:
lib/jets/resource/function.rb

Instance Method Summary collapse

Methods inherited from Base

#resource

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_propertiesObject

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_keyObject



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_propertiesObject



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_handlerObject



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_runtimeObject



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

#definitionObject



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_propertiesObject



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

#environmentObject



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_idObject



17
18
19
# File 'lib/jets/resource/function.rb', line 17

def function_logical_id
  "{namespace}_lambda_function".underscore
end

#function_nameObject

Examples:

"#{Jets.config.project_namespace}-sleep_job-perform"
"demo-dev-sleep_job-perform"


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_propertiesObject

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_propertiesObject

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

#handlerObject



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_envObject

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

#replacementsObject



21
22
23
# File 'lib/jets/resource/function.rb', line 21

def replacements
  @task.replacements # has namespace replacement
end