# # Copyright (c) 2006, 2007 Michael Schroeder, Novell Inc. # Copyright (c) 2008 Adrian Schroeter, Novell Inc. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License version 2 as # published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program (see the file COPYING); if not, write to the # Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA # ################################################################ # # XML templates for the BuildService. See XML/Structured. # package BSXML; use strict; # # an explained example entry of this file # #our $pack = [ creates space # 'package' => # 'name', # 'project', # [], before the [] all strings become attributes to # 'title', from here on all strings become children like # 'description', # [[ 'person' => creates children, the [[ ]] syntax allows any number of them including zero # 'role', again role and userid attributes, both are required # 'userid', # ]], this block describes a construct # @flags, copies in the block of possible flag definitions # [ $repo ], refers to the repository construct and allows again any number of them (0-X) #]; closes the child with our $repo = [ 'repository' => 'name', 'rebuild', 'block', 'linkedbuild', [[ 'releasetarget' => 'project', 'repository', 'trigger', ]], [[ 'path' => 'project', 'repository', ]], [ 'hostsystem' => 'project', 'repository', ], [ 'base' => # expanded repo only! 'project', 'repository', ], [ 'arch' ], 'status', ]; our @disableenable = ( [[ 'disable' => 'arch', 'repository', ]], [[ 'enable' => 'arch', 'repository', ]], ); our @flags = ( [ 'lock' => @disableenable ], [ 'build' => @disableenable ], [ 'publish' => @disableenable ], [ 'debuginfo' => @disableenable ], [ 'useforbuild' => @disableenable ], [ 'binarydownload' => @disableenable ], [ 'sourceaccess' => @disableenable ], [ 'access' => @disableenable ], ); our @roles = ( [[ 'person' => 'role', 'userid', ]], [[ 'group' => 'role', 'groupid', ]], ); our $download = [ 'download' => 'baseurl', 'metafile', 'mtype', 'arch', ]; our $maintenance = [ 'maintenance' => [[ 'maintains' => 'project', ]], ]; our $proj = [ 'project' => 'name', 'kind', [], 'title', 'description', [[ 'link' => 'project', ]], 'remoteurl', 'remoteproject', 'mountproject', [ 'devel', => 'project', ], @roles, [ $download ], $maintenance, @flags, [ $repo ], ]; our $pack = [ 'package' => 'name', 'project', [], 'title', 'description', [ 'devel', => 'project', 'package', ], @roles, @disableenable, @flags, 'url', 'bcntsynctag', ]; our $packinfo = [ 'info' => 'repository', 'name', 'file', 'error', [ 'dep' ], [ 'prereq' ], [ 'imagetype' ], # kiwi [ 'imagearch' ], # kiwi 'nodbgpkgs', # kiwi 'nosrcpkgs', # kiwi [[ 'path' => 'project', 'repository', ]], [[ 'extrasource' => 'project', 'package', 'srcmd5', 'file', ]], ]; our $linked = [ 'linked' => 'project', 'package', ]; our $aggregatelist = [ 'aggregatelist' => [[ 'aggregate' => 'project', [], 'nosources', [ 'package' ], [ 'binary' ], [[ 'repository' => 'target', 'source', ]], ]], ]; # former: kernel - 123 - 1 123: incident # now: sec-123 - 1 -1 our $patchinfo = [ 'patchinfo' => 'incident', # optional, gets replaced on with updateinfoid on release 'version', # optional, defaults to 1 [], [ 'package' ],# optional [ 'binary' ], # optional [[ 'releasetarget' => # optional 'project', 'repository', ]], [[ 'issue' => 'tracker', 'id', 'documented', [], '_content', ]], 'category', 'rating', 'name', # optional, old patchinfo name which will become part of incident string 'summary', 'description', 'swampid', # obsolete 'packager', 'stopped', 'zypp_restart_needed', 'reboot_needed', 'relogin_needed', ]; our $channel = [ 'channel' => [ 'product' => 'project', 'name', ], [[ 'target' => 'project', 'repository', 'tag', # optional ]], [[ 'binaries' => 'project', 'repository', 'arch', [[ 'binary' => 'name', 'binaryarch', 'project', 'repository', 'package', 'arch', 'supportstatus', ]], ]], ]; our $projpack = [ 'projpack' => 'repoid', [[ 'project' => 'name', 'kind', [], 'title', 'description', 'config', 'patternmd5', [[ 'link' => 'project', ]], 'remoteurl', 'remoteproject', @flags, @roles, [ $repo ], [ $download ], [[ 'package' => 'name', 'rev', 'srcmd5', # commit id 'versrel', 'verifymd5', # tree id 'originproject', 'revtime', 'constraintsmd5', # md5sum of constraints file in srcmd5 [ $linked ], 'error', [ $packinfo ], $aggregatelist, $patchinfo, $channel, @flags, 'bcntsynctag', ]], 'missingpackages', ]], [[ 'remotemap' => 'project', 'root', 'remoteurl', 'remoteproject', 'remoteroot', 'partition', 'proto', # project data not included [], 'config', @flags, @roles, [ $repo ], 'error', ]], ]; our $linkinfo = [ 'linkinfo' => # information from link 'project', 'package', 'rev', 'srcmd5', 'baserev', 'missingok', # expanded / unexpanded srcmd5 'xsrcmd5', 'lsrcmd5', 'error', 'lastworking', [ $linked ], ]; our $serviceinfo = [ 'serviceinfo' => # information in case a source service is part of package 'code', # can be "running", "failed", "succeeded" 'xsrcmd5', 'lsrcmd5', [], 'error', # contains error message (with new lines) in case of error ]; our $dir = [ 'directory' => 'name', 'count', # obsolete, the API sets this for some requests 'rev', 'vrev', 'srcmd5', 'tproject', # obsolete, use linkinfo 'tpackage', # obsolete, use linkinfo 'trev', # obsolete, use linkinfo 'tsrcmd5', # obsolete, use linkinfo 'lsrcmd5', # obsolete, use linkinfo 'error', 'xsrcmd5', # obsolete, use linkinfo $linkinfo, $serviceinfo, [[ 'entry' => 'name', 'md5', 'size', 'mtime', 'error', 'id', 'originproject', # for package listing ]] ]; our $fileinfo = [ 'fileinfo' => 'filename', [], 'name', 'epoch', 'version', 'release', 'arch', 'source', 'summary', 'description', 'size', 'mtime', [ 'provides' ], [ 'requires' ], [ 'prerequires' ], [ 'conflicts' ], [ 'obsoletes' ], [ 'recommends' ], [ 'supplements' ], [ 'suggests' ], [ 'enhances' ], [[ 'provides_ext' => 'dep', [[ 'requiredby' => 'name', 'epoch', 'version', 'release', 'arch', 'project', 'repository', ]], ]], [[ 'requires_ext' => 'dep', [[ 'providedby' => 'name', 'epoch', 'version', 'release', 'arch', 'project', 'repository', ]], ]], ]; our $sourceinfo = [ 'sourceinfo' => 'package', 'rev', 'vrev', 'srcmd5', 'lsrcmd5', 'verifymd5', [], 'filename', 'error', 'originproject', [ $linked ], 'revtime', 'changesmd5', 'name', 'version', 'release', [ 'subpacks' ], [ 'deps' ], [ 'prereqs' ], [ 'exclarch' ], [ 'badarch' ], ]; our $sourceinfolist = [ 'sourceinfolist' => [ $sourceinfo ], ]; our $buildinfo = [ 'buildinfo' => 'project', 'repository', 'package', 'srcserver', 'reposerver', 'downloadurl', [], 'job', 'arch', 'hostarch', # for cross build 'error', 'srcmd5', 'verifymd5', 'rev', 'disturl', 'reason', # just for the explain string of a build reason 'needed', # number of blocked 'revtime', # time of last commit 'readytime', 'specfile', # obsolete 'file', 'versrel', 'bcnt', 'release', 'debuginfo', 'constraintsmd5', [ 'prjconfconstraint' ], [ 'subpack' ], [ 'imagetype' ], # kiwi 'nodbgpkgs', # kiwi 'nosrcpkgs', # kiwi [ 'dep' ], [[ 'bdep' => 'name', 'preinstall', 'vminstall', 'cbpreinstall', 'cbinstall', 'runscripts', 'notmeta', 'noinstall', 'epoch', 'version', 'release', 'arch', 'project', 'repository', 'repoarch', 'binary', 'package', 'srcmd5', ]], [ 'pdep' ], # obsolete [[ 'path' => 'project', 'repository', 'server', ]], [[ 'syspath' => 'project', 'repository', 'server', ]], 'expanddebug', 'followupfile', # for two-stage builds 'masterdispatched', # dispatched through a master dispatcher ]; our $jobstatus = [ 'jobstatus' => 'code', 'result', # succeeded, failed or unchanged 'details', [], 'starttime', 'endtime', 'workerid', 'hostarch', 'uri', # uri to reach worker 'arch', # our architecture 'job', # our jobname 'jobid', # md5 of job info file ]; our $buildreason = [ 'reason' => [], 'explain', # Readable reason 'time', # unix time from start build 'oldsource', # last build source md5 sum, if a source change was the reason [[ 'packagechange' => # list changed files which are used for building 'change', # kind of change (content/meta change, additional file or removed file) 'key', # file name ]], ]; our $buildstatus = [ 'status' => 'package', 'code', 'status', # obsolete, now code 'error', # obsolete, now details [], 'details', 'workerid', # last build data 'hostarch', 'readytime', 'starttime', 'endtime', 'job', # internal, job when building 'uri', # obsolete 'arch', # obsolete ]; our $builddepinfo = [ 'builddepinfo' => [[ 'package' => 'name', [], 'source', [ 'pkgdep' ], [ 'subpkg' ], ]], [[ 'cycle' => [ 'package' ], ]], ]; our $event = [ 'event' => 'type', [], 'project', 'repository', 'arch', 'package', 'job', 'due', ]; our $events = [ 'events' => 'next', 'sync', [ $event ], ]; our $revision = [ 'revision' => 'rev', 'vrev', [], 'srcmd5', 'version', 'time', 'user', 'comment', 'requestid', ]; our $revision_acceptinfo = [ @$revision, [ 'acceptinfo' => 'rev', 'srcmd5', 'osrcmd5', 'xsrcmd5', 'oxsrcmd5', ], ]; our $revisionlist = [ 'revisionlist' => [ $revision ] ]; our $buildhist = [ 'buildhistory' => [[ 'entry' => 'rev', 'srcmd5', 'versrel', 'bcnt', 'time', ]], ]; our $binaryversionlist = [ 'binaryversionlist' => [[ 'binary' => 'name', # should be filename instead. sigh. 'sizek', 'error', 'hdrmd5', 'metamd5', 'leadsigmd5', ]], ]; our $packagebinaryversionlist = [ 'packagebinaryversionlist' => [[ 'binaryversionlist' => 'package', 'code', [[ 'binary' => 'name', 'sizek', 'error', 'hdrmd5', 'metamd5', 'leadsigmd5', ]], ]], ]; our $worker = [ 'worker' => 'hostarch', 'ip', 'port', 'workerid', [ 'buildarch' ], [ 'hostlabel' ], 'sandbox', [ 'linux' => [], 'version', 'flavor' ], [ 'hardware' => [ 'cpu' => [ 'flag' ], ], 'processors', 'memory', # in MBytes 'swap', # in MBytes 'disk', # in MBytes ], 'owner', 'tellnojob', 'job', # set when worker is busy 'arch', # set when worker is busy 'jobid', # set when worker is busy 'reposerver', # set when worker is busy and job was masterdispatched ]; our $packstatuslist = [ 'packstatuslist' => 'project', 'repository', 'arch', [[ 'packstatus' => 'name', 'status', 'error', ]], [[ 'packstatussummary' => 'status', 'count', ]], ]; our $linkpatch = [ '' => [ 'add' => 'name', 'type', 'after', 'popt', 'dir', ], [ 'apply' => 'name', ], [ 'delete' => 'name', ], 'branch', 'topadd', ]; our $link = [ 'link' => 'project', 'package', 'rev', 'vrev', 'cicount', 'baserev', 'missingok', [ 'patches' => [ $linkpatch ], ], ]; our $workerstatus = [ 'workerstatus' => 'clients', [[ 'idle' => 'uri', 'workerid', 'hostarch', ]], [[ 'building' => 'uri', 'workerid', 'hostarch', 'project', 'repository', 'package', 'arch', 'starttime', ]], [[ 'waiting', => 'arch', 'jobs', ]], [[ 'blocked', => 'arch', 'jobs', ]], [[ 'buildavg', => 'arch', 'buildavg', ]], [[ 'partition' => 'name', [[ 'daemon' => 'type', # scheduler/dispatcher/signer/publisher/warden 'arch', # scheduler only 'state', 'starttime', [ 'queue' => # scheduler only 'high', 'med', 'low', 'next', ], ]], ]], ]; our $workerstate = [ 'workerstate' => 'state', 'nextstate', # for exit/restart 'jobid', ]; our $jobhistlay = [ 'package', 'rev', 'srcmd5', 'versrel', 'bcnt', 'readytime', 'starttime', 'endtime', 'code', 'uri', 'workerid', 'hostarch', 'reason', 'verifymd5', ]; our $jobhist = [ 'jobhist' => @$jobhistlay, ]; our $jobhistlist = [ 'jobhistlist' => [ $jobhist ], ]; our $ajaxstatus = [ 'ajaxstatus' => [[ 'watcher' => 'filename', 'state', [[ 'job' => 'id', 'ev', 'fd', 'peer', 'request', ]], ]], [[ 'rpc' => 'uri', 'state', 'ev', 'fd', [[ 'job' => 'id', 'ev', 'fd', 'peer', 'starttime', 'request', ]], ]], [[ 'serialize' => 'filename', [[ 'job' => 'id', 'ev', 'fd', 'peer', 'request', ]], ]], ]; our $serverstatus = [ 'serverstatus' => [[ 'job' => 'id', 'starttime', 'pid', 'peer', 'request', 'group', ]], ]; ##################### new api stuff our $binarylist = [ 'binarylist' => 'package', [[ 'binary' => 'filename', 'size', 'mtime', ]], ]; our $summary = [ 'summary' => [[ 'statuscount' => 'code', 'count', ]], ]; our $schedulerstats = [ 'stats' => 'lastchecked', 'checktime', 'lastfinished', 'lastpublished', ]; our $result = [ 'result' => 'project', 'repository', 'arch', 'code', # pra state, can be "unknown", "broken", "scheduling", "blocked", "building", "finished", "publishing", "published" or "unpublished" 'state', # old name of 'code', to be removed 'details', 'dirty', # marked for re-scheduling if element exists, state might not be correct anymore [ $buildstatus ], [ $binarylist ], $summary, $schedulerstats, ]; our $resultlist = [ 'resultlist' => 'state', 'retryafter', [ $result ], ]; our $opstatus = [ 'status' => 'code', 'origin', [], 'summary', 'details', [[ 'data' => 'name', '_content', ]], [ 'exception' => 'type', 'message', [ 'backtrace' => [ 'line' ], ], ], ]; my $rpm_entry = [ 'rpm:entry' => 'kind', 'name', 'epoch', 'ver', 'rel', 'flags', ]; our $pattern = [ 'pattern' => 'xmlns', # obsolete, moved to patterns 'xmlns:rpm', # obsolete, moved to patterns [], 'name', 'arch', [[ 'version' => 'epoch', 'ver', 'rel', ]], [[ 'summary' => 'lang', '_content', ]], [[ 'description' => 'lang', '_content', ]], 'default', 'uservisible', [[ 'category' => 'lang', '_content', ]], 'icon', 'script', [ 'rpm:provides' => [ $rpm_entry ], ], [ 'rpm:conflicts' => [ $rpm_entry ], ], [ 'rpm:obsoletes' => [ $rpm_entry ], ], [ 'rpm:requires' => [ $rpm_entry ], ], [ 'rpm:suggests' => [ $rpm_entry ], ], [ 'rpm:enhances' => [ $rpm_entry ], ], [ 'rpm:supplements' => [ $rpm_entry ], ], [ 'rpm:recommends' => [ $rpm_entry ], ], ]; our $patterns = [ 'patterns' => 'count', 'xmlns', 'xmlns:rpm', [], [ $pattern ], ]; our $ymp = [ 'metapackage' => 'xmlns:os', 'xmlns', [], [[ 'group' => 'recommended', 'distversion', [], 'name', 'summary', 'description', 'remainSubscribed', [ 'repositories' => [[ 'repository' => 'recommended', 'format', 'producturi', [], 'name', 'summary', 'description', 'url', ]], ], [ 'software' => [[ 'item' => 'type', 'recommended', 'architectures', 'action', [], 'name', 'summary', 'description', ]], ], ]], ]; our $binary_id = [ 'binary' => 'name', 'project', 'package', 'repository', 'version', 'release', 'arch', 'filename', 'filepath', 'baseproject', 'type', ]; our $pattern_id = [ 'pattern' => 'name', 'project', 'repository', 'arch', 'filename', 'filepath', 'baseproject', 'type', ]; our $request = [ 'request' => 'id', 'type', # obsolete, still here to handle OBS pre-1.5 requests 'key', # cache key, not really in request 'retryafter', # timed out waiting for a key change [[ 'action' => 'type', # currently submit, delete, change_devel, add_role, maintenance_release, maintenance_incident, set_bugowner [ 'source' => 'project', 'package', 'rev', # belongs to package attribute 'repository', # for merge request ], [ 'target' => 'project', 'package', 'releaseproject', # for incident request 'repository', # for release and delete request ], [ 'person' => 'name', 'role', ], [ 'group' => 'name', 'role', ], [ 'options' => [], 'sourceupdate', # can be cleanup, update or noupdate 'updatelink', # can be true or false ], [ 'acceptinfo' => 'rev', 'srcmd5', 'osrcmd5', 'xsrcmd5', 'oxsrcmd5', ], ]], [ 'submit' => # this is old style, obsolete by request, but still supported [ 'source' => 'project', 'package', 'rev', ], [ 'target' => 'project', 'package', ], ], [ 'state' => 'name', 'who', 'when', 'superseded_by', # set when state.name is "superseded" [], 'comment', ], [[ 'review' => 'state', # review state (new/accepted or declined) 'by_user', # this user shall review it 'by_group', # one of this groupd shall review it # either user or group must be used, never both 'by_project', # any maintainer of this project can review it 'by_package', # any maintainer of this package can review it (requires by_project) 'who', # this user has reviewed it 'when', [], 'comment', ]], [[ 'history' => 'name', 'who', 'when', 'superseded_by', [], 'comment', ]], 'accept_at', 'title', 'description', ]; our $repositorystate = [ 'repositorystate' => [ 'blocked' ], ]; our $collection = [ 'collection' => 'matches', 'limited', [ $request ], [ $proj ], [ $pack ], [ $binary_id ], [ $pattern_id ], [ 'value' ], ]; our $quota = [ 'quota' => 'packages', [[ 'project' => 'name', 'packages', ]], ]; our $schedulerinfo = [ 'schedulerinfo' => 'arch', 'started', 'time', [], 'slept', 'notready', [ 'queue' => 'high', 'med', 'low', 'next', ], 'projects', 'repositories', [[ 'worst' => 'project', 'repository', 'packages', 'time', ]], 'buildavg', 'avg', 'variance', ]; our $person = [ 'person' => 'login', 'email', 'realname', 'state', [ 'globalrole' ], [ 'watchlist' => [[ 'project' => 'name', ]], ], ]; our $comps = [ 'comps' => [[ 'group' => [], 'id', [[ 'description' => 'xml:lang', '_content', ]], [[ 'name' => 'xml:lang', '_content', ]], [ 'packagelist' => [[ 'packagereq' => 'type', '_content', ]], ], ]], ]; our $dispatchprios = [ 'dispatchprios' => [[ 'prio' => 'project', 'repository', 'arch', 'adjust', ]], ]; # list of used services for a package or project our $services = [ 'services' => [[ 'service' => 'name', 'mode', # "localonly" is skipping this service on server side, "trylocal" is trying to merge changes directly in local files, "disabled" is just skipping it [[ 'param' => 'name', '_content' ]], ]], ]; # service type definitions our $servicetype = [ 'service' => 'name', 'hidden', # "true" to suppress it from service list in GUIs [], 'summary', 'description', [[ 'parameter' => 'name', [], 'description', 'required', # don't run without this parameter 'allowmultiple', # This parameter can be used multiple times [ 'allowedvalue' ], # list of possible values ]], ]; our $servicelist = [ 'servicelist' => [ $servicetype ], ]; our $updateinfoitem = [ 'update' => 'from', 'status', 'type', 'version', [], 'id', 'title', 'severity', 'release', [ 'issued' => 'date', ], [ 'updated' => 'date', ], 'reboot_suggested', [ 'references' => [[ 'reference' => 'href', 'id', 'title', 'type', ]], ], 'description', [ 'pkglist', [[ 'collection' => 'short', [], 'name', [[ 'package' => 'name', 'epoch', 'version', 'release', 'arch', 'src', 'supportstatus', [], 'filename', [ 'sum' => # obsolete? 'type', '_content', ], 'reboot_suggested', 'restart_suggested', 'relogin_suggested', ]], ]], ], ]; our $updateinfo = [ 'updates' => 'xmlns', [ $updateinfoitem ], ]; our $deltapackage = [ 'newpackage' => 'name', 'epoch', 'version', 'release', 'arch', [[ 'delta' => 'oldepoch', 'oldversion', 'oldrelease', [], 'filename', 'sequence', 'size', [ 'checksum' => 'type', '_content', ], ]], ]; our $deltainfo = [ 'deltainfo' => [ $deltapackage ], ]; our $prestodelta = [ 'prestodelta' => [ $deltapackage ], ]; our $sourcediff = [ 'sourcediff' => 'key', [ 'old' => 'project', 'package', 'rev', 'srcmd5', ], [ 'new' => 'project', 'package', 'rev', 'srcmd5', ], [ 'files' => [[ 'file' => 'state', # added, deleted, changed [ 'old' => 'name', 'md5', 'size', 'mtime', ], [ 'new' => 'name', 'md5', 'size', 'mtime', ], [ 'diff' => 'binary', 'lines', 'shown', '_content', ], ]], ], [ 'issues' => [[ 'issue' => 'state', 'tracker', 'name', 'label', 'url', ]] ], ]; our $configuration = [ 'configuration' => [], 'title', #webui only 'description', #webui only 'name', #obsname 'anonymous', 'registration', 'default_access_disabled', 'allow_user_to_create_home_project', 'multiaction_notify_support', 'disallow_group_creation', 'change_password', 'cleanup_after_days', 'hide_private_options', 'gravatar', 'enforce_project_keys', 'download_on_demand', 'download_url', 'ymp_url', 'errbit_url', 'bugzilla_url', 'http_proxy', 'no_proxy', 'admin_email', 'theme', 'cleanup_empty_projects', 'disable_publish_for_branches', [ 'schedulers' => [ 'arch' ], ], ]; our $issue_trackers = [ 'issue-trackers' => [[ 'issue-tracker' => [], 'name', 'description', 'kind', 'label', 'enable-fetch', 'regex', 'user', # 'password', commented out on purpose, should not reach backend 'show-url', 'url', 'issues-updated', ]], ]; our $appdataitem = [ 'application' => [ 'id' => 'type', '_content' ], 'pkgname', 'name', 'summary', [ 'icon' => 'type', [], 'name', [[ 'filecontent' => 'file', '_content' ]], ], [ 'appcategories' => [ 'appcategory' ] ], [ 'mimetypes' => [ 'mimetype' ] ], [ 'keywords' => [ 'keyword' ] ], [ 'url' => 'type', '_content' ] ]; our $appdata = [ 'applications' => 'version', [ $appdataitem ] ]; our $attribute = [ 'attribute' => 'namespace', 'name', 'binary', [ 'value' ], [[ 'issue' => 'name', 'tracker' ]], ]; our $attributes = [ 'attributes' => [ $attribute ], ]; our $size = [ 'size' => 'unit', [], '_content', ]; our $time = [ 'time' => 'unit', [], '_content', ]; # define constraints for build jobs in packages or projects. our @constraint = ( [[ 'hostlabel' => 'exclude', # true or false. default is false. [], '_content' # workers might get labels defined by admin, for example for benchmarking. ]], [ 'sandbox' => 'exclude', # true or false. default is false. [], '_content' # xen/kvm/zvm/lxc/emulator/chroot/secure ], [ 'linux' => [ 'version' => [], 'max' , 'min' , ], 'flavor', ], [ 'hardware' => [ 'cpu' => [ 'flag' ], ], 'processors', [ 'disk' => $size ], [ 'memory' => $size ], [ 'physicalmemory' => $size ], ] ); our $constraints = [ 'constraints' => @constraint, [[ 'overwrite' => [ 'conditions' => [ 'arch' ], [ 'package' ], ], @constraint, ]] ]; our $buildstatistics = [ 'buildstatistics' => [ 'disk' => [ 'usage' => [ 'size' => 'unit', [], '_content', ], 'io_requests', 'io_sectors', ], ], [ 'memory' => [ 'usage' => $size ], ], [ 'times' => [ 'total' => $time ], [ 'preinstall' => $time ], [ 'install' => $time ], [ 'main' => $time ], [ 'download' => $time ], ], [ 'download' => [], $size, 'binaries', 'cachehits', 'preinstallimage', ], ]; our $notifications = [ 'notifications' => 'next', 'sync', [[ 'notification' => 'type', 'time', [[ 'data' => 'key', '_content', ]], ]], ]; our $frozenlinks = [ 'frozenlinks' => [[ 'frozenlink' => 'project', [[ 'package' => 'name', 'srcmd5', 'vrev', ]], ]], ]; 1;