#!/usr/bin/env perl
BEGIN {
$ENV
{DANCER_ENVDIR} =
'/dev/null'
; }
use
Dancer
qw/:moose :script !pass/
;
my
$CONFIG
= config();
$CONFIG
->{logger} =
'console'
;
$CONFIG
->{
log
} = (
$ENV
{
'DANCER_DEBUG'
} ?
'debug'
:
'error'
);
Dancer::Logger->init(
'console'
,
$CONFIG
);
{
}
config->{
'device_auth'
} = [{
driver
=>
'snmp'
}, {
driver
=>
'cli'
}];
my
$j1
= do_job(
'TestOne'
);
is(
$j1
->status,
'done'
,
'status is done'
);
is(
$j1
->
log
,
'OK: SNMP driver is successful.'
,
'workers are run in decreasing priority until done'
);
my
$j2
= do_job(
'TestTwo'
);
is(
$j2
->status,
'done'
,
'status is done'
);
is(
$j2
->
log
,
'OK: CLI driver is successful.'
,
'lower priority driver not run if higher is successful'
);
config->{
'device_auth'
} = [];
my
$j3
= do_job(
'TestOne'
);
is(
$j3
->status,
'defer'
,
'status is defer'
);
is(
$j3
->
log
,
'deferred job with no device creds'
,
'no matching config for workers'
);
config->{
'device_auth'
} = [{
driver
=>
'snmp'
}];
my
$j4
= do_job(
'TestThree'
);
is(
$j4
->status,
'done'
,
'status is done'
);
is(
$j4
->
log
,
'OK: SNMP driver is successful.'
,
'respect user config filtering the driver'
);
config->{
'device_auth'
} = [
{
driver
=>
'snmp'
,
action
=>
'testthree'
},
{
driver
=>
'cli'
,
action
=>
'foo'
},
];
my
$j5
= do_job(
'TestThree'
);
is(
$j5
->status,
'done'
,
'status is done'
);
is(
$j5
->
log
,
'OK: SNMP driver is successful.'
,
'respect user config filtering the action'
);
config->{
'device_auth'
} = [
{
driver
=>
'snmp'
,
action
=>
'testthree::_base_'
},
{
driver
=>
'cli'
,
action
=>
'testthree::foo'
},
];
my
$j6
= do_job(
'TestThree'
);
is(
$j6
->status,
'done'
,
'status is done'
);
is(
$j6
->
log
,
'OK: SNMP driver is successful.'
,
'respect user config filtering the namespace'
);
config->{
'device_auth'
} = [{
driver
=>
'snmp'
}];
my
$j7
= do_job(
'TestFour'
);
is(
$j7
->status,
'done'
,
'status is done'
);
is(
$j7
->
log
,
'OK: custom driver is successful.'
,
'override an action'
);
config->{
'device_auth'
} = [{
driver
=>
'snmp'
}];
my
$j8
= do_job(
'TestFive'
);
is(
$j8
->status,
'done'
,
'status is done'
);
is((
scalar
@{
$j8
->_statuslist}), 2,
'two workers ran'
);
is(
$j8
->_last_priority, 100,
'priority is for snmp'
);
is(
$j8
->
log
,
'OK: SNMP driver is successful.'
,
'add to an action'
);
config->{
'device_auth'
} = [];
my
$j9
= do_job(
'TestSix'
);
is(
$j9
->status,
'done'
,
'status is done'
);
is((
scalar
@{
$j9
->_statuslist}), 3,
'three workers ran'
);
is(
$j9
->_last_priority, 0,
'priority is for driverless action'
);
is(
$j9
->
log
,
'OK: second driverless action is successful.'
,
'driverless actions always run'
);
my
$j10
= do_job(
'TestSeven'
);
is(
$j10
->best_status,
'error'
,
'status is error'
);
is((
scalar
@{
$j10
->_statuslist}), 2,
'two workers ran'
);
is(
$j10
->_last_priority, 1000000,
'priority is for direct action'
);
done_testing;
sub
do_job {
my
$pkg
=
shift
;
config->{
'extra_worker_plugins'
} = [
"X::${pkg}"
];
my
$job
= App::Netdisco::Backend::Job->new({
job
=> 0,
device
=> App::Netdisco::DB->resultset(
'Device'
)->new_result({
ip
=>
'192.0.2.1'
}),
action
=>
lc
(
$pkg
),
});
try
{
MyWorker->new()->run(
$job
);
}
catch
{
$job
->status(
'error'
);
$job
->
log
(
"error running job: $_"
);
};
return
$job
;
}