#1084 move slow skiplist build to the first job on running backend

This commit is contained in:
Oliver Gorwits
2023-09-05 22:55:33 +01:00
parent 8b47e7e2f8
commit 3a820c06e4
10 changed files with 180 additions and 77 deletions

View File

@@ -7,6 +7,17 @@ use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::JobQueue 'jq_insert';
use Dancer::Plugin::DBIC 'schema';
register_worker({ phase => 'check' }, sub {
return Status->defer("arpwalk skipped: have not yet primed skiplist")
unless schema(vars->{'tenant'})->resultset('DeviceSkip')
->search({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
})->count();
return Status->done('Arpwalk is able to run');
});
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;

View File

@@ -7,6 +7,17 @@ use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::JobQueue 'jq_insert';
use Dancer::Plugin::DBIC 'schema';
register_worker({ phase => 'check' }, sub {
return Status->defer("discoverall skipped: have not yet primed skiplist")
unless schema(vars->{'tenant'})->resultset('DeviceSkip')
->search({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
})->count();
return Status->done('Discoverall is able to run');
});
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;

View File

@@ -7,6 +7,17 @@ use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::JobQueue 'jq_insert';
use Dancer::Plugin::DBIC 'schema';
register_worker({ phase => 'check' }, sub {
return Status->defer("macwalk skipped: have not yet primed skiplist")
unless schema(vars->{'tenant'})->resultset('DeviceSkip')
->search({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
})->count();
return Status->done('Macwalk is able to run');
});
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;

View File

@@ -7,6 +7,17 @@ use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::JobQueue 'jq_insert';
use Dancer::Plugin::DBIC 'schema';
register_worker({ phase => 'check' }, sub {
return Status->defer("nbtwalk skipped: have not yet primed skiplist")
unless schema(vars->{'tenant'})->resultset('DeviceSkip')
->search({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
})->count();
return Status->done('Nbtwalk is able to run');
});
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;

View File

@@ -0,0 +1,60 @@
package App::Netdisco::Worker::Plugin::PrimeSkiplist;
use Dancer ':syntax';
use Dancer::Plugin::DBIC 'schema';
use App::Netdisco::Worker::Plugin;
use aliased 'App::Netdisco::Worker::Status';
use App::Netdisco::Util::Device 'get_denied_actions';
use App::Netdisco::Backend::Job;
use Try::Tiny;
register_worker({ phase => 'main' }, sub {
my ($job, $workerconf) = @_;
my $happy = false;
my $devices = schema(vars->{'tenant'})->resultset('Device');
my $rs = schema(vars->{'tenant'})->resultset('DeviceSkip');
my %actionset = ();
while (my $d = $devices->next) {
my @badactions = get_denied_actions($d);
$actionset{$d->ip} = \@badactions if scalar @badactions;
}
debug sprintf 'priming device action skip list for %d devices',
scalar keys %actionset;
try {
schema(vars->{'tenant'})->txn_do(sub {
$rs->update_or_create({
backend => setting('workers')->{'BACKEND'},
device => $_,
actionset => $actionset{$_},
}, { key => 'primary' }) for keys %actionset;
});
# add one faux record to allow *walk actions to see there is a backend running
$rs->update_or_create({
backend => setting('workers')->{'BACKEND'},
device => '255.255.255.255',
last_defer => \'LOCALTIMESTAMP',
}, { key => 'primary' });
$happy = true;
}
catch {
error $_;
};
if ($happy) {
return Status->done("Primed device action skip list");
}
else {
return Status->error("Failed to prime device action skip list");
}
});
true;