use
Dancer
qw/:moose :syntax !error/
;
foreach
my
$slot
(
qw/
job
entered
started
finished
device
port
action
only_namespace
subaction
status
username
userip
log
device_key
backend
job_priority
is_cancelled
is_offline
_current_phase
_last_namespace
_last_priority
/
) {
has
$slot
=> (
is
=>
'rw'
,
);
}
has
'_statuslist'
=> (
is
=>
'rw'
,
default
=>
sub
{ [] },
);
sub
BUILD {
my
(
$job
,
$args
) =
@_
;
if
(
$job
->action =~ m/^(\w+)::(\w+)$/i) {
$job
->action($1);
$job
->only_namespace($2);
}
if
(!
defined
$job
->subaction) {
$job
->subaction(
''
);
}
}
sub
display_name {
my
$job
=
shift
;
return
join
' '
,
$job
->action,
(
$job
->device ||
''
),
(
$job
->port ||
''
);
}
sub
cancel {
my
(
$job
,
$msg
) =
@_
;
$msg
||=
'unknown reason for cancelled job'
;
$job
->is_cancelled(true);
return
Status->error(
$msg
);
}
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
;
}
sub
finalise_status {
my
$job
=
shift
;
$job
->status(
'error'
);
$job
->
log
(
'failed to report from any worker!'
);
my
$max_level
= 0;
foreach
my
$status
(
reverse
@{
$job
->_statuslist }) {
next
if
$status
->phase
and
$status
->phase !~ m/^(?:check|early|main|user|store|late)$/;
next
if
$status
->phase eq
'check'
and
$status
->is_ok;
if
((
$max_level
!= Status->done()->level and
$status
->level >=
$max_level
)
or (
$status
->level >
$max_level
)) {
$job
->status(
$status
->status );
$job
->
log
(
$status
->
log
);
$max_level
=
$status
->level;
}
}
}
sub
check_passed {
my
$job
=
shift
;
return
true
if
0 ==
scalar
@{
$job
->_statuslist };
foreach
my
$status
(@{
$job
->_statuslist }) {
return
true
if
((
$status
->phase eq
'check'
) and
$status
->is_ok);
}
return
false;
}
sub
namespace_passed {
my
(
$job
,
$workerconf
) =
@_
;
if
(
$job
->_last_namespace) {
foreach
my
$status
(@{
$job
->_statuslist }) {
next
unless
(
$status
->phase eq
$workerconf
->{phase})
and (
$workerconf
->{namespace} eq
$job
->_last_namespace)
and (
$workerconf
->{priority} <
$job
->_last_priority);
return
true
if
$status
->is_ok;
}
}
$job
->_last_namespace(
$workerconf
->{namespace} );
$job
->_last_priority(
$workerconf
->{priority} );
return
false;
}
sub
enter_phase {
my
(
$job
,
$phase
) =
@_
;
$job
->_current_phase(
$phase
);
debug BRIGHT_CYAN,
"//// "
,
uc
(
$phase
),
' \\\\\\\\ '
, GREY10,
'phase'
, RESET;
$job
->_last_namespace(
undef
);
$job
->_last_priority(
undef
);
}
sub
add_status {
my
(
$job
,
$status
) =
@_
;
return
unless
ref
$status
eq
'App::Netdisco::Worker::Status'
;
$status
->phase(
$job
->_current_phase ||
''
);
push
@{
$job
->_statuslist },
$status
;
if
(
$status
->
log
) {
debug GREEN,
"\N{LEFTWARDS BLACK ARROW} "
, BRIGHT_GREEN,
'('
,
$status
->status,
') '
, GREEN,
$status
->
log
, RESET;
}
}
sub
id { (
shift
)->job }
sub
extra { (
shift
)->subaction }
true;