File Coverage

blib/lib/Eixo/Docker/EventRegister.pm
Criterion Covered Total %
statement 15 56 26.7
branch 0 10 0.0
condition 0 4 0.0
subroutine 5 15 33.3
pod 0 4 0.0
total 20 89 22.4


line stmt bran cond sub pod time code
1             package Eixo::Docker::EventRegister;
2              
3 12     12   68 use strict;
  12         26  
  12         323  
4              
5 12     12   60 use JSON;
  12         24  
  12         80  
6 12     12   10821 use IO::Select;
  12         21986  
  12         710  
7 12     12   6301 use Eixo::Docker::EventPool;
  12         33  
  12         391  
8 12     12   6016 use Eixo::Docker::Event;
  12         31  
  12         8454  
9              
10             sub new{
11              
12 0     0 0   return bless({
13              
14             api=>$_[1],
15              
16             frequency=>$_[2],
17              
18             pid_pool=>undef,
19              
20             r_pool=>undef,
21              
22             s_pool=>undef,
23              
24             events=>{},
25              
26             pool=>[],
27              
28             }, $_[0]);
29             }
30              
31             sub DESTROY {
32              
33 0 0   0     return unless($_[0]->{pid_pool});
34              
35 0           kill('TERM', $_[0]->{pid_pool});
36              
37 0           waitpid($_[0]->{pid_pool}, 0);
38             }
39              
40             #
41             # It will block forever
42             #
43             sub condvar{
44 0     0 0   my ($self) = @_;
45              
46 0           my $s = IO::Select->new;
47              
48 0           $s->add($self->{r_pool});
49              
50 0           while($s->can_read){
51 0           $self->run;
52             }
53             }
54              
55             sub run{
56 0     0 0   my ($self) = @_;
57              
58 0 0         return unless($self->{pid_pool});
59              
60 0           $self->__getEvents;
61              
62 0           $self->__runEvents;
63             }
64              
65             sub registerEvent{
66 0     0 0   my ($self, %args) = @_;
67              
68 0 0         if(!$self->{pid_pool}){
69              
70 0           $self->__launchPool;
71             }
72              
73 0           my $signature = join('-', $args{id}, $args{status});
74              
75             $self->{events}->{$signature} = Eixo::Docker::Event->new(
76              
77             $args{id},
78              
79             $args{status},
80              
81       0     $args{code} || sub {}
82 0   0       );
83             }
84              
85             sub __getEvents{
86 0     0     my ($self) = @_;
87              
88 0           my @lines;
89              
90 0           my $r = $self->{r_pool};
91              
92 0           while(my $l = $r->getline){
93 0           push @lines, $l;
94             }
95              
96 0           foreach(grep { $_ =~ /\w/ } @lines){
  0            
97 0           push @{$self->{pool}}, JSON->new->decode($_);
  0            
98             }
99             }
100              
101             sub __runEvents{
102 0     0     my ($self) = @_;
103              
104 0           foreach my $e (@{$self->{pool}}){
  0            
105              
106 0 0         if(my $event = $self->__isRegistered($e)){
107              
108 0           $event->run($e);
109              
110             }
111             }
112              
113 0           $self->{pool} = [];
114             }
115              
116             sub __isRegistered{
117 0     0     my ($self, $e) = @_;
118              
119 0           my $signature = join('-', $e->{id}, $e->{status});
120              
121 0 0         $self->{events}->{$signature} || undef;
122             }
123              
124             sub __launchPool{
125 0     0     my ($self) = @_;
126              
127             my $pool = Eixo::Docker::EventPool->new(
128              
129             0,
130              
131             $self->{api},
132              
133 0   0       $self->{frequency} || 1
134            
135             )->create;
136              
137 0           $self->{pid_pool} = $pool->{pid};
138              
139 0           $self->{r_pool} = $pool->{reader};
140            
141 0           $self->{r_pool}->blocking(0);
142              
143             #$self->{s_pool} = IO::Select->new;
144              
145             #$self->{s_pool}->add($self->{r_pool});
146             }
147              
148              
149              
150             1;