Merge branch '1.8' of gitorious.org:opensuse/build-service into 1.8
[opensuse:build-service.git] / src / backend / BSXML.pm
1 #
2 # Copyright (c) 2006, 2007 Michael Schroeder, Novell Inc.
3 # Copyright (c) 2008 Adrian Schroeter, Novell Inc.
4 #
5 # This program is free software; you can redistribute it and/or modify
6 # it under the terms of the GNU General Public License version 2 as
7 # published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program (see the file COPYING); if not, write to the
16 # Free Software Foundation, Inc.,
17 # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
18 #
19 ################################################################
20 #
21 # XML templates for the BuildService. See XML/Structured.
22 #
23
24 package BSXML;
25
26 use strict;
27
28
29 # an explained example entry of this file
30 #
31 #our $pack = [             creates <package name="" project=""> space
32 #    'package' =>          
33 #       'name',
34 #       'project',
35 #       [],                before the [] all strings become attributes to <package>
36 #       'title',           from here on all strings become children like <title> </title>
37 #       'description',
38 #       [[ 'person' =>     creates <person> children, the [[ ]] syntax allows any number of them including zero
39 #           'role',        again role and userid attributes, both are required
40 #           'userid',    
41 #       ]],                this block describes a <person role="defeatist" userid="statler" /> construct
42 #       @flags,            copies in the block of possible flag definitions
43 #       [ $repo ],         refers to the repository construct and allows again any number of them (0-X)
44 #];                        closes the <package> child with </package>
45
46 our $repo = [
47    'repository' => 
48         'name',
49      [[ 'path' =>
50             'project',
51             'repository',
52      ]],
53       [ 'arch' ],
54         'status',
55 ];
56
57 our @disableenable = (
58      [[ 'disable' =>
59         'arch',
60         'repository',
61      ]],
62      [[ 'enable' =>
63         'arch',
64         'repository',
65      ]],
66 );
67
68 our @flags = (
69       [ 'build' => @disableenable ],
70       [ 'publish' => @disableenable ],
71       [ 'debuginfo' => @disableenable ],
72       [ 'useforbuild' => @disableenable ],
73       [ 'binarydownload' => @disableenable ],
74       [ 'readaccess' => @disableenable ],
75       [ 'privacy' => @disableenable ],
76 );
77
78 our $download = [
79     'download' =>
80      'baseurl',
81      'metafile',
82      'mtype',
83      'arch',
84 ];
85
86 our $proj = [
87     'project' =>
88         'name',
89          [],
90         'title',
91         'description',
92      [[ 'link' =>
93             'project',
94      ]],
95         'remoteurl',
96         'remoteproject',
97      [[ 'person' =>
98             'role',
99             'userid',
100      ]],
101      [[ 'group' =>
102             'role',
103             'groupid',
104      ]],
105      [ $download ],
106      [ 'attributes' => 
107        [[ 'namespace' => 
108             'name', 
109             [[ 'modifiable_by' =>
110                    'user',
111                    'group',
112                    'role',
113             ]],
114        ]],
115        [[ 'definition' => 
116             'name', 
117             'namespace', 
118             [],
119             'count',
120             [ 'default' =>
121                [ 'value' ],
122             ],
123             [ 'allowed' =>
124                [ 'value' ],
125             ],
126             [[ 'modifiable_by' =>
127                'user',
128                'group',
129                'role',
130             ]],
131        ]],
132      ],
133         @flags,
134       [ $repo ],
135 ];
136
137 our $pack = [
138     'package' =>
139         'name',
140         'project',
141         [],
142         'title',
143         'description',
144       [ 'devel', =>
145             'project',
146             'package',
147       ],
148      [[ 'person' =>
149             'role',
150             'userid',
151      ]],
152      [[ 'group' =>
153             'role',
154             'groupid',
155      ]],
156         @disableenable,
157         @flags,
158         'url',
159         'bcntsynctag',
160 ];
161
162 our $packinfo = [
163     'info' =>
164         'repository',
165         'name',
166         'file',
167         'error',
168           [ 'dep' ],
169           [ 'prereq' ],
170           [ 'imagetype' ],
171          [[ 'path' =>
172                 'project',
173                 'repository',
174         ]],
175          [[ 'extrasource' =>
176                 'project',
177                 'package',
178                 'srcmd5',
179                 'file',
180          ]],
181 ];
182
183 our $linked = [
184     'linked' =>
185         'project',
186         'package',
187 ];
188
189 our $aggregatelist = [
190     'aggregatelist' =>
191      [[ 'aggregate' =>
192             'project',
193           [ 'package' ],
194           [ 'binary' ],
195          [[ 'repository' =>
196                 'target',
197                 'source',
198          ]],
199      ]],
200 ];
201
202 our $patchinfo = [
203     'patchinfo' => 
204             'name',
205             [],
206           [ 'binary' ],
207          [[ 'bugzilla' =>
208                 'name',
209                 '_content',
210          ]],
211           [ 'CVE' ],
212             'category',
213             'rating',
214             'summary',
215             'description',
216             'swampid',
217             'packager',
218             'zypp_restart_needed',
219             'reboot_needed',
220             'relogin_needed',
221 ];
222
223 our $projpack = [
224     'projpack' =>
225      [[ 'project' =>
226             'name',
227              [],
228             'title',
229             'description',
230             'config',
231             'patternmd5',
232             'remoteurl',
233             'remoteproject',
234             @flags,
235           [ $repo ],
236           [ $download ],
237          [[ 'package' =>
238                 'name',
239                 'rev',
240                 'srcmd5',       # commit id
241                 'versrel',
242                 'verifymd5',    # tree id
243                 [ $linked ],
244                 'error',
245                 [ $packinfo ],
246                 $aggregatelist,
247                 @flags,
248                 'bcntsynctag',
249          ]],
250      ]],
251      [[ 'remotemap' =>
252             'project',
253             'remoteurl', 
254             'remoteproject', 
255      ]],
256 ];
257
258 our $linkinfo = [
259     'linkinfo' =>
260         # information from link
261         'project',
262         'package',
263         'rev',
264         'srcmd5',
265         'baserev',
266         # expanded / unexpanded srcmd5
267         'xsrcmd5',
268         'lsrcmd5',
269         'error',
270         'lastworking',
271 ];
272
273
274 our $dir = [
275     'directory' =>
276         'name',
277         'count',        # obsolete, the API sets this for some requests
278         'rev',
279         'vrev',
280         'srcmd5',
281         'tproject',
282         'tpackage',
283         'trev',
284         'tsrcmd5',
285         'lsrcmd5',
286         'error',
287         'xsrcmd5',
288         $linkinfo,
289      [[ 'entry' =>
290             'name',
291             'md5',
292             'size',
293             'mtime',
294             'error',
295             'id',
296      ]]
297 ];
298
299 our $fileinfo = [
300     'fileinfo' =>
301         'filename',
302         [],
303         'name',
304         'epoch',
305         'version',
306         'release',
307         'arch',
308         'summary',
309         'description',
310         'size',
311         'mtime',
312       [ 'provides' ],
313       [ 'requires' ],
314       [ 'prerequires' ],
315       [ 'conflicts' ],
316       [ 'obsoletes' ],
317       [ 'recommends' ],
318       [ 'supplements' ],
319       [ 'suggests' ],
320       [ 'enhances' ],
321
322      [[ 'provides_ext' =>
323             'dep',
324          [[ 'requiredby' =>
325                 'name',
326                 'epoch',
327                 'version',
328                 'release',
329                 'arch',
330                 'project',
331                 'repository',
332          ]],
333      ]],
334      [[ 'requires_ext' =>
335             'dep',
336          [[ 'providedby' =>
337                 'name',
338                 'epoch',
339                 'version',
340                 'release',
341                 'arch',
342                 'project',
343                 'repository',
344          ]],
345      ]],
346 ];
347
348 our $buildinfo = [
349     'buildinfo' =>
350         'project',
351         'repository',
352         'package',
353         'srcserver',
354         'reposerver',
355         'downloadurl',
356         [],
357         'job',
358         'arch',
359         'error',
360         'srcmd5',
361         'verifymd5',
362         'rev',
363         'reason',       # just for the explain string of a build reason
364         'specfile',     # obsolete
365         'file',
366         'versrel',
367         'bcnt',
368         'release',
369         'debuginfo',
370       [ 'subpack' ],
371       [ 'imagetype' ],
372       [ 'dep' ],
373      [[ 'bdep' =>
374         'name',
375         'preinstall',
376         'vminstall',
377         'cbpreinstall',
378         'cbinstall',
379         'runscripts',
380         'notmeta',
381         'noinstall',
382
383         'epoch',
384         'version',
385         'release',
386         'arch',
387         'project',
388         'repository',
389         'repoarch',
390         'package',
391         'srcmd5',
392      ]],
393       [ 'pdep' ],       # obsolete
394      [[ 'path' =>
395             'project',
396             'repository',
397             'server',
398      ]]
399 ];
400
401 our $jobstatus = [
402     'jobstatus' =>
403         'code',
404         'result',       # succeeded, failed or unchanged
405         'details',
406         [],
407         'starttime',
408         'endtime',
409         'workerid',
410         'hostarch',
411
412         'uri',          # uri to reach worker
413
414         'arch',         # our architecture
415         'job',          # our jobname
416         'jobid',        # md5 of job info file
417 ];
418
419 our $buildreason = [
420     'reason' =>
421        [],
422        'explain',             # Readable reason
423        'time',                # unix time from start build
424        'oldsource',           # last build source md5 sum, if a source change was the reason
425        [[ 'packagechange' =>  # list changed files which are used for building
426           'change',           # kind of change (content/meta change, additional file or removed file)
427           'key',              # file name
428        ]],
429 ];
430
431 our $buildstatus = [
432     'status' =>
433         'package',
434         'code',
435         'status',       # obsolete, now code
436         'error',        # obsolete, now details
437         [],
438         'details',
439
440         'workerid',     # last build data
441         'hostarch',
442         'readytime',
443         'starttime',
444         'endtime',
445
446         'job',          # internal, job when building
447
448         'uri',          # obsolete
449         'arch',         # obsolete
450 ];
451
452 our $builddepinfo = [
453     'builddepinfo' =>
454      [[ 'package' =>
455             'name',
456             [],
457             'source',
458           [ 'pkgdep' ],
459           [ 'subpkg' ],
460      ]],
461 ];
462
463 our $event = [
464     'event' =>
465         'type',
466         [],
467         'project',
468         'repository',
469         'arch',
470         'package',
471         'job',
472         'due',
473 ];
474
475 our $events = [
476     'events' =>
477         'next',
478         'sync',
479        [ $event ],
480 ];
481
482 our $revision = [
483      'revision' =>
484         'rev',
485         'vrev',
486         [],
487         'srcmd5',
488         'version',
489         'time',
490         'user',
491         'comment',
492         'requestid',
493 ];
494
495 our $revisionlist = [
496     'revisionlist' =>
497       [ $revision ]
498 ];
499
500 our $buildhist = [
501     'buildhistory' =>
502      [[ 'entry' =>
503             'rev',
504             'srcmd5',
505             'versrel',
506             'bcnt',
507             'time',
508      ]],
509 ];
510
511 our $binaryversionlist = [
512     'binaryversionlist' =>
513       [[ 'binary' =>
514             'name',
515             'sizek',
516             'error',
517             'hdrmd5',
518             'metamd5',
519             'leadsigmd5',
520       ]],
521 ];
522
523 our $worker = [
524     'worker' =>
525         'hostarch',
526         'ip',
527         'port',
528         'workerid',
529       [ 'buildarch' ],
530         'memory',       # in MBytes
531         'disk',         # in MBytes
532         'tellnojob',
533
534         'job',          # set when worker is busy
535         'arch',         # set when worker is busy
536 ];
537
538 our $packstatuslist = [
539     'packstatuslist' =>
540         'project',
541         'repository',
542         'arch',
543      [[ 'packstatus' =>
544             'name',
545             'status',
546             'error',
547      ]],
548      [[ 'packstatussummary' =>
549             'status',
550             'count',
551      ]],
552 ];
553
554 our $packstatuslistlist = [
555     'packstatuslistlist' =>
556     'state',
557     'retryafter',
558      [ $packstatuslist ],
559 ];
560
561 our $linkpatch = [
562     '' =>
563       [ 'add' =>
564             'name',
565             'type',
566             'after',
567             'popt',
568             'dir',
569       ],
570       [ 'apply' =>
571             'name',
572       ],
573       [ 'delete' =>
574             'name',
575       ],
576         'branch',
577         'topadd',
578 ];
579
580 our $link = [
581     'link' =>
582         'project',
583         'package',
584         'rev',
585         'cicount',
586         'baserev',
587       [ 'patches' =>
588           [ $linkpatch ],
589       ],
590 ];
591
592 our $workerstatus = [
593     'workerstatus' =>
594         'clients',
595      [[ 'idle' =>
596             'uri',
597             'workerid',
598             'hostarch',
599      ]], 
600      [[ 'building' =>
601             'uri',
602             'workerid',
603             'hostarch',
604             'project',
605             'repository',
606             'package',
607             'arch',
608             'starttime',
609      ]],
610      [[ 'waiting', =>
611             'arch',
612             'jobs',
613      ]],
614      [[ 'blocked', =>
615             'arch',
616             'jobs',
617      ]],
618      [[ 'buildavg', =>
619             'arch',
620             'buildavg',
621      ]],
622      [[ 'scheduler' =>
623             'arch',
624             'state',
625             'starttime',
626      ]],
627 ];
628
629 our $workerstate = [
630     'workerstate' =>
631         'state',
632         'jobid',
633 ];
634
635 our $jobhistlay = [
636         'package',
637         'rev',
638         'srcmd5',
639         'versrel',
640         'bcnt',
641         'readytime',
642         'starttime',
643         'endtime',
644         'code',
645         'uri',
646         'workerid',
647         'hostarch',
648         'reason',
649 ];
650
651 our $jobhist = [
652     'jobhist' =>
653         @$jobhistlay,
654 ];
655
656 our $jobhistlist = [
657     'jobhistlist' =>
658       [ $jobhist ],
659 ];
660
661 our $ajaxstatus = [
662     'ajaxstatus' =>
663      [[ 'watcher' =>
664             'filename',
665             'state',
666          [[ 'job' =>
667                 'id',
668                 'ev',
669                 'fd',
670                 'peer',
671          ]],
672      ]],
673      [[ 'rpc' =>
674             'uri',
675             'state',
676             'ev',
677             'fd',
678          [[ 'job' =>
679                 'id',
680                 'ev',
681                 'fd',
682                 'peer',
683          ]],
684      ]],
685 ];
686
687 ##################### new api stuff
688
689 our $binarylist = [
690     'binarylist' =>
691         'package',
692      [[ 'binary' =>
693             'filename',
694             'size',
695             'mtime',
696      ]],
697 ];
698
699 our $summary = [
700     'summary' =>
701      [[ 'statuscount' =>
702             'code',
703             'count',
704      ]],
705 ];
706
707 our $result = [
708     'result' =>
709         'project',
710         'repository',
711         'arch',
712         'state', # pra state, can be "unknown", "scheduling", "blocked", "building", "finished", "publishing", "published" or "unpublished"
713         'dirty', # marked for re-scheduling if element exists, state might not be correct anymore
714       [ $buildstatus ],
715       [ $binarylist ],
716         $summary,
717 ];
718
719 our $resultlist = [
720     'resultlist' =>
721         'state',
722         'retryafter',
723       [ $result ],
724 ];
725
726 our $opstatus = [
727     'status' =>
728         'code',
729         'origin',
730         [],
731         'summary',
732         'details',
733         [ 'exception' =>
734             'type',
735             'message',
736             [ 'backtrace' =>
737                 [ 'line',
738                 ],
739             ],
740         ],
741 ];
742
743 my $rpm_entry = [
744     'rpm:entry' =>
745         'kind',
746         'name',
747         'epoch',
748         'ver',
749         'rel',
750         'flags',
751 ];
752
753 our $pattern = [
754     'pattern' =>
755         'xmlns',      # obsolete, moved to patterns
756         'xmlns:rpm',  # obsolete, moved to patterns
757         [],
758         'name',
759      [[ 'summary' =>
760             'lang',
761             '_content',
762      ]],
763      [[ 'description' =>
764             'lang',
765             '_content',
766      ]],
767         'default',
768         'uservisible',
769      [[ 'category' =>
770             'lang',
771             '_content',
772      ]],
773         'icon',
774         'script',
775       [ 'rpm:provides' => [ $rpm_entry ], ],
776       [ 'rpm:conflicts' => [ $rpm_entry ], ],
777       [ 'rpm:obsoletes' => [ $rpm_entry ], ],
778       [ 'rpm:requires' => [ $rpm_entry ], ],
779       [ 'rpm:suggests' => [ $rpm_entry ], ],
780       [ 'rpm:enhances' => [ $rpm_entry ], ],
781       [ 'rpm:supplements' => [ $rpm_entry ], ],
782       [ 'rpm:recommends' => [ $rpm_entry ], ],
783 ];
784
785 our $patterns = [
786     'patterns' =>
787         'count',
788         'xmlns',
789         'xmlns:rpm',
790         [],
791       [ $pattern ],
792 ];
793
794 our $ymp = [
795     'metapackage' =>
796         'xmlns:os',
797         'xmlns',
798         [],
799      [[ 'group' =>
800             'recommended',
801             'distversion',
802             [],
803             'name',
804             'summary',
805             'description',
806             'remainSubscribed',
807           [ 'repositories' =>
808              [[ 'repository' =>
809                     'recommended',
810                     'format',
811                     'producturi',
812                     [],
813                     'name',
814                     'summary',
815                     'description',
816                     'url',
817              ]],
818             ],
819           [ 'software' =>
820              [[ 'item' =>
821                     'type',
822                     'recommended',
823                     'architectures',
824                     'action',
825                     [],
826                     'name',
827                     'summary',
828                     'description',
829              ]],
830           ],
831       ]],
832 ];
833
834 our $binary_id = [
835     'binary' => 
836         'name',
837         'project',
838         'package',
839         'repository',
840         'version',
841         'arch',
842         'filename',
843         'filepath',
844         'baseproject',
845         'type',
846 ];
847
848 our $pattern_id = [
849     'pattern' => 
850         'name',
851         'project',
852         'repository',
853         'arch',
854         'filename',
855         'filepath',
856         'baseproject',
857         'type',
858 ];
859
860 our $request = [
861     'request' =>
862         'id',
863         'type',             # obsolete in future, type will be defined per action
864      [[ 'action' =>
865            'type',          # currently submit, delete, change_devel
866            [ 'source' =>
867                  'project',
868                  'package',
869                  'rev',
870            ],
871            [ 'target' =>
872                  'project',
873                  'package',
874            ],
875            [ 'options' =>
876                  [],
877                  'sourceupdate', # can be cleanup, update or noupdate
878            ],
879      ]],
880       [ 'submit' =>          # this is old style, obsolete by request, but still supported
881           [ 'source' =>
882                 'project',
883                 'package',
884                 'rev',
885           ],
886           [ 'target' =>
887                 'project',
888                 'package',
889           ],
890       ],
891       [ 'state' =>
892             'name',
893             'who',
894             'when',
895             'superseded_by', # set when state.name is "superseded"
896             [],
897             'comment',
898       ],
899      [[ 'review' =>
900             'state',         # review state (new/accepted or declined)
901             'by_user',       # this user shall review it
902             'by_group',      # one of this groupd shall review it
903                              # either user or group must be used, never both
904             'who',           # this user has reviewed it
905             'when',
906             [],
907             'comment',
908      ]],
909      [[ 'history' =>
910             'name',
911             'who',
912             'when',
913             'superseded_by',
914             [],
915             'comment',
916      ]],
917         'title',
918         'description',
919 ];
920
921 our $repositorystate = [
922     'repositorystate' => 
923       [ 'blocked' ],
924 ];
925
926 our $collection = [
927     'collection' => 
928       [ $request ],
929       [ $proj ],
930       [ $pack ],
931       [ $binary_id ],
932       [ $pattern_id ],
933       [ 'value' ],
934 ];
935
936 our $quota = [
937     'quota' =>
938         'packages',
939      [[ 'project' =>
940             'name',
941             'packages',
942      ]],
943 ];
944
945 our $services = [
946     'services' =>
947     [[ 'service' =>
948        'name',
949        [],
950        [[ 'param' => 'name', '_content' ]],
951     ]],
952 ];
953
954 our $schedulerinfo = [
955   'schedulerinfo' =>
956         'arch',
957         'started',
958         'time',
959         [],
960         'slept',
961         'notready',
962       [ 'queue' =>
963             'high',
964             'med',
965             'low',
966             'next',
967       ],
968         'projects',
969         'repositories',
970      [[ 'worst' =>
971             'project',
972             'repository',
973             'packages',
974             'time',
975      ]],
976         'buildavg',
977         'avg',
978         'variance',
979 ];
980
981 our $person = [
982   'person' =>
983         'login',
984         'email',
985         'realname',
986         [ 'watchlist' =>
987                 [[ 'project' =>
988                         'name',
989                 ]],
990         ],
991 ];
992
993
994 1;