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 )