move capacity check to Queue package
This commit is contained in:
@@ -5,7 +5,7 @@ use Dancer::Plugin::DBIC 'schema';
|
|||||||
|
|
||||||
use base 'Exporter';
|
use base 'Exporter';
|
||||||
our @EXPORT = ();
|
our @EXPORT = ();
|
||||||
our @EXPORT_OK = qw/ add_jobs take_jobs reset_jobs /;
|
our @EXPORT_OK = qw/ add_jobs capacity_for take_jobs reset_jobs /;
|
||||||
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
|
our %EXPORT_TAGS = ( all => \@EXPORT_OK );
|
||||||
|
|
||||||
schema('daemon')->deploy;
|
schema('daemon')->deploy;
|
||||||
@@ -16,6 +16,30 @@ sub add_jobs {
|
|||||||
$queue->populate($jobs);
|
$queue->populate($jobs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub capacity_for {
|
||||||
|
my ($action) = @_;
|
||||||
|
|
||||||
|
my $action_map = {
|
||||||
|
Interactive => [qw/location contact portcontrol portname vlan power/]
|
||||||
|
};
|
||||||
|
|
||||||
|
my $role_map = {
|
||||||
|
map {$_ => 'Interactive'} @{ $action_map->{Interactive} }
|
||||||
|
};
|
||||||
|
|
||||||
|
my $setting_map = {
|
||||||
|
Poller => 'daemon_pollers',
|
||||||
|
Interactive => 'daemon_interactives',
|
||||||
|
};
|
||||||
|
|
||||||
|
my $role = $role_map->{$action};
|
||||||
|
my $setting = $setting_map->{$role};
|
||||||
|
|
||||||
|
my $current = $queue->search({role => $role})->count;
|
||||||
|
|
||||||
|
return ($current < setting($setting));
|
||||||
|
}
|
||||||
|
|
||||||
sub take_jobs {
|
sub take_jobs {
|
||||||
my ($wid, $role, $max) = @_;
|
my ($wid, $role, $max) = @_;
|
||||||
$max ||= 1;
|
$max ||= 1;
|
||||||
|
|||||||
@@ -12,13 +12,9 @@ use namespace::clean;
|
|||||||
|
|
||||||
my $fqdn = hostfqdn || 'localhost';
|
my $fqdn = hostfqdn || 'localhost';
|
||||||
|
|
||||||
# forward and reverse mappings for worker role to Netdisco job type (action)
|
|
||||||
# this needs updating when we invent new job types
|
|
||||||
my $action_map = {
|
|
||||||
Interactive => [qw/location contact portcontrol portname vlan power/]
|
|
||||||
};
|
|
||||||
my $role_map = {
|
my $role_map = {
|
||||||
map {$_ => 'Interactive'} @{ $action_map->{Interactive} }
|
map {$_ => 'Interactive'}
|
||||||
|
qw/location contact portcontrol portname vlan power/
|
||||||
};
|
};
|
||||||
|
|
||||||
sub worker_begin {
|
sub worker_begin {
|
||||||
@@ -47,7 +43,7 @@ sub worker_body {
|
|||||||
next unless is_discoverable($job->device);
|
next unless is_discoverable($job->device);
|
||||||
|
|
||||||
# check for available local capacity
|
# check for available local capacity
|
||||||
next unless $self->capacity_for($job);
|
next unless $self->do('capacity_for', $job->action);
|
||||||
|
|
||||||
# mark job as running
|
# mark job as running
|
||||||
next unless $self->lock_job($job);
|
next unless $self->lock_job($job);
|
||||||
@@ -68,23 +64,6 @@ sub worker_body {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sub capacity_for {
|
|
||||||
my ($self, $job) = @_;
|
|
||||||
|
|
||||||
my $setting_map = {
|
|
||||||
Poller => 'daemon_pollers',
|
|
||||||
Interactive => 'daemon_interactives',
|
|
||||||
};
|
|
||||||
|
|
||||||
my $role = $role_map->{$job->action};
|
|
||||||
my $setting = $setting_map->{$role};
|
|
||||||
|
|
||||||
my $current = schema('daemon')->resultset('Admin')
|
|
||||||
->search({role => $role})->count;
|
|
||||||
|
|
||||||
return ($current < setting($setting));
|
|
||||||
}
|
|
||||||
|
|
||||||
sub lock_job {
|
sub lock_job {
|
||||||
my ($self, $job) = @_;
|
my ($self, $job) = @_;
|
||||||
my $happy = 0;
|
my $happy = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user