Added initial Minion support and example test job
This commit is contained in:
parent
cc6ea41ce5
commit
1302f9e843
6 changed files with 101 additions and 0 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -2,6 +2,8 @@
|
||||||
myapp.conf
|
myapp.conf
|
||||||
hypnotoad.pid
|
hypnotoad.pid
|
||||||
*.db
|
*.db
|
||||||
|
*.db-wal
|
||||||
|
*.db-shm
|
||||||
*~
|
*~
|
||||||
/images
|
/images
|
||||||
*.swp
|
*.swp
|
||||||
|
|
36
README.md
36
README.md
|
@ -22,3 +22,39 @@ cpanm --installdeps . --with-feature postgres
|
||||||
PEAR_TEST_PG=1 prove -lr
|
PEAR_TEST_PG=1 prove -lr
|
||||||
```
|
```
|
||||||
|
|
||||||
|
# Minion
|
||||||
|
|
||||||
|
to set up minion support, you will need to create a database and user for
|
||||||
|
minion to connect to. In production his should be a PostgreSQL database,
|
||||||
|
however an SQLite db can be used in testing.
|
||||||
|
|
||||||
|
To use the SQLite version, run the following commands:
|
||||||
|
|
||||||
|
```
|
||||||
|
cpanm --installdeps --with-feature sqlite .
|
||||||
|
```
|
||||||
|
|
||||||
|
And then add the following to your configuration file:
|
||||||
|
|
||||||
|
```
|
||||||
|
minion => {
|
||||||
|
SQLite => 'sqlite:minion.db',
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
This will then use an SQLite db for the minion backend, at minion.db
|
||||||
|
|
||||||
|
|
||||||
|
## Example PostgreSQL setup
|
||||||
|
|
||||||
|
```
|
||||||
|
# Example commands - probably not the best ones
|
||||||
|
# TODO come back and improve these with proper ownership and DDL rights
|
||||||
|
sudo -u postgres createuser minion
|
||||||
|
sudo -u postgres createdb localloop_minion
|
||||||
|
sudo -u postgres psql
|
||||||
|
psql=# alter user minion with encrypted password 'abc123';
|
||||||
|
psql=# grant all privileges on database localloop_minion to minion;
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
4
cpanfile
4
cpanfile
|
@ -39,6 +39,10 @@ feature 'postgres', 'PostgreSQL Support' => sub {
|
||||||
requires 'Test::PostgreSQL';
|
requires 'Test::PostgreSQL';
|
||||||
};
|
};
|
||||||
|
|
||||||
|
feature 'sqlite', 'SQLite Support' => sub {
|
||||||
|
requires 'Minion::Backend::SQLite';
|
||||||
|
};
|
||||||
|
|
||||||
feature 'codepoint-open', 'Code Point Open manipulation' => sub {
|
feature 'codepoint-open', 'Code Point Open manipulation' => sub {
|
||||||
requires 'Geo::UK::Postcode::CodePointOpen';
|
requires 'Geo::UK::Postcode::CodePointOpen';
|
||||||
};
|
};
|
||||||
|
|
|
@ -42,6 +42,7 @@ sub startup {
|
||||||
$self->plugin('Pear::LocalLoop::Plugin::Currency');
|
$self->plugin('Pear::LocalLoop::Plugin::Currency');
|
||||||
$self->plugin('Pear::LocalLoop::Plugin::Postcodes');
|
$self->plugin('Pear::LocalLoop::Plugin::Postcodes');
|
||||||
$self->plugin('Pear::LocalLoop::Plugin::TemplateHelpers');
|
$self->plugin('Pear::LocalLoop::Plugin::TemplateHelpers');
|
||||||
|
$self->plugin('Pear::LocalLoop::Plugin::Minion');
|
||||||
|
|
||||||
$self->plugin('Authentication' => {
|
$self->plugin('Authentication' => {
|
||||||
'load_user' => sub {
|
'load_user' => sub {
|
||||||
|
@ -187,6 +188,12 @@ sub startup {
|
||||||
|
|
||||||
my $admin_routes = $r->under('/admin')->to('admin#under');
|
my $admin_routes = $r->under('/admin')->to('admin#under');
|
||||||
|
|
||||||
|
if ( defined $config->{minion} ) {
|
||||||
|
$self->plugin( 'Minion::Admin' => {
|
||||||
|
return_to => '/admin/home',
|
||||||
|
route => $admin_routes->any('/minion'),
|
||||||
|
} );
|
||||||
|
}
|
||||||
$admin_routes->get('/home')->to('admin#home');
|
$admin_routes->get('/home')->to('admin#home');
|
||||||
|
|
||||||
$admin_routes->get('/tokens')->to('admin-tokens#index');
|
$admin_routes->get('/tokens')->to('admin-tokens#index');
|
||||||
|
|
37
lib/Pear/LocalLoop/Plugin/Minion.pm
Normal file
37
lib/Pear/LocalLoop/Plugin/Minion.pm
Normal file
|
@ -0,0 +1,37 @@
|
||||||
|
package Pear::LocalLoop::Plugin::Minion;
|
||||||
|
use Mojo::Base 'Mojolicious::Plugin';
|
||||||
|
|
||||||
|
use Mojo::Loader qw/ find_modules load_class /;
|
||||||
|
|
||||||
|
sub register {
|
||||||
|
my ( $plugin, $app, $cong ) = @_;
|
||||||
|
|
||||||
|
if ( defined $app->config->{minion} ) {
|
||||||
|
$app->log->debug('Setting up Minion');
|
||||||
|
$app->plugin('Minion' => $app->config->{minion} );
|
||||||
|
|
||||||
|
my $job_namespace = __PACKAGE__ . '::Job';
|
||||||
|
my @modules = find_modules $job_namespace;
|
||||||
|
for my $package ( @modules ) {
|
||||||
|
my ( $job ) = $package =~ /${job_namespace}::(.*)$/;
|
||||||
|
$app->log->debug( $package );
|
||||||
|
$app->log->debug( $job );
|
||||||
|
load_class $package;
|
||||||
|
$app->minion->add_task(
|
||||||
|
$job => sub {
|
||||||
|
my ( $job, @args ) = @_;
|
||||||
|
my $job_runner = $package->new(
|
||||||
|
job => $job,
|
||||||
|
);
|
||||||
|
$job_runner->run( @args );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$app->minion->enqueue('test' => [ 'test arg 1', 'test_arg 2' ] );
|
||||||
|
} else {
|
||||||
|
$app->log->debug('No Minion Config');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
15
lib/Pear/LocalLoop/Plugin/Minion/Job/test.pm
Normal file
15
lib/Pear/LocalLoop/Plugin/Minion/Job/test.pm
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
package Pear::LocalLoop::Plugin::Minion::Job::test;
|
||||||
|
use Mojo::Base -base;
|
||||||
|
|
||||||
|
has [ qw/ job / ];
|
||||||
|
|
||||||
|
sub run {
|
||||||
|
my ( $self, @args ) = @_;
|
||||||
|
|
||||||
|
$self->job->app->log->debug( 'Testing Job' );
|
||||||
|
for my $arg ( @args ) {
|
||||||
|
$self->job->app->log->debug( $arg );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
Reference in a new issue