Koji 1.18.0 Release notes

Migrating from Koji 1.17

For details on migrating see :doc:`../migrations/migrating_to_1.18`

Security Fixes

Client Changes

**Add option for custom cert location**

| PR: https://pagure.io/koji/pull-request/1253

The CLI now has an option for setting a custom SSL certificate, similar to the
options for Kerberos authentication.

**Load client plugins from ~/.koji/plugins**

| PR: https://pagure.io/koji/pull-request/892

This change allows users to load their own cli plugins from ``~/.koji/plugins``
or from another location by using the ``plugin_paths`` setting.

**Show load/capacity in list-channels**

| PR: https://pagure.io/koji/pull-request/1449

The ``list-channels`` display has been expanded to show overall totals for load
and capacity.

**Allow taginfo cli to use tag IDs**

| PR: https://pagure.io/koji/pull-request/1476

The ``taginfo`` command can now accept a numeric tag id on the command line.

**Add option to show channels in list-hosts**

| PR: https://pagure.io/koji/pull-request/1425

The ``list-hosts`` command will now display channel subscriptions if the
``--show-channels`` option is given.

**Remove merge option from edit-external-repo**

| PR: https://pagure.io/koji/pull-request/1499

This option was mistakenly added to the command and never did anything.
It is gone now.

**Honor mock.package_manager tag setting in mock-config cli**

| PR: https://pagure.io/koji/pull-request/1374

The ``mock-config`` command will now honor this setting just as ``kojid`` does.

Library Changes

**New multicall interface**

| PR: https://pagure.io/koji/pull-request/957

This feature implements a new and much better way to use multicall in the Koji
These changes create a new implementation outside of ClientSession.
The old way will still work.

With this new implementation:

* a multicall is tracked as an instance of `MultiCallSession`
* the original session is unaffected
* multiple multicalls can be managed in parallel, if desired
* `MultiCallSession` behaves more or less like a session in multicall mode
* method calls return a `VirtualCall` instance that can later be used to access the result
* `MultiCallSession` can be used as a context manager, ensuring that the calls are executed

Usage examples can be found in the :doc:`Writing Koji Code <../writing_koji_code>`

Web UI Changes

**Retain old search pattern in web ui**

| PR: https://pagure.io/koji/pull-request/1258

The search results page of the web ui now retains a search form with the
current search pre-filled.
This makes it easier for users to refine their searches.

**Display task durations in webui**

| PR: https://pagure.io/koji/pull-request/1383

The ``taskinfo`` page in the web ui now shows task durations in addition to

Builder Changes

**Rebuild SRPMS before building**

| PR: https://pagure.io/koji/pull-request/1462

For rpm builds from an uploaded srpm, Koji will now rebuild the srpm in the
build environment first.
This ensures that the NVR is correct for the resulting build.

The old behavior can be requested by setting ``rebuild_srpm=False`` in the tag
extra data for the build tag in question.

**User createrepo_c by default**

| PR: https://pagure.io/koji/pull-request/1278

The ``use_createrepo_c`` configuration option for ``kojid`` now defaults to True.

**Use createrepo update option even for first repo run**

| PR: https://pagure.io/koji/pull-request/1363

If there is no older repo for a tag, Koji will now attempt to find
a related repo to use ``createrepo --update`` with.
This will speed up first-time repo generations for tags that
predominantly inherit their content from another build tag.

**Scale task_avail_delay based on bin rank**

| PR: https://pagure.io/koji/pull-request/1386

This is an adjustment to Koji's decentralized scheduling algorithm.
It should result in better utilization of host capacity, particularly when
a channel has hosts that are very heterogeneous in capacity.

The meaning of the ``task_avail_delay`` setting is different now.
Within a channel-arch bin, the hosts with highest capacity will take the task
immediately, while hosts lower down will have a delay proportional to their
The "rank" here is a float between 0.0 and 1.0 used as a multiplier.
So ``task_avail_delay`` is the maximum time that any host will wait to
take a task.

Hosts with higher available capacity will be more likely to claim a
task, resulting in better utilization of the highest capacity hosts.

**Use RawConfigParser for kojid**

| PR: https://pagure.io/koji/pull-request/1544

The use of percent signs is common in ``kojid.conf`` because of the
``host_principal_format`` setting.
This causes an error in python3 if ``SafeConfigParser`` is used, so we use
``RawConfigParser`` instead.

**Handle bare merge mode**

| PR: https://pagure.io/koji/pull-request/1411
| PR: https://pagure.io/koji/pull-request/1516
| PR: https://pagure.io/koji/pull-request/1502

This feature adds a new merge mode for external repos named ``bare``.
This mode is intended for use with modularity.

Use of this mode requires createrepo_c version 0.14.0 or later on the builders
that handle the createrepo tasks.

System Changes

**API for reserving NVRs for content generators**

| PR: https://pagure.io/koji/pull-request/1464
| PR: https://pagure.io/koji/pull-request/1597
| PR: https://pagure.io/koji/pull-request/1601
| PR: https://pagure.io/koji/pull-request/1602
| PR: https://pagure.io/koji/pull-request/1606

This feature allows content generators to reserve NVRs earlier in the build
process similar to builds performed by ``kojid``. The NVR is reserved by
calling ``CGInitBuild()`` and finalized by the ``CGImport()`` call.

**Per-tag configuration of rpm macros**

| PR: https://pagure.io/koji/pull-request/898

This feature allows setting rpm macros via the tag extra field. These macros
will be added to the mock configuration for the buildroot. The system
looks for extra values of the form ``rpm.macro.NAME``.

For example, to set the dist tag for a given tag, you could use a command like:


    $ koji edit-tag f30-build -x rpm.macro.dist=MYDISTTAG

**Per-tag configuration for module_hotfixes setting**

| PR: https://pagure.io/koji/pull-request/1524
| PR: https://pagure.io/koji/pull-request/1578

Koji now handles the field ``mock.yum.module_hotfixes`` in the tag extra.
When set, kojid will set ``module_hotfixes=0/1`` in the yum portion of the
mock configuration for a buildroot.

**Allow users to opt out of notifications**

| PR: https://pagure.io/koji/pull-request/1417
| PR: https://pagure.io/koji/pull-request/1580

This feature lets users opt out of notifications that they would otherwise
automatically recieve, such as build and tag notifications for:

- the build owner (the user who submitted the build)
- the package owner within the given tag

These opt-outs are user controlled and can be managed with the new
``block-notification`` and ``unblock-notificiation`` commands.

**Allow hub policy to match version and release**

| PR: https://pagure.io/koji/pull-request/1513

This feature adds new policy tests to match ``version`` and ``release``.
This tests are glob pattern matches.

**Allow hub policy to match build type**

| PR: https://pagure.io/koji/pull-request/1415

Koji added btypes in version 1.11 along with content generators.
Now, all builds have one or more btypes.

This change allows policies to check the btype value using the ``buildtype`` test.

**More granular admin permissions**

| PR: https://pagure.io/koji/pull-request/1454

A number of actions that were previously admin-only are now governed by
separate permissions:

        This permission governs most host management operations, such as
        adding, editing, enabling/disabling, and restarting.

        This permission governs adding, editing, and deleting tags.

        This permission governs adding, editing, and deleting targets.

Koji administrators may want to consider reducing the number of users with
full ``admin`` permission.

**Option to generate separate source repo**

| PR: https://pagure.io/koji/pull-request/1273

The (non-dist) yum repos that Koji generates for building normally don't
include srpms.
An old option allowed them to be included in some cases, but they were simply
added to each repo.
Newer options have been added that instruct Koji to include them as a separate
src repo.

In the cli, the ``regen-repo`` command now accepts a ``--separate-source``
option that triggers this behavior.

In ``kojira``, the ``separate_source_tags`` option is a list of tag patterns.
Build tags that match any of these patterns will have their repos generated
with a separate src repo.

**Add volume option for dist-repo**

| PR: https://pagure.io/koji/pull-request/1327

Dist repos can now be generated on volumes other than the main one.
Use the ``--volume`` option to the ``dist-repo`` command to do so.

Generally you want the repo to be on the same volume as the rpms it will
Dist repos hard link (same volume) or copy (different volume) their rpms into
Using the appropriate volume can drastically improve the efficiency, both in
generation time and space consumption.

**Minor gc optimizations**

| PR: https://pagure.io/koji/pull-request/1337
| PR: https://pagure.io/koji/pull-request/1442
| PR: https://pagure.io/koji/pull-request/1437

This change speeds up portions of garbage collection by making the
``build_references`` check lazy by default.

**Rollback errors in multiCall**

| PR: https://pagure.io/koji/pull-request/1358

If one of the calls in a multicall raises an error, then the transaction will
be rolled back to the start of that call before Koji proceeds to the next call.
This matches the behavior of normal calls more closely.

Multicalls are still handled within single database transaction.

**Support tilde in search**

| PR: https://pagure.io/koji/pull-request/1297

The tilde character is no longer prohibited in search terms.

**Remove 'keepalive' option**

| PR: https://pagure.io/koji/pull-request/1277

The ``keepalive`` setting is no longer used anywhere in koji.
It has been removed.