App-FargateStack

 view release on metacpan or  search on metacpan

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

    max_capacity
    metric
    min_capacity
    policy_arn
    policy_name
    requests
    scale_in_cooldown
    scale_out_cooldown
    scheduled_actions
    task_name
  )
);

use parent qw(Class::Accessor::Fast);

########################################################################
sub new {
########################################################################
  my ( $class, @args ) = @_;

  my $options = ref $args[0] ? $args[0] : {@args};

  die 'usage: App::FargateStack::AutoscalingConfig->new(config => autoscaling-config)'
    if !$options->{config};

  my $self = $class->SUPER::new($options);

  foreach (qw(cpu requests scale_in_cooldown scale_out_cooldown policy_name)) {
    next if !defined $self->get($_);

    $self->update( $_ => $self->get($_) );
  }

  $self->parse_metric();

  if ( $self->get_cpu || $self->get_requests ) {
    $self->parse_cooldown();

    $self->parse_scaling_capacity();
  }

  $self->parse_scheduled_actions();

  $self->sanity_check();

  return $self;
}

########################################################################
sub sanity_check {
########################################################################
  my ($self) = @_;

  die 'autoscaling: cpu & requests are mutually exclusive'
    if $self->get_cpu && $self->get_requests;

  return;
}

########################################################################
sub update {
########################################################################
  my ( $self, $key, $value ) = @_;

  $self->get_config->{$key} = $value;

  return $self->set( $key, $value );
}

########################################################################
sub has_scheduled_action {
########################################################################
  my ($self) = @_;

  return exists $self->get_config->{scheduled};
}

########################################################################
sub parse_scheduled_actions {
########################################################################
  my ($self) = @_;

  return
    if !$self->has_scheduled_action;

  my $scheduled = $self->get_config->{scheduled};

  my %scheduled_actions;

  foreach my $scheduled_action_name ( keys %{$scheduled} ) {
    $scheduled_actions{$scheduled_action_name} = $self->_parse_scheduled_action( $scheduled->{$scheduled_action_name} );
  }

  $self->set_scheduled_actions( \%scheduled_actions );

  return $self;
}

########################################################################
sub parse_cooldown {
########################################################################
  my ($self) = @_;

  return
    if !$self->get_cpu && !$self->get_requests;

  my $config = $self->get_config;

  my $scale_out_cooldown = $self->get_scale_out_cooldown // $config->{scale_out_cooldown};
  my $scale_in_cooldown  = $self->get_scale_in_cooldown  // $config->{scale_in_cooldown};

  $scale_out_cooldown ||= $DEFAULT_AUTOSCALING_SCALE_OUT_COOLDOWN;
  $scale_in_cooldown  ||= $DEFAULT_AUTOSCALING_SCALE_IN_COOLDOWN;

  $self->update( scale_out_cooldown => int $scale_out_cooldown );
  $self->update( scale_in_cooldown  => int $scale_in_cooldown );

  return $self;
}

########################################################################



( run in 0.985 second using v1.01-cache-2.11-cpan-39bf76dae61 )