App-FargateStack

 view release on metacpan or  search on metacpan

lib/App/FargateStack.pm  view on Meta::CPAN


  my $title = sprintf "Service:[%s]\n", $self->maybe_color( bright_white => $service_name );

  $title .= sprintf "Status:[%s] Running:[%s] Pending:[%s] Desired:[%s]\n",
    $status,
    $self->maybe_color( green        => $running_count ),
    $self->maybe_color( yellow       => $pending_count ),
    $self->maybe_color( bright_white => $desired_count );

  $title .= sprintf 'Task Definition: [%s]', $self->maybe_color( 'bright_white' => $task_definition_arn );

  my @events = grep {defined} @{ $result->{events} }[ 0 .. ( $self->get_max_events - 1 ) ];

  my @data = map { { 'Time' => $_->{createdAt}, Event => wrap( q{}, q{}, $_->{message} ) } } @events;

  print {*STDOUT} easy_table(
    table_options => { headingText => $title, allowANSI => $TRUE },
    data          => \@data,
    columns       => [qw(Time Event)],
  );

  $self->display_task_status($service_name);

  return $SUCCESS;
}

########################################################################
sub display_task_status {
########################################################################
  my ( $self, $service_name ) = @_;

  my $ecs = $self->fetch_ecs;

  my $cluster_name = $self->get_config->{cluster}->{name};

  my $task_arns = $ecs->list_tasks( $cluster_name, 'taskArns' );
  $ecs->check_result( message => 'ERROR: could not list tasks for cluster: [%s]', $cluster_name );

  return
    if !@{$task_arns};

  $task_arns = [ map { basename($_) } @{$task_arns} ];

  my $query
    = sprintf
    'tasks[?group == `service:%s`].{started_at:startedAt, task_definition_arn:taskDefinitionArn, last_status:lastStatus, image_digest:containers[0].imageDigest}',
    $service_name;

  my $service_tasks = $ecs->describe_tasks( $cluster_name, $task_arns, $query );
  $ecs->check_result( message => 'ERROR: Could not describe tasks: [%s]', join q{,}, @{$task_arns} );

  $self->log_debug( sub { return Dumper( [ service_tasks => $service_tasks ] ) } );

  my @data;

  foreach my $task ( @{$service_tasks} ) {
    my ( $image_digest, $task_definition_arn, $started_at, $last_status )
      = @{$task}{qw(image_digest task_definition_arn started_at last_status)};

    my $short_image_digest        = abbrev( $image_digest, 16 );
    my $short_task_definition_arn = ( split m{/}xsm, $task_definition_arn )[-1];

    my $latest_task_definition_arn = $self->get_latest_task_definition($service_name);

    my $latest_image_digest = $self->get_latest_image($service_name)->{imageDigest};

    $last_status = $self->maybe_color( $last_status eq 'RUNNING' ? 'green' : 'yellow' => $last_status );

    $self->log_debug(
      sub {
        return Dumper(
          [ task                => $task,
            latest_image_digest => $latest_image_digest
          ]
        );
      }
    );

    my $task_definition_status = choose {
      return $self->maybe_color( green => 'Current' )
        if $task_definition_arn eq $latest_task_definition_arn;

      return $self->maybe_color( red => ( split m{/}xsm, $latest_task_definition_arn )[-1] );
    };

    $image_digest //= q{};

    my $image_digest_status = choose {
      return $self->maybe_color( green => 'Current' )
        if $image_digest eq $latest_image_digest;

      return $self->maybe_color( red => abbrev( $latest_image_digest, 16 ) );
    };

    push @data,
      {
      'Started At'             => $started_at,
      'Status'                 => $last_status,
      'Task Definition'        => $short_task_definition_arn,
      'Task Definition Status' => $task_definition_status,
      'Image Digest'           => $short_image_digest,
      'Image Status'           => $image_digest_status,
      };
  }

  print {*STDOUT} "\n\n",
    easy_table(
    table_options => { headingText => 'Task Status', allowANSI => $TRUE },
    data          => \@data,
    columns       => [ 'Started At', 'Status', 'Task Definition', 'Task Definition Status', 'Image Digest', 'Image Status' ],
    );

  return;
}

########################################################################
sub get_default_task_name {
########################################################################
  my ( $self, $type, $filter ) = @_;

  my $tasks = $self->common_args('tasks');

  my ($task_name) = $self->get_args;

  return $task_name
    if $task_name;

  my @task_names = keys %{$tasks};

  return $task_names[0]
    if @task_names == 1;

  $type //= 'task';

  my @tasks = grep { $tasks->{$_}->{type} eq $type } keys %{$tasks};

  if ($filter) {
    @tasks = grep { defined $tasks->{$_}->{$filter} } @tasks;
  }

  # more than 1, error or we found just 1
  return $tasks[1] ? $EMPTY : $tasks[0];
}



( run in 0.624 second using v1.01-cache-2.11-cpan-6b5c3043376 )