1package App::Netdisco::Worker::Loader;
2
3use strict;
4use warnings;
5
6use Module::Load ();
7use Dancer qw/:moose :syntax/;
8
9use Moo::Role;
10use namespace::clean;
11
12has [qw/workers_check
13        workers_early
14        workers_main
15        workers_user
16        workers_store
17        workers_late/] => ( is => 'rw' );
18
19sub load_workers {
20  my $self = shift;
21  my $action = $self->job->action or die "missing action\n";
22
23  my @core_plugins = @{ setting('worker_plugins') || [] };
24  my @user_plugins = @{ setting('extra_worker_plugins') || [] };
25
26  # load worker plugins for our action
27  foreach my $plugin (@user_plugins, @core_plugins) {
28    $plugin =~ s/^X::/+App::NetdiscoX::Worker::Plugin::/;
29    $plugin = 'App::Netdisco::Worker::Plugin::'. $plugin
30      if $plugin !~ m/^\+/;
31    $plugin =~ s/^\+//;
32
33    next unless $plugin =~ m/::Plugin::${action}(?:::|$)/i;
34    $ENV{ND2_LOG_PLUGINS} && debug "loading worker plugin $plugin";
35    Module::Load::load $plugin;
36  }
37
38  # now vars->{workers} is populated, we set the dispatch order
39  my $workers = vars->{'workers'}->{$action} || {};
40  #use DDP; p vars->{'workers'};
41
42  foreach my $phase (qw/check early main user store late/) {
43    my $pname = "workers_${phase}";
44    my @wset = ();
45
46    foreach my $namespace (sort keys %{ $workers->{$phase} }) {
47      foreach my $priority (sort {$b <=> $a}
48                            keys %{ $workers->{$phase}->{$namespace} }) {
49        push @wset, @{ $workers->{$phase}->{$namespace}->{$priority} };
50      }
51    }
52
53    $self->$pname( \@wset );
54  }
55}
56
57true;
58