Big picture examples
********************

Actual Pungi configuration files can get very large. This pages brings
two examples of (almost) full configuation for two different composes.


Fedora Rawhide compose
======================

This is a shortened configuration for Fedora Radhide compose as of
2019-10-14.

   release_name = 'Fedora'
   release_short = 'Fedora'
   release_version = 'Rawhide'
   release_is_layered = False

   bootable = True
   comps_file = {
       'scm': 'git',
       'repo': 'https://pagure.io/fedora-comps.git',
       'branch': 'master',
       'file': 'comps-rawhide.xml',
       # Merge translations by running make. This command will generate the file.
       'command': 'make comps-rawhide.xml'
   }
   module_defaults_dir = {
       'scm': 'git',
       'repo': 'https://pagure.io/releng/fedora-module-defaults.git',
       'branch': 'master',
       'dir': '.'
   }

   variants_file='variants-fedora.xml'
   sigkeys = ['12C944D0']

   # Put packages into subdirectories hashed by their initial letter.
   hashed_directories = True

   # There is a special profile for use with compose. It makes Pungi
   # authenticate automatically as rel-eng user.
   koji_profile = 'compose_koji'

   # RUNROOT settings
   runroot = True
   runroot_channel = 'compose'
   runroot_tag = 'f32-build'

   # PKGSET
   pkgset_source = 'koji'
   pkgset_koji_tag = 'f32'
   pkgset_koji_inherit = False

   filter_system_release_packages = False

   # GATHER
   gather_method = {
       '^.*': {                # For all variants
           'comps': 'deps',    # resolve dependencies for packages from comps file
           'module': 'nodeps', # but not for packages from modules
       }
   }
   gather_backend = 'dnf'
   gather_profiler = True
   check_deps = False
   greedy_method = 'build'

   repoclosure_backend = 'dnf'

   # CREATEREPO
   createrepo_deltas = False
   createrepo_database = True
   createrepo_use_xz = True
   createrepo_extra_args = ['--zck', '--zck-dict-dir=/usr/share/fedora-repo-zdicts/rawhide']

   # CHECKSUMS
   media_checksums = ['sha256']
   media_checksum_one_file = True
   media_checksum_base_filename = '%(release_short)s-%(variant)s-%(version)s-%(arch)s-%(date)s%(type_suffix)s.%(respin)s'

   # CREATEISO
   iso_hfs_ppc64le_compatible = False
   create_jigdo = False

   # BUILDINSTALL
   buildinstall_method = 'lorax'
   buildinstall_skip = [
       # No installer for Modular variant
       ('^Modular$', {'*': True}),
       # No 32 bit installer for Everything.
       ('^Everything$', {'i386': True}),
   ]

   # Enables macboot on x86_64 for all variants and disables upgrade image building
   # everywhere.
   lorax_options = [
     ('^.*$', {
        'x86_64': {
            'nomacboot': False
        },
        'ppc64le': {
            # Use 3GB image size for ppc64le.
            'rootfs_size': 3
        },
        '*': {
            'noupgrade': True
        }
     })
   ]

   additional_packages = [
       ('^(Server|Everything)$', {
           '*': [
               # Add all architectures of dracut package.
               'dracut.*',
               # All all packages matching this pattern
               'autocorr-*',
           ],
       }),

       ('^Everything$', {
           # Everything should include all packages from the tag. This only
           # applies to the native arch. Multilib will still be pulled in
           # according to multilib rules.
           '*': ['*'],
       }),
   ]

   filter_packages = [
       ("^.*$", {"*": ["glibc32", "libgcc32"]}),
       ('(Server)$', {
           '*': [
               'kernel*debug*',
               'kernel-kdump*',
           ]
       }),
   ]

   multilib = [
       ('^Everything$', {
           'x86_64': ['devel', 'runtime'],
       })
   ]

   # These packages should never be multilib on any arch.
   multilib_blacklist = {
       '*': [
           'kernel', 'kernel-PAE*', 'kernel*debug*', 'java-*', 'php*', 'mod_*', 'ghc-*'
       ],
   }

   # These should be multilib even if they don't match the rules defined above.
   multilib_whitelist = {
       '*': ['wine', '*-static'],
   }

   createiso_skip = [
       # Keep binary ISOs for Server, but not source ones.
       ('^Server$', {'src': True}),

       # Remove all other ISOs.
       ('^Everything$', {'*': True, 'src': True}),
       ('^Modular$', {'*': True, 'src': True}),
   ]

   # Image name respecting Fedora's image naming policy
   image_name_format = '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s-%(date)s%(type_suffix)s.%(respin)s.iso'
   # Use the same format for volume id
   image_volid_formats = [
       '%(release_short)s-%(variant)s-%(disc_type)s-%(arch)s-%(version)s'
   ]
   # Used by Pungi to replace 'Cloud' with 'C' (etc.) in ISO volume IDs.
   # There is a hard 32-character limit on ISO volume IDs, so we use
   # these to try and produce short enough but legible IDs. Note this is
   # duplicated in Koji for live images, as livemedia-creator does not
   # allow Pungi to tell it what volume ID to use. Note:
   # https://fedoraproject.org/wiki/User:Adamwill/Draft_fedora_image_naming_policy
   volume_id_substitutions = {
                    'Beta': 'B',
                 'Rawhide': 'rawh',
              'Silverblue': 'SB',
                'Cinnamon': 'Cinn',
                   'Cloud': 'C',
            'Design_suite': 'Dsgn',
          'Electronic_Lab': 'Elec',
              'Everything': 'E',
          'Scientific_KDE': 'SciK',
                'Security': 'Sec',
                  'Server': 'S',
             'Workstation': 'WS',
   }

   disc_types = {
       'boot': 'netinst',
       'live': 'Live',
   }

   translate_paths = [
      ('/mnt/koji/compose/', 'https://kojipkgs.fedoraproject.org/compose/'),
   ]

   # These will be inherited by live_media, live_images and image_build
   global_ksurl = 'git+https://pagure.io/fedora-kickstarts.git?#HEAD'
   global_release = '!RELEASE_FROM_LABEL_DATE_TYPE_RESPIN'
   global_version = 'Rawhide'
   # live_images ignores this in favor of live_target
   global_target = 'f32'

   image_build = {
       '^Container$': [
           {
               'image-build': {
                       'format': [('docker', 'tar.xz')],
                       'name': 'Fedora-Container-Base',
                       'kickstart': 'fedora-container-base.ks',
                       'distro': 'Fedora-22',
                       'disk_size': 5,
                       'arches': ['armhfp', 'aarch64', 'ppc64le', 's390x', 'x86_64'],
                       'repo': 'Everything',
                       'install_tree_from': 'Everything',
                       'subvariant': 'Container_Base',
                       'failable': ['*'],
                       },
               'factory-parameters': {
                   'dockerversion': "1.10.1",
                   'docker_cmd':  '[ "/bin/bash" ]',
                   'docker_env': '[ "DISTTAG=f32container", "FGC=f32", "container=oci" ]',
                   'docker_label': '{ "name": "fedora", "license": "MIT", "vendor": "Fedora Project", "version": "32"}',
               },
           },
       ],
   }

   live_media = {
       '^Workstation$': [
               {
                   'name': 'Fedora-Workstation-Live',
                   'kickstart': 'fedora-live-workstation.ks',
                   # Variants.xml also contains aarch64 and armhfp, but there
                   # should be no live media for those arches.
                   'arches': ['x86_64', 'ppc64le'],
                   'failable': ['ppc64le'],
                   # Take packages and install tree from Everything repo.
                   'repo': 'Everything',
                   'install_tree_from': 'Everything',
               }
           ],
       '^Spins': [
           # There are multiple media for Spins variant. They use subvariant
           # field so that they can be indentified in the metadata.
           {
               'name': 'Fedora-KDE-Live',
               'kickstart': 'fedora-live-kde.ks',
               'arches': ['x86_64'],
               'repo': 'Everything',
               'install_tree_from': 'Everything',
               'subvariant': 'KDE'

           },
           {
               'name': 'Fedora-Xfce-Live',
               'kickstart': 'fedora-live-xfce.ks',
               'arches': ['x86_64'],
               'failable': ['*'],
               'repo': 'Everything',
               'install_tree_from': 'Everything',
               'subvariant': 'Xfce'
           },
       ],
   }

   failable_deliverables = [
       # Installer and ISOs for server failing do not abort the compose.
       ('^Server$', {
           '*': ['buildinstall', 'iso'],
       }),
       ('^.*$', {
           # Buildinstall is not blocking
           'src': ['buildinstall'],
           # Nothing on i386, ppc64le blocks the compose
           'i386': ['buildinstall', 'iso'],
           'ppc64le': ['buildinstall', 'iso'],
           's390x': ['buildinstall', 'iso'],
       })
   ]

   live_target = 'f32'
   live_images_no_rename = True
   live_images = [
       ('^Workstation$', {
           'armhfp': {
               'kickstart': 'fedora-arm-workstation.ks',
               'name': 'Fedora-Workstation-armhfp',
               # Again workstation takes packages from Everything.
               'repo': 'Everything',
               'type': 'appliance',
               'failable': True,
           }
       }),
       ('^Server$', {
           # But Server has its own repo.
           'armhfp': {
               'kickstart': 'fedora-arm-server.ks',
               'name': 'Fedora-Server-armhfp',
               'type': 'appliance',
               'failable': True,
           }
       }),
   ]

   ostree = {
       "^Silverblue$": {
           "version": "!OSTREE_VERSION_FROM_LABEL_DATE_TYPE_RESPIN",
           # To get config, clone master branch from this repo and take
           # treefile from there.
           "treefile": "fedora-silverblue.yaml",
           "config_url": "https://pagure.io/workstation-ostree-config.git",
           "config_branch": "master",
           # Consume packages from Everything
           "repo": "Everything",
           # Don't create a reference in the ostree repo (signing automation does that).
           "tag_ref": False,
           # Don't use change detection in ostree.
           "force_new_commit": True,
           # This is the location for the repo where new commit will be
           # created. Note that this is outside of the compose dir.
           "ostree_repo": "/mnt/koji/compose/ostree/repo/",
           "ostree_ref": "fedora/rawhide/${basearch}/silverblue",
           "arches": ["x86_64", "ppc64le", "aarch64"],
           "failable": ['*'],
       }
   }

   ostree_installer = [
       ("^Silverblue$", {
           "x86_64": {
               "repo": "Everything",
               "release": None,
               "rootfs_size": "8",
               # Take templates from this repository.
               'template_repo': 'https://pagure.io/fedora-lorax-templates.git',
               'template_branch': 'master',
               # Use following templates.
               "add_template": ["ostree-based-installer/lorax-configure-repo.tmpl",
                                "ostree-based-installer/lorax-embed-repo.tmpl",
                                "ostree-based-installer/lorax-embed-flatpaks.tmpl"],
               # And add these variables for the templates.
               "add_template_var": [
                   "ostree_install_repo=https://kojipkgs.fedoraproject.org/compose/ostree/repo/",
                   "ostree_update_repo=https://ostree.fedoraproject.org",
                   "ostree_osname=fedora",
                   "ostree_oskey=fedora-32-primary",
                   "ostree_contenturl=mirrorlist=https://ostree.fedoraproject.org/mirrorlist",
                   "ostree_install_ref=fedora/rawhide/x86_64/silverblue",
                   "ostree_update_ref=fedora/rawhide/x86_64/silverblue",
                   "flatpak_remote_name=fedora",
                   "flatpak_remote_url=oci+https://registry.fedoraproject.org",
                   "flatpak_remote_refs=runtime/org.fedoraproject.Platform/x86_64/f30 app/org.gnome.Baobab/x86_64/stable",
               ],
               'failable': ['*'],
           },
       })
   ]


RCM Tools compose
=================

This is a small compose used to deliver packages to Red Hat internal
users. The configuration is split into two files.

   # rcmtools-common.conf

   release_name = "RCM Tools"
   release_short = "RCMTOOLS"
   release_version = "2.0"
   release_type = "updates"
   release_is_layered = True
   createrepo_c = True
   createrepo_checksum = "sha256"

   # PKGSET
   pkgset_source = "koji"
   koji_profile = "brew"
   pkgset_koji_inherit = True


   # GENERAL SETTINGS
   bootable = False
   comps_file = "rcmtools-comps.xml"
   variants_file = "rcmtools-variants.xml"
   sigkeys = ["3A3A33A3"]


   # RUNROOT settings
   runroot = False


   # GATHER
   gather_method = "deps"
   check_deps = True

   additional_packages = [
       ('.*', {
           '*': ['puddle', 'rcm-nexus'],
           }
       ),
   ]

   # Set repoclosure_strictness to fatal to avoid installation dependency
   # issues in production composes
   repoclosure_strictness = [
       ("^.*$", {
           "*": "fatal"
       })
   ]

Configuration specific for different base products is split into
separate files.

   # rcmtools-common.conf
   from rcmtools-common import *

   # BASE PRODUCT
   base_product_name = "Red Hat Enterprise Linux"
   base_product_short = "RHEL"
   base_product_version = "7"

   # PKGSET
   pkgset_koji_tag = "rcmtools-rhel-7-compose"

   # remove i386 arch on rhel7
   tree_arches = ["aarch64", "ppc64le", "s390x", "x86_64"]

   check_deps = False

   # Packages in these repos are available to satisfy dependencies inside the
   # compose, but will not be pulled in.
   gather_lookaside_repos = [
       ("^Client|Client-optional$", {
           "x86_64": [
               "http://example.redhat.com/rhel/7/Client/x86_64/os/",
               "http://example.redhat.com/rhel/7/Client/x86_64/optional/os/",
           ],
       }),
        ("^Workstation|Workstation-optional$", {
           "x86_64": [
               "http://example.redhat.com/rhel/7/Workstation/x86_64/os/",
               "http://example.redhat.com/rhel/7/Workstation/x86_64/optional/os/",
           ],
       }),
       ("^Server|Server-optional$", {
           "aarch64": [
               "http://example.redhat.com/rhel/7/Server/aarch64/os/",
               "http://example.redhat.com/rhel/7/Server/aarch64/optional/os/",
           ],
           "ppc64": [
               "http://example.redhat.com/rhel/7/Server/ppc64/os/",
               "http://example.redhat.com/rhel/7/Server/ppc64/optional/os/",
           ],
           "ppc64le": [
               "http://example.redhat.com/rhel/7/Server/ppc64le/os/",
               "http://example.redhat.com/rhel/7/Server/ppc64le/optional/os/",
           ],
           "s390x": [
               "http://example.redhat.com/rhel/7/Server/s390x/os/",
               "http://example.redhat.com/rhel/7/Server/s390x/optional/os/",
           ],
           "x86_64": [
               "http://example.redhat.com/rhel/7/Server/x86_64/os/",
               "http://example.redhat.com/rhel/7/Server/x86_64/optional/os/",
           ],
       })
   ]
