lib/jets/job/dsl.rb in jets-0.7.1 vs lib/jets/job/dsl.rb in jets-0.8.0
- old
+ new
@@ -1,58 +1,76 @@
# Jets::Job::Base < Jets::Lambda::Functions
# Both Jets::Job::Base and Jets::Lambda::Functions have Dsl modules included.
# So the Jets::Job::Dsl overrides some of the Jets::Lambda::Functions behavior.
+#
+# Implements:
+# default_associated_resource: must return @resources
module Jets::Job::Dsl
extend ActiveSupport::Concern
included do
class << self
def rate(expression)
- @rate = expression
+ update_properties(schedule_expression: "rate(#{expression})")
end
def cron(expression)
- @cron = expression
+ update_properties(schedule_expression: "cron(#{expression}")
end
- # Explicitly disable scheduling for the function
- def disable(value)
- @disable = value
+ def event_pattern(details={})
+ event_rule(event_pattern: details)
+ add_descriptions # useful: generic description in the Event Rule console
end
- # This is a property of the AWS::Events::Rule not the Lambda function
- def state(value)
- @state = value
+ def add_descriptions
+ numbered_resources = []
+ n = 1
+ @resources.map do |definition|
+ logical_id = definition.keys.first
+ attributes = definition.values.first
+ attributes[:properties][:description] = "#{self.name} Event Rule #{n}"
+ numbered_resources << { "#{logical_id}" => attributes }
+ n += 1
+ end
+ @resources = numbered_resources
end
- # Override register_task.
- # A Job::Task is a Lambda::Task with some added DSL methods like
- # rate and cron.
- def register_task(meth, lang=:ruby)
- if @rate || @cron || @disable
- # Job lambda function.
- all_tasks[meth] = Jets::Job::Task.new(self.name, meth,
- rate: @rate,
- cron: @cron,
- state: @state,
- properties: @properties,
- lang: lang)
- true
- else
- task_name = "#{name}##{meth}" # IE: HardJob#dig
- puts "[WARNING] #{task_name} created without a rate or cron expression. " \
- "Add a rate or cron expression above the method definition if you want this method to be scheduled. " \
- "If #{task_name} is not meant to be a scheduled lambda function, you can put the method under after a private keyword to get rid of this warning. " \
- "#{task_name} defined at #{caller[1].inspect}."
- false
- end
- # Done storing options, clear out for the next added method.
- clear_properties
+ def default_associated_resource
+ event_rule
+ @resources # must return @resoures for update_properties
end
- def clear_properties
- super
- @rate, @cron, @state, @disable = nil, nil, nil, nil
+ def event_rule(props={})
+ default_props = {
+ state: "ENABLED",
+ targets: [{
+ arn: "!GetAtt {namespace}LambdaFunction.Arn",
+ id: "{namespace}RuleTarget"
+ }]
+ }
+ properties = default_props.deep_merge(props)
+
+ resource("{namespace}EventsRule" => {
+ type: "AWS::Events::Rule",
+ properties: properties
+ })
+
+ add_logical_id_counter if @resources.size > 1
+ end
+
+ # Loop back through the resources and add a counter to the end of the id
+ # to handle multiple events.
+ # Then replace @resources entirely
+ def add_logical_id_counter
+ numbered_resources = []
+ n = 1
+ @resources.map do |definition|
+ logical_id = definition.keys.first
+ numbered_resources << { "#{logical_id}#{n}" => definition.values.first }
+ n += 1
+ end
+ @resources = numbered_resources
end
end
end
end