1d2151e752ebb4adbdb19eeb027a2b3cb81e0c3f
[services/obs-event-plugin.git] / notify_buildmonitor.pm
1 ################################################################
2 #
3 # Module for BuildMonitor DB logging.
4 #
5 package notify_buildmonitor;
6
7 use BSConfig;
8 use BuildMonitorDB;
9 use Data::Dumper;
10 use BSRPC;
11 use MIME::Base64;
12 use JSON::XS;
13
14 use strict;
15
16 sub new {
17   my $self = {};
18   bless $self, shift;
19   return $self;
20 }
21
22 sub trigger_make_dep_graph {
23   my ($build_project_id, $proj_name, $repo, $arch) = @_;
24
25   # trigger making build_progress graph.
26   my $jenkinsuri = "$BSConfig::jenkinsserver/job/make_dep_graph/buildWithParameters";
27   my $param = {
28     'request' => 'POST',
29     'uri' => $jenkinsuri,
30     'timeout' => 60,
31     'maxredirects' => 1,
32   };
33   my $args = {
34     'action' => 'build_progress',
35     'build_project_id'=>$build_project_id,
36     'obs_project' => $proj_name,
37     'repo' => $repo,
38     'arch' => $arch,
39   };
40   my @para = ("TRIGGER_INFO=".encode_base64(encode_json($args), ''));
41   print "notify: trigger Jenkins uri=[$jenkinsuri] para=[@para]\n";
42   eval {
43     BSRPC::rpc( $param, undef, @para );
44   };
45   warn("Jenkins: $@") if $@;
46 }
47
48 sub srcsrv_start {
49   my ($paramRef) = @_;
50
51   # update all projects and packages info.
52   print "[", __LINE__, "] SRCSRV_START!\n";
53
54   my $start_time = BuildMonitorDB::get_cur_time();
55   BuildMonitorDB::initialize_projpack_info($paramRef->{'projpack'});
56   my $elapsed_time = BuildMonitorDB::get_cur_time() - $start_time; 
57   print "[",__LINE__,"] took $elapsed_time seconds.\n";
58 }
59
60 sub srcsrv_create_project {
61   my ($paramRef) = @_;
62
63   my $proj_name = $paramRef->{'project'};
64   my $description = $paramRef->{'description'};
65
66   print "[", __LINE__, "] create a project ($proj_name, $description)\n";
67   BuildMonitorDB::insert_or_update_project_info($proj_name, $description);
68
69   if( $proj_name =~ /home:prerelease/ ) {
70     # This process is required only for prerelease projects.
71     BuildMonitorDB::insert_build_project_table($proj_name);
72   }
73 }
74
75 sub srcsrv_update_project {
76   my ($paramRef) = @_;
77
78   my $proj_name = $paramRef->{'project'};
79   my $description = $paramRef->{'description'};
80
81   print "[", __LINE__, "] update a project ($proj_name, $description)\n";
82   BuildMonitorDB::insert_or_update_project_info($proj_name, $description);
83 }
84
85 sub srcsrv_delete_project {
86   my ($paramRef) = @_;
87
88   my $proj_name = $paramRef->{'project'};
89
90   print "[", __LINE__, "] delete a project ($proj_name )\n";
91   BuildMonitorDB::delete_project_info($proj_name);
92 }
93
94 sub srcsrv_create_package {
95   my ($paramRef) = @_;
96
97   my $proj_name = $paramRef->{'project'};
98   my $pkg_name  = $paramRef->{'package'};
99   my $description = $paramRef->{'description'};
100
101   print "[", __LINE__, "] create a package ($proj_name, $pkg_name, $description)\n";
102   BuildMonitorDB::insert_or_update_package_info($proj_name, $pkg_name, $description);
103 }
104
105 sub srcsrv_update_package {
106   my ($paramRef) = @_;
107
108   my $proj_name = $paramRef->{'project'};
109   my $pkg_name  = $paramRef->{'package'};
110   my $description = $paramRef->{'description'};
111
112   print "[", __LINE__, "] update a package ($proj_name, $pkg_name, $description)\n";
113   BuildMonitorDB::insert_or_update_package_info($proj_name, $pkg_name, $description);
114 }
115
116 sub srcsrv_delete_package {
117   my ($paramRef) = @_;
118
119   my $proj_name = $paramRef->{'project'};
120   my $pkg_name  = $paramRef->{'package'};
121
122   print "[", __LINE__, "] delete a package ($proj_name, $pkg_name)\n";
123   BuildMonitorDB::delete_package_info($proj_name, $pkg_name);
124 }
125
126 sub srcsrv_request_accepted {
127   my ($paramRef) = @_;
128
129   my $target_proj = $paramRef->{'targetproject'};
130   my $source_proj = $paramRef->{'sourceproject'};
131
132   print "[", __LINE__, "] request accepted src=$source_proj, target=$target_proj\n";
133   BuildMonitorDB::insert_build_project_table($target_proj);
134 }
135
136 sub build_start {
137   my ($paramRef) = @_;
138
139   my $proj_name = $paramRef->{'project'};
140   my $repo = $paramRef->{'repository'};
141   my $arch = $paramRef->{'arch'};
142   my $pkg_name = $paramRef->{'package'};
143   my $reason = $paramRef->{'reason'};
144
145   my $config = "test";
146
147   BuildMonitorDB::package_build_start($config, $proj_name, $repo, $arch, $pkg_name, $reason);
148 }
149
150 sub build_unchanged {
151   my ($paramRef) = @_;
152
153   my $proj_name = $paramRef->{'project'};
154   my $repo = $paramRef->{'repository'};
155   my $arch = $paramRef->{'arch'};
156   my $pkg_name = $paramRef->{'package'};
157   my $build_result_dir = $paramRef->{'build_result_dir'};
158
159   my $status = "unchanged";
160   my $config = "test";
161
162   BuildMonitorDB::package_build_finished($config, $proj_name, $repo, $arch, $pkg_name, $status, $build_result_dir);
163 }
164
165 sub build_success {
166   my ($paramRef) = @_;
167
168   my $proj_name = $paramRef->{'project'};
169   my $repo = $paramRef->{'repository'};
170   my $arch = $paramRef->{'arch'};
171   my $pkg_name = $paramRef->{'package'};
172   my $build_result_dir = $paramRef->{'build_result_dir'};
173
174   my $status = "succeeded";
175   my $config = "test";
176
177   BuildMonitorDB::package_build_finished($config, $proj_name, $repo, $arch, $pkg_name, $status, $build_result_dir);
178 }
179
180 sub build_fail {
181   my ($paramRef) = @_;
182
183   my $proj_name = $paramRef->{'project'};
184   my $repo = $paramRef->{'repository'};
185   my $arch = $paramRef->{'arch'};
186   my $pkg_name = $paramRef->{'package'};
187   my $build_result_dir = $paramRef->{'build_result_dir'};
188
189   my $status = "failed";
190   my $config = "test";
191
192   BuildMonitorDB::package_build_finished($config, $proj_name, $repo, $arch, $pkg_name, $status, $build_result_dir);
193 }
194
195 sub build_broken {
196   my ($paramRef) = @_;
197
198   my $proj_name = $paramRef->{'project'};
199   my $repo = $paramRef->{'repository'};
200   my $arch = $paramRef->{'arch'};
201   my $pkg_name = $paramRef->{'package'};
202   my $detail = $paramRef->{'detail'};
203
204   my $status = "broken";
205   my $config = "test";
206
207   BuildMonitorDB::package_build_status($config, $proj_name, $repo, $arch, $pkg_name, $status, $detail);
208 }
209
210 sub build_unresolvable {
211   my ($paramRef) = @_;
212
213   my $proj_name = $paramRef->{'project'};
214   my $repo = $paramRef->{'repository'};
215   my $arch = $paramRef->{'arch'};
216   my $pkg_name = $paramRef->{'package'};
217   my $detail = $paramRef->{'detail'};
218
219   my $status = "unresolvable";
220   my $config = "test";
221
222   BuildMonitorDB::package_build_status($config, $proj_name, $repo, $arch, $pkg_name, $status, $detail);
223 }
224
225 sub repo_publish_state {
226   my ($paramRef) = @_;
227
228   my $proj_name = $paramRef->{'project'};
229   my $repo = $paramRef->{'repo'};
230   my $state = $paramRef->{'state'};
231   my $arch = $paramRef->{'arch'};
232   
233   my $config = "test";
234
235   if( $state eq "published") {
236     #if published, the project build is finished.
237     BuildMonitorDB::project_build_finished($config, $proj_name, $repo, $arch);
238   }
239 }
240
241 sub repo_published {
242   my ($paramRef) = @_;
243
244   my $proj_name = $paramRef->{'project'};
245
246   BuildMonitorDB::build_project_completed($proj_name);
247 }
248
249 my %event_handlers = (
250   'SRCSRV_START' => \&srcsrv_start,
251
252   'SRCSRV_CREATE_PROJECT' => \&srcsrv_create_project,
253   'SRCSRV_UPDATE_PROJECT' => \&srcsrv_update_project,
254   'SRCSRV_DELETE_PROJECT' => \&srcsrv_delete_project,
255
256   'SRCSRV_CREATE_PACKAGE' => \&srcsrv_create_package,
257   'SRCSRV_UPDATE_PACKAGE' => \&srcsrv_update_package,
258   'SRCSRV_DELETE_PACKAGE' => \&srcsrv_delete_package,
259
260   'SRCSRV_REQUEST_ACCEPTED' => \&srcsrv_request_accepted,
261
262   'BUILD_START' => \&build_start,
263   'BUILD_UNCHANGED' => \&build_unchanged,
264   'BUILD_SUCCESS' => \&build_success,
265   'BUILD_FAIL' => \&build_fail,
266   'BUILD_BROKEN' => \&build_broken,
267   'BUILD_UNRESOLVABLE' => \&build_unresolvable,
268
269   'REPO_PUBLISH_STATE' => \&repo_publish_state,
270   'REPO_PUBLISHED' => \&repo_published,
271 );
272
273 my $g_dbh = undef;
274
275 sub notify() {
276   my ($self, $type, $paramRef ) = @_;
277
278   # you should add the statements below to BSConfig.pm
279   #our $notification_plugin = "notify_buildmonitor";
280   #our $build_monitor_db_conf = "/usr/lib/obs/server/build_monitor_db.conf";
281   return unless $BSConfig::build_monitor_db_conf;
282
283   $g_dbh = BuildMonitorDB::connect_db($BSConfig::build_monitor_db_conf);
284   if( ! $g_dbh ) {
285     print "[", __FILE__, ":",__LINE__, "] BuildMonitorDB::connect_db() failed.\n";
286     return ;
287   }
288   
289   my $evhandler = $event_handlers{$type};
290   if( $evhandler ) {
291     $evhandler->($paramRef);
292   } else {
293     print "[BuildMonitor] undefined event type: $type\n";
294   }
295 }
296
297 1;