API workers using Gearman::Driver
authorDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 14 Apr 2012 18:47:26 +0000 (20:47 +0200)
committerDobrica Pavlinusic <dpavlin@rot13.org>
Sat, 14 Apr 2012 18:48:06 +0000 (20:48 +0200)
gearman/api_workers.pl [new file with mode: 0755]
lib/CloudStore/Gearman/API.pm [new file with mode: 0644]

diff --git a/gearman/api_workers.pl b/gearman/api_workers.pl
new file mode 100755 (executable)
index 0000000..d08b285
--- /dev/null
@@ -0,0 +1,34 @@
+#!/usr/bin/env perl
+use strict;
+use warnings;
+use Gearman::Driver;
+use lib '/srv/cloudstore/lib';
+
+BEGIN {
+       $ENV{NAME} ||= $1 if $0 =~ m{([^/]+)$};
+       die "no SLICE in enviroment" unless $ENV{SLICE};
+}
+
+our $log = "$ENV{SLICE}/log/$ENV{NAME}.log",
+
+my $driver = Gearman::Driver->new(
+       namespaces => [qw(CloudStore::Gearman)],
+       configfile => 'config.yaml',
+       loglevel   => 'DEBUG',
+       logfile    => $log,
+       server     => $ENV{GEARMAN} || 'localhost:4730',
+       interval   => 3,
+       job_runtime_attributes => {
+               'CloudStore::Gearman::API::create_user' => {
+                       max_processes => 1,
+                       min_processes => 1,
+               },
+       },
+);
+
+open(my $pid, '>', "/tmp/$ENV{NAME}.pid");
+print $pid "$$\n";
+close $pid;
+
+warn localtime() . " STARTED $ENV{NAME} pid $$ log $log\n";
+$driver->run;
diff --git a/lib/CloudStore/Gearman/API.pm b/lib/CloudStore/Gearman/API.pm
new file mode 100644 (file)
index 0000000..0a1d0a0
--- /dev/null
@@ -0,0 +1,121 @@
+package CloudStore::Gearman::API;
+use base qw(Gearman::Driver::Worker);
+use Moose;
+
+=head1 NAME
+
+Gearman API workers
+
+=cut
+
+use Data::Dump qw(dump);
+use autodie;
+
+use lib '/srv/cloudstore/lib';
+use CloudStore::API;
+#use WarnColor;
+
+
+use base qw(Gearman::Driver::Worker);
+
+sub prefix { '' } # don't prefix methods with package
+
+sub process_name {
+        my ( $self, $orig, $job_name ) = @_;
+        warn "# process_name $orig $job_name\n";
+        return "$orig ($job_name)";
+}
+
+sub chomp_work {
+       my ($self,$work) = @_;
+       chomp $work;
+       return $work;
+}
+
+our $api = CloudStore::API->new;
+
+=head2 create_user "user_id password quota"
+
+=cut
+
+sub create_user : Job : Decode(chomp_work) : MinProcesses(1) : MaxProcesses(1) {
+       my ( $self, $job, $work ) = @_;
+
+       warn "# create_user [$work]\n";
+       my ( $email, $password, $quota ) = split(/\s+/,$work,3);
+       $quota ||= 200000 && warn "default quota";
+       $api->create_user( $email, $password, $quota );
+}
+
+=head2 send_file ~u2001/from.txt#~u2003/dir/new to.txt
+
+=cut
+
+sub send_file : Job : Decode(chomp_work) : MaxProcesses(2) {
+       my ( $self, $job, $work ) = @_;
+
+       warn "# send_file [$work]\n";
+
+       my ( $from, $to ) = split(/#/,$work,2);
+       
+       my $f_uid = $1 if $from =~ s{~(\w+)/}{};
+       my $t_uid = $1 if $to   =~ s{~(\w+)/}{};
+
+       warn "send_file $f_uid $from -> $t_uid $to\n";
+
+       $api->send_file( $f_uid => $from, $t_uid => $to );
+}
+
+=head2 rename_file ~u2001/old.txt#new.txt
+
+=cut
+
+sub rename_file : Job : Decode(chomp_work) : MaxProcesses(2) {
+       my ( $self, $job, $work ) = @_;
+
+       warn "# rename_file [$work]\n";
+
+       my ( $from, $to ) = split(/#/,$work,2);
+       my $login = $1 if $from =~ s{~(\w+)/}{};
+       $api->rename_file( $login, $from, $to );
+}
+
+=head2 delete ~u2001/file_or_dir
+
+=cut
+
+sub delete : Job : Decode(chomp_work) : MaxProcesses(2) {
+       my ( $self, $job, $work ) = @_;
+
+       warn "# delete [$work]\n";
+
+       my $login = $1 if $work =~ s{~(\w+)}{};
+       $api->delete( $login, $work );
+
+}
+
+=head2 file_size ~u2001/foo.txt
+
+=cut
+
+sub file_size : Job : Decode(chomp_work) : MaxProcesses(40) {
+       my ( $self, $job, $work ) = @_;
+
+       warn "# file_size [$work]\n";
+
+       my $login = $1 if $work =~ s{~(\w+)}{};
+       $api->file_size( $login, $work );
+}
+
+=head2 user_usage u2001
+
+=cut
+
+sub user_usage : Job : Decode(chomp_work) : MaxProcesses(40) {
+       my ( $self, $job, $work ) = @_;
+       warn "# usage [$work]\n";
+       my $usage = $api->usage( $work );
+       return $usage->{_usage};
+}
+
+1;