def _create_scheduled_model(self, config, # type: Config deployment, # type: models.DeploymentPackage event_source, # type: app.ScheduledEventConfig stage_name, # type: str ): # type: (...) -> models.ScheduledEvent lambda_function = self._create_lambda_model( config=config, deployment=deployment, name=event_source.name, handler_name=event_source.handler_string, stage_name=stage_name ) # Resource names must be unique across a chalice app. # However, in the original deployer code, the cloudwatch # event + lambda function was considered a single resource. # Now that they're treated as two separate resources we need # a unique name for the event_source that's not the lambda # function resource name. We handle this by just appending # '-event' to the name. Ideally this is handled in app.py # but we won't be able to do that until the old deployer # is gone. resource_name = event_source.name + '-event' if isinstance(event_source.schedule_expression, app.ScheduleExpression): expression = event_source.schedule_expression.to_string() else: expression = event_source.schedule_expression rule_name = '%s-%s-%s' % (config.app_name, config.chalice_stage, resource_name) scheduled_event = models.ScheduledEvent( resource_name=resource_name, rule_name=rule_name, schedule_expression=expression, lambda_function=lambda_function, ) return scheduled_event
def test_can_generate_scheduled_event(self): function = self.lambda_function() event = models.ScheduledEvent( resource_name='foo-event', rule_name='myrule', schedule_expression='rate(5 minutes)', lambda_function=function, ) template = self.template_gen.generate([function, event]) rule = template['resource']['aws_cloudwatch_event_rule'][ event.resource_name] assert rule == { 'name': event.resource_name, 'schedule_expression': 'rate(5 minutes)' }
def test_can_plan_scheduled_event(self): function = create_function_resource('function_name') event = models.ScheduledEvent( resource_name='bar', rule_name='myrulename', schedule_expression='rate(5 minutes)', lambda_function=function, ) plan = self.determine_plan(event) assert len(plan) == 4 self.assert_apicall_equals( plan[0], models.APICall( method_name='get_or_create_rule_arn', params={ 'rule_name': 'myrulename', 'schedule_expression': 'rate(5 minutes)', }, output_var='rule-arn', )) self.assert_apicall_equals( plan[1], models.APICall(method_name='connect_rule_to_lambda', params={ 'rule_name': 'myrulename', 'function_arn': Variable('function_name_lambda_arn') })) self.assert_apicall_equals( plan[2], models.APICall( method_name='add_permission_for_scheduled_event', params={ 'rule_arn': Variable('rule-arn'), 'function_arn': Variable('function_name_lambda_arn'), }, )) assert plan[3] == models.RecordResourceValue( resource_type='cloudwatch_event', resource_name='bar', name='rule_name', value='myrulename', )
def test_can_generate_scheduled_event(self): function = self.lambda_function() event = models.ScheduledEvent( resource_name='foo-event', rule_name='myrule', schedule_expression='rate(5 minutes)', lambda_function=function, ) template = self.template_gen.generate_sam_template([function, event]) resources = template['Resources'] assert len(resources) == 1 cfn_resource = list(resources.values())[0] assert cfn_resource['Properties']['Events'] == { 'FooEvent': { 'Type': 'Schedule', 'Properties': { 'Schedule': 'rate(5 minutes)' }, }, }