[backend] be also compatible with upcomming project type attribute
[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         'rebuild',
50         'block',
51         'linkedbuild',
52      [[ 'releasetarget' => # not supported in OBS 2.1, but to avoid failure when building against 2.3 projects using this feature
53             'project',
54             'repository',
55             'trigger',
56      ]],
57      [[ 'path' =>
58             'project',
59             'repository',
60      ]],
61       [ 'arch' ],
62         'status',
63 ];
64
65 our @disableenable = (
66      [[ 'disable' =>
67         'arch',
68         'repository',
69      ]],
70      [[ 'enable' =>
71         'arch',
72         'repository',
73      ]],
74 );
75
76 our @flags = (
77       [ 'build' => @disableenable ],
78       [ 'publish' => @disableenable ],
79       [ 'debuginfo' => @disableenable ],
80       [ 'useforbuild' => @disableenable ],
81       [ 'binarydownload' => @disableenable ],
82       [ 'sourceaccess' => @disableenable ],
83       [ 'privacy' => @disableenable ],
84       [ 'access' => @disableenable ],
85       [ 'lock' => @disableenable ], # not supported in OBS 2.1, but to avoid failure when building against 2.3 projects using this flag
86 );
87
88 our $download = [
89     'download' =>
90      'baseurl',
91      'metafile',
92      'mtype',
93      'arch',
94 ];
95
96 our $proj = [
97     'project' =>
98         'name',
99         'type', # to be compatible with OBS 2.3
100          [],
101         'title',
102         'description',
103      [[ 'link' =>
104             'project',
105      ]],
106         'remoteurl',
107         'remoteproject',
108         'mountproject',
109      [[ 'person' =>
110             'role',
111             'userid',
112      ]],
113      [[ 'group' =>
114             'role',
115             'groupid',
116      ]],
117      [ $download ],
118      [ 'attributes' => 
119        [[ 'namespace' => 
120             'name', 
121             [[ 'modifiable_by' =>
122                    'user',
123                    'group',
124                    'role',
125             ]],
126        ]],
127        [[ 'definition' => 
128             'name', 
129             'namespace', 
130             [],
131             'count',
132             [ 'default' =>
133                [ 'value' ],
134             ],
135             [ 'allowed' =>
136                [ 'value' ],
137             ],
138             [[ 'modifiable_by' =>
139                'user',
140                'group',
141                'role',
142             ]],
143        ]],
144      ],
145         @flags,
146       [ $repo ],
147 ];
148
149 our $pack = [
150     'package' =>
151         'name',
152         'project',
153         [],
154         'title',
155         'description',
156       [ 'devel', =>
157             'project',
158             'package',
159       ],
160      [[ 'person' =>
161             'role',
162             'userid',
163      ]],
164      [[ 'group' =>
165             'role',
166             'groupid',
167      ]],
168         @disableenable,
169         @flags,
170         'url',
171         'bcntsynctag',
172 ];
173
174 our $packinfo = [
175     'info' =>
176         'repository',
177         'name',
178         'file',
179         'error',
180           [ 'dep' ],
181           [ 'prereq' ],
182           [ 'imagetype' ],
183           [ 'imagearch' ],
184          [[ 'path' =>
185                 'project',
186                 'repository',
187         ]],
188          [[ 'extrasource' =>
189                 'project',
190                 'package',
191                 'srcmd5',
192                 'file',
193          ]],
194 ];
195
196 our $linked = [
197     'linked' =>
198         'project',
199         'package',
200 ];
201
202 our $aggregatelist = [
203     'aggregatelist' =>
204      [[ 'aggregate' =>
205             'project',
206             [],
207             'nosources',
208           [ 'package' ],
209           [ 'binary' ],
210          [[ 'repository' =>
211                 'target',
212                 'source',
213          ]],
214      ]],
215 ];
216
217 our $patchinfo = [
218     'patchinfo' => 
219             'name',
220             [],
221           [ 'binary' ],
222          [[ 'bugzilla' =>
223                 'name',
224                 '_content',
225          ]],
226           [ 'CVE' ],
227             'category',
228             'rating',
229             'summary',
230             'description',
231             'swampid',
232             'packager',
233             'zypp_restart_needed',
234             'reboot_needed',
235             'relogin_needed',
236 ];
237
238 our $projpack = [
239     'projpack' =>
240      [[ 'project' =>
241             'name',
242              [],
243             'title',
244             'description',
245             'config',
246             'patternmd5',
247          [[ 'link' =>
248                 'project',
249          ]],
250             'remoteurl',
251             'remoteproject',
252             @flags,
253           [ $repo ],
254           [ $download ],
255          [[ 'package' =>
256                 'name',
257                 'rev',
258                 'srcmd5',       # commit id
259                 'versrel',
260                 'verifymd5',    # tree id
261                 'originproject',
262                 'revtime',
263                 [ $linked ],
264                 'error',
265                 [ $packinfo ],
266                 $aggregatelist,
267                 @flags,
268                 'bcntsynctag',
269          ]],
270      ]],
271      [[ 'remotemap' =>
272             'project',
273             'remoteurl', 
274             'remoteproject', 
275      ]],
276 ];
277
278 our $linkinfo = [
279     'linkinfo' =>
280         # information from link
281         'project',
282         'package',
283         'rev',
284         'srcmd5',
285         'baserev',
286         # expanded / unexpanded srcmd5
287         'xsrcmd5',
288         'lsrcmd5',
289         'error',
290         'lastworking',
291       [ $linked ],
292 ];
293
294
295 our $dir = [
296     'directory' =>
297         'name',
298         'count',        # obsolete, the API sets this for some requests
299         'rev',
300         'vrev',
301         'srcmd5',
302         'tproject',
303         'tpackage',
304         'trev',
305         'tsrcmd5',
306         'lsrcmd5',
307         'error',
308         'xsrcmd5',
309         $linkinfo,
310      [[ 'entry' =>
311             'name',
312             'md5',
313             'size',
314             'mtime',
315             'error',
316             'id',
317      ]]
318 ];
319
320 our $fileinfo = [
321     'fileinfo' =>
322         'filename',
323         [],
324         'name',
325         'epoch',
326         'version',
327         'release',
328         'arch',
329         'summary',
330         'description',
331         'size',
332         'mtime',
333       [ 'provides' ],
334       [ 'requires' ],
335       [ 'prerequires' ],
336       [ 'conflicts' ],
337       [ 'obsoletes' ],
338       [ 'recommends' ],
339       [ 'supplements' ],
340       [ 'suggests' ],
341       [ 'enhances' ],
342
343      [[ 'provides_ext' =>
344             'dep',
345          [[ 'requiredby' =>
346                 'name',
347                 'epoch',
348                 'version',
349                 'release',
350                 'arch',
351                 'project',
352                 'repository',
353          ]],
354      ]],
355      [[ 'requires_ext' =>
356             'dep',
357          [[ 'providedby' =>
358                 'name',
359                 'epoch',
360                 'version',
361                 'release',
362                 'arch',
363                 'project',
364                 'repository',
365          ]],
366      ]],
367 ];
368
369 our $buildinfo = [
370     'buildinfo' =>
371         'project',
372         'repository',
373         'package',
374         'srcserver',
375         'reposerver',
376         'downloadurl',
377         [],
378         'job',
379         'arch',
380         'error',
381         'srcmd5',
382         'verifymd5',
383         'rev',
384         'reason',       # just for the explain string of a build reason
385         'needed',       # number of blocked
386         'revtime',      # time of last commit
387         'readytime',
388         'specfile',     # obsolete
389         'file',
390         'versrel',
391         'bcnt',
392         'release',
393         'debuginfo',
394       [ 'subpack' ],
395       [ 'imagetype' ],
396       [ 'dep' ],
397      [[ 'bdep' =>
398         'name',
399         'preinstall',
400         'vminstall',
401         'cbpreinstall',
402         'cbinstall',
403         'runscripts',
404         'notmeta',
405         'noinstall',
406
407         'epoch',
408         'version',
409         'release',
410         'arch',
411         'project',
412         'repository',
413         'repoarch',
414         'package',
415         'srcmd5',
416      ]],
417       [ 'pdep' ],       # obsolete
418      [[ 'path' =>
419             'project',
420             'repository',
421             'server',
422      ]],
423      [[ 'syspath' =>
424             'project',
425             'repository',
426             'server',
427      ]],
428 ];
429
430 our $jobstatus = [
431     'jobstatus' =>
432         'code',
433         'result',       # succeeded, failed or unchanged
434         'details',
435         [],
436         'starttime',
437         'endtime',
438         'workerid',
439         'hostarch',
440
441         'uri',          # uri to reach worker
442
443         'arch',         # our architecture
444         'job',          # our jobname
445         'jobid',        # md5 of job info file
446 ];
447
448 our $buildreason = [
449     'reason' =>
450        [],
451        'explain',             # Readable reason
452        'time',                # unix time from start build
453        'oldsource',           # last build source md5 sum, if a source change was the reason
454        [[ 'packagechange' =>  # list changed files which are used for building
455           'change',           # kind of change (content/meta change, additional file or removed file)
456           'key',              # file name
457        ]],
458 ];
459
460 our $buildstatus = [
461     'status' =>
462         'package',
463         'code',
464         'status',       # obsolete, now code
465         'error',        # obsolete, now details
466         [],
467         'details',
468
469         'workerid',     # last build data
470         'hostarch',
471         'readytime',
472         'starttime',
473         'endtime',
474
475         'job',          # internal, job when building
476
477         'uri',          # obsolete
478         'arch',         # obsolete
479 ];
480
481 our $builddepinfo = [
482     'builddepinfo' =>
483      [[ 'package' =>
484             'name',
485             [],
486             'source',
487           [ 'pkgdep' ],
488           [ 'subpkg' ],
489      ]],
490      [[ 'cycle' =>
491           [ 'package' ],
492      ]],
493 ];
494
495 our $event = [
496     'event' =>
497         'type',
498         [],
499         'project',
500         'repository',
501         'arch',
502         'package',
503         'job',
504         'due',
505 ];
506
507 our $events = [
508     'events' =>
509         'next',
510         'sync',
511        [ $event ],
512 ];
513
514 our $revision = [
515      'revision' =>
516         'rev',
517         'vrev',
518         [],
519         'srcmd5',
520         'version',
521         'time',
522         'user',
523         'comment',
524         'requestid',
525 ];
526
527 our $revisionlist = [
528     'revisionlist' =>
529       [ $revision ]
530 ];
531
532 our $buildhist = [
533     'buildhistory' =>
534      [[ 'entry' =>
535             'rev',
536             'srcmd5',
537             'versrel',
538             'bcnt',
539             'time',
540      ]],
541 ];
542
543 our $binaryversionlist = [
544     'binaryversionlist' =>
545       [[ 'binary' =>
546             'name',
547             'sizek',
548             'error',
549             'hdrmd5',
550             'metamd5',
551             'leadsigmd5',
552       ]],
553 ];
554
555 our $worker = [
556     'worker' =>
557         'hostarch',
558         'ip',
559         'port',
560         'workerid',
561       [ 'buildarch' ],
562         'memory',       # in MBytes
563         'disk',         # in MBytes
564         'tellnojob',
565
566         'job',          # set when worker is busy
567         'arch',         # set when worker is busy
568 ];
569
570 our $packstatuslist = [
571     'packstatuslist' =>
572         'project',
573         'repository',
574         'arch',
575      [[ 'packstatus' =>
576             'name',
577             'status',
578             'error',
579      ]],
580      [[ 'packstatussummary' =>
581             'status',
582             'count',
583      ]],
584 ];
585
586 our $packstatuslistlist = [
587     'packstatuslistlist' =>
588     'state',
589     'retryafter',
590      [ $packstatuslist ],
591 ];
592
593 our $linkpatch = [
594     '' =>
595       [ 'add' =>
596             'name',
597             'type',
598             'after',
599             'popt',
600             'dir',
601       ],
602       [ 'apply' =>
603             'name',
604       ],
605       [ 'delete' =>
606             'name',
607       ],
608         'branch',
609         'topadd',
610 ];
611
612 our $link = [
613     'link' =>
614         'project',
615         'package',
616         'rev',
617         'cicount',
618         'baserev',
619       [ 'patches' =>
620           [ $linkpatch ],
621       ],
622 ];
623
624 our $workerstatus = [
625     'workerstatus' =>
626         'clients',
627      [[ 'idle' =>
628             'uri',
629             'workerid',
630             'hostarch',
631      ]], 
632      [[ 'building' =>
633             'uri',
634             'workerid',
635             'hostarch',
636             'project',
637             'repository',
638             'package',
639             'arch',
640             'starttime',
641      ]],
642      [[ 'waiting', =>
643             'arch',
644             'jobs',
645      ]],
646      [[ 'blocked', =>
647             'arch',
648             'jobs',
649      ]],
650      [[ 'buildavg', =>
651             'arch',
652             'buildavg',
653      ]],
654      [[ 'scheduler' =>
655             'arch',
656             'state',
657             'starttime',
658           [ 'queue' =>
659                 'high',
660                 'med',
661                 'low',
662                 'next',
663           ],
664      ]],
665 ];
666
667 our $workerstate = [
668     'workerstate' =>
669         'state',
670         'jobid',
671 ];
672
673 our $jobhistlay = [
674         'package',
675         'rev',
676         'srcmd5',
677         'versrel',
678         'bcnt',
679         'readytime',
680         'starttime',
681         'endtime',
682         'code',
683         'uri',
684         'workerid',
685         'hostarch',
686         'reason',
687 ];
688
689 our $jobhist = [
690     'jobhist' =>
691         @$jobhistlay,
692 ];
693
694 our $jobhistlist = [
695     'jobhistlist' =>
696       [ $jobhist ],
697 ];
698
699 our $ajaxstatus = [
700     'ajaxstatus' =>
701      [[ 'watcher' =>
702             'filename',
703             'state',
704          [[ 'job' =>
705                 'id',
706                 'ev',
707                 'fd',
708                 'peer',
709                 'request',
710          ]],
711      ]],
712      [[ 'rpc' =>
713             'uri',
714             'state',
715             'ev',
716             'fd',
717          [[ 'job' =>
718                 'id',
719                 'ev',
720                 'fd',
721                 'peer',
722                 'starttime',
723                 'request',
724          ]],
725      ]],
726      [[ 'serialize' =>
727             'filename',
728          [[ 'job' =>
729                 'id',
730                 'ev',
731                 'fd',
732                 'peer',
733                 'request',
734          ]],
735      ]],
736 ];
737
738 our $serverstatus = [
739     'serverstatus' =>
740      [[ 'job' =>
741             'id',
742             'starttime',
743             'pid',
744             'peer',
745             'request',
746      ]],
747 ];
748
749 ##################### new api stuff
750
751 our $binarylist = [
752     'binarylist' =>
753         'package',
754      [[ 'binary' =>
755             'filename',
756             'size',
757             'mtime',
758      ]],
759 ];
760
761 our $summary = [
762     'summary' =>
763      [[ 'statuscount' =>
764             'code',
765             'count',
766      ]],
767 ];
768
769 our $result = [
770     'result' =>
771         'project',
772         'repository',
773         'arch',
774         'state', # pra state, can be "unknown", "broken", "scheduling", "blocked", "building", "finished", "publishing", "published" or "unpublished"
775         'dirty', # marked for re-scheduling if element exists, state might not be correct anymore
776       [ $buildstatus ],
777       [ $binarylist ],
778         $summary,
779 ];
780
781 our $resultlist = [
782     'resultlist' =>
783         'state',
784         'retryafter',
785       [ $result ],
786 ];
787
788 our $opstatus = [
789     'status' =>
790         'code',
791         'origin',
792         [],
793         'summary',
794         'details',
795         [ 'exception' =>
796             'type',
797             'message',
798             [ 'backtrace' =>
799                 [ 'line',
800                 ],
801             ],
802         ],
803 ];
804
805 my $rpm_entry = [
806     'rpm:entry' =>
807         'kind',
808         'name',
809         'epoch',
810         'ver',
811         'rel',
812         'flags',
813 ];
814
815 our $pattern = [
816     'pattern' =>
817         'xmlns',      # obsolete, moved to patterns
818         'xmlns:rpm',  # obsolete, moved to patterns
819         [],
820         'name',
821      [[ 'summary' =>
822             'lang',
823             '_content',
824      ]],
825      [[ 'description' =>
826             'lang',
827             '_content',
828      ]],
829         'default',
830         'uservisible',
831      [[ 'category' =>
832             'lang',
833             '_content',
834      ]],
835         'icon',
836         'script',
837       [ 'rpm:provides' => [ $rpm_entry ], ],
838       [ 'rpm:conflicts' => [ $rpm_entry ], ],
839       [ 'rpm:obsoletes' => [ $rpm_entry ], ],
840       [ 'rpm:requires' => [ $rpm_entry ], ],
841       [ 'rpm:suggests' => [ $rpm_entry ], ],
842       [ 'rpm:enhances' => [ $rpm_entry ], ],
843       [ 'rpm:supplements' => [ $rpm_entry ], ],
844       [ 'rpm:recommends' => [ $rpm_entry ], ],
845 ];
846
847 our $patterns = [
848     'patterns' =>
849         'count',
850         'xmlns',
851         'xmlns:rpm',
852         [],
853       [ $pattern ],
854 ];
855
856 our $ymp = [
857     'metapackage' =>
858         'xmlns:os',
859         'xmlns',
860         [],
861      [[ 'group' =>
862             'recommended',
863             'distversion',
864             [],
865             'name',
866             'summary',
867             'description',
868             'remainSubscribed',
869           [ 'repositories' =>
870              [[ 'repository' =>
871                     'recommended',
872                     'format',
873                     'producturi',
874                     [],
875                     'name',
876                     'summary',
877                     'description',
878                     'url',
879              ]],
880             ],
881           [ 'software' =>
882              [[ 'item' =>
883                     'type',
884                     'recommended',
885                     'architectures',
886                     'action',
887                     [],
888                     'name',
889                     'summary',
890                     'description',
891              ]],
892           ],
893       ]],
894 ];
895
896 our $binary_id = [
897     'binary' => 
898         'name',
899         'project',
900         'package',
901         'repository',
902         'version',
903         'arch',
904         'filename',
905         'filepath',
906         'baseproject',
907         'type',
908 ];
909
910 our $pattern_id = [
911     'pattern' => 
912         'name',
913         'project',
914         'repository',
915         'arch',
916         'filename',
917         'filepath',
918         'baseproject',
919         'type',
920 ];
921
922 our $request = [
923     'request' =>
924         'id',
925         'type',         # obsolete in future, type will be defined per action
926      [[ 'action' =>
927             'type',     # currently submit, delete, change_devel, add_role
928           [ 'source' =>
929                 'project',
930                 'package',
931                 'rev',
932           ],
933           [ 'target' =>
934                 'project',
935                 'package',
936           ],
937           [ 'person' =>
938                 'name',
939                 'role',
940           ],
941           [ 'group' =>
942                 'name',
943                 'role',
944           ],
945           [ 'options' =>
946                 [],
947                 'sourceupdate', # can be cleanup, update or noupdate
948                 'updatelink',   # can be true or false
949           ],
950           [ 'acceptinfo' =>
951                 'rev',
952                 'srcmd5',
953                 'osrcmd5',
954                 'xsrcmd5',
955                 'oxsrcmd5',
956           ],
957      ]],
958       [ 'submit' =>          # this is old style, obsolete by request, but still supported
959           [ 'source' =>
960                 'project',
961                 'package',
962                 'rev',
963           ],
964           [ 'target' =>
965                 'project',
966                 'package',
967           ],
968       ],
969       [ 'state' =>
970             'name',
971             'who',
972             'when',
973             'superseded_by', # set when state.name is "superseded"
974             [],
975             'comment',
976       ],
977      [[ 'review' =>
978             'state',         # review state (new/accepted or declined)
979             'by_user',       # this user shall review it
980             'by_group',      # one of this groupd shall review it
981                              # either user or group must be used, never both
982             'who',           # this user has reviewed it
983             'when',
984             [],
985             'comment',
986      ]],
987      [[ 'history' =>
988             'name',
989             'who',
990             'when',
991             'superseded_by',
992             [],
993             'comment',
994      ]],
995         'title',
996         'description',
997 ];
998
999 our $repositorystate = [
1000     'repositorystate' => 
1001       [ 'blocked' ],
1002 ];
1003
1004 our $collection = [
1005     'collection' => 
1006         'matches',
1007         'limited',
1008       [ $request ],
1009       [ $proj ],
1010       [ $pack ],
1011       [ $binary_id ],
1012       [ $pattern_id ],
1013       [ 'value' ],
1014 ];
1015
1016 our $quota = [
1017     'quota' =>
1018         'packages',
1019      [[ 'project' =>
1020             'name',
1021             'packages',
1022      ]],
1023 ];
1024
1025 our $services = [
1026     'services' =>
1027     [[ 'service' =>
1028        'name',
1029        [],
1030        [[ 'param' => 'name', '_content' ]],
1031     ]],
1032 ];
1033
1034 our $schedulerinfo = [
1035   'schedulerinfo' =>
1036         'arch',
1037         'started',
1038         'time',
1039         [],
1040         'slept',
1041         'notready',
1042       [ 'queue' =>
1043             'high',
1044             'med',
1045             'low',
1046             'next',
1047       ],
1048         'projects',
1049         'repositories',
1050      [[ 'worst' =>
1051             'project',
1052             'repository',
1053             'packages',
1054             'time',
1055      ]],
1056         'buildavg',
1057         'avg',
1058         'variance',
1059 ];
1060
1061 our $person = [
1062   'person' =>
1063         'login',
1064         'email',
1065         'realname',
1066         [ 'globalrole' ],
1067         [ 'watchlist' =>
1068                 [[ 'project' =>
1069                         'name',
1070                 ]],
1071         ],
1072 ];
1073
1074 our $comps = [
1075     'comps' =>
1076     [[ 'group' =>
1077         [],
1078         'id',
1079         [[ 'description' =>
1080             'xml:lang',
1081             '_content',
1082         ]],
1083         [[ 'name' =>
1084             'xml:lang',
1085             '_content',
1086         ]],
1087         [ 'packagelist' =>
1088             [[ 'packagereq' =>
1089                 'type',
1090                 '_content',
1091             ]],
1092         ],
1093     ]],
1094 ];
1095
1096 our $dispatchprios = [
1097     'dispatchprios' =>
1098      [[ 'prio' =>
1099             'project',
1100             'repository',
1101             'arch',
1102             'adjust',
1103      ]],
1104 ];
1105
1106 our $service = [
1107     'service' =>
1108         'name',
1109         [],
1110         'summary',
1111         'description',
1112         [[ 'parameter' =>
1113                      'name',
1114                      [],
1115                      'description',
1116                      'required', # don't run without this parameter
1117                      'allowmultiple', # This parameter can be used multiple times
1118                      [[ 'allowedvalue' => '_content' ]], # list of possible values
1119         ]],
1120 ];
1121
1122 our $servicelist = [
1123     'servicelist' =>
1124         [ $service ],
1125 ];
1126
1127 1;