allow store() to pick the best status of any connecting worker

This commit is contained in:
Oliver Gorwits
2019-03-20 12:15:09 +00:00
parent 39805adf69
commit c4f9810e7d
2 changed files with 30 additions and 7 deletions

View File

@@ -81,14 +81,35 @@ sub cancel {
return Status->error($msg); return Status->error($msg);
} }
=head2 best_status
Find the best status so far. The process is to track back from the last worker
and find the highest scoring status, skipping the check phase.
=cut
sub best_status {
my $job = shift;
my $cur_level = 0;
my $cur_status = '';
foreach my $status (reverse @{ $job->_statuslist }) {
next if $status->phase
and $status->phase !~ m/^(?:early|main|store|late)$/;
if ($status->level >= $cur_level) {
$cur_level = $status->level;
$cur_status = $status->status;
}
}
return $cur_status;
}
=head2 finalise_status =head2 finalise_status
Find the best status and log it into the job's C<status> and C<log> slots. Find the best status and log it into the job's C<status> and C<log> slots.
The process is to track back from the last worker and find the best status,
which is C<done> in early or main phases, or else any status in any non-user
phase.
=cut =cut
sub finalise_status { sub finalise_status {

View File

@@ -35,7 +35,9 @@ register_worker({ phase => 'store' }, sub {
$device->ip, scalar @{ vars->{'v6arps'} }; $device->ip, scalar @{ vars->{'v6arps'} };
$device->update({last_arpnip => \$now}); $device->update({last_arpnip => \$now});
return Status->done("Ended arpnip for $device");
my $status = $job->best_status;
return Status->$status("Ended arpnip for $device");
}); });
register_worker({ phase => 'main', driver => 'snmp' }, sub { register_worker({ phase => 'main', driver => 'snmp' }, sub {
@@ -53,7 +55,7 @@ register_worker({ phase => 'main', driver => 'snmp' }, sub {
push @{ vars->{'v6arps'} }, push @{ vars->{'v6arps'} },
@{get_arps_snmp($device, $snmp->ipv6_n2p_mac, $snmp->ipv6_n2p_addr) }; @{get_arps_snmp($device, $snmp->ipv6_n2p_mac, $snmp->ipv6_n2p_addr) };
return Status->info("Gathered arp caches from $device"); return Status->done("Gathered arp caches from $device");
}); });
# get an arp table (v4 or v6) # get an arp table (v4 or v6)
@@ -97,7 +99,7 @@ register_worker({ phase => 'main', driver => 'cli' }, sub {
push @{ vars->{'v6arps'} }, push @{ vars->{'v6arps'} },
grep { NetAddr::IP::Lite->new($_->{ip})->bits == 128 } @arps; grep { NetAddr::IP::Lite->new($_->{ip})->bits == 128 } @arps;
return Status->info("Gathered arp caches from $device"); return Status->done("Gathered arp caches from $device");
}); });
sub get_arps_cli { sub get_arps_cli {