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