1PUNGI(1)                             Pungi                            PUNGI(1)
2
3
4

NAME

6       pungi - Pungi Documentation
7
8       Contents:
9

ABOUT PUNGI

11         [image: Pungi Logo] [image]
12
13       Pungi is a distribution compose tool.
14
15       Composes  are  release snapshots that contain release deliverables such
16       as:
17
18       • installation trees
19
20         • RPMs
21
22         • repodata
23
24         • comps
25
26       • (bootable) ISOs
27
28       • kickstart trees
29
30         • anaconda images
31
32         • images for PXE boot
33
34   Tool overview
35       Pungi consists of multiple separate executables backed by a common  li‐
36       brary.
37
38       The  main  entry-point  is  the pungi-koji script. It loads the compose
39       configuration and kicks off the process. Composing itself  is  done  in
40       phases.   Each  phase  is  responsible for generating some artifacts on
41       disk and updating the compose object that is threaded through  all  the
42       phases.
43
44       Pungi itself does not actually do that much. Most of the actual work is
45       delegated to separate executables. Pungi just makes sure that  all  the
46       commands  are  invoked  in the appropriate order and with correct argu‐
47       ments. It also moves the artifacts to correct locations.
48
49       The executable name pungi-koji comes from the fact that most  of  those
50       separate  executables submit tasks to Koji that does the actual work in
51       an auditable way.
52
53       However unlike doing everything manually in Koji, Pungi will make  sure
54       you are building all images from the same package set, and will produce
55       even deliverables that Koji can not create like YUM repos and installer
56       ISOs.
57
58   Links
59       • Upstream GIT: https://pagure.io/pungi/
60
61       • Issue tracker: https://pagure.io/pungi/issues
62
63       • Questions can be asked on #fedora-releng IRC channel on FreeNode
64
65   Origin of name
66       The name Pungi comes from the instrument used to charm snakes. Anaconda
67       being the software Pungi was manipulating, and anaconda being a  snake,
68       led to the referential naming.
69
70       The first name, which was suggested by Seth Vidal, was FIST, Fedora In‐
71       stallation <Something> Tool. That name was quickly  discarded  and  re‐
72       placed with Pungi.
73
74       There  was  also a bit of an inside joke that when said aloud, it could
75       sound like punji, which is a sharpened stick at the bottom of  a  trap.
76       Kind of like software…
77

PHASES

79       Each  invocation  of  pungi-koji  consists of a set of phases.  [image:
80       phase diagram] [image]
81
82       Most of the phases run sequentially (left-to-right in the diagram), but
83       there are use cases where multiple phases run in parallel. This happens
84       for phases whose main point is to wait for a Koji task to finish.
85
86   Init
87       The first phase to ever run. Can not be skipped. It prepares the  comps
88       files  for  variants  (by filtering out groups and packages that should
89       not be there).  See Processing comps files for details about  how  this
90       is done.
91
92   Pkgset
93       This  phase loads a set of packages that should be composed. It has two
94       separate results: it prepares repos with packages  in  work/  directory
95       (one  per arch) for further processing, and it returns a data structure
96       with mapping of packages to architectures.
97
98   Buildinstall
99       Spawns a bunch of threads, each of which runs either lorax or  buildin‐
100       stall  command  (the latter coming from anaconda package). The commands
101       create boot.iso and other boot configuration files. The  image  is  fi‐
102       nally linked into the compose/ directory as netinstall media.
103
104       The created images are also needed for creating live media or other im‐
105       ages in later phases.
106
107       With lorax this phase runs one task per variant.arch  combination.  For
108       buildinstall  command there is only one task per architecture and prod‐
109       uct.img should be used to customize the results.
110
111   Gather
112       This phase uses data collected by pkgset phase  and  figures  out  what
113       packages  should  be  in  each variant. The basic mapping can come from
114       comps file, a JSON mapping or additional_packages config  option.  This
115       inputs  can  then be enriched by adding all dependencies. See Gathering
116       packages for details.
117
118       Once the mapping is finalized, the packages are linked  to  appropriate
119       places and the rpms.json manifest is created.
120
121   ExtraFiles
122       This  phase collects extra files from the configuration and copies them
123       to the compose directory. The files are described by a JSON file in the
124       compose  subtree  where the files are copied. This metadata is meant to
125       be distributed with the data (on ISO images).
126
127   Createrepo
128       This phase creates RPM repositories for each variant.arch tree.  It  is
129       actually  reading  the  rpms.json manifest to figure out which packages
130       should be included.
131
132   OSTree
133       Updates an ostree repository with a new commit with packages  from  the
134       compose.   The  repository  lives outside of the compose and is updated
135       immediately. If the compose fails in a later stage, the commit will not
136       be reverted.
137
138       Implementation wise, this phase runs rpm-ostree command in Koji runroot
139       (to allow running on different arches).
140
141   Createiso
142       Generates ISO files and accumulates enough metadata to be able to  cre‐
143       ate image.json manifest. The file is however not created in this phase,
144       instead it is dumped in the pungi-koji script itself.
145
146       The files include a repository with all RPMs from  the  variant.  There
147       will be multiple images if the packages do not fit on a single image.
148
149       The  image  will  be  bootable if buildinstall phase is enabled and the
150       packages fit on a single image.
151
152       There can also be images with  source  repositories.  These  are  never
153       bootable.
154
155   ExtraIsos
156       This  phase  is  very  similar to createiso, except it combines content
157       from multiple variants onto a single image. Packages, repodata and  ex‐
158       tra files from each configured variant are put into a subdirectory. Ad‐
159       ditional extra files can be put into top level of the image. The  image
160       will be bootable if the main variant is bootable.
161
162   LiveImages, LiveMedia
163       Creates  media  in  Koji  with koji spin-livecd, koji spin-appliance or
164       koji spin-livemedia command. When the media are  finished,  the  images
165       are  copied  into the compose/ directory and metadata for images is up‐
166       dated.
167
168   ImageBuild
169       This phase wraps up koji image-build. It also updates the metadata  ul‐
170       timately responsible for images.json manifest.
171
172   OSBuild
173       Similarly  to  image build, this phases creates a koji osbuild task. In
174       the background it uses OSBuild Composer to create images.
175
176   OSBS
177       This phase builds container base images in OSBS.
178
179       The finished images are available in registry provided by OSBS, but not
180       downloaded directly into the compose. The is metadata about the created
181       image in compose/metadata/osbs.json.
182
183   ImageContainer
184       This phase builds a container image in OSBS, and stores the metadata in
185       the  same  file as OSBS phase. The container produced here wraps a dif‐
186       ferent image, created it ImageBuild or OSBuild phase. It can be  useful
187       to deliver a VM image to containerized environments.
188
189   OSTreeInstaller
190       Creates  bootable  media  that carry an ostree repository as a payload.
191       These images are created by running lorax with special templates. Again
192       it runs in Koji runroot.
193
194   Repoclosure
195       Run repoclosure on each repository. By default errors are only reported
196       in the log, the compose will still be considered a success. The  actual
197       error  has to be looked up in the compose logs directory. Configuration
198       allows customizing this.
199
200   ImageChecksum
201       Responsible for generating checksums for the images. The checksums  are
202       stored  in  image manifest as well as files on disk. The list of images
203       to be processed is obtained from the image manifest. This way  all  im‐
204       ages will get the same checksums irrespective of the phase that created
205       them.
206
207   Test
208       This phase is supposed to run some sanity checks on the  finished  com‐
209       pose.
210
211       The  only  test  is  to check all images listed the metadata and verify
212       that they look sane. For ISO files headers are checked  to  verify  the
213       format is correct, and for bootable media a check is run to verify they
214       have properties that allow booting.
215

CONFIG FILE FORMAT

217       The configuration file parser is provided by kobo
218
219       The file follows a Python-like format. It consists  of  a  sequence  of
220       variables that have a value assigned to them.
221
222          variable = value
223
224       The  variable  names  must  follow  the same convention as Python code:
225       start with a letter and consist  of  letters,  digits  and  underscores
226       only.
227
228       The  values can be either an integer, float, boolean (True or False), a
229       string or None. Strings must be enclosed in  either  single  or  double
230       quotes.
231
232       Complex types are supported as well.
233
234       A list is enclosed in square brackets and items are separated with com‐
235       mas.  There can be a comma after the last item as well.
236
237          a_list = [1,
238                    2,
239                    3,
240                   ]
241
242       A tuple works like a list, but is enclosed in parenthesis.
243
244          a_tuple = (1, "one")
245
246       A dictionary is wrapped in brackets, and consists of key:  value  pairs
247       separated by commas. The keys can only be formed from basic types (int,
248       float, string).
249
250          a_dict = {
251              'foo': 'bar',
252              1: None
253          }
254
255       The value assigned to a variable can also be taken from  another  vari‐
256       able.
257
258          one = 1
259          another = one
260
261       Anything  on a line after a # symbol is ignored and functions as a com‐
262       ment.
263
264   Importing other files
265       It is possible to include another configuration  file.  The  files  are
266       looked up relative to the currently processed file.
267
268       The general structure of import is:
269
270          from FILENAME import WHAT
271
272       The FILENAME should be just the base name of the file without extension
273       (which must be .conf). WHAT can either be a  comma  separated  list  of
274       variables or *.
275
276          # Opens constants.conf and brings PI and E into current scope.
277          from constants import PI, E
278
279          # Opens common.conf and brings everything defined in that file into current
280          # file as well.
281          from common import *
282
283       NOTE:
284          Pungi  will  copy  the configuration file given on command line into
285          the logs/ directory. Only this single file will be copied,  not  any
286          included  ones.  (Copying  included files requires a fix in kobo li‐
287          brary.)
288
289          The JSON-formatted dump of configuration is correct though.
290
291   Formatting strings
292       String interpolation is available as well. It uses a %-encoded  format.
293       See Python documentation for more details.
294
295          joined = "%s %s" % (var_a, var_b)
296
297          a_dict = {
298              "fst": 1,
299              "snd": 2,
300          }
301          another = "%(fst)s %(snd)s" % a_dict
302

CONFIGURATION

304       Please  read  productmd documentation for terminology and other release
305       and compose related details.
306
307   Minimal Config Example
308          # RELEASE
309          release_name = "Fedora"
310          release_short = "Fedora"
311          release_version = "23"
312
313          # GENERAL SETTINGS
314          comps_file = "comps-f23.xml"
315          variants_file = "variants-f23.xml"
316
317          # KOJI
318          koji_profile = "koji"
319          runroot = False
320
321          # PKGSET
322          sigkeys = [None]
323          pkgset_source = "koji"
324          pkgset_koji_tag = "f23"
325
326          # GATHER
327          gather_method = "deps"
328          greedy_method = "build"
329          check_deps = False
330
331          # BUILDINSTALL
332          buildinstall_method = "lorax"
333
334   Release
335       Following mandatory options describe a release.
336
337   Options
338       release_name [mandatory]
339              (str) – release name
340
341       release_short [mandatory]
342              (str) – release short name, without spaces and  special  charac‐
343              ters
344
345       release_version [mandatory]
346              (str) – release version
347
348       release_type = “ga” (str) – release type, for example ga,
349              updates or updates-testing. See list of all valid values in pro‐
350              ductmd documentation.
351
352       release_internal = False
353              (bool) – whether the compose is meant for public consumption
354
355       treeinfo_version
356              (str) Version to display in .treeinfo files. If not  configured,
357              the value from release_version will be used.
358
359   Example
360          release_name = "Fedora"
361          release_short = "Fedora"
362          release_version = "23"
363          # release_type = "ga"
364
365   Base Product
366       Base  product  options  are  optional and we need to them only if we’re
367       composing a layered product built on another (base) product.
368
369   Options
370       base_product_name
371              (str) – base product name
372
373       base_product_short
374              (str) – base product short  name,  without  spaces  and  special
375              characters
376
377       base_product_version
378              (str) – base product major version
379
380       base_product_type = “ga”
381              (str)  –  base product type, “ga”, “updates” etc., for full list
382              see documentation of productmd.
383
384   Example
385          release_name = "RPM Fusion"
386          release_short = "rf"
387          release_version = "23.0"
388
389          base_product_name = "Fedora"
390          base_product_short = "Fedora"
391          base_product_version = "23"
392
393   General Settings
394   Options
395       comps_file [mandatory]
396              (scm_dict, str or None) – reference to comps XML file  with  in‐
397              stallation groups
398
399       variants_file [mandatory]
400              (scm_dict  or str) – reference to variants XML file that defines
401              release variants and architectures
402
403       module_defaults_dir [optional]
404              (scm_dict or str) – reference the module defaults directory con‐
405              taining  modulemd-defaults  YAML  documents.  Files relevant for
406              modules included in the compose will be embedded in  the  gener‐
407              ated repodata and available for DNF.
408
409                 module_defaults_dir = {
410                     "scm": "git",
411                     "repo": "https://pagure.io/releng/fedora-module-defaults.git",
412                     "dir": ".",
413                 }
414
415       failable_deliverables [optional]
416              (list)  – list which deliverables on which variant and architec‐
417              ture can fail and not abort the whole compose. This only applies
418              to  buildinstall  and iso parts. All other artifacts can be con‐
419              figured in their respective part of configuration.
420
421              Please note that * as a wildcard matches all  architectures  but
422              src.
423
424       comps_filter_environments [optional]
425              (bool)  –  When  set to False, the comps files for variants will
426              not have their environments filtered to match the variant.
427
428       tree_arches
429              ([str]) – list of architectures which should be included; if un‐
430              defined, all architectures from variants.xml will be included
431
432       tree_variants
433              ([str])  –  list  of variants which should be included; if unde‐
434              fined, all variants from variants.xml will be included
435
436       repoclosure_strictness
437              (list) – variant/arch mapping describing how repoclosure  should
438              run.  Possible values are
439
440off – do not run repoclosure
441
442lenient  –  (default)  run repoclosure and write results to
443                   logs, but detected errors are only reported in logs
444
445fatal – abort compose when any issue is detected
446
447              When multiple blocks in the mapping match a variant/arch  combi‐
448              nation, the last value will win.
449
450       repoclosure_backend
451              (str) – Select which tool should be used to run repoclosure over
452              created repositories. By default yum is used, but you can switch
453              to  dnf.  Please note that when dnf is used, the build dependen‐
454              cies check is skipped. On Python 3, only dnf backend  is  avail‐
455              able.
456
457              See also: the gather_backend setting for Pungi’s gather phase.
458
459       cts_url
460              (str)  – URL to Compose Tracking Service. If defined, Pungi will
461              add the compose to Compose Tracking Service and ge  the  compose
462              ID from it.  For example https://cts.localhost.tld/
463
464       cts_keytab
465              (str)  –  Path to Kerberos keytab which will be used for Compose
466              Tracking Service Kerberos authentication. If  not  defined,  the
467              default Kerberos principal is used.
468
469       compose_type
470              (str)  – Allows to set default compose type. Type set via a com‐
471              mand-line option overwrites this.
472
473       mbs_api_url
474              (str) – URL to Module Build  Service  (MBS)  API.   For  example
475              https://mbs.example.com/module-build-service/2.    This  is  re‐
476              quired by pkgset_scratch_modules.
477
478   Example
479          comps_file = {
480              "scm": "git",
481              "repo": "https://git.fedorahosted.org/git/comps.git",
482              "branch": None,
483              "file": "comps-f23.xml.in",
484          }
485
486          variants_file = {
487              "scm": "git",
488              "repo": "https://pagure.io/pungi-fedora.git ",
489              "branch": None,
490              "file": "variants-fedora.xml",
491          }
492
493          failable_deliverables = [
494              ('^.*$', {
495                  # Buildinstall can fail on any variant and any arch
496                  '*': ['buildinstall'],
497                  'src': ['buildinstall'],
498                  # Nothing on i386 blocks the compose
499                  'i386': ['buildinstall', 'iso', 'live'],
500              })
501          ]
502
503          tree_arches = ["x86_64"]
504          tree_variants = ["Server"]
505
506          repoclosure_strictness = [
507              # Make repoclosure failures fatal for compose on all variants …
508              ('^.*$', {'*': 'fatal'}),
509              # … except for Everything where it should not run at all.
510              ('^Everything$', {'*': 'off'})
511          ]
512
513   Image Naming
514       Both image name and volume id are generated based on the configuration.
515       Since  the  volume  id is limited to 32 characters, there are more set‐
516       tings available.  The process for generating volume id is to get a list
517       of  possible  formats  and  try them sequentially until one fits in the
518       length limit. If substitutions are configured, each attempted volume id
519       will be modified by it.
520
521       For  layered products, the candidate formats are first image_volid_lay‐
522       ered_product_formats followed by image_volid_formats.  Otherwise,  only
523       image_volid_formats are tried.
524
525       If  no  format  matches the length limit, an error will be reported and
526       compose aborted.
527
528   Options
529       There a couple common format specifiers available for both the options:
530
531compose_id
532
533release_short
534
535version
536
537date
538
539respin
540
541type
542
543type_suffix
544
545label
546
547label_major_version
548
549variant
550
551arch
552
553disc_type
554
555       image_name_format [optional]
556              (str|dict) – Python’s format string to serve as template for im‐
557              age  names.  The  value  can  also be a dict mapping variant UID
558              regexes to the format string. The pattern  should  not  overlap,
559              otherwise it is undefined which one will be used.
560
561              This  format will be used for all phases generating images. Cur‐
562              rently that means createiso, live_images and buildinstall.
563
564              Available extra keys are:
565
566disc_num
567
568suffix
569
570       image_volid_formats [optional]
571              (list) – A list of format strings for generating volume id.
572
573              The extra available keys are:
574
575base_product_short
576
577base_product_version
578
579       image_volid_layered_product_formats [optional]
580              (list) – A list of format strings for generating volume  id  for
581              layered  products.  The  keys  available are the same as for im‐
582              age_volid_formats.
583
584       restricted_volid = False
585              (bool) – New versions of lorax  replace  all  non-alphanumerical
586              characters  with dashes (underscores are preserved). This option
587              will mimic similar behaviour in Pungi.
588
589       volume_id_substitutions [optional]
590              (dict) – A mapping of string replacements to shorten the  volume
591              id.
592
593       disc_types [optional]
594              (dict)  –  A  mapping  for  customizing  disc_type used in image
595              names.
596
597              Available keys are:
598
599boot – for boot.iso  images  created  in   buildinstall
600                       phase
601
602live – for images created by live_images phase
603
604dvd – for images created by createiso phase
605
606ostree – for ostree installer images
607
608              Default values are the same as the keys.
609
610   Example
611          # Image name respecting Fedora's image naming policy
612          image_name_format = "%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s%(suffix)s"
613          # Use the same format for volume id
614          image_volid_formats = [
615              "%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s"
616          ]
617          # No special handling for layered products, use same format as for regular images
618          image_volid_layered_product_formats = []
619          # Replace "Cloud" with "C" in volume id etc.
620          volume_id_substitutions = {
621              'Cloud': 'C',
622              'Alpha': 'A',
623              'Beta': 'B',
624              'TC': 'T',
625          }
626
627          disc_types = {
628              'boot': 'netinst',
629              'live': 'Live',
630              'dvd': 'DVD',
631          }
632
633   Signing
634       If  you  want  to sign deliverables generated during pungi run like RPM
635       wrapped images. You must provide few configuration options:
636
637       signing_command [optional]
638              (str) – Command that will be run with a koji build as  a  single
639              argument.  This  command  must not require any user interaction.
640              If you need to pass a password for a signing key to the command,
641              do  this  via  command line option of the command and use string
642              formatting   syntax   %(signing_key_password)s.    (See    sign‐
643              ing_key_password_file).
644
645       signing_key_id [optional]
646              (str)  –  ID of the key that will be used for the signing.  This
647              ID will be used when crafting koji paths to signed files (kojip‐
648              kgs.fedoraproject.org/pack‐
649              ages/NAME/VER/REL/data/signed/KEYID/..).
650
651       signing_key_password_file [optional]
652              (str) – Path to a file with password that will be formatted into
653              signing_command  string via %(signing_key_password)s string for‐
654              mat syntax (if used).  Because pungi config is usually stored in
655              git and is part of compose logs we don’t want password to be in‐
656              cluded directly in the config.  Note: If - string  is  used  in‐
657              stead of a filename, then you will be asked for the password in‐
658              teractivelly right after pungi starts.
659
660   Example
661          signing_command = '~/git/releng/scripts/sigulsign_unsigned.py -vv --password=%(signing_key_password)s fedora-24'
662          signing_key_id = '81b46521'
663          signing_key_password_file = '~/password_for_fedora-24_key'
664
665   Git URLs
666       In multiple places the config requires URL of a Git repository to down‐
667       load  some  file from. This URL is passed on to Koji. It is possible to
668       specify which commit to use using this syntax:
669
670          git://git.example.com/git/repo-name.git?#<rev_spec>
671
672       The <rev_spec> pattern can be replaced with actual commit  SHA,  a  tag
673       name,  HEAD  to  indicate  that tip of default branch should be used or
674       origin/<branch_name> to use tip of arbitrary branch.
675
676       If the URL specifies a branch or HEAD, Pungi will replace it  with  the
677       actual  commit SHA. This will later show up in Koji tasks and help with
678       tracing what particular inputs were used.
679
680       NOTE:
681          The origin must be specified because of the way Koji works with  the
682          repository.  It  will  clone the repository then switch to requested
683          state with git reset --hard REF. Since no local  branches  are  cre‐
684          ated,  we  need  to use full specification including the name of the
685          remote.
686
687   Createrepo Settings
688   Options
689       createrepo_checksum
690              (str) – specify checksum type for createrepo;  expected  values:
691              sha512, sha256, sha1. Defaults to sha256.
692
693       createrepo_c = True
694              (bool) – use createrepo_c (True) or legacy createrepo (False)
695
696       createrepo_deltas = False
697              (list)  –  generate  delta  RPMs  against an older compose. This
698              needs to be used together with --old-composes command line argu‐
699              ment.  The  value  should be a mapping of variants and architec‐
700              tures that should enable creating delta RPMs. Source and  debug‐
701              info repos never have deltas.
702
703       createrepo_use_xz = False
704              (bool)  –  whether  to pass --xz to the createrepo command. This
705              will cause the SQLite databases to be compressed with xz.
706
707       createrepo_num_threads
708              (int) – how many concurrent createrepo process to run.  The  de‐
709              fault is to use one thread per CPU available on the machine.
710
711       createrepo_num_workers
712              (int) – how many concurrent createrepo workers to run. Value de‐
713              faults to 3.
714
715       createrepo_database
716              (bool) – whether to create SQLite database as part of the  repo‐
717              data.  This  is only useful as an optimization for clients using
718              Yum to consume to the repo.  Default  value  depends  on  gather
719              backend. For DNF it’s turned off, for Yum the default is True.
720
721       createrepo_extra_args
722              ([str])  –  a list of extra arguments passed on to createrepo or
723              createrepo_c executable.  This  could  be  useful  for  enabling
724              zchunk generation and pointing it to correct dictionaries.
725
726       createrepo_extra_modulemd
727              (dict) – a mapping of variant UID to an scm dict.  If specified,
728              it should point to a directory with extra module  metadata  YAML
729              files that will be added to the repository for this variant. The
730              cloned files should be split into subdirectories for each archi‐
731              tecture of the variant.
732
733       createrepo_enable_cache = True
734              (bool) – whether to use --cachedir option of createrepo. It will
735              cache and reuse checksum vaules to speed  up  createrepo  phase.
736              The  cache  dir is located at /var/cache/pungi/createrepo_c/$re‐
737              lease_short-$uid e.g. /var/cache/pungi/createrepo_c/Fedora-1000
738
739       product_id = None
740              (scm_dict) – If specified, it should point to a  directory  with
741              certificates  *<variant_uid>-<arch>-*.pem.  Pungi will copy each
742              certificate file into the relevant Yum repositories as a produc‐
743              tid  file in the repodata directories. The purpose of these pro‐
744              ductid   files   is   to   expose   the    product    data    to
745              subscription-manager.   subscription-manager  includes  a “prod‐
746              uct-id” Yum plugin that can  read  these  productid  certificate
747              files from each Yum repository.
748
749       product_id_allow_missing = False
750              (bool)  –  When  product_id  is  used and a certificate for some
751              variant and architecture is missing, Pungi will exit with an er‐
752              ror  by  default.   When you set this option to True, Pungi will
753              ignore the missing certificate and simply log a warning message.
754
755       product_id_allow_name_prefix = True
756              (bool) – Allow arbitrary prefix for the  certificate  file  name
757              (see  leading  *  in  the pattern above). Setting this option to
758              False will make the pattern more strict by  requiring  the  file
759              name to start directly with variant name.
760
761   Example
762          createrepo_checksum = "sha"
763          createrepo_deltas = [
764              # All arches for Everything should have deltas.
765              ('^Everything$', {'*': True}),
766              # Also Server.x86_64 should have them (but not on other arches).
767              ('^Server$', {'x86_64': True}),
768          ]
769          createrepo_extra_modulemd = {
770              "Server": {
771                  "scm": "git",
772                  "repo": "https://example.com/extra-server-modulemd.git",
773                  "dir": ".",
774                  # The directory should have this layout. Each architecture for the
775                  # variant should be included (even if the directory is empty.
776                  # .
777                  # ├── aarch64
778                  # │   ├── some-file.yaml
779                  # │   └ ...
780                  # └── x86_64
781              }
782          }
783
784   Package Set Settings
785   Options
786       sigkeys
787              ([str  or  None])  – priority list of signing key IDs. These key
788              IDs match the key IDs for the builds in Koji. Pungi will  choose
789              signed  packages  according to the order of the key IDs that you
790              specify here. Use one single key in this list to ensure that all
791              RPMs are signed by one key. If the list includes an empty string
792              or None, Pungi will allow unsigned packages. If  the  list  only
793              includes None, Pungi will use all unsigned packages.
794
795       pkgset_source [mandatory]
796              (str)  –  “koji”  (any  koji instance) or “repos” (arbitrary yum
797              repositories)
798
799       pkgset_koji_tag
800              (str|[str]) – tag(s) to read package set from. This  option  can
801              be omitted for modular composes.
802
803       pkgset_koji_builds
804              (str|[str]) – extra build(s) to include in a package set defined
805              as NVRs.
806
807       pkgset_koji_scratch_tasks
808              (str|[str]) – RPM scratch build task(s) to include in a  package
809              set, defined as task IDs. This option can be used only when com‐
810              pose_type is set to test. The RPM still needs to have higher NVR
811              than  any other RPM with the same name coming from other sources
812              in order to appear in the resulting compose.
813
814       pkgset_koji_module_tag
815              (str|[str]) – tags to read module from. This option works  simi‐
816              larly to listing tags in variants XML. If tags are specified and
817              variants XML specifies some modules via NSVC (or part of),  only
818              modules  matching  that  list  will  be used (and taken from the
819              tag). Inheritance is used automatically.
820
821       pkgset_koji_module_builds
822              (dict) – A mapping of variants to extra module builds to include
823              in a package set: {variant: [N:S:V:C]}.
824
825       pkgset_koji_inherit = True
826              (bool)  –  inherit  builds  from parent tags; we can turn it off
827              only if we have all builds tagged in a single tag
828
829       pkgset_koji_inherit_modules = False
830              (bool) – the same as above, but this  only  applies  to  modular
831              tags.  This  option applies to the content tags that contain the
832              RPMs.
833
834       pkgset_repos
835              (dict) – A mapping of architectures to repositories  with  RPMs:
836              {arch: [repo]}. Only use when pkgset_source = "repos".
837
838       pkgset_scratch_modules
839              (dict)  – A mapping of variants to scratch module builds: {vari‐
840              ant: [N:S:V:C]}. Requires mbs_api_url.
841
842       pkgset_exclusive_arch_considers_noarch = True
843              (bool) – If a package includes noarch in its ExclusiveArch  tag,
844              it will be included in all architectures since noarch is compat‐
845              ible with everything. Set this option to False to ignore  noarch
846              in ExclusiveArch and always consider only binary architectures.
847
848       pkgset_allow_reuse = True
849              (bool)  –  When set to True, Pungi will try to reuse pkgset data
850              from the old composes specified by --old-composes. When enabled,
851              this  option  can speed up new composes because it does not need
852              to calculate the pkgset data from Koji. However, if you block or
853              unblock  a  package in Koji (for example) between composes, then
854              Pungi may not respect those changes in your new compose.
855
856       signed_packages_retries = 0
857              (int) – In automated workflows, you might start a compose before
858              Koji has completely written all signed packages to disk. In this
859              case you may want Pungi to wait for the  package  to  appear  in
860              Koji’s  storage.  This option controls how many times Pungi will
861              retry looking for the signed copy.
862
863       signed_packages_wait = 30
864              (int) – Interval in seconds for how long  to  wait  between  at‐
865              tempts  to  find  signed  packages. This option only makes sense
866              when signed_packages_retries is set higher than 0.
867
868   Example
869          sigkeys = [None]
870          pkgset_source = "koji"
871          pkgset_koji_tag = "f23"
872
873   Buildinstall Settings
874       Script or process that creates bootable images with Anaconda  installer
875       is historically called buildinstall.
876
877   Options
878       buildinstall_method
879              (str)  –  “lorax”  (f16+,  rhel7+)  or “buildinstall” (older re‐
880              leases)
881
882       lorax_options
883              (list) – special options passed on to lorax.
884
885              Format: [(variant_uid_regex, {arch|*: {option: name}})].
886
887              Recognized options are:
888
889bugurl str (default None)
890
891nomacboot bool (default True)
892
893noupgrade bool (default True)
894
895add_template [str] (default empty)
896
897add_arch_template [str] (default empty)
898
899add_template_var [str] (default empty)
900
901add_arch_template_var [str] (default empty)
902
903rootfs_size – [int] (default empty)
904
905version – [str] (default from treeinfo_version  or  re‐
906                       lease_version)  – used as --version and --release argu‐
907                       ment on the lorax command line
908
909dracut_args – [[str]] (default  empty)  override  argu‐
910                       ments  for  dracut.  Please note that if this option is
911                       used, lorax will not use any other  arguments,  so  you
912                       have  to provide a full list and can not just add some‐
913                       thing.
914
915skip_branding bool (default False)
916
917squashfs_only  bool   (default   False)   pass   the
918                       –squashfs_only to Lorax.
919
920configuration_file  –  (scm_dict)  (default empty) pass
921                       the specified configuration file to Lorax using the  -c
922                       option.
923
924       lorax_extra_sources
925              (list)  –  a  variant/arch  mapping  with  urls for extra source
926              repositories added to Lorax command line. Either one repo  or  a
927              list can be specified.
928
929       lorax_use_koji_plugin = False
930              (bool) – When set to True, the Koji pungi_buildinstall task will
931              be used to execute Lorax instead of runroot.  Use  only  if  the
932              Koji instance has the pungi_buildinstall plugin installed.
933
934       buildinstall_kickstart
935              (scm_dict)  –  If  specified, this kickstart file will be copied
936              into each file and pointed to in boot configuration.
937
938       buildinstall_topdir
939              (str) – Full path to top directory where  the  runroot  buildin‐
940              stall Koji tasks output should be stored. This is useful in sit‐
941              uation when the Pungi compose is not generated on the same stor‐
942              age as the Koji task is running on. In this case, Pungi can pro‐
943              vide input repository for runroot task using HTTP  and  set  the
944              output  directory for this task to buildinstall_topdir. Once the
945              runroot task finishes, Pungi will copy the  results  of  runroot
946              tasks to the compose working directory.
947
948       buildinstall_skip
949              (list)  – mapping that defines which variants and arches to skip
950              during  buildinstall;  format:   [(variant_uid_regex,   {arch|*:
951              True})]. This is only supported for lorax.
952
953       buildinstall_allow_reuse = False
954              (bool)  – When set to True, Pungi will try to reuse buildinstall
955              results from old compose specified by --old-composes.
956
957       buildinstall_packages
958              (list) – Additional packages to be installed in the runroot  en‐
959              vironment  where  lorax  will  run  to create installer. Format:
960              [(variant_uid_regex, {arch|*: [package_globs]})].
961
962   Example
963          buildinstall_method = "lorax"
964
965          # Enables macboot on x86_64 for all variants and builds upgrade images
966          # everywhere.
967          lorax_options = [
968              ("^.*$", {
969                  "x86_64": {
970                      "nomacboot": False
971                  }
972                  "*": {
973                      "noupgrade": False
974                  }
975              })
976          ]
977
978          # Don't run buildinstall phase for Modular variant
979          buildinstall_skip = [
980              ('^Modular', {
981                  '*': True
982              })
983          ]
984
985          # Add another repository for lorax to install packages from
986          lorax_extra_sources = [
987              ('^Simple$', {
988                  '*': 'https://example.com/repo/$basearch/',
989              })
990          ]
991
992          # Additional packages to be installed in the Koji runroot environment where
993          # lorax will run.
994          buildinstall_packages = [
995              ('^Simple$', {
996                  '*': ['dummy-package'],
997              })
998          ]
999
1000       NOTE:
1001          It is advised to run buildinstall (lorax) in koji, i.e. with runroot
1002          enabled for clean build environments, better logging, etc.
1003
1004       WARNING:
1005          Lorax  installs  RPMs  into  a  chroot.  This involves running %post
1006          scriptlets and they frequently run executables in  the  chroot.   If
1007          we’re  composing for multiple architectures, we must use runroot for
1008          this reason.
1009
1010   Gather Settings
1011   Options
1012       gather_method [mandatory]
1013              (str*|*dict) – Options are deps, nodeps and  hybrid.   Specifies
1014              whether  and how package dependencies should be pulled in.  Pos‐
1015              sible configuration can be one value for  all  variants,  or  if
1016              configured  per-variant  it can be a simple string hybrid or a a
1017              dictionary mapping source type to a value  of  deps  or  nodeps.
1018              Make  sure  only  one regex matches each variant, as there is no
1019              guarantee which value will be used if there are multiple  match‐
1020              ing  ones. All used sources must have a configured method unless
1021              hybrid solving is used.
1022
1023       gather_fulltree = False
1024              (bool) – When set to True all RPMs built from an SRPM  will  al‐
1025              ways be included. Only use when gather_method = "deps".
1026
1027       gather_selfhosting = False
1028              (bool)  – When set to True, Pungi will build a self-hosting tree
1029              by following build dependencies. Only use when  gather_method  =
1030              "deps".
1031
1032       gather_allow_reuse = False
1033              (bool)  –  When  set to True, Pungi will try to reuse gather re‐
1034              sults from old compose specified by --old-composes.
1035
1036       greedy_method = none
1037              (str) – This option controls how package requirements are satis‐
1038              fied in case a particular Requires has multiple candidates.
1039
1040none – the best packages is selected to satisfy the dependency
1041                and only that one is pulled into the compose
1042
1043all – packages that provide the symbol are pulled in
1044
1045build – the best package is selected, and  then  all  packages
1046                from the same build that provide the symbol are pulled in
1047
1048              NOTE:
1049                 As  an  example  let’s work with this situation: a package in
1050                 the compose has Requires: foo. There are three packages  with
1051                 Provides:  foo: pkg-a, pkg-b-provider-1 and pkg-b-provider-2.
1052                 The pkg-b-* packages are build from the same source  package.
1053                 Best match determines pkg-b-provider-1 as best matching pack‐
1054                 age.
1055
1056                 • With greedy_method = "none" only pkg-b-provider-1  will  be
1057                   pulled in.
1058
1059                 • With  greedy_method  =  "all"  all  three  packages will be
1060                   pulled in.
1061
1062                 • With   greedy_method   =   "build"   pkg-b-provider-1   and
1063                   pkg-b-provider-2 will be pulled in.
1064
1065       gather_backend
1066              (str)  –This  changes the entire codebase doing dependency solv‐
1067              ing, so it can change the result in unpredictable ways.
1068
1069              On Python 2, the choice is between yum or dnf  and  defaults  to
1070              yum. On Python 3 dnf is the only option and default.
1071
1072              Particularly the multilib work is performed differently by using
1073              python-multilib library. Please refer to multilib option to  see
1074              the differences.
1075
1076              See  also:  the repoclosure_backend setting for Pungi’s repoclo‐
1077              sure phase.
1078
1079       multilib
1080              (list) – mapping of variant regexes and arches to list of multi‐
1081              lib methods
1082
1083              Available methods are:
1084
1085none – no package matches this method
1086
1087all – all packages match this method
1088
1089runtime – packages that install some shared object file
1090                       (*.so.*) will match.
1091
1092devel  –  packages  whose  name  ends  with  -devel  or
1093                       --static suffix will be matched. When dnf is used, this
1094                       method automatically enables runtime  method  as  well.
1095                       With  yum  backend  this  method  also uses a hardcoded
1096                       blacklist and whitelist.
1097
1098kernel –  packages  providing  kernel  or  kernel-devel
1099                       match this method (only in yum backend)
1100
1101yaboot  –  only yaboot package on ppc arch matches this
1102                       (only in yum backend)
1103
1104       additional_packages
1105              (list) – additional packages to be included in a variant and ar‐
1106              chitecture;   format:   [(variant_uid_regex,   {arch|*:   [pack‐
1107              age_globs]})]
1108
1109              In contrast to the comps_file setting,  the  additional_packages
1110              setting  merely adds the list of packages to the compose. When a
1111              package is in a comps group, it is  visible  to  users  via  dnf
1112              groupinstall   and   Anaconda’s   Groups  selection,  but  addi‐
1113              tional_packages does not affect DNF groups.
1114
1115              The packages specified here are matched against RPM  names,  not
1116              any  other  provides in the package nor the name of source pack‐
1117              age. Shell globbing is used,  so  wildcards  are  possible.  The
1118              package can be specified as name only or name.arch.
1119
1120              With  dnf gathering backend, you can specify a debuginfo package
1121              to be included. This is meant to include a package if autodetec‐
1122              tion  does  not get it. If you add a debuginfo package that does
1123              not have anything else from the same build included in the  com‐
1124              pose, the sources will not be pulled in.
1125
1126              If  you  list  a package in additional_packages but Pungi cannot
1127              find it (for example, it’s not available in the Koji tag), Pungi
1128              will  log a warning in the “work” or “logs” directories and con‐
1129              tinue without aborting.
1130
1131              Example: This configuration will add all packages in a Koji  tag
1132              to an “Everything” variant:
1133
1134                 additional_packages = [
1135                     ('^Everything$', {
1136                         '*': [
1137                             '*',
1138                         ],
1139                     })
1140                 ]
1141
1142       filter_packages
1143              (list)  –  packages  to be excluded from a variant and architec‐
1144              ture; format: [(variant_uid_regex, {arch|*: [package_globs]})]
1145
1146              See additional_packages for details about package specification.
1147
1148       filter_modules
1149              (list) – modules to be excluded from a variant and architecture;
1150              format: [(variant_uid_regex, {arch|*: [name:stream]})]
1151
1152              Both  name  and  stream  can use shell-style globs. If stream is
1153              omitted, all streams are removed.
1154
1155              This option only applies to modules taken from  Koji  tags,  not
1156              modules explicitly listed in variants XML without any tags.
1157
1158       filter_system_release_packages
1159              (bool)  –  for  each variant, figure out the best system release
1160              package and filter out all others. This will not work if a vari‐
1161              ant  needs  more  than one system release package. In such case,
1162              set this option to False.
1163
1164       gather_prepopulate = None
1165              (scm_dict) – If specified, you can use this  to  add  additional
1166              packages.  The format of the file pointed to by this option is a
1167              JSON mapping {variant_uid: {arch: {build: [package]}}}. Packages
1168              added through this option can not be removed by filter_packages.
1169
1170       multilib_blacklist
1171              (dict) – multilib blacklist; format: {arch|*: [package_globs]}.
1172
1173              See additional_packages for details about package specification.
1174
1175       multilib_whitelist
1176              (dict)  – multilib blacklist; format: {arch|*: [package_names]}.
1177              The whitelist must contain exact package  names;  there  are  no
1178              wildcards or pattern matching.
1179
1180       gather_lookaside_repos = []
1181              (list) – lookaside repositories used for package gathering; for‐
1182              mat: [(variant_uid_regex, {arch|*: [repo_urls]})]
1183
1184              The repo_urls are passed to the depsolver, which can  use  pack‐
1185              ages  in the repos for satisfying dependencies, but the packages
1186              themselves are not pulled into the compose.  The  repo_urls  can
1187              contain  $basearch  variable,  which  will  be  substituted with
1188              proper value by the depsolver.
1189
1190              The repo_urls are used by repoclosure too, but  it  can’t  parse
1191              $basearch  currently  and  that  will  cause  Repoclosure  phase
1192              crashed. repoclosure_strictness option could  be  used  to  stop
1193              running repoclosure.
1194
1195              Please  note  that * as a wildcard matches all architectures but
1196              src.
1197
1198       hashed_directories = False
1199              (bool) – put packages into  “hashed”  directories,  for  example
1200              Packages/k/kernel-4.0.4-301.fc22.x86_64.rpm
1201
1202       check_deps = True
1203              (bool)  –  Set  to  False if you don’t want the compose to abort
1204              when some package has broken dependencies.
1205
1206       require_all_comps_packages = False
1207              (bool) – Set to True to abort compose when package mentioned  in
1208              comps  file  can  not be found in the package set. When disabled
1209              (the default), such cases are still reported as warnings in  the
1210              log.
1211
1212       gather_source_mapping
1213              (str)  – JSON mapping with initial packages for the compose. The
1214              value should be a path to  JSON  file  with  following  mapping:
1215              {variant:  {arch:  {rpm_name: [rpm_arch|None]}}}. Relative paths
1216              are interpreted relative to the location of main config file.
1217
1218       gather_profiler = False
1219              (bool) – When set to True the gather  tool  will  produce  addi‐
1220              tional performance profiling information at the end of its logs.
1221              Only takes effect when gather_backend = "dnf".
1222
1223       variant_as_lookaside
1224              (list) – a variant/variant mapping that tells one or more  vari‐
1225              ants  in compose has other variant(s) in compose as a lookaside.
1226              Only top level variants are supported (not addons/layered  prod‐
1227              ucts). Format: [(variant_uid, variant_uid)]
1228
1229   Example
1230          gather_method = "deps"
1231          greedy_method = "build"
1232          check_deps = False
1233          hashed_directories = True
1234
1235          gather_method = {
1236              "^Everything$": {
1237                  "comps": "deps"     # traditional content defined by comps groups
1238              },
1239              "^Modular$": {
1240                  "module": "nodeps"  # Modules do not need dependencies
1241              },
1242              "^Mixed$": {            # Mixed content in one variant
1243                  "comps": "deps",
1244                  "module": "nodeps"
1245              }
1246              "^OtherMixed$": "hybrid",   # Using hybrid depsolver
1247          }
1248
1249          additional_packages = [
1250              # bz#123456
1251              ('^(Workstation|Server)$', {
1252                  '*': [
1253                      'grub2',
1254                      'kernel',
1255                  ],
1256              }),
1257          ]
1258
1259          filter_packages = [
1260              # bz#111222
1261              ('^.*$', {
1262                  '*': [
1263                      'kernel-doc',
1264                  ],
1265              }),
1266          ]
1267
1268          multilib = [
1269              ('^Server$', {
1270                  'x86_64': ['devel', 'runtime']
1271              })
1272          ]
1273
1274          multilib_blacklist = {
1275              "*": [
1276                  "gcc",
1277              ],
1278          }
1279
1280          multilib_whitelist = {
1281              "*": [
1282                  "alsa-plugins-*",
1283              ],
1284          }
1285
1286          # gather_lookaside_repos = [
1287          #     ('^.*$', {
1288          #         '*': [
1289          #             "https://dl.fedoraproject.org/pub/fedora/linux/releases/22/Everything/$basearch/os/",
1290          #         ],
1291          #         'x86_64': [
1292          #             "https://dl.fedoraproject.org/pub/fedora/linux/releases/22/Everything/source/SRPMS/",
1293          #         ]
1294          #     }),
1295          # ]
1296
1297       NOTE:
1298          It  is  a  good  practice  to  attach  bug/ticket  numbers  to addi‐
1299          tional_packages,  filter_packages,  multilib_blacklist  and   multi‐
1300          lib_whitelist to track decisions.
1301
1302   Koji Settings
1303   Options
1304       koji_profile
1305              (str)  –  koji profile name. This tells Pungi how to communicate
1306              with your chosen Koji instance. See Koji’s  documentation  about
1307              profiles  for  more  information  about  how to set up your Koji
1308              client profile. In the examples, the  profile  name  is  “koji”,
1309              which points to Fedora’s koji.fedoraproject.org.
1310
1311       global_runroot_method
1312              (str)  –  global runroot method to use. If runroot_method is set
1313              per Pungi phase using a dictionary, this option defines the  de‐
1314              fault  runroot  method  for  phases  not  mentioned  in the run‐
1315              root_method dictionary.
1316
1317       runroot_method
1318              (str*|*dict) – Runroot method to use. It can further specify the
1319              runroot method in case the runroot is set to True.
1320
1321              Available methods are:
1322
1323local – runroot tasks are run locally
1324
1325koji – runroot tasks are run in Koji
1326
1327openssh  – runroot tasks are run on remote machine con‐
1328                       nected using OpenSSH.   The  runroot_ssh_hostnames  for
1329                       each  architecture must be set and the user under which
1330                       Pungi  runs  must  be  configured  to  login  as   run‐
1331                       root_ssh_username using the SSH key.
1332
1333              The  runroot  method  can  also be set per Pungi phase using the
1334              dictionary with phase name as key and runroot method  as  value.
1335              The  default  runroot  method  is  in  this  case defined by the
1336              global_runroot_method option.
1337
1338   Example
1339          global_runroot_method = "koji"
1340          runroot_method = {
1341              "createiso": "local"
1342          }
1343
1344       runroot_channel
1345              (str) – name of koji channel
1346
1347       runroot_tag
1348              (str) – name of koji build tag used for runroot
1349
1350       runroot_weights
1351              (dict) – customize task weights for various runroot  tasks.  The
1352              values  in  the  mapping should be integers, the keys can be se‐
1353              lected from the following list. By default no weight is assigned
1354              and Koji picks the default one according to policy.
1355
1356buildinstall
1357
1358createiso
1359
1360ostree
1361
1362ostree_installer
1363
1364   Example
1365          koji_profile = "koji"
1366          runroot_channel = "runroot"
1367          runroot_tag = "f23-build"
1368
1369   Runroot “openssh” method settings
1370   Options
1371       runroot_ssh_username
1372              (str) – For openssh runroot method, configures the username used
1373              to login the remote machine to run the runroot task. Defaults to
1374              “root”.
1375
1376       runroot_ssh_hostnames
1377              (dict)  –  For  openssh runroot method, defines the hostname for
1378              each architecture on which the runroot task should  be  running.
1379              Format: {"x86_64": "runroot-x86-64.localhost.tld", ...}
1380
1381       runroot_ssh_init_template
1382              (str)  [optional] – For openssh runroot method, defines the com‐
1383              mand to initializes the runroot task on the remote machine. This
1384              command  is executed as first command for each runroot task exe‐
1385              cuted.
1386
1387              The command can print a string which is then available as  {run‐
1388              root_key}  for  other SSH commands. This string might be used to
1389              keep the context across different SSH commands executed for sin‐
1390              gle runroot task.
1391
1392              The  goal of this command is setting up the environment for real
1393              runroot commands. For example preparing the unique mock environ‐
1394              ment, mounting the desired file-systems, …
1395
1396              The command string can contain following variables which are re‐
1397              placed by the real values before executing the init command:
1398
1399{runroot_tag} - Tag  to  initialize  the  runroot  environment
1400                from.
1401
1402              When not set, no init command is executed.
1403
1404       runroot_ssh_install_packages_template
1405              (str)  [optional] – For openssh runroot method, defines the tem‐
1406              plate for command to install the packages requested to  run  the
1407              runroot task.
1408
1409              The  template  string  can contain following variables which are
1410              replaced by the real values before executing  the  install  com‐
1411              mand:
1412
1413{runroot_key}  -  Replaced  with  the  string returned by run‐
1414                root_ssh_init_template if used. This can be used to  keep  the
1415                track  of  context of SSH commands belonging to single runroot
1416                task.
1417
1418{packages} - White-list separated list of packages to install.
1419
1420              Example (The {runroot_key} is expected to be set to mock  config
1421              file  using  the  runroot_ssh_init_template  command.): "mock -r
1422              {runroot_key} --install {packages}"
1423
1424              When not set, no command to install packages on  remote  machine
1425              is executed.
1426
1427       runroot_ssh_run_template
1428              (str)  [optional] – For openssh runroot method, defines the tem‐
1429              plate for the main runroot command.
1430
1431              The template string can contain following  variables  which  are
1432              replaced  by  the  real values before executing the install com‐
1433              mand:
1434
1435{runroot_key} - Replaced with  the  string  returned  by  run‐
1436                root_ssh_init_template  if  used. This can be used to keep the
1437                track of context of SSH commands belonging to  single  runroot
1438                task.
1439
1440{command} - Command to run.
1441
1442              Example  (The {runroot_key} is expected to be set to mock config
1443              file using the  runroot_ssh_init_template  command.):  "mock  -r
1444              {runroot_key} chroot -- {command}"
1445
1446              When not set, the runroot command is run directly.
1447
1448   Extra Files Settings
1449   Options
1450       extra_files
1451              (list) – references to external files to be placed in os/ direc‐
1452              tory   and   media;   format:   [(variant_uid_regex,    {arch|*:
1453              [scm_dict]})].  See Exporting files from SCM for details. If the
1454              dict specifies a target key, an additional subdirectory will  be
1455              used.
1456
1457   Example
1458          extra_files = [
1459              ('^.*$', {
1460                  '*': [
1461                      # GPG keys
1462                      {
1463                          "scm": "rpm",
1464                          "repo": "fedora-repos",
1465                          "branch": None,
1466                          "file": [
1467                              "/etc/pki/rpm-gpg/RPM-GPG-KEY-22-fedora",
1468                          ],
1469                          "target": "",
1470                      },
1471                      # GPL
1472                      {
1473                          "scm": "git",
1474                          "repo": "https://pagure.io/pungi-fedora",
1475                          "branch": None,
1476                          "file": [
1477                              "GPL",
1478                          ],
1479                          "target": "",
1480                      },
1481                  ],
1482              }),
1483          ]
1484
1485   Extra Files Metadata
1486       If  extra  files  are  specified  a metadata file, extra_files.json, is
1487       placed in the os/ directory and media. The checksums generated are  de‐
1488       termined  by  media_checksums option. This metadata file is in the for‐
1489       mat:
1490
1491          {
1492            "header": {"version": "1.0},
1493            "data": [
1494              {
1495                "file": "GPL",
1496                "checksums": {
1497                  "sha256": "8177f97513213526df2cf6184d8ff986c675afb514d4e68a404010521b880643"
1498                },
1499                "size": 18092
1500              },
1501              {
1502                "file": "release-notes/notes.html",
1503                "checksums": {
1504                  "sha256": "82b1ba8db522aadf101dca6404235fba179e559b95ea24ff39ee1e5d9a53bdcb"
1505                },
1506                "size": 1120
1507              }
1508            ]
1509          }
1510
1511   CreateISO Settings
1512   Options
1513       createiso_skip = False
1514              (list) – mapping that defines which variants and arches to  skip
1515              during createiso; format: [(variant_uid_regex, {arch|*: True})]
1516
1517       createiso_max_size
1518              (list)  –  mapping  that  defines maximum expected size for each
1519              variant and arch. If the ISO is larger than the limit, a warning
1520              will be issued.
1521
1522              Format: [(variant_uid_regex, {arch|*: number})]
1523
1524       createiso_max_size_is_strict
1525              (list)  –  Set  the  value to True to turn the warning from cre‐
1526              ateiso_max_size into a hard error that will abort  the  compose.
1527              If  there are multiple matches in the mapping, the check will be
1528              strict if at least one match says so.
1529
1530              Format: [(variant_uid_regex, {arch|*: bool})]
1531
1532       create_jigdo = False
1533              (bool) – controls the creation of jigdo from ISO
1534
1535       create_optional_isos = False
1536              (bool) – when set to True, ISOs will be  created  even  for  op‐
1537              tional  variants.  By default only variants with type variant or
1538              layered-product will get ISOs.
1539
1540       createiso_break_hardlinks = False
1541              (bool) – when set to True, all files that should go on  the  ISO
1542              and  have  a hardlink will be first copied into a staging direc‐
1543              tory. This should work around a bug in genisoimage including in‐
1544              correct link count in the image, but it is at the cost of having
1545              to copy a potentially significant amount of data.
1546
1547              The staging directory is deleted when ISO is  successfully  cre‐
1548              ated.  In  that case the same task to create the ISO will not be
1549              re-runnable.
1550
1551       createiso_use_xorrisofs = False
1552              (bool) – when set to True, use xorrisofs for creating  ISOs  in‐
1553              stead of genisoimage.
1554
1555       iso_size = 4700000000
1556              (int|str) – size of ISO image. The value should either be an in‐
1557              teger meaning size in bytes, or it can be a string with k, M,  G
1558              suffix (using multiples of 1024).
1559
1560       iso_level
1561              (int|list)  [optional] – Set the ISO9660 conformance level. This
1562              is either a global single value (a number from 1  to  4),  or  a
1563              variant/arch mapping.
1564
1565       split_iso_reserve = 10MiB
1566              (int|str) – how much free space should be left on each disk. The
1567              format is the same as for iso_size option.
1568
1569       iso_hfs_ppc64le_compatible = True
1570              (bool) – when set  to  False,  the  Apple/HFS  compatibility  is
1571              turned  off  for  ppc64le ISOs. This option only makes sense for
1572              bootable products, and affects images produced in createiso  and
1573              extra_isos phases.
1574
1575       NOTE:
1576          Source  architecture  needs  to be listed explicitly.  Excluding ‘*’
1577          applies only on binary arches.  Jigdo causes significant increase of
1578          time to ISO creation.
1579
1580   Example
1581          createiso_skip = [
1582              ('^Workstation$', {
1583                  '*': True,
1584                  'src': True
1585              }),
1586          ]
1587
1588   Automatic generation of version and release
1589       Version and release values for certain artifacts can be generated auto‐
1590       matically based on release  version,  compose  label,  date,  type  and
1591       respin. This can be used to shorten the config and keep it the same for
1592       multiple uses.
1593
1594┌───────────────────────┬───────────────┬──────────┬──────────┬────────┬──────────────┐
1595│Compose ID             │ Label         │ Version  │ Date     │ Respin │ Release      │
1596├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1597F-Rawhide-20170406.n.0 -             Rawhide  20170406 0      20170406.n.0 
1598├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1599F-26-20170329.1        Alpha-1.6     26_Alpha 20170329 1      1.6          
1600├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1601F-Atomic-25-20170407.0 RC-20170407.0 25       20170407 0      20170407.0   
1602├───────────────────────┼───────────────┼──────────┼──────────┼────────┼──────────────┤
1603F-Atomic-25-20170407.0 -             25       20170407 0      20170407.0   
1604└───────────────────────┴───────────────┴──────────┴──────────┴────────┴──────────────┘
1605
1606       All  non-RC  milestones from label get appended to the version. For re‐
1607       lease either label is used or date, type and respin.
1608
1609   Common options for Live Images, Live Media and Image Build
1610       All images can have ksurl, version, release and target specified. Since
1611       this can create a lot of duplication, there are global options that can
1612       be used instead.
1613
1614       For each of the phases, if the option is not specified for a particular
1615       deliverable,  an option named <PHASE_NAME>_<OPTION> is checked. If that
1616       is not specified either, the last fallback is global_<OPTION>. If  even
1617       that is unset, the value is considered to not be specified.
1618
1619       The kickstart URL is configured by these options.
1620
1621global_ksurl – global fallback setting
1622
1623live_media_ksurl
1624
1625image_build_ksurl
1626
1627live_images_ksurl
1628
1629       Target is specified by these settings.
1630
1631global_target – global fallback setting
1632
1633live_media_target
1634
1635image_build_target
1636
1637live_images_target
1638
1639osbuild_target
1640
1641       Version  is specified by these options. If no version is set, a default
1642       value will be provided according to automatic versioning.
1643
1644global_version – global fallback setting
1645
1646live_media_version
1647
1648image_build_version
1649
1650live_images_version
1651
1652osbuild_version
1653
1654       Release is specified by these options. If set to a magic value to  !RE‐
1655       LEASE_FROM_LABEL_DATE_TYPE_RESPIN,  a value will be generated according
1656       to automatic versioning.
1657
1658global_release – global fallback setting
1659
1660live_media_release
1661
1662image_build_release
1663
1664live_images_release
1665
1666osbuild_release
1667
1668       Each configuration block can also optionally specify  a  failable  key.
1669       For  live images it should have a boolean value. For live media and im‐
1670       age build it should be a list of strings containing architectures  that
1671       are  optional. If any deliverable fails on an optional architecture, it
1672       will not abort the whole compose. If the list contains  only  "*",  all
1673       arches will be substituted.
1674
1675   Live Images Settings
1676       live_images
1677              (list) – Configuration for the particular image. The elements of
1678              the list should be tuples (variant_uid_regex, {arch|*: config}).
1679              The config should be a dict with these keys:
1680
1681kickstart (str)
1682
1683ksurl (str) [optional] – where to get the kickstart from
1684
1685name (str)
1686
1687version (str)
1688
1689target (str)
1690
1691repo (str|[str]) – repos specified by URL or variant UID
1692
1693specfile (str) – for images wrapped in RPM
1694
1695scratch  (bool)  –  only RPM-wrapped images can use scratch
1696                   builds, but by default this is turned off
1697
1698type (str) – what kind of task to start in  Koji.  Defaults
1699                   to  live meaning koji spin-livecd will be used. Alternative
1700                   option is appliance corresponding to koji spin-appliance.
1701
1702sign (bool) – only RPM-wrapped images can be signed
1703
1704       live_images_no_rename
1705              (bool) – When set to True, filenames generated by Koji  will  be
1706              used.   When  False,  filenames  will  be generated based on im‐
1707              age_name_format configuration option.
1708
1709   Live Media Settings
1710       live_media
1711              (dict) – configuration for koji spin-livemedia;  format:  {vari‐
1712              ant_uid_regex: [{opt:value}]}
1713
1714              Required options:
1715
1716name (str)
1717
1718version (str)
1719
1720arches ([str]) – what architectures to build the media for;
1721                   by default uses all arches for the variant.
1722
1723kickstart (str) – name of the kickstart file
1724
1725              Available options:
1726
1727ksurl (str)
1728
1729ksversion (str)
1730
1731scratch (bool)
1732
1733target (str)
1734
1735release  (str)  –  a  string  with  the  release,  or  !RE‐
1736                   LEASE_FROM_LABEL_DATE_TYPE_RESPIN to automatically generate
1737                   a suitable value. See automatic versioning for details.
1738
1739skip_tag (bool)
1740
1741repo (str|[str]) – repos specified by URL or variant UID
1742
1743title (str)
1744
1745install_tree_from (str) – variant to take install tree from
1746
1747nomacboot (bool)
1748
1749   Image Build Settings
1750       image_build
1751              (dict)  –  config   for   koji   image-build;   format:   {vari‐
1752              ant_uid_regex: [{opt: value}]}
1753
1754              By  default, images will be built for each binary arch valid for
1755              the variant. The config can specify a list of arches  to  narrow
1756              this down.
1757
1758       NOTE:
1759          Config  can  contain  anything  what is accepted by koji image-build
1760          --config configfile.ini
1761
1762          Repo can be specified either as a string or a list  of  strings.  It
1763          will  be  automatically transformed into format suitable for koji. A
1764          repo for the currently built variant will be added as well.
1765
1766          If    you    explicitly    set    release    to    !RELEASE_FROM_LA‐
1767          BEL_DATE_TYPE_RESPIN,  it will be replaced with a value generated as
1768          described in automatic versioning.
1769
1770          If you explicitly set release to !RELEASE_FROM_DATE_RESPIN, it  will
1771          be  replaced  with  a value generated as described in automatic ver‐
1772          sioning.
1773
1774          If you explicitly set version to !VERSION_FROM_VERSION, it  will  be
1775          replaced  with  a value generated as described in automatic version‐
1776          ing.
1777
1778          Please don’t set install_tree. This gets automatically set by  pungi
1779          based  on  current variant. You can use install_tree_from key to use
1780          install tree from another variant.
1781
1782          Both the install tree and repos can use one of following formats:
1783
1784              • URL to the location
1785
1786              • name of variant in the current compose
1787
1788              • absolute path on local filesystem (which  will  be  translated
1789                using configured mappings or used unchanged, in which case you
1790                have to ensure the koji builders can access it)
1791
1792          You can set either a single format, or a list of formats. For avail‐
1793          able values see help output for koji image-build command.
1794
1795          If  ksurl  ends  with  #HEAD, Pungi will figure out the SHA1 hash of
1796          current HEAD and use that instead.
1797
1798          Setting scratch to True will run the koji tasks as scratch builds.
1799
1800   Example
1801          image_build = {
1802              '^Server$': [
1803                  {
1804                      'image-build': {
1805                          'format': ['docker', 'qcow2']
1806                          'name': 'fedora-qcow-and-docker-base',
1807                          'target': 'koji-target-name',
1808                          'ksversion': 'F23',     # value from pykickstart
1809                          'version': '23',
1810                          # correct SHA1 hash will be put into the URL below automatically
1811                          'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1812                          'kickstart': "fedora-docker-base.ks",
1813                          'repo': ["http://someextrarepos.org/repo", "ftp://rekcod.oi/repo"],
1814                          'distro': 'Fedora-20',
1815                          'disk_size': 3,
1816
1817                          # this is set automatically by pungi to os_dir for given variant
1818                          # 'install_tree': 'http://somepath',
1819                      },
1820                      'factory-parameters': {
1821                          'docker_cmd':  "[ '/bin/bash' ]",
1822                          'docker_env': "[ 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' ]",
1823                          'docker_labels': "{'Name': 'fedora-docker-base', 'License': u'GPLv2', 'RUN': 'docker run -it --rm ${OPT1} --privileged -v \`pwd\`:/atomicapp -v /run:/run -v /:/host --net=host --name ${NAME} -e NAME=${NAME} -e IMAGE=${IMAGE} ${IMAGE} -v ${OPT2} run ${OPT3} /atomicapp', 'Vendor': 'Fedora Project', 'Version': '23', 'Architecture': 'x86_64' }",
1824                      }
1825                  },
1826                  {
1827                      'image-build': {
1828                          'format': ['docker', 'qcow2']
1829                          'name': 'fedora-qcow-and-docker-base',
1830                          'target': 'koji-target-name',
1831                          'ksversion': 'F23',     # value from pykickstart
1832                          'version': '23',
1833                          # correct SHA1 hash will be put into the URL below automatically
1834                          'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1835                          'kickstart': "fedora-docker-base.ks",
1836                          'repo': ["http://someextrarepos.org/repo", "ftp://rekcod.oi/repo"],
1837                          'distro': 'Fedora-20',
1838                          'disk_size': 3,
1839
1840                          # this is set automatically by pungi to os_dir for given variant
1841                          # 'install_tree': 'http://somepath',
1842                      }
1843                  },
1844                  {
1845                      'image-build': {
1846                          'format': 'qcow2',
1847                          'name': 'fedora-qcow-base',
1848                          'target': 'koji-target-name',
1849                          'ksversion': 'F23',     # value from pykickstart
1850                          'version': '23',
1851                          'ksurl': 'https://git.fedorahosted.org/git/spin-kickstarts.git?somedirectoryifany#HEAD',
1852                          'kickstart': "fedora-docker-base.ks",
1853                          'distro': 'Fedora-23',
1854
1855                          # only build this type of image on x86_64
1856                          'arches': ['x86_64']
1857
1858                          # Use install tree and repo from Everything variant.
1859                          'install_tree_from': 'Everything',
1860                          'repo': ['Everything'],
1861
1862                          # Set release automatically.
1863                          'release': '!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN',
1864                      }
1865                  }
1866              ]
1867          }
1868
1869   OSBuild Composer for building images
1870       osbuild
1871              (dict) – configuration for building images in  OSBuild  Composer
1872              service fronted by a Koji plugin. Pungi will trigger a Koji task
1873              delegating to the OSBuild Composer, which will build the  image,
1874              import it to Koji via content generators.
1875
1876              Format: {variant_uid_regex: [{...}]}.
1877
1878              Required keys in the configuration dict:
1879
1880name – name of the Koji package
1881
1882distro – image for which distribution should be build TODO ex‐
1883                amples
1884
1885image_types – a list with a single image type string or just a
1886                string  representing  the image type to build (e.g. qcow2). In
1887                any case, only a single image type can be provided as an argu‐
1888                ment.
1889
1890              Optional keys:
1891
1892target  –  which build target to use for the task. Either this
1893                option or the global osbuild_target is required.
1894
1895version – version for the final build (as a string). This  op‐
1896                tion  is  required if the global osbuild_version is not speci‐
1897                fied.
1898
1899release – release part of the final NVR. If neither  this  op‐
1900                tion nor the global osbuild_release is set, Koji will automat‐
1901                ically generate a value.
1902
1903repo – a list of repositories from which to  consume  packages
1904                for building the image. By default only the variant repository
1905                is used.  The list items may use one of the following formats:
1906
1907                • String with just the repository URL.
1908
1909                • Dictionary with the following keys:
1910
1911baseurl – URL of the repository.
1912
1913
1914
1915                    package_sets – a list of package set names to use for this
1916                           repository. Package sets are an internal concept of
1917                           Image Builder and are used in image definitions. If
1918                           specified, the repository is used by Image  Builder
1919                           only  for the pipeline with the same name.  For ex‐
1920                           ample, specifying the build package set  name  will
1921                           make  the  repository to be used only for the build
1922                           environment in which the image will be built.  (op‐
1923                           tional)
1924
1925arches  –  list of architectures for which to build the image.
1926                By default, the variant arches are used. This option can  only
1927                restrict it, not add a new one.
1928
1929ostree_url  –  URL  of the repository that’s used to fetch the
1930                parent commit from.
1931
1932ostree_ref – name of the ostree branch
1933
1934ostree_parent – commit hash or a a  branch-like  reference  to
1935                the parent commit.
1936
1937upload_options  – a dictionary with upload options specific to
1938                the target cloud environment. If provided, the image  will  be
1939                uploaded  to  the  cloud  environment, in addition to the Koji
1940                server. One can’t combine arbitrary image types with arbitrary
1941                upload  options.  The dictionary keys differ based on the tar‐
1942                get cloud environment. The following keys are supported:
1943
1944AWS EC2 upload options – upload to Amazon Web Services.
1945
1946region – AWS region to upload the image to
1947
1948share_with_accounts – list of AWS account IDs to share the
1949                    image with
1950
1951snapshot_name  –  Snapshot  name of the uploaded EC2 image
1952                    (optional)
1953
1954AWS S3 upload options – upload to Amazon Web Services S3.
1955
1956region – AWS region to upload the image to
1957
1958Azure upload options – upload to Microsoft Azure.
1959
1960tenant_id – Azure tenant ID to upload the image to
1961
1962subscription_id – Azure subscription ID to upload the  im‐
1963                    age to
1964
1965resource_group  – Azure resource group to upload the image
1966                    to
1967
1968location – Azure location of the resource group (optional)
1969
1970image_name – Image name of the uploaded Azure  image  (op‐
1971                    tional)
1972
1973GCP upload options – upload to Google Cloud Platform.
1974
1975region – GCP region to upload the image to
1976
1977bucket – GCP bucket to upload the image to (optional)
1978
1979share_with_accounts  –  list  of GCP accounts to share the
1980                    image with
1981
1982image_name – Image name of the  uploaded  GCP  image  (op‐
1983                    tional)
1984
1985Container upload options – upload to a container registry.
1986
1987name – name of the container image (optional)
1988
1989tag – container tag to upload the image to (optional)
1990
1991       NOTE:
1992          There  is  initial  support for having this task as failable without
1993          aborting the whole compose. This can be enabled  by  setting  "fail‐
1994          able":  ["*"]  in  the  config for the image. It is an on/off switch
1995          without granularity per arch.
1996
1997   Image container
1998       This phase supports building containers in OSBS  that  embed  an  image
1999       created  in the same compose. This can be useful for delivering the im‐
2000       age to users running in containerized environments.
2001
2002       Pungi will start a buildContainer task in Koji with  configured  source
2003       repository. The Dockerfile can expect that a repo file will be injected
2004       into the container that defines a repo named image-to-include, and  its
2005       baseurl  will  point to the image to include. It is possible to extract
2006       the URL with a command like dnf config-manager --dump  image-to-include
2007       | awk '/baseurl =/{print $3}'`
2008
2009       image_container
2010              (dict)  – configuration for building containers embedding an im‐
2011              age.
2012
2013              Format: {variant_uid_regex: [{...}]}.
2014
2015              The inner object will define a single container. These keys  are
2016              required:
2017
2018url,  target,  git_branch.  See OSBS section for definition of
2019                these.
2020
2021image_spec – (object) A string mapping of filters used to  se‐
2022                lect the image to embed. All images listed in metadata for the
2023                variant will be processed. The keys of this filter are used to
2024                select  metadata  fields for the image, and values are regular
2025                expression that need to match the metadata value.
2026
2027                The filter should match exactly one image.
2028
2029   Example config
2030          image_container = {
2031              "^Server$": [{
2032                  "url": "git://example.com/dockerfiles.git?#HEAD",
2033                  "target": "f24-container-candidate",
2034                  "git_branch": "f24",
2035                  "image_spec": {
2036                      "format": "qcow2",
2037                      "arch": "x86_64",
2038                      "path": ".*/guest-image-.*$",
2039                  }
2040              }]
2041          }
2042
2043   OSTree Settings
2044       The ostree phase of Pungi can create and  update  ostree  repositories.
2045       This  is  done by running rpm-ostree compose in a Koji runroot environ‐
2046       ment. The ostree repository itself is  not  part  of  the  compose  and
2047       should be located in another directory. Any new packages in the compose
2048       will be added to the repository with a new commit.
2049
2050       ostree (dict) – a mapping of configuration for each. The format  should
2051              be  {variant_uid_regex:  config_dict}.  It  is possible to use a
2052              list of configuration dicts as well.
2053
2054              The configuration dict for each  variant  arch  pair  must  have
2055              these keys:
2056
2057treefile – (str) Filename of configuration for rpm-ostree.
2058
2059config_url – (str) URL for Git repository with the treefile.
2060
2061repo – (str|dict|[str|dict]) repos specified by URL or variant
2062                UID or a dict of repo options,  baseurl  is  required  in  the
2063                dict.
2064
2065ostree_repo – (str) Where to put the ostree repository
2066
2067              These keys are optional:
2068
2069keep_original_sources  – (bool) Keep the existing source repos
2070                in the tree config file. If  not  enabled,  all  the  original
2071                source repos will be removed from the tree config file.
2072
2073config_branch  – (str) Git branch of the repo to use. Defaults
2074                to master.
2075
2076arches – ([str]) List of architectures for which to update os‐
2077                tree.  There will be one task per architecture. By default all
2078                architectures in the variant are used.
2079
2080failable – ([str]) List of architectures for which this deliv‐
2081                erable is not release blocking.
2082
2083update_summary  –  (bool)  Update  summary metadata after tree
2084                composing.  Defaults to False.
2085
2086force_new_commit – (bool) Do  not  use  rpm-ostree’s  built-in
2087                change detection.  Defaults to False.
2088
2089unified_core  – (bool) Use rpm-ostree in unified core mode for
2090                composes.  Defaults to False.
2091
2092version – (str) Version string to be added as versioning meta‐
2093                data.   If  this  option  is  set  to !OSTREE_VERSION_FROM_LA‐
2094                BEL_DATE_TYPE_RESPIN, a value will be generated  automatically
2095                as   $VERSION.$RELEASE.   If  this  option  is  set  to  !VER‐
2096                SION_FROM_VERSION_DATE_RESPIN, a value will be generated auto‐
2097                matically as $VERSION.$DATE.$RESPIN.  See how those values are
2098                created.
2099
2100tag_ref – (bool, default True) If set to False, a  git  refer‐
2101                ence will not be created.
2102
2103ostree_ref – (str) To override value ref from treefile.
2104
2105   Example config
2106          ostree = {
2107              "^Atomic$": {
2108                  "treefile": "fedora-atomic-docker-host.json",
2109                  "config_url": "https://git.fedorahosted.org/git/fedora-atomic.git",
2110                  "repo": [
2111                      "Server",
2112                      "http://example.com/repo/x86_64/os",
2113                      {"baseurl": "Everything"},
2114                      {"baseurl": "http://example.com/linux/repo", "exclude": "systemd-container"},
2115                  ],
2116                  "keep_original_sources": True,
2117                  "ostree_repo": "/mnt/koji/compose/atomic/Rawhide/",
2118                  "update_summary": True,
2119                  # Automatically generate a reasonable version
2120                  "version": "!OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN",
2121                  # Only run this for x86_64 even if Atomic has more arches
2122                  "arches": ["x86_64"],
2123              }
2124          }
2125
2126       ostree_use_koji_plugin = False
2127              (bool)  –  When  set to True, the Koji pungi_ostree task will be
2128              used to execute rpm-ostree instead of runroot. Use only  if  the
2129              Koji instance has the pungi_ostree plugin installed.
2130
2131   Ostree Installer Settings
2132       The  ostree_installer  phase  of  Pungi  can  produce  installer  image
2133       bundling an OSTree repository. This always runs in Koji  as  a  runroot
2134       task.
2135
2136       ostree_installer
2137              (dict)  –  a  variant/arch  mapping of configuration. The format
2138              should be [(variant_uid_regex, {arch|*: config_dict})].
2139
2140              The configuration dict for each variant arch pair must have this
2141              key:
2142
2143              These keys are optional:
2144
2145repo – (str|[str]) repos specified by URL or variant UID
2146
2147release  – (str) Release value to set for the installer image.
2148                Set to !RELEASE_FROM_LABEL_DATE_TYPE_RESPIN  to  generate  the
2149                value automatically.
2150
2151failable – ([str]) List of architectures for which this deliv‐
2152                erable is not release blocking.
2153
2154              These optional keys are passed to lorax to customize the build.
2155
2156installpkgs – ([str])
2157
2158add_template – ([str])
2159
2160add_arch_template – ([str])
2161
2162add_template_var – ([str])
2163
2164add_arch_template_var – ([str])
2165
2166rootfs_size – ([str])
2167
2168template_repo – (str) Git repository with extra templates.
2169
2170template_branch – (str) Branch to use from template_repo.
2171
2172              The templates can either be absolute paths, in which  case  they
2173              will  be  used  as configured; or they can be relative paths, in
2174              which case template_repo needs to point to a Git repository from
2175              which to take the templates.
2176
2177              If  the templates need to run with additional dependencies, that
2178              can be configured with the optional key:
2179
2180extra_runroot_pkgs – ([str])
2181
2182skip_branding – (bool) Stops lorax to  install  packages  with
2183                branding.  Defaults to False.
2184
2185       ostree_installer_overwrite = False
2186              (bool) – by default if a variant including OSTree installer also
2187              creates regular installer images in  buildinstall  phase,  there
2188              will  be  conflicts (as the files are put in the same place) and
2189              Pungi will report an error and fail the compose.
2190
2191              With this option it is possible to opt-in for  the  overwriting.
2192              The traditional boot.iso will be in the iso/ subdirectory.
2193
2194       ostree_installer_use_koji_plugin = False
2195              (bool) – When set to True, the Koji pungi_buildinstall task will
2196              be used to execute Lorax instead of runroot.  Use  only  if  the
2197              Koji instance has the pungi_buildinstall plugin installed.
2198
2199   Example config
2200          ostree_installer = [
2201              ("^Atomic$", {
2202                  "x86_64": {
2203                      "repo": [
2204                          "Everything",
2205                          "https://example.com/extra-repo1.repo",
2206                          "https://example.com/extra-repo2.repo",
2207                      ],
2208                      "release": "!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN",
2209                      "installpkgs": ["fedora-productimg-atomic"],
2210                      "add_template": ["atomic-installer/lorax-configure-repo.tmpl"],
2211                      "add_template_var": [
2212                          "ostree_osname=fedora-atomic",
2213                          "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
2214                      ],
2215                      "add_arch_template": ["atomic-installer/lorax-embed-repo.tmpl"],
2216                      "add_arch_template_var": [
2217                          "ostree_repo=https://kojipkgs.fedoraproject.org/compose/atomic/Rawhide/",
2218                          "ostree_osname=fedora-atomic",
2219                          "ostree_ref=fedora-atomic/Rawhide/x86_64/docker-host",
2220                      ]
2221                      'template_repo': 'https://git.fedorahosted.org/git/spin-kickstarts.git',
2222                      'template_branch': 'f24',
2223                  }
2224              })
2225          ]
2226
2227   OSBS Settings
2228       Pungi  can  build  container  images  in  OSBS.  The build is initiated
2229       through Koji container-build plugin. The base image will be using  RPMs
2230       from  the  current  compose and a Dockerfile from specified Git reposi‐
2231       tory.
2232
2233       Please note that the image is uploaded to a registry and  not  exported
2234       into  compose directory. There will be a metadata file in compose/meta‐
2235       data/osbs.json with details about the built images (assuming  they  are
2236       not scratch builds).
2237
2238       osbs   (dict) – a mapping from variant regexes to configuration blocks.
2239              The format should be {variant_uid_regex: [config_dict]}.
2240
2241              The configuration for each image must have at least these keys:
2242
2243url – (str) URL pointing to a Git repository with  Dockerfile.
2244                Please see Git URLs section for more details.
2245
2246target – (str) A Koji target to build the image for.
2247
2248git_branch – (str) A branch in SCM for the Dockerfile. This is
2249                required by OSBS to avoid race conditions when multiple builds
2250                from the same repo are submitted at the same time. Please note
2251                that url should contain the branch or tag  name  as  well,  so
2252                that it can be resolved to a particular commit hash.
2253
2254              Optionally  you  can specify failable. If it has a truthy value,
2255              failure to create the image will not abort the whole compose.
2256
2257              The configuration will pass other  attributes  directly  to  the
2258              Koji  task.   This  includes  scratch  and  priority.  See  koji
2259              list-api buildContainer for more details about these options.
2260
2261              A value for yum_repourls will be created automatically and point
2262              at a repository in the current compose. You can add extra repos‐
2263              itories with repo key having a list of urls  pointing  to  .repo
2264              files  or just variant uid, Pungi will create the .repo file for
2265              that variant. If specific URL is used in  the  repo,  the  $COM‐
2266              POSE_ID  variable  in  the repo string will be replaced with the
2267              real compose ID.  gpgkey can be specified to enable gpgcheck  in
2268              repo files for variants.
2269
2270       osbs_registries
2271              (dict)  –  Use  this  optional setting to emit osbs-request-push
2272              messages for each non-scratch container  build.  These  messages
2273              can  guide  other  tools  how  to  push the images to other reg‐
2274              istries. For example, an external tool might  trigger  on  these
2275              messages  and  copy the images from OSBS’s registry to a staging
2276              or production registry.
2277
2278              For each completed container build, Pungi will try to match  the
2279              NVR  against a key in osbs_registries mapping (using shell-style
2280              globbing) and take the  corresponding  value  and  collect  them
2281              across  all  built  images.  Pungi  will  save  this  data  into
2282              logs/global/osbs-registries.json, mapping each Koji NVR  to  the
2283              registry data. Pungi will also send this data to the message bus
2284              on the osbs-request-push topic once the  compose  finishes  suc‐
2285              cessfully.
2286
2287              Pungi  simply  logs  the  mapped data and emits the messages. It
2288              does not handle the messages or push  images.  A  separate  tool
2289              must do that.
2290
2291   Example config
2292          osbs = {
2293              "^Server$": {
2294                  # required
2295                  "url": "git://example.com/dockerfiles.git?#HEAD",
2296                  "target": "f24-docker-candidate",
2297                  "git_branch": "f24-docker",
2298
2299                  # optional
2300                  "repo": ["Everything", "https://example.com/extra-repo.repo"],
2301                  # This will result in three repo urls being passed to the task.
2302                  # They will be in this order: Server, Everything, example.com/
2303                  "gpgkey": 'file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release',
2304              }
2305          }
2306
2307   Extra ISOs
2308       Create an ISO image that contains packages from multiple variants. Such
2309       ISO always belongs to one variant, and will be stored in ISO  directory
2310       of that variant.
2311
2312       The  ISO  will  be  bootable  if buildinstall phase runs for the parent
2313       variant. It will reuse boot configuration from that variant.
2314
2315       extra_isos
2316              (dict) – a mapping from variant UID regex to a list of  configu‐
2317              ration blocks.
2318
2319include_variants – (list) list of variant UIDs from which con‐
2320                tent should be added to the ISO; the variant of this image  is
2321                added automatically.
2322
2323              Rest of configuration keys is optional.
2324
2325filename – (str) template for naming the image. In addition to
2326                the regular placeholders filename is available with  the  name
2327                generated using image_name_format option.
2328
2329volid  –  (str) template for generating volume ID. Again volid
2330                placeholder can be used similarly as for file name.  This  can
2331                also  be  a  list of templates that will be tried sequentially
2332                until one generates a volume ID that fits  into  32  character
2333                limit.
2334
2335extra_files  –  (list) a list of scm_dict objects. These files
2336                will be put in the top level directory of the image.
2337
2338arches – (list) a list of architectures  for  which  to  build
2339                this  image.  By  default  all arches from the variant will be
2340                used. This option can be used to limit them.
2341
2342failable_arches – (list) a list of architectures for which the
2343                image  can  fail  to be generated and not fail the entire com‐
2344                pose.
2345
2346skip_src – (bool) allows to disable  creating  an  image  with
2347                source packages.
2348
2349inherit_extra_files  –  (bool) by default extra files in vari‐
2350                ants are ignored. If you want to include them in the ISO,  set
2351                this option to True.
2352
2353max_size  – (int) expected maximum size in bytes. If the final
2354                image is larger, a warning will be issued.
2355
2356   Example config
2357          extra_isos = {
2358              'Server': [{
2359                  # Will generate foo-DP-1.0-20180510.t.43-Server-x86_64-dvd1.iso
2360                  'filename': 'foo-{filename}',
2361                  'volid': 'foo-{arch}',
2362
2363                  'extra_files': [{
2364                      'scm': 'git',
2365                      'repo': 'https://pagure.io/pungi.git',
2366                      'file': 'setup.py'
2367                  }],
2368
2369                  'include_variants': ['Client']
2370              }]
2371          }
2372          # This should create image with the following layout:
2373          #  .
2374          #  ├── Client
2375          #  │   ├── Packages
2376          #  │   │   ├── a
2377          #  │   │   └── b
2378          #  │   └── repodata
2379          #  ├── Server
2380          #  │   ├── Packages
2381          #  │   │   ├── a
2382          #  │   │   └── b
2383          #  │   └── repodata
2384          #  └── setup.py
2385
2386   Media Checksums Settings
2387       media_checksums
2388              (list) – list of checksum types to compute, allowed  values  are
2389              anything supported by Python’s hashlib module (see documentation
2390              for details).
2391
2392       media_checksum_one_file
2393              (bool) – when True, only one CHECKSUM file will be  created  per
2394              directory;  this option requires media_checksums to only specify
2395              one type
2396
2397       media_checksum_base_filename
2398              (str) – when not set, all checksums will be save to a file named
2399              either  CHECKSUM or based on the digest type; this option allows
2400              adding any prefix to that name
2401
2402              It is possible to use format strings that will be replace by ac‐
2403              tual values.  The allowed keys are:
2404
2405arch
2406
2407compose_id
2408
2409date
2410
2411label
2412
2413label_major_version
2414
2415release_short
2416
2417respin
2418
2419type
2420
2421type_suffix
2422
2423version
2424
2425dirname (only if media_checksum_one_file is enabled)
2426
2427              For   example,   for   Fedora   the   prefix   should  be  %(re‐
2428              lease_short)s-%(variant)s-%(version)s-%(date)s%(type_suf‐
2429              fix)s.%(respin)s.
2430
2431   Translate Paths Settings
2432       translate_paths
2433              (list)  –  list  of  paths  to translate; format: [(path, trans‐
2434              lated_path)]
2435
2436       NOTE:
2437          This feature becomes useful when you need to transform compose loca‐
2438          tion  into  e.g.  a  HTTP  repo  which  is can be passed to koji im‐
2439          age-build.  The path part is normalized via os.path.normpath().
2440
2441   Example config
2442          translate_paths = [
2443              ("/mnt/a", "http://b/dir"),
2444          ]
2445
2446   Example usage
2447          >>> from pungi.util import translate_paths
2448          >>> print translate_paths(compose_object_with_mapping, "/mnt/a/c/somefile")
2449          http://b/dir/c/somefile
2450
2451   Miscellaneous Settings
2452       paths_module
2453              (str) – Name of Python module implementing the same interface as
2454              pungi.paths.  This  module  can be used to override where things
2455              are placed.
2456
2457       link_type = hardlink-or-copy
2458              (str) – Method of putting packages into compose directory.
2459
2460              Available options:
2461
2462hardlink-or-copy
2463
2464hardlink
2465
2466copy
2467
2468symlink
2469
2470abspath-symlink
2471
2472       skip_phases
2473              (list) – List of phase names that should be  skipped.  The  same
2474              functionality is available via a command line option.
2475
2476       release_discinfo_description
2477              (str)  – Override description in .discinfo files. The value is a
2478              format string accepting %(variant_name)s and %(arch)s placehold‐
2479              ers.
2480
2481       symlink_isos_to
2482              (str)  –  If set, the ISO files from buildinstall, createiso and
2483              live_images phases will be put into this destination, and a sym‐
2484              link pointing to this location will be created in actual compose
2485              directory.
2486
2487       dogpile_cache_backend
2488              (str) – If set, Pungi will  use  the  configured  Dogpile  cache
2489              backend to cache various data between multiple Pungi calls. This
2490              can make Pungi faster in case more similar composes are  running
2491              regularly in short time.
2492
2493              For    list    of    available    backends,   please   see   the
2494              https://dogpilecache.readthedocs.io documentation.
2495
2496              Most typical configuration uses the dogpile.cache.dbm backend.
2497
2498       dogpile_cache_arguments
2499              (dict) – Arguments to be used when creating  the  Dogpile  cache
2500              backend.   See  the  particular  backend’s configuration for the
2501              list of possible key/value pairs.
2502
2503              For the dogpile.cache.dbm backend, the value can be for  example
2504              following:
2505
2506                 {
2507                     "filename": "/tmp/pungi_cache_file.dbm"
2508                 }
2509
2510       dogpile_cache_expiration_time
2511              (int)  –  Defines the default expiration time in seconds of data
2512              stored in the Dogpile cache. Defaults to 3600 seconds.
2513

BIG PICTURE EXAMPLES

2515       Actual Pungi configuration files can get very large. This pages  brings
2516       two examples of (almost) full configuration for two different composes.
2517
2518   Fedora Rawhide compose
2519       This  is  a  shortened  configuration  for Fedora Radhide compose as of
2520       2019-10-14.
2521
2522          release_name = 'Fedora'
2523          release_short = 'Fedora'
2524          release_version = 'Rawhide'
2525          release_is_layered = False
2526
2527          bootable = True
2528          comps_file = {
2529              'scm': 'git',
2530              'repo': 'https://pagure.io/fedora-comps.git',
2531              'branch': 'master',
2532              'file': 'comps-rawhide.xml',
2533              # Merge translations by running make. This command will generate the file.
2534              'command': 'make comps-rawhide.xml'
2535          }
2536          module_defaults_dir = {
2537              'scm': 'git',
2538              'repo': 'https://pagure.io/releng/fedora-module-defaults.git',
2539              'branch': 'main',
2540              'dir': '.'
2541          }
2542          # Optional module obsoletes configuration which is merged
2543          # into the module index and gets resolved
2544          module_obsoletes_dir = {
2545              'scm': 'git',
2546              'repo': 'https://pagure.io/releng/fedora-module-defaults.git',
2547              'branch': 'main',
2548              'dir': 'obsoletes'
2549          }
2550
2551          variants_file='variants-fedora.xml'
2552          sigkeys = ['12C944D0']
2553
2554          # Put packages into subdirectories hashed by their initial letter.
2555          hashed_directories = True
2556
2557          # There is a special profile for use with compose. It makes Pungi
2558          # authenticate automatically as rel-eng user.
2559          koji_profile = 'compose_koji'
2560
2561          # RUNROOT settings
2562          runroot = True
2563          runroot_channel = 'compose'
2564          runroot_tag = 'f32-build'
2565
2566          # PKGSET
2567          pkgset_source = 'koji'
2568          pkgset_koji_tag = 'f32'
2569          pkgset_koji_inherit = False
2570
2571          filter_system_release_packages = False
2572
2573          # GATHER
2574          gather_method = {
2575              '^.*': {                # For all variants
2576                  'comps': 'deps',    # resolve dependencies for packages from comps file
2577                  'module': 'nodeps', # but not for packages from modules
2578              }
2579          }
2580          gather_backend = 'dnf'
2581          gather_profiler = True
2582          check_deps = False
2583          greedy_method = 'build'
2584
2585          repoclosure_backend = 'dnf'
2586
2587          # CREATEREPO
2588          createrepo_deltas = False
2589          createrepo_database = True
2590          createrepo_use_xz = True
2591          createrepo_extra_args = ['--zck', '--zck-dict-dir=/usr/share/fedora-repo-zdicts/rawhide']
2592
2593          # CHECKSUMS
2594          media_checksums = ['sha256']
2595          media_checksum_one_file = True
2596          media_checksum_base_filename = '%(release_short)s-%(variant)s-%(version)s-%(arch)s-%(date)s%(type_suffix)s.%(respin)s'
2597
2598          # CREATEISO
2599          iso_hfs_ppc64le_compatible = False
2600
2601          # BUILDINSTALL
2602          buildinstall_method = 'lorax'
2603          buildinstall_skip = [
2604              # No installer for Modular variant
2605              ('^Modular$', {'*': True}),
2606              # No 32 bit installer for Everything.
2607              ('^Everything$', {'i386': True}),
2608          ]
2609
2610          # Enables macboot on x86_64 for all variants and disables upgrade image building
2611          # everywhere.
2612          lorax_options = [
2613            ('^.*$', {
2614               'x86_64': {
2615                   'nomacboot': False
2616               },
2617               'ppc64le': {
2618                   # Use 3GB image size for ppc64le.
2619                   'rootfs_size': 3
2620               },
2621               '*': {
2622                   'noupgrade': True
2623               }
2624            })
2625          ]
2626
2627          additional_packages = [
2628              ('^(Server|Everything)$', {
2629                  '*': [
2630                      # Add all architectures of dracut package.
2631                      'dracut.*',
2632                      # All all packages matching this pattern
2633                      'autocorr-*',
2634                  ],
2635              }),
2636
2637              ('^Everything$', {
2638                  # Everything should include all packages from the tag. This only
2639                  # applies to the native arch. Multilib will still be pulled in
2640                  # according to multilib rules.
2641                  '*': ['*'],
2642              }),
2643          ]
2644
2645          filter_packages = [
2646              ("^.*$", {"*": ["glibc32", "libgcc32"]}),
2647              ('(Server)$', {
2648                  '*': [
2649                      'kernel*debug*',
2650                      'kernel-kdump*',
2651                  ]
2652              }),
2653          ]
2654
2655          multilib = [
2656              ('^Everything$', {
2657                  'x86_64': ['devel', 'runtime'],
2658              })
2659          ]
2660
2661          # These packages should never be multilib on any arch.
2662          multilib_blacklist = {
2663              '*': [
2664                  'kernel', 'kernel-PAE*', 'kernel*debug*', 'java-*', 'php*', 'mod_*', 'ghc-*'
2665              ],
2666          }
2667
2668          # These should be multilib even if they don't match the rules defined above.
2669          multilib_whitelist = {
2670              '*': ['wine', '*-static'],
2671          }
2672
2673          createiso_skip = [
2674              # Keep binary ISOs for Server, but not source ones.
2675              ('^Server$', {'src': True}),
2676
2677              # Remove all other ISOs.
2678              ('^Everything$', {'*': True, 'src': True}),
2679              ('^Modular$', {'*': True, 'src': True}),
2680          ]
2681
2682          # Image name respecting Fedora's image naming policy
2683          image_name_format = '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s-%(date)s%(type_suffix)s.%(respin)s.iso'
2684          # Use the same format for volume id
2685          image_volid_formats = [
2686              '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s'
2687          ]
2688          # Used by Pungi to replace 'Cloud' with 'C' (etc.) in ISO volume IDs.
2689          # There is a hard 32-character limit on ISO volume IDs, so we use
2690          # these to try and produce short enough but legible IDs. Note this is
2691          # duplicated in Koji for live images, as livemedia-creator does not
2692          # allow Pungi to tell it what volume ID to use. Note:
2693          # https://fedoraproject.org/wiki/User:Adamwill/Draft_fedora_image_naming_policy
2694          volume_id_substitutions = {
2695                           'Beta': 'B',
2696                        'Rawhide': 'rawh',
2697                     'Silverblue': 'SB',
2698                       'Cinnamon': 'Cinn',
2699                          'Cloud': 'C',
2700                   'Design_suite': 'Dsgn',
2701                 'Electronic_Lab': 'Elec',
2702                     'Everything': 'E',
2703                 'Scientific_KDE': 'SciK',
2704                       'Security': 'Sec',
2705                         'Server': 'S',
2706                    'Workstation': 'WS',
2707          }
2708
2709          disc_types = {
2710              'boot': 'netinst',
2711              'live': 'Live',
2712          }
2713
2714          translate_paths = [
2715             ('/mnt/koji/compose/', 'https://kojipkgs.fedoraproject.org/compose/'),
2716          ]
2717
2718          # These will be inherited by live_media, live_images and image_build
2719          global_ksurl = 'git+https://pagure.io/fedora-kickstarts.git?#HEAD'
2720          global_release = '!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN'
2721          global_version = 'Rawhide'
2722          # live_images ignores this in favor of live_target
2723          global_target = 'f32'
2724
2725          image_build = {
2726              '^Container$': [
2727                  {
2728                      'image-build': {
2729                              'format': [('docker', 'tar.xz')],
2730                              'name': 'Fedora-Container-Base',
2731                              'kickstart': 'fedora-container-base.ks',
2732                              'distro': 'Fedora-22',
2733                              'disk_size': 5,
2734                              'arches': ['armhfp', 'aarch64', 'ppc64le', 's390x', 'x86_64'],
2735                              'repo': 'Everything',
2736                              'install_tree_from': 'Everything',
2737                              'subvariant': 'Container_Base',
2738                              'failable': ['*'],
2739                              },
2740                      'factory-parameters': {
2741                          'dockerversion': "1.10.1",
2742                          'docker_cmd':  '[ "/bin/bash" ]',
2743                          'docker_env': '[ "DISTTAG=f32container", "FGC=f32", "container=oci" ]',
2744                          'docker_label': '{ "name": "fedora", "license": "MIT", "vendor": "Fedora Project", "version": "32"}',
2745                      },
2746                  },
2747              ],
2748          }
2749
2750          live_media = {
2751              '^Workstation$': [
2752                      {
2753                          'name': 'Fedora-Workstation-Live',
2754                          'kickstart': 'fedora-live-workstation.ks',
2755                          # Variants.xml also contains aarch64 and armhfp, but there
2756                          # should be no live media for those arches.
2757                          'arches': ['x86_64', 'ppc64le'],
2758                          'failable': ['ppc64le'],
2759                          # Take packages and install tree from Everything repo.
2760                          'repo': 'Everything',
2761                          'install_tree_from': 'Everything',
2762                      }
2763                  ],
2764              '^Spins': [
2765                  # There are multiple media for Spins variant. They use subvariant
2766                  # field so that they can be identified in the metadata.
2767                  {
2768                      'name': 'Fedora-KDE-Live',
2769                      'kickstart': 'fedora-live-kde.ks',
2770                      'arches': ['x86_64'],
2771                      'repo': 'Everything',
2772                      'install_tree_from': 'Everything',
2773                      'subvariant': 'KDE'
2774
2775                  },
2776                  {
2777                      'name': 'Fedora-Xfce-Live',
2778                      'kickstart': 'fedora-live-xfce.ks',
2779                      'arches': ['x86_64'],
2780                      'failable': ['*'],
2781                      'repo': 'Everything',
2782                      'install_tree_from': 'Everything',
2783                      'subvariant': 'Xfce'
2784                  },
2785              ],
2786          }
2787
2788          failable_deliverables = [
2789              # Installer and ISOs for server failing do not abort the compose.
2790              ('^Server$', {
2791                  '*': ['buildinstall', 'iso'],
2792              }),
2793              ('^.*$', {
2794                  # Buildinstall is not blocking
2795                  'src': ['buildinstall'],
2796                  # Nothing on i386, ppc64le blocks the compose
2797                  'i386': ['buildinstall', 'iso'],
2798                  'ppc64le': ['buildinstall', 'iso'],
2799                  's390x': ['buildinstall', 'iso'],
2800              })
2801          ]
2802
2803          live_target = 'f32'
2804          live_images_no_rename = True
2805          live_images = [
2806              ('^Workstation$', {
2807                  'armhfp': {
2808                      'kickstart': 'fedora-arm-workstation.ks',
2809                      'name': 'Fedora-Workstation-armhfp',
2810                      # Again workstation takes packages from Everything.
2811                      'repo': 'Everything',
2812                      'type': 'appliance',
2813                      'failable': True,
2814                  }
2815              }),
2816              ('^Server$', {
2817                  # But Server has its own repo.
2818                  'armhfp': {
2819                      'kickstart': 'fedora-arm-server.ks',
2820                      'name': 'Fedora-Server-armhfp',
2821                      'type': 'appliance',
2822                      'failable': True,
2823                  }
2824              }),
2825          ]
2826
2827          ostree = {
2828              "^Silverblue$": {
2829                  "version": "!OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN",
2830                  # To get config, clone master branch from this repo and take
2831                  # treefile from there.
2832                  "treefile": "fedora-silverblue.yaml",
2833                  "config_url": "https://pagure.io/workstation-ostree-config.git",
2834                  "config_branch": "master",
2835                  # Consume packages from Everything
2836                  "repo": "Everything",
2837                  # Don't create a reference in the ostree repo (signing automation does that).
2838                  "tag_ref": False,
2839                  # Don't use change detection in ostree.
2840                  "force_new_commit": True,
2841                  # Use unified core mode for rpm-ostree composes
2842                  "unified_core": True,
2843                  # This is the location for the repo where new commit will be
2844                  # created. Note that this is outside of the compose dir.
2845                  "ostree_repo": "/mnt/koji/compose/ostree/repo/",
2846                  "ostree_ref": "fedora/rawhide/${basearch}/silverblue",
2847                  "arches": ["x86_64", "ppc64le", "aarch64"],
2848                  "failable": ['*'],
2849              }
2850          }
2851
2852          ostree_installer = [
2853              ("^Silverblue$", {
2854                  "x86_64": {
2855                      "repo": "Everything",
2856                      "release": None,
2857                      "rootfs_size": "8",
2858                      # Take templates from this repository.
2859                      'template_repo': 'https://pagure.io/fedora-lorax-templates.git',
2860                      'template_branch': 'master',
2861                      # Use following templates.
2862                      "add_template": ["ostree-based-installer/lorax-configure-repo.tmpl",
2863                                       "ostree-based-installer/lorax-embed-repo.tmpl",
2864                                       "ostree-based-installer/lorax-embed-flatpaks.tmpl"],
2865                      # And add these variables for the templates.
2866                      "add_template_var": [
2867                          "ostree_install_repo=https://kojipkgs.fedoraproject.org/compose/ostree/repo/",
2868                          "ostree_update_repo=https://ostree.fedoraproject.org",
2869                          "ostree_osname=fedora",
2870                          "ostree_oskey=fedora-32-primary",
2871                          "ostree_contenturl=mirrorlist=https://ostree.fedoraproject.org/mirrorlist",
2872                          "ostree_install_ref=fedora/rawhide/x86_64/silverblue",
2873                          "ostree_update_ref=fedora/rawhide/x86_64/silverblue",
2874                          "flatpak_remote_name=fedora",
2875                          "flatpak_remote_url=oci+https://registry.fedoraproject.org",
2876                          "flatpak_remote_refs=runtime/org.fedoraproject.Platform/x86_64/f30 app/org.gnome.Baobab/x86_64/stable",
2877                      ],
2878                      'failable': ['*'],
2879                  },
2880              })
2881          ]
2882
2883   RCM Tools compose
2884       This is a small compose used to deliver packages to  Red  Hat  internal
2885       users. The configuration is split into two files.
2886
2887          # rcmtools-common.conf
2888
2889          release_name = "RCM Tools"
2890          release_short = "RCMTOOLS"
2891          release_version = "2.0"
2892          release_type = "updates"
2893          release_is_layered = True
2894          createrepo_c = True
2895          createrepo_checksum = "sha256"
2896
2897          # PKGSET
2898          pkgset_source = "koji"
2899          koji_profile = "brew"
2900          pkgset_koji_inherit = True
2901
2902
2903          # GENERAL SETTINGS
2904          bootable = False
2905          comps_file = "rcmtools-comps.xml"
2906          variants_file = "rcmtools-variants.xml"
2907          sigkeys = ["3A3A33A3"]
2908
2909
2910          # RUNROOT settings
2911          runroot = False
2912
2913
2914          # GATHER
2915          gather_method = "deps"
2916          check_deps = True
2917
2918          additional_packages = [
2919              ('.*', {
2920                  '*': ['puddle', 'rcm-nexus'],
2921                  }
2922              ),
2923          ]
2924
2925          # Set repoclosure_strictness to fatal to avoid installation dependency
2926          # issues in production composes
2927          repoclosure_strictness = [
2928              ("^.*$", {
2929                  "*": "fatal"
2930              })
2931          ]
2932
2933       Configuration  specific for different base products is split into sepa‐
2934       rate files.
2935
2936          # rcmtools-common.conf
2937          from rcmtools-common import *
2938
2939          # BASE PRODUCT
2940          base_product_name = "Red Hat Enterprise Linux"
2941          base_product_short = "RHEL"
2942          base_product_version = "7"
2943
2944          # PKGSET
2945          pkgset_koji_tag = "rcmtools-rhel-7-compose"
2946
2947          # remove i386 arch on rhel7
2948          tree_arches = ["aarch64", "ppc64le", "s390x", "x86_64"]
2949
2950          check_deps = False
2951
2952          # Packages in these repos are available to satisfy dependencies inside the
2953          # compose, but will not be pulled in.
2954          gather_lookaside_repos = [
2955              ("^Client|Client-optional$", {
2956                  "x86_64": [
2957                      "http://example.redhat.com/rhel/7/Client/x86_64/os/",
2958                      "http://example.redhat.com/rhel/7/Client/x86_64/optional/os/",
2959                  ],
2960              }),
2961               ("^Workstation|Workstation-optional$", {
2962                  "x86_64": [
2963                      "http://example.redhat.com/rhel/7/Workstation/x86_64/os/",
2964                      "http://example.redhat.com/rhel/7/Workstation/x86_64/optional/os/",
2965                  ],
2966              }),
2967              ("^Server|Server-optional$", {
2968                  "aarch64": [
2969                      "http://example.redhat.com/rhel/7/Server/aarch64/os/",
2970                      "http://example.redhat.com/rhel/7/Server/aarch64/optional/os/",
2971                  ],
2972                  "ppc64": [
2973                      "http://example.redhat.com/rhel/7/Server/ppc64/os/",
2974                      "http://example.redhat.com/rhel/7/Server/ppc64/optional/os/",
2975                  ],
2976                  "ppc64le": [
2977                      "http://example.redhat.com/rhel/7/Server/ppc64le/os/",
2978                      "http://example.redhat.com/rhel/7/Server/ppc64le/optional/os/",
2979                  ],
2980                  "s390x": [
2981                      "http://example.redhat.com/rhel/7/Server/s390x/os/",
2982                      "http://example.redhat.com/rhel/7/Server/s390x/optional/os/",
2983                  ],
2984                  "x86_64": [
2985                      "http://example.redhat.com/rhel/7/Server/x86_64/os/",
2986                      "http://example.redhat.com/rhel/7/Server/x86_64/optional/os/",
2987                  ],
2988              })
2989          ]
2990

EXPORTING FILES FROM SCM

2992       Multiple places in Pungi can use files from external storage. The  con‐
2993       figuration  is  similar  independently of the backend that is used, al‐
2994       though some features may be different.
2995
2996       The so-called scm_dict is always put into configuration  as  a  dictio‐
2997       nary, which can contain following keys.
2998
2999scm  –  indicates  which SCM system is used. This is always required.
3000         Allowed values are:
3001
3002file – copies files from local filesystem
3003
3004git – copies files from a Git repository
3005
3006cvs – copies files from a CVS repository
3007
3008rpm – copies files from a package in the compose
3009
3010koji – downloads archives from a given build in Koji build system
3011
3012repo
3013
3014         • for Git and CVS backends this should be URL to the repository
3015
3016         • for RPM backend this should be a shell style glob matching  package
3017           names (or a list of such globs)
3018
3019         • for file backend this should be empty
3020
3021         • for Koji backend this should be an NVR or package name
3022
3023branch
3024
3025         • branch  name  for Git and CVS backends, with master and HEAD as de‐
3026           faults
3027
3028         • Koji tag for koji backend if only package name is given
3029
3030         • otherwise should not be specified
3031
3032file – a list of files that should be exported.
3033
3034dir – a directory that should be exported. All its contents  will  be
3035         exported. This option is mutually exclusive with file.
3036
3037command  – defines a shell command to run after Git clone to generate
3038         the needed file (for example to run  make).  Only  supported  in  Git
3039         backend.
3040
3041   Koji examples
3042       There are two different ways how to configure the Koji backend.
3043
3044          {
3045              # Download all *.tar files from build my-image-1.0-1.
3046              "scm": "koji",
3047              "repo": "my-image-1.0-1",
3048              "file": "*.tar",
3049          }
3050
3051          {
3052              # Find latest build of my-image in tag my-tag and take files from
3053              # there.
3054              "scm": "koji",
3055              "repo": "my-image",
3056              "branch": "my-tag",
3057              "file": "*.tar",
3058          }
3059
3060       Using  both  tag name and exact NVR will result in error: the NVR would
3061       be interpreted as a package name, and would not match anything.
3062
3063   file vs. dir
3064       Exactly one of these two options has to be specified. Documentation for
3065       each configuration option should specify whether it expects a file or a
3066       directory.
3067
3068       For extra_files phase either key is valid and should be chosen  depend‐
3069       ing on what the actual use case.
3070
3071   Caveats
3072       The rpm backend can only be used in phases that would extract the files
3073       after pkgset phase finished. You can’t get comps file from a package.
3074
3075       Depending on Git repository URL configuration Pungi can only export the
3076       requested  content using git archive. When a command should run this is
3077       not possible and a clone is always needed.
3078
3079       When using koji backend, it is required to  provide  configuration  for
3080       Koji  profile  to be used (koji_profile). It is not possible to contact
3081       multiple different Koji instances.
3082

PROGRESS NOTIFICATION

3084       Pungi has the ability to emit notification messages about progress  and
3085       general  status of the compose. These can be used to e.g. send messages
3086       to fedmsg. This is implemented by actually calling a separate script.
3087
3088       The script will be called with one argument describing action that just
3089       happened.  A  JSON-encoded  object  will be passed to standard input to
3090       provide more information about the event. At the very least, the object
3091       will contain a compose_id key.
3092
3093       The  notification  script  inherits  working  directory from the parent
3094       process and it can be called from  the  same  directory  pungi-koji  is
3095       called from. The working directory is listed at the start of main log.
3096
3097       Currently these messages are sent:
3098
3099status-change – when composing starts, finishes or fails; a status
3100            key is provided to indicate details
3101
3102phase-start – on start of a phase
3103
3104phase-stop – when phase is finished
3105
3106createiso-targets – with a list of images to be created
3107
3108createiso-imagedone – when any single image is finished
3109
3110createiso-imagefail – when any single image fails to create
3111
3112fail-to-start – when there are incorrect CLI options or errors  in
3113            configuration  file;  this message does not contain compose_id nor
3114            is it started in the compose directory (which does not exist yet)
3115
3116ostree – when a new commit is created, this message will  announce
3117            its hash and the name of ref it is meant for.
3118
3119       For phase related messages phase_name key is provided as well.
3120
3121       A pungi-fedmsg-notification script is provided and understands this in‐
3122       terface.
3123
3124   Setting it up
3125       The script should be provided as a command  line  argument  --notifica‐
3126       tion-script.
3127
3128          --notification-script=pungi-fedmsg-notification
3129

GATHERING PACKAGES

3131       A  compose created by Pungi consists of one or more variants. A variant
3132       contains a subset of the content targeted at a particular use case.
3133
3134       There are different types of variants. The type  affects  how  packages
3135       are gathered into the variant.
3136
3137       The  inputs  for gathering are defined by various gather sources. Pack‐
3138       ages from all sources are collected to create a  big  list  of  package
3139       names,  comps  groups  names and a list of packages that should be fil‐
3140       tered out.
3141
3142       NOTE:
3143          The inputs for both explicit package list and comps file are  inter‐
3144          preted  as  RPM names, not any arbitrary provides nor source package
3145          name.
3146
3147       Next, gather_method defines how the list is processed. For nodeps,  the
3148       results  from source are used pretty much as is [1]. For deps method, a
3149       process will be launched to figure out what dependencies are needed and
3150       those will be pulled in.
3151
3152       [1]  The lists are filtered based on what packages are available in the
3153            package set, but nothing else will be pulled in.
3154
3155   Variant types
3156       Variant
3157              is a base type that has no special behaviour.
3158
3159       Addon  is built on top of a regular variant. Any packages  that  should
3160              go  to both the addon and its parent will be removed from addon.
3161              Packages that are  only  in  addon  but  pulled  in  because  of
3162              gather_fulltree option will be moved to parent.
3163
3164       Integrated Layered Product
3165              works similarly to addon. Additionally, all packages from addons
3166              on the same parent variant are removed integrated layered  prod‐
3167              ucts.
3168
3169              The  main  difference  between  an  addon and integrated layered
3170              product is that integrated layered product has its own  identity
3171              in the metadata (defined with product name and version).
3172
3173              NOTE:
3174                 There’s  also  Layered Product as a term, but this is not re‐
3175                 lated to variants. It’s used to describe a  product  that  is
3176                 not  a standalone operating system and is instead meant to be
3177                 used on some other base system.
3178
3179       Optional
3180              contains packages that complete the base variants’ package  set.
3181              It  always  has fulltree and selfhosting enabled, so it contains
3182              build dependencies and packages which were not specifically  re‐
3183              quested for base variant.
3184
3185       Some configuration options are overridden for particular variant types.
3186
3187   Depsolving configuration
3188                      ┌──────────┬──────────────┬──────────────┐
3189                      │Variant   │ Fulltree     │ Selfhosting  │
3190                      ├──────────┼──────────────┼──────────────┤
3191                      │base      │ configurable │ configurable │
3192                      ├──────────┼──────────────┼──────────────┤
3193                      │addon/ILP │ enabled      │ disabled     │
3194                      ├──────────┼──────────────┼──────────────┤
3195                      │optional  │ enabled      │ enabled      │
3196                      └──────────┴──────────────┴──────────────┘
3197
3198   Profiling
3199       Profiling  data  on the pungi-gather tool can be enabled by setting the
3200       gather_profiler configuration option to True.
3201
3202   Modular compose
3203       A compose with gather_source set to module is called modular. The pack‐
3204       age list is determined by a list of modules.
3205
3206       The  list  of modules that will be put into a variant is defined in the
3207       variants.xml  file.  The  file  can  contain  either   Name:Stream   or
3208       Name:Stream:Version  references.  See Module Naming Policy for details.
3209       When Version is missing from the specification, Pungi will ask PDC  for
3210       the latest one.
3211
3212       The  module  metadata  in  PDC contains a list of RPMs in the module as
3213       well as Koji tag from which the packages can be retrieved.
3214
3215   Restrictions
3216          • A modular compose must always use Koji as a package set source.
3217

PROCESSING COMPS FILES

3219       The comps file that Pungi takes as input is not really  pure  comps  as
3220       used  by tools like DNF. There are extensions used to customize how the
3221       file is processed.
3222
3223       The first step of Pungi processing is to retrieve the actual file. This
3224       can use anything that Exporting files from SCM supports.
3225
3226       Pungi  extensions  are arch attribute on packageref, group and environ‐
3227       ment tags. The value of this attribute is a comma separated list of ar‐
3228       chitectures.
3229
3230       Second  step  Pungi  performs is creating a file for each architecture.
3231       This is done by removing all elements with incompatible arch attribute.
3232       No additional clean up is performed on this file. The resulting file is
3233       only used internally for the rest of the compose process.
3234
3235       Third and final step is to create comps file for each Variant.Arch com‐
3236       bination.   This  is  the actual file that will be included in the com‐
3237       pose. The start file is the original input file, from  which  all  ele‐
3238       ments with incompatible architecture are removed. Then clean up is per‐
3239       formed by removing all empty groups, removing non-existing groups  from
3240       environments and categories and finally removing empty environments and
3241       categories. As a last step groups not listed in the variants  file  are
3242       removed.
3243

CONTRIBUTING TO PUNGI

3245   Set up development environment
3246       In order to work on Pungi, you should install recent version of Fedora.
3247
3248   Python2
3249       Fedora  29  is  recommended  because some packages are not available in
3250       newer Fedora release, e.g. python2-libcomps.
3251
3252       Install required packages
3253
3254          $ sudo dnf install -y krb5-devel gcc make libcurl-devel python2-devel python2-createrepo_c kobo-rpmlib yum python2-libcomps python2-libselinx
3255
3256   Python3
3257       Install required packages
3258
3259          $ sudo dnf install -y krb5-devel gcc make libcurl-devel python3-devel python3-createrepo_c python3-libcomps
3260
3261   Developing
3262       Currently the development workflow for Pungi is on master branch:
3263
3264       • Make your own fork at https://pagure.io/pungi
3265
3266       • Clone your fork locally (replacing $USERNAME with your own):
3267
3268            git clone git@pagure.io:forks/$USERNAME/pungi.git
3269
3270       • cd into your local clone and add the remote upstream for rebasing:
3271
3272            cd pungi
3273            git remote add upstream git@pagure.io:pungi.git
3274
3275         NOTE:
3276            This workflow assumes that you never git commit  directly  to  the
3277            master  branch  of  your  fork.  This will make more sense when we
3278            cover rebasing below.
3279
3280       • create a topic branch based on master:
3281
3282            git branch my_topic_branch master
3283            git checkout my_topic_branch
3284
3285       • Make edits, changes, add new features, etc. and  then  make  sure  to
3286         pull  from  upstream  master  and rebase before submitting a pull re‐
3287         quest:
3288
3289            # lets just say you edited setup.py for sake of argument
3290            git checkout my_topic_branch
3291
3292            # make changes to setup.py
3293            black setup.py
3294            tox
3295            git add setup.py
3296            git commit -s -m "added awesome feature to setup.py"
3297
3298            # now we rebase
3299            git checkout master
3300            git pull --rebase upstream master
3301            git push origin master
3302            git push origin --tags
3303            git checkout my_topic_branch
3304            git rebase master
3305
3306            # resolve merge conflicts if any as a result of your development in
3307            # your topic branch
3308            git push origin my_topic_branch
3309
3310         NOTE:
3311            In order to for your commit to be merged:
3312
3313            • you must sign-off on it. Use -s option when running git commit.
3314
3315            • The code must be well formatted via black and pass flake8 check‐
3316              ing. Run tox -e black,flake8 to do the check.
3317
3318       • Create pull request in the pagure.io web UI
3319
3320       • For  convenience, here is a bash shell function that can be placed in
3321         your ~/.bashrc and called such  as  pullupstream  pungi-4-devel  that
3322         will automate a large portion of the rebase steps from above:
3323
3324            pullupstream () {
3325              if [[ -z "$1" ]]; then
3326                printf "Error: must specify a branch name (e.g. - master, devel)\n"
3327              else
3328                pullup_startbranch=$(git describe --contains --all HEAD)
3329                git checkout $1
3330                git pull --rebase upstream master
3331                git push origin $1
3332                git push origin --tags
3333                git checkout ${pullup_startbranch}
3334              fi
3335            }
3336
3337   Testing
3338       You  must  write  unit  tests  for  any  new  code  (except for trivial
3339       changes). Any code without sufficient test coverage may not be merged.
3340
3341       To run all existing tests, suggested method is to use tox.
3342
3343          $ sudo dnf install python3-tox -y
3344
3345          $ tox -e py3
3346          $ tox -e py27
3347
3348       Alternatively you could create a vitualenv, install deps and run  tests
3349       manually if you don’t want to use tox.
3350
3351          $ sudo dnf install python3-virtualenvwrapper -y
3352          $ mkvirtualenv --system-site-packages py3
3353          $ workon py3
3354          $ pip install -r requirements.txt -r test-requirements.txt
3355          $ make test
3356
3357          # or with coverage
3358          $ make test-coverage
3359
3360       If you need to run specified tests, pytest is recommended.
3361
3362          # Activate virtualenv first
3363
3364          # Run tests
3365          $ pytest tests/test_config.py
3366          $ pytest tests/test_config.py -k test_pkgset_mismatch_repos
3367
3368       In  the  tests/  directory there is a shell script test_compose.sh that
3369       you can use to try and create a miniature compose on  dummy  data.  The
3370       actual data will be created by running make test-data in project root.
3371
3372          $ sudo dnf -y install rpm-build createrepo_c isomd5sum genisoimage syslinux
3373
3374          # Activate virtualenv (the one created by tox could be used)
3375          $ source .tox/py3/bin/activate
3376
3377          $ python setup.py develop
3378          $ make test-data
3379          $ make test-compose
3380
3381       This  testing  compose does not actually use all phases that are avail‐
3382       able, and there is no checking that the  result  is  correct.  It  only
3383       tells you whether it crashed or not.
3384
3385       NOTE:
3386          Even  when  it  finishes successfully, it may print errors about re‐
3387          poclosure on Server-Gluster.x86_64 in test phase. This is not a bug.
3388
3389   Documenting
3390       You must write  documentation  for  any  new  features  and  functional
3391       changes.  Any code without sufficient documentation may not be merged.
3392
3393       To generate the documentation, run make doc in project root.
3394

TESTING PUNGI

3396   Test Data
3397       Tests  require  test  data  and not all of it is available in git.  You
3398       must create test repositories before running the tests:
3399
3400          make test-data
3401
3402       Requirements: createrepo_c, rpmbuild
3403
3404   Unit Tests
3405       Unit tests cover functionality of Pungi python modules.   You  can  run
3406       all of them at once:
3407
3408          make test
3409
3410       which is shortcut to:
3411
3412          python2 setup.py test
3413          python3 setup.py test
3414
3415       You can alternatively run individual tests:
3416
3417          cd tests
3418          ./<test>.py [<class>[.<test>]]
3419
3420   Functional Tests
3421       Because  compose is quite complex process and not everything is covered
3422       with unit tests yet, the easiest way how to test if  your  changes  did
3423       not  break  anything  badly is to start a compose on a relatively small
3424       and well defined package set:
3425
3426          cd tests
3427          ./test_compose.sh
3428

MANAGING COMPOSE FROM MULTIPLE PARTS

3430       There may be cases where it makes sense to split  a  big  compose  into
3431       separate  parts, but create a compose output that links all output into
3432       one familiar structure.
3433
3434       The pungi-orchestrate tools allows that.
3435
3436       It works with an INI-style configuration file.  The  [general]  section
3437       contains information about identity of the main compose. Other sections
3438       define individual parts.
3439
3440       The parts are scheduled to run in parallel, with the minimal amount  of
3441       serialization.  The  final compose directory will contain hard-links to
3442       the files.
3443
3444   General settings
3445       target Path to directory where the final compose should be created.
3446
3447       compose_type
3448              Type of compose to make.
3449
3450       release_name
3451              Name of the product for the final compose.
3452
3453       release_short
3454              Short name of the product for the final compose.
3455
3456       release_version
3457              Version of the product for the final compose.
3458
3459       release_type
3460              Type of the product for the final compose.
3461
3462       extra_args
3463              Additional arguments that will be passed to the child Pungi pro‐
3464              cesses.
3465
3466       koji_profile
3467              If  specified,  a  current event will be retrieved from the Koji
3468              instance and used for all parts.
3469
3470       kerberos
3471              If set to yes, a kerberos ticket will be  automatically  created
3472              at the start.  Set keytab and principal as well.
3473
3474       kerberos_keytab
3475              Path to keytab file used to create the kerberos ticket.
3476
3477       kerberos_principal
3478              Kerberos principal for the ticket
3479
3480       pre_compose_script
3481              Commands  to  execute  before first part is started. Can contain
3482              multiple commands on separate lines.
3483
3484       post_compose_script
3485              Commands to execute after the last part finishes and final  sta‐
3486              tus is updated. Can contain multiple commands on separate lines.
3487
3488                 post_compose_script =
3489                     compose-latest-symlink $COMPOSE_PATH
3490                     custom-post-compose-script.sh
3491
3492              Multiple environment variables are defined for the scripts:
3493
3494COMPOSE_PATH
3495
3496COMPOSE_ID
3497
3498COMPOSE_DATE
3499
3500COMPOSE_TYPE
3501
3502COMPOSE_RESPIN
3503
3504COMPOSE_LABEL
3505
3506RELEASE_ID
3507
3508RELEASE_NAME
3509
3510RELEASE_SHORT
3511
3512RELEASE_VERSION
3513
3514RELEASE_TYPE
3515
3516RELEASE_IS_LAYERED YES for layered products, empty other‐
3517                   wise
3518
3519BASE_PRODUCT_NAME – only set for layered products
3520
3521BASE_PRODUCT_SHORT – only set for layered products
3522
3523BASE_PRODUCT_VERSION – only set for layered products
3524
3525BASE_PRODUCT_TYPE – only set for layered products
3526
3527       notification_script
3528              Executable name (or path to a script) that will be used to  send
3529              a message once the compose is finished. In order for a valid URL
3530              to be included in the message, at least one part must  configure
3531              path translation that would apply to location of main compose.
3532
3533              Only two messages will be sent, one for start and one for finish
3534              (either successful or not).
3535
3536   Partial compose settings
3537       Each part should have a separate section in the config file.
3538
3539       It can specify these options:
3540
3541       config Path to configuration file that describes this  part.  If  rela‐
3542              tive,  it is resolved relative to the file with parts configura‐
3543              tion.
3544
3545       just_phase, skip_phase
3546              Customize which phases should run for this part.
3547
3548       depends_on
3549              A comma separated list of other parts that must be finished  be‐
3550              fore this part starts.
3551
3552       failable
3553              A  boolean  toggle to mark a part as failable. A failure in such
3554              part will mark the final compose as incomplete, but  still  suc‐
3555              cessful.
3556

AUTHOR

3558       Daniel Mach
3559
3561       2022, Red Hat, Inc.
3562
3563
3564
3565
35664.3                              Dec 09, 2022                         PUNGI(1)
Impressum