File Coverage

blib/lib/Gearman/Driver/Console/Basic.pm
Criterion Covered Total %
statement 1 3 33.3
branch n/a
condition n/a
subroutine 1 1 100.0
pod n/a
total 2 4 50.0


line stmt bran cond sub pod time code
1             package Gearman::Driver::Console::Basic;
2              
3 1     1   2078 use Moose::Role;
  0            
  0            
4             use DateTime;
5             use Time::HiRes;
6              
7             =head1 NAME
8              
9             Gearman::Driver::Console::Basic - Provides basic console commands
10              
11             =head1 DESCRIPTION
12              
13             This implements the basic management console commands like C<status>,
14             C<quit>, C<shutdown>, ...
15              
16             =head1 COMMANDS
17              
18             =head2 status
19              
20             Parameters: C<none>
21              
22             status
23             GDExamples::Convert::convert_to_jpeg 0 5 0 2010-01-29T20:37:17 1970-01-01T00:00:00
24             GDExamples::Convert::convert_to_gif 0 5 0 2010-01-29T20:37:12 2010-01-29T20:37:12 some error
25             .
26              
27             Columns are separated by at least two spaces in this order:
28              
29             =over 4
30              
31             =item * job_name
32              
33             =item * min_processes
34              
35             =item * max_processes
36              
37             =item * current_processes
38              
39             =item * last_run
40              
41             =item * last_error
42              
43             =item * last_error_message
44              
45             =back
46              
47             =cut
48              
49             sub status {
50             my ($self) = @_;
51              
52             # get maximum lengths
53             my @max = ( 0, 1, 1, 1, 1, 1, 1 );
54             foreach my $job ( $self->driver->get_jobs ) {
55             my $lasterror_msg = $job->lasterror_msg;
56             $max[0] = length $job->name if $max[0] < length $job->name;
57             $max[1] = length $job->min_processes if $max[1] < length $job->min_processes;
58             $max[2] = length $job->max_processes if $max[2] < length $job->max_processes;
59             $max[3] = length $job->count_processes if $max[3] < length $job->count_processes;
60             $max[4] = length $job->lastrun if $max[4] < length $job->lastrun;
61             $max[5] = length $job->lasterror if $max[5] < length $job->lasterror;
62             }
63              
64             my @result = ();
65             foreach my $job ( $self->driver->get_jobs ) {
66             my $lasterror_msg = $job->lasterror_msg;
67             chomp $lasterror_msg;
68             push @result,
69             sprintf(
70             "%-$max[0]s %$max[1]d %$max[2]d %$max[3]d %$max[4]s %$max[5]s %s",
71             $job->name, $job->min_processes, $job->max_processes, $job->count_processes,
72             DateTime->from_epoch( epoch => $job->lastrun ),
73             DateTime->from_epoch( epoch => $job->lasterror ),
74             $lasterror_msg ? "ERROR: $lasterror_msg" : ""
75             );
76             }
77              
78             return @result;
79             }
80              
81             =head2 set_min_processes
82              
83             Parameters: C<job_name min_processes>
84              
85             set_min_processes asdf 5
86             ERR invalid_job_name: asdf
87             set_min_processes GDExamples::Convert::convert_to_jpeg ten
88             ERR invalid_value: min_processes must be >= 0
89             set_min_processes GDExamples::Convert::convert_to_jpeg 10
90             ERR invalid_value: min_processes must be smaller than max_processes
91             set_min_processes GDExamples::Convert::convert_to_jpeg 5
92             OK
93             .
94              
95             =cut
96              
97             sub set_min_processes {
98             my ( $self, $job_name, $min_processes ) = @_;
99              
100             my $job = $self->get_job($job_name);
101              
102             if ( !defined($min_processes) || $min_processes !~ /^\d+$/ || $min_processes < 0 ) {
103             die "ERR invalid_value: min_processes must be >= 0\n";
104             }
105              
106             if ( $min_processes > $job->max_processes ) {
107             die "ERR invalid_value: min_processes must be smaller than max_processes\n";
108             }
109              
110             $job->min_processes($min_processes);
111              
112             return "OK";
113             }
114              
115             =head2 set_max_processes
116              
117             Parameters: C<job_name max_processes>
118              
119             set_max_processes asdf 5
120             ERR invalid_job_name: asdf
121             set_max_processes GDExamples::Convert::convert_to_jpeg ten
122             ERR invalid_value: max_processes must be >= 0
123             set_max_processes GDExamples::Convert::convert_to_jpeg 0
124             ERR invalid_value: max_processes must be greater than min_processes
125             set_max_processes GDExamples::Convert::convert_to_jpeg 6
126             OK
127             .
128              
129             =cut
130              
131             sub set_max_processes {
132             my ( $self, $job_name, $max_processes ) = @_;
133              
134             my $job = $self->get_job($job_name);
135              
136             if ( !defined($max_processes) || $max_processes !~ /^\d+$/ || $max_processes < 0 ) {
137             die "ERR invalid_value: max_processes must be >= 0\n";
138             }
139              
140             if ( $max_processes < $job->min_processes ) {
141             die "ERR invalid_value: max_processes must be greater than min_processes\n";
142             }
143              
144             $job->max_processes($max_processes);
145              
146             return "OK";
147             }
148              
149             =head2 set_processes
150              
151             Parameters: C<job_name min_processes max_processes>
152              
153             set_processes asdf 1 1
154             ERR invalid_job_name: asdf
155             set_processes GDExamples::Convert::convert_to_jpeg ten ten
156             ERR invalid_value: min_processes must be >= 0
157             set_processes GDExamples::Convert::convert_to_jpeg 1 ten
158             ERR invalid_value: max_processes must be >= 0
159             set_processes GDExamples::Convert::convert_to_jpeg 5 1
160             ERR invalid_value: max_processes must be greater than min_processes
161             set_processes GDExamples::Convert::convert_to_jpeg 1 5
162             OK
163             .
164              
165             =cut
166              
167             sub set_processes {
168             my ( $self, $job_name, $min_processes, $max_processes ) = @_;
169              
170             my $job = $self->get_job($job_name);
171              
172             if ( !defined($min_processes) || $min_processes !~ /^\d+$/ || $min_processes < 0 ) {
173             die "ERR invalid_value: min_processes must be >= 0\n";
174             }
175              
176             if ( !defined($max_processes) || $max_processes !~ /^\d+$/ || $max_processes < 0 ) {
177             die "ERR invalid_value: max_processes must be >= 0\n";
178             }
179              
180             if ( $max_processes < $min_processes ) {
181             die "ERR invalid_value: max_processes must be greater than min_processes\n";
182             }
183              
184             $job->min_processes($min_processes);
185             $job->max_processes($max_processes);
186              
187             return "OK";
188             }
189              
190             =head2 show
191              
192             Parameters: C<job_name>
193              
194             show GDExamples::Convert::convert_to_jpeg
195             GDExamples::Convert::convert_to_jpeg 0 5 0 1970-01-01T00:00:00 1970-01-01T00:00:00
196             3662
197             3664
198             3663
199             .
200             show GDExamples::Convert::convert_to_gif
201             GDExamples::Convert::convert_to_gif 0 5 0 1970-01-01T00:00:00 1970-01-01T00:00:00
202             3665
203             .
204              
205             =cut
206              
207             sub show {
208             my ( $self, $job_name ) = @_;
209              
210             my $job = $self->get_job($job_name);
211              
212             my @result = ();
213              
214             my $lasterror_msg = $job->lasterror_msg;
215             chomp $lasterror_msg;
216              
217             push @result,
218             sprintf(
219             "%s %d %d %d %s %s %s",
220             $job->name, $job->min_processes, $job->max_processes, $job->count_processes,
221             DateTime->from_epoch( epoch => $job->lastrun ),
222             DateTime->from_epoch( epoch => $job->lasterror ),
223             $lasterror_msg ? "ERROR: $lasterror_msg" : ""
224             );
225              
226             push @result, $job->get_pids;
227              
228             return @result;
229             }
230              
231             =head2 kill
232              
233             Parameters: C<pid> [<pid> <pid> ...]
234              
235             kill 1
236             ERR invalid_value: the given PID(s) do not belong to us
237             kill 3662
238             OK
239             .
240              
241             =cut
242              
243             sub kill {
244             my ( $self, @pids ) = @_;
245              
246             my @valid_pids = ();
247             foreach my $job ( $self->driver->get_jobs ) {
248             my @job_pids = $job->get_pids;
249             foreach my $pid (@pids) {
250             if ( grep $_ eq $pid, @job_pids ) {
251             push @valid_pids, $pid;
252             }
253             }
254             }
255              
256             die "ERR invalid_value: the given PID(s) do not belong to us\n" unless @valid_pids;
257              
258             CORE::kill 15, @valid_pids;
259              
260             return "OK";
261             }
262              
263             =head2 killall
264              
265             Kills all childs/pids of given job.
266              
267             Parameters: C<job_name> [<job_name> <job_name> ...]
268              
269             killall GDExamples::Convert::convert_to_jpeg
270             OK
271             .
272              
273             It also accepts C<*> as parameter to kill all jobs, so be careful
274             with that!
275              
276             =cut
277              
278             sub killall {
279             my ( $self, @job_names ) = @_;
280              
281             die "ERR invalid_value: no job_names given\n" unless scalar(@job_names);
282              
283             my $kill = sub {
284             my ($job) = @_;
285             my @pids = $job->get_pids;
286             CORE::kill 15, @pids;
287             Time::HiRes::usleep(50); # prevent POE from freaking out
288             };
289              
290             if ( defined $job_names[0] && $job_names[0] eq '*' && scalar(@job_names) == 1 ) {
291             foreach my $job ( $self->driver->get_jobs ) {
292             $kill->($job);
293             }
294             }
295              
296             else {
297             foreach my $job_name (@job_names) {
298             my $job = $self->get_job($job_name);
299             $kill->($job);
300             }
301             }
302              
303             return "OK";
304             }
305              
306             =head2 quit
307              
308             Parameters: C<none>
309              
310             Closes your connection gracefully.
311              
312             =head2 shutdown
313              
314             Parameters: C<none>
315              
316             Shuts L<Gearman::Driver> down.
317              
318             =cut
319              
320             sub shutdown {
321             my ($self) = @_;
322             $self->driver->shutdown;
323             }
324              
325             =head1 AUTHOR
326              
327             See L<Gearman::Driver>.
328              
329             =head1 COPYRIGHT AND LICENSE
330              
331             See L<Gearman::Driver>.
332              
333             =head1 SEE ALSO
334              
335             =over 4
336              
337             =item * L<Gearman::Driver>
338              
339             =item * L<Gearman::Driver::Adaptor>
340              
341             =item * L<Gearman::Driver::Console>
342              
343             =item * L<Gearman::Driver::Console::Client>
344              
345             =item * L<Gearman::Driver::Job>
346              
347             =item * L<Gearman::Driver::Job::Method>
348              
349             =item * L<Gearman::Driver::Loader>
350              
351             =item * L<Gearman::Driver::Observer>
352              
353             =item * L<Gearman::Driver::Worker>
354              
355             =back
356              
357             =cut
358              
359             no Moose::Role;
360              
361             1;