Skip to content

Commit

Permalink
Fixing describe_instance_status call to fetch all the status responses
Browse files Browse the repository at this point in the history
  • Loading branch information
Matt West committed Sep 29, 2014
1 parent 434bc32 commit f4ac462
Showing 1 changed file with 120 additions and 71 deletions.
191 changes: 120 additions & 71 deletions lib/Net/Amazon/EC2.pm
Original file line number Diff line number Diff line change
Expand Up @@ -2097,100 +2097,149 @@ sub describe_instance_status {

$self->_build_filters( \%args );
my $xml = $self->_sign( Action => 'DescribeInstanceStatus', %args );

my $instancestatuses;
my $token;

if ( grep { defined && length } $xml->{Errors} ) {
return $self->_parse_errors($xml);
}
else {
foreach my $instancestatus_elem ( @{ $xml->{instanceStatusSet}{item} } )
{
my $group_sets = [];

my $instancestatus_state = Net::Amazon::EC2::InstanceState->new(
code => $instancestatus_elem->{instanceState}{code},
name => $instancestatus_elem->{instanceState}{name},
);
my $instance_status = $self->_create_describe_instance_status( $instancestatus_elem );
push @$instancestatuses, $instance_status;
}

foreach
my $events_arr ( @{ $instancestatus_elem->{eventsSet}{item} } )
{
my $events;
if ( grep { defined && length } $events_arr->{notAfter} ) {
$events = Net::Amazon::EC2::Events->new(
code => $events_arr->{code},
description => $events_arr->{description},
not_before => $events_arr->{notBefore},
not_after => $events_arr->{notAfter},
);
if ( grep { defined && length } $xml->{nextToken} ) {
while(1) {
$args{NextToken} = $token;
$self->_build_filters( \%args );
my $tmp_xml = $self->_sign( Action => 'DescribeInstanceStatus', %args );
if ( grep { defined && length } $tmp_xml->{Errors} ) {
return $self->_parse_errors($tmp_xml);
}
else {
$events = Net::Amazon::EC2::Events->new(
code => $events_arr->{code},
description => $events_arr->{description},
not_before => $events_arr->{notBefore},
);
foreach my $tmp_instancestatus_elem ( @{ $tmp_xml->{instanceStatusSet}{item} } )
{
my $tmp_instance_status = $self->_create_describe_instance_status( $tmp_instancestatus_elem );
push @$instancestatuses, $tmp_instance_status;
}
if ( grep { defined && length } $tmp_xml->{nextToken} ) {
$token = $tmp_xml->{nextToken};
}
else {
last;
}
}
push @$group_sets, $events;
}
}
}

my $instancestatus_istatus;
if ( grep { defined && length }
$instancestatus_elem->{instanceStatus} )
{
my $details_set = [];
foreach my $details_arr (
@{ $instancestatus_elem->{instanceStatus}{details}{item} } )
{
my $details = Net::Amazon::EC2::Details->new(
status => $details_arr->{status},
name => $details_arr->{name},
);
push @$details_set, $details;
}
$instancestatus_istatus =
Net::Amazon::EC2::InstanceStatus->new(
status => $instancestatus_elem->{instanceStatus}{status},
details => $details_set,
);
}
return $instancestatuses;
}

my $instancestatus_sstatus;
if ( grep { defined && length }
$instancestatus_elem->{systemStatus} )
{
my $details_set = [];
foreach my $details_arr (
@{ $instancestatus_elem->{systemStatus}{details}{item} } )
{
my $details = Net::Amazon::EC2::Details->new(
status => $details_arr->{status},
name => $details_arr->{name},
);
push @$details_set, $details;
}
$instancestatus_sstatus = Net::Amazon::EC2::SystemStatus->new(
status => $instancestatus_elem->{systemStatus}{status},
details => $details_set,
);
}
=head2 _create_describe_instance_status(%instanceElement)
Returns a blessed object. Used internally for wrapping describe_instance_status nextToken calls
=over
=item InstanceStatusElement (required)
The instance status element we want to build out and return
=back
my $instance_status = Net::Amazon::EC2::InstanceStatuses->new(
availability_zone => $instancestatus_elem->{availabilityZone},
events => $group_sets,
instance_id => $instancestatus_elem->{instanceId},
instance_state => $instancestatus_state,
instance_status => $instancestatus_istatus,
system_status => $instancestatus_sstatus,
Returns a Net::Amazon::EC2::InstanceStatuses object
=cut

sub _create_describe_instance_status {
my $self = shift;
my $instancestatus_elem = shift;

my $group_sets = [];

my $instancestatus_state = Net::Amazon::EC2::InstanceState->new(
code => $instancestatus_elem->{instanceState}{code},
name => $instancestatus_elem->{instanceState}{name},
);

foreach
my $events_arr ( @{ $instancestatus_elem->{eventsSet}{item} } )
{
my $events;
if ( grep { defined && length } $events_arr->{notAfter} ) {
$events = Net::Amazon::EC2::Events->new(
code => $events_arr->{code},
description => $events_arr->{description},
not_before => $events_arr->{notBefore},
not_after => $events_arr->{notAfter},
);
}
else {
$events = Net::Amazon::EC2::Events->new(
code => $events_arr->{code},
description => $events_arr->{description},
not_before => $events_arr->{notBefore},
);
}
push @$group_sets, $events;
}

push @$instancestatuses, $instance_status;
my $instancestatus_istatus;
if ( grep { defined && length }
$instancestatus_elem->{instanceStatus} )
{
my $details_set = [];
foreach my $details_arr (
@{ $instancestatus_elem->{instanceStatus}{details}{item} } )
{
my $details = Net::Amazon::EC2::Details->new(
status => $details_arr->{status},
name => $details_arr->{name},
);
push @$details_set, $details;
}
$instancestatus_istatus =
Net::Amazon::EC2::InstanceStatus->new(
status => $instancestatus_elem->{instanceStatus}{status},
details => $details_set,
);
}

my $instancestatus_sstatus;
if ( grep { defined && length }
$instancestatus_elem->{systemStatus} )
{
my $details_set = [];
foreach my $details_arr (
@{ $instancestatus_elem->{systemStatus}{details}{item} } )
{
my $details = Net::Amazon::EC2::Details->new(
status => $details_arr->{status},
name => $details_arr->{name},
);
push @$details_set, $details;
}
$instancestatus_sstatus = Net::Amazon::EC2::SystemStatus->new(
status => $instancestatus_elem->{systemStatus}{status},
details => $details_set,
);
}

return $instancestatuses;
my $instance_status = Net::Amazon::EC2::InstanceStatuses->new(
availability_zone => $instancestatus_elem->{availabilityZone},
events => $group_sets,
instance_id => $instancestatus_elem->{instanceId},
instance_state => $instancestatus_state,
instance_status => $instancestatus_istatus,
system_status => $instancestatus_sstatus,

);

return $instance_status;
}

=head2 describe_instance_attribute(%params)
Expand Down

0 comments on commit f4ac462

Please sign in to comment.