App-FargateStack
view release on metacpan or search on metacpan
lib/App/FargateStack/Builder/Events.pm view on Meta::CPAN
package App::FargateStack::Builder::Events;
use strict;
use warnings;
use App::FargateStack::Builder::Utils qw(log_die);
use App::FargateStack::Constants;
use Carp;
use Data::Compare;
use Data::Dumper;
use English qw(-no_match_vars);
use JSON;
use Role::Tiny;
########################################################################
sub build_events {
########################################################################
my ($self) = @_;
my ( $config, $dryrun, $cluster, $tasks ) = $self->common_args(qw(config dryrun cluster tasks));
my @events = grep { $tasks->{$_}->{type} eq 'task' && $tasks->{$_}->{schedule} } keys %{$tasks};
if ( !@events ) {
$self->log_info('events: no events to build');
return;
}
$self->log_info( 'events: [%d] event(s) to build', scalar @events );
$self->log_info('events: constructing IAM role for events...');
$self->build_events_iam_role(@events); # task names
foreach my $task_name (@events) {
$self->log_info( 'events: building event for: [%s]', $task_name );
my $task = $tasks->{$task_name};
# ok to be undef, as App::Events will provide default
my $event_bus_name = $task->{event_bus_name};
my $event = $self->fetch_events;
my $schedule = $task->{schedule};
if ( !$schedule ) {
$self->log_warn( 'events: no schedule for task: [%s]...skipping', $task_name );
return;
}
$self->log_info( 'events: found a schedule...validating schedule: [%s]', $schedule );
my $valid_schedule = $event->validate_schedule($schedule);
croak sprintf "ERROR: invalid schedule expression: %s\nSee: %s", $schedule, $EVENT_SCHEDULER_TYPE_URL
if !$valid_schedule;
my $rule_name = sprintf '%s-schedule', $task_name;
if ( $valid_schedule ne $schedule ) {
$self->log_warn( sprintf 'events: [%s] schedule modified [%s] automatically for you...', $schedule, $valid_schedule );
$task->{schedule} = $valid_schedule;
$schedule = $valid_schedule;
}
$self->log_info( 'events: checking if rule [%s] exists or schedule [%s] changed', $rule_name, $schedule );
my $exists = $event->rule_exists( $rule_name, $schedule );
my $rule_exists = $exists ? q{} : 'does not ';
my $schedule_changed = $exists == -1 ? q {} : 'not ';
my $level = $rule_exists ? 'warn' : 'info';
$level = $schedule_changed ? 'info' : 'error';
$level = "log_$level";
$self->$level( 'events: rule [%s] %sexists and schedule [%s] has %schanged',
$rule_name, $rule_exists, $schedule, $schedule_changed );
if ( $exists == -1 || $self->taskdef_has_changed($task_name) ) {
if ( !$dryrun ) {
$self->log_error( 'events: attempting to delete rule in case target does not exist [%s]...%s', $rule_name, $dryrun );
my $result = $event->delete_rule($rule_name);
$event->check_result(
message => 'could not delete rule: [%s]',
params => [$rule_name],
regexp => qr/has\stargets/xmsi
);
}
}
my $action = !$exists ? 'created' : 'replaced';
if ( !$exists || ( $exists == -1 || $self->taskdef_has_changed($task_name) ) ) {
$self->inc_required_resources( 'events:rule' => [$rule_name] );
$self->get_logger->warn( sprintf 'events: [%s] rule will be %s...%s', $rule_name, $action, $dryrun );
$self->log_warn( sprintf 'events: [%s] rule will be %s...%s', $rule_name, $action, $dryrun );
if ( !$dryrun ) {
$event->put_rule( rule_name => $rule_name, schedule => $schedule, state => $TRUE );
$event->check_result( message => 'ERROR: could not create rule [%s]', $rule_name );
}
$self->get_logger->warn( sprintf 'events: [%s] rule %s successfully', $rule_name, $action );
}
else {
$self->get_logger->info( sprintf 'events: rule [%s] exists...skipping', $rule_name );
$self->inc_existing_resources( 'events:rule' => $rule_name );
( run in 0.617 second using v1.01-cache-2.11-cpan-39bf76dae61 )