Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-kiwi for openSUSE:Factory 
checked in at 2021-12-01 20:46:25
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-kiwi (Old)
 and      /work/SRC/openSUSE:Factory/.python-kiwi.new.31177 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-kiwi"

Wed Dec  1 20:46:25 2021 rev:87 rq:934738 version:9.24.10

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-kiwi/python-kiwi.changes  2021-11-22 
23:04:19.425903904 +0100
+++ /work/SRC/openSUSE:Factory/.python-kiwi.new.31177/python-kiwi.changes       
2021-12-02 02:23:27.020985188 +0100
@@ -1,0 +2,90 @@
+Tue Nov 23 15:10:26 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Bump version: 9.24.9 ??? 9.24.10
+
+-------------------------------------------------------------------
+Tue Nov 23 10:43:10 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Added documentation about sharing backends
+
+  The kiwi boxbuild plugin supports several sharing
+  backends. Details about them and eventual pre-setup
+  steps prior use are mentioned in this document
+
+-------------------------------------------------------------------
+Tue Nov 23 10:11:07 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Fixed MicroOS build test
+
+  snapper default config has moved from /etc to /usr/share
+
+-------------------------------------------------------------------
+Mon Nov 22 22:27:44 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Bump version: 9.24.8 ??? 9.24.9
+
+-------------------------------------------------------------------
+Mon Nov 22 17:18:07 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Bump version: 9.24.7 ??? 9.24.8
+
+-------------------------------------------------------------------
+Mon Nov 22 17:15:47 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Added support for reading metalink in info module
+
+  For resolver operations through libsolv the 'kiwi image info'
+  module exists. So far it could not read the repos from
+  metalink repo definitions. This Fixes #1890
+
+-------------------------------------------------------------------
+Fri Nov 19 13:29:52 CET 2021 - David Cassany <dcass...@suse.com>
+
+- Force key attribute from signing element to be treated as a URI
+
+  Signed-off-by: David Cassany <dcass...@suse.com>
+
+-------------------------------------------------------------------
+Thu Nov 18 16:52:52 CET 2021 - David Cassany <dcass...@suse.com>
+
+- Pass signing keys from the XML to the repositories
+
+  This commits makes sure signing keys are passed to
+  repositories setup in build task.
+
+  Signed-off-by: David Cassany <dcass...@suse.com>
+
+-------------------------------------------------------------------
+Thu Nov 18 09:23:46 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Move static sle15 integration test to git
+
+-------------------------------------------------------------------
+Tue Nov 16 16:29:49 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Bump version: 9.24.6 ??? 9.24.7
+
+-------------------------------------------------------------------
+Mon Nov 15 16:40:37 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Fixed raid integration test using extra boot part
+
+  Due to changes in the distribution the tests needs some
+  adaptions. The kernel as provided now by TW uses symlinks
+  from boot to /usr/lib/modules/... to point to the kernel
+  binary. Of course this breaks for any system that uses
+  /boot on another partition. Those image tests which were
+  testing this aspect needs fixing.
+
+-------------------------------------------------------------------
+Mon Nov 15 14:25:23 CET 2021 - Dan ??erm??k <dcer...@suse.com>
+
+- Make sure fedora-release is installed on Rawhide
+
+  Follow up to #1957 and #1962:
+  The Fedora build tests were using the generic release package and not
+  fedora-release. This issue has been partially fixed in #1962, but we forgot 
to
+  port the fix to the rawhide images as well. This commit adds the missing 
package
+  to the Rawhide images as well.
+
+-------------------------------------------------------------------
@@ -17,0 +108,21 @@
+
+-------------------------------------------------------------------
+Fri Nov 12 16:57:17 CET 2021 - Marcus Sch??fer <marcus.schae...@gmail.com>
+
+- Allow to set sign keyfile in repository elements
+
+  This commit adds a new and optional child element <signing>
+  to the repository/source element as shown in the following
+  example:
+
+  <repository>
+  <source path="...">
+  <signing key="keyfile"/>
+  </source>
+  </repository>
+
+  The collection of all keyfiles from all repositories will be
+  added to the keyring as used by the selected package manager.
+  Signing keys specified on the commandline and signing keys
+  specified in the image description will be combined.
+  This Fixes #1883

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-kiwi.spec ++++++
--- /var/tmp/diff_new_pack.ruMqMT/_old  2021-12-02 02:23:27.516983458 +0100
+++ /var/tmp/diff_new_pack.ruMqMT/_new  2021-12-02 02:23:27.520983444 +0100
@@ -43,7 +43,7 @@
 %endif
 
 Name:           python-kiwi
-Version:        9.24.6
+Version:        9.24.10
 Provides:       kiwi-schema = 7.4
 Release:        0
 Url:            https://github.com/OSInside/kiwi

++++++ PKGBUILD ++++++
--- /var/tmp/diff_new_pack.ruMqMT/_old  2021-12-02 02:23:27.544983360 +0100
+++ /var/tmp/diff_new_pack.ruMqMT/_new  2021-12-02 02:23:27.548983346 +0100
@@ -3,7 +3,7 @@
 
 pkgname=('python-kiwi' 'kiwi-man-pages' 'dracut-kiwi-lib' 
'dracut-kiwi-oem-repart' 'dracut-kiwi-oem-dump' 'dracut-kiwi-live' 
'dracut-kiwi-overlay')
 arch=(x86_64)
-pkgver=9.24.6
+pkgver=9.24.10
 pkgrel=0
 pkgdesc="KIWI - Appliance Builder Next Generation"
 url="https://github.com/SUSE/kiwi/tarball/master";
@@ -12,7 +12,7 @@
 provides=(kiwi-ng kiwi)
 source=("${pkgname}.tar.gz")
 changelog="${pkgname}.changes"
-md5sums=('74cbc9283eb117626209c7f212f957a3')
+md5sums=('166597cfdcba49bf6089b425c1cc5a12')
 
 
 build() {

++++++ python-kiwi.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/.bumpversion.cfg 
new/kiwi-9.24.10/.bumpversion.cfg
--- old/kiwi-9.24.6/.bumpversion.cfg    2021-11-12 23:11:19.000000000 +0100
+++ new/kiwi-9.24.10/.bumpversion.cfg   2021-11-23 15:10:26.000000000 +0100
@@ -1,5 +1,5 @@
 [bumpversion]
-current_version = 9.24.6
+current_version = 9.24.10
 commit = True
 tag = True
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/PKG-INFO new/kiwi-9.24.10/PKG-INFO
--- old/kiwi-9.24.6/PKG-INFO    2021-11-12 23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/PKG-INFO   2021-11-23 15:12:44.000000000 +0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: kiwi
-Version: 9.24.6
+Version: 9.24.10
 Summary: KIWI - Appliance Builder (next generation)
 Home-page: https://osinside.github.io/kiwi
 Author: Marcus Schaefer
Binary files old/kiwi-9.24.6/doc/build/latex/kiwi.pdf and 
new/kiwi-9.24.10/doc/build/latex/kiwi.pdf differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi.8 
new/kiwi-9.24.10/doc/build/man/kiwi.8
--- old/kiwi-9.24.6/doc/build/man/kiwi.8        2021-11-12 23:12:47.000000000 
+0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi.8       2021-11-23 15:12:43.000000000 
+0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi \- Creating Operating System Images
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::image::info.8 
new/kiwi-9.24.10/doc/build/man/kiwi::image::info.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::image::info.8   2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::image::info.8  2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::IMAGE::INFO" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::IMAGE::INFO" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::image::info \- Provide detailed information about an image description
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::image::resize.8 
new/kiwi-9.24.10/doc/build/man/kiwi::image::resize.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::image::resize.8 2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::image::resize.8        2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::IMAGE::RESIZE" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::IMAGE::RESIZE" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::image::resize \- Resize disk images to new geometry
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::result::bundle.8 
new/kiwi-9.24.10/doc/build/man/kiwi::result::bundle.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::result::bundle.8        2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::result::bundle.8       2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::RESULT::BUNDLE" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::RESULT::BUNDLE" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::result::bundle \- Bundle build results
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::result::list.8 
new/kiwi-9.24.10/doc/build/man/kiwi::result::list.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::result::list.8  2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::result::list.8 2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::RESULT::LIST" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::RESULT::LIST" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::result::list \- List build results
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::system::build.8 
new/kiwi-9.24.10/doc/build/man/kiwi::system::build.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::system::build.8 2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::system::build.8        2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::SYSTEM::BUILD" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::SYSTEM::BUILD" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::system::build \- Build image in combined prepare and create step
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::system::create.8 
new/kiwi-9.24.10/doc/build/man/kiwi::system::create.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::system::create.8        2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::system::create.8       2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::SYSTEM::CREATE" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::SYSTEM::CREATE" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::system::create \- Create image from prepared root system
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::system::prepare.8 
new/kiwi-9.24.10/doc/build/man/kiwi::system::prepare.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::system::prepare.8       2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::system::prepare.8      2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::SYSTEM::PREPARE" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::SYSTEM::PREPARE" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::system::prepare \- Prepare image root system
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/build/man/kiwi::system::update.8 
new/kiwi-9.24.10/doc/build/man/kiwi::system::update.8
--- old/kiwi-9.24.6/doc/build/man/kiwi::system::update.8        2021-11-12 
23:12:47.000000000 +0100
+++ new/kiwi-9.24.10/doc/build/man/kiwi::system::update.8       2021-11-23 
15:12:43.000000000 +0100
@@ -27,7 +27,7 @@
 .\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
 .in \\n[rst2man-indent\\n[rst2man-indent-level]]u
 ..
-.TH "KIWI::SYSTEM::UPDATE" "8" "Nov 12, 2021" "9.24.6" "KIWI NG"
+.TH "KIWI::SYSTEM::UPDATE" "8" "Nov 23, 2021" "9.24.10" "KIWI NG"
 .SH NAME
 kiwi::system::update \- Update/Upgrade image root system
 .SH SYNOPSIS
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/source/conf.py 
new/kiwi-9.24.10/doc/source/conf.py
--- old/kiwi-9.24.6/doc/source/conf.py  2021-11-12 23:11:19.000000000 +0100
+++ new/kiwi-9.24.10/doc/source/conf.py 2021-11-23 15:10:26.000000000 +0100
@@ -140,7 +140,7 @@
 # built documents.
 #
 # The short X.Y version.
-version = '9.24.6'
+version = '9.24.10'
 # The full version, including alpha/beta/rc tags.
 release = version
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kiwi-9.24.6/doc/source/image_description/elements.rst 
new/kiwi-9.24.10/doc/source/image_description/elements.rst
--- old/kiwi-9.24.6/doc/source/image_description/elements.rst   2021-11-12 
22:23:40.000000000 +0100
+++ new/kiwi-9.24.10/doc/source/image_description/elements.rst  2021-11-16 
16:29:43.000000000 +0100
@@ -793,7 +793,9 @@
   to run repository signature validation. If not set, no value is
   appended into the repository configuration file. If set the
   relevant key information needs to be provided on the {kiwi}
-  commandline using the `--signing-key` option
+  commandline using the `--signing-key` option or via the `<signing>`
+  element as part of the `<repository><source>` setting in the
+  image description.
 
 customize="/path/to/custom_script"
   Custom script hook which is invoked with the repo file as parameter
@@ -917,6 +919,23 @@
   A placeholder for the Open Build Service (OBS) to indicate that all
   repositories are taken from the project configuration in OBS.
 
+A repository `<source>` element can optionally contain one ore more
+signing keys for the packages from this repository like shown in the
+following example:
+
+.. code:: xml
+
+   <repository alias="kiwi">
+     <source path="{exc_kiwi_repo}">
+       <signing key="/path/to/sign_key_a"/>
+       <signing key="/path/to/sign_key_b"/>
+     </source>
+   </repository>
+
+All signing keys from all repositories will be collected and
+incorporated into the keyring as used by the selected package
+manager.
+
 .. _sec.packages:
 
 <packages>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/doc/source/plugins/self_contained.rst 
new/kiwi-9.24.10/doc/source/plugins/self_contained.rst
--- old/kiwi-9.24.6/doc/source/plugins/self_contained.rst       2021-10-15 
10:02:03.000000000 +0200
+++ new/kiwi-9.24.10/doc/source/plugins/self_contained.rst      2021-11-23 
15:10:22.000000000 +0100
@@ -77,5 +77,55 @@
 .. note::
 
    The provided `--description` and `--target-dir` options are
-   setup as shared folders between the host and the guest. No other
+   setup as shared folders between the host and the box. No other
    data will be shared with the host.
+
+Sharing Backends
+----------------
+
+As mentioned above, the `boxbuild` call shares the two host directories
+provided in `--description` and `--target-dir` with the box. To do this
+the following sharing backends are supported:
+
+``--9p-sharing``
+  With QEMU's `9pfs` you can create virtual filesystem devices
+  (virtio-9p-device) and expose them to the box. For more information
+  see `9pfs <https://wiki.qemu.org/Documentation/9psetup>`__. Using
+  this sharing backend does not require any setup procedure from the
+  user and is also the default for `boxbuild`
+   
+``--sshfs-sharing``
+  SSHFS is a FUSE-based filesystem client for mounting remote
+  directories over a Secure Shell connection (SSH). In `boxbuild`
+  this is used to mount directories from the host into the box.
+  Because this runs through an SSH connection the host must allow
+  connections from the box. If you plan to use `sshfs` add the
+  following SSH public key to the :file:`~/.ssh/authorized_keys`
+  file of the user which is expected to call `boxbuild`
+
+  .. code:: bash
+
+     echo "ssh-rsa 
AAAAB3NzaC1yc2EAAAADAQABAAABgQCtiqDaYgEMkr7za7qc4iPXftgu/j3sodPOtpoG8PinwRX6/3xZteOJzCH2qCZjEgA5zsP9lxy/119cWXvdxFUvyEINjH77unzRnaHj/yTXPhHuhHgAiEubuHer2gZoOs+UH4cGJLKCrabjTjZdeK9KvL+hoAgJaWxDUvGsXYDQTBHXlKjniOL1MGbltDBHnYhu4k+PjjJ+UEBN+8+F74Y5fYgIovXXY88WQrybuEr1eAYjhvk/ln6TKw1P6uvVMuIbAGUgnZFntDCI91Qw8ps1j+lX3vNc8ZBoOwM6nHZqq4FAqbXuH+NvQFS/xDM6wwZQhAe+14dTQBA5F1mgCVf+fSbteb0/CraSGmgKIM8aPnK8rfF+BY6Jar3AJFKVRPshRzrQj6CWYu3BfmOLupCpqOK2XFyoU2lEpaZDejgPSJq/IBGZdjKplWJFF8ZRQ01a8eX8K2fjrQt/4k9c7Pjlg1aDH8Sf+5+vcehlSNs1d50wnFoaIPrgDdy04omiaJ8=
 kiwi@boxbuild" >> ~/.ssh/authorized_keys
+
+  The public key mentioned here is associated with an SSH key pair
+  we provide in the pre-built box images.
+
+  .. warning::
+
+     If the `sshfs` backend is used without the host trusting the box,
+     the `boxbuild` call will become interactive at the time of the sshfs
+     mount. In this case the user might be asked for a passphrase or
+     depending on the host `sshd` setup the request will be declined and
+     the boxbuild fails.
+
+``--virtiofs-sharing``
+  QEMU virtio-fs shared file system daemon. Share a host directory tree
+  with a box through a virtio-fs device. For more information
+  see `virtiofs 
<https://qemu.readthedocs.io/en/latest/tools/virtiofsd.html>`__.
+  Using this sharing backend does not require any setup procedure from the
+  user  
+
+  .. warning::
+
+     virtiofs support was added but considered experimental and
+     not yet stable across the distributions. Feedback welcome.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/schema/kiwi.rnc 
new/kiwi-9.24.10/kiwi/schema/kiwi.rnc
--- old/kiwi-9.24.6/kiwi/schema/kiwi.rnc        2021-11-03 20:37:14.000000000 
+0100
+++ new/kiwi-9.24.10/kiwi/schema/kiwi.rnc       2021-11-22 17:18:04.000000000 
+0100
@@ -38,6 +38,7 @@
 grub_console = xsd:token {pattern = "(console|gfxterm|serial)( 
(console|gfxterm|serial))*"}
 fs_attributes = xsd:token {pattern = 
"(no-copy-on-write|synchronous-updates)(,(no-copy-on-write|synchronous-updates))*"}
 package-version-type =  xsd:token {pattern = 
"(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){3}"}
+simple-uri-type = xsd:token {pattern = "(file:|https:|http:|ftp:).*"}
 
 #==========================================
 # start with image description
@@ -1027,6 +1028,24 @@
 }
 
 #==========================================
+# common element <signing>
+#
+div {
+    k.signing.key.attribute =
+        ## Specify path to a signing key for this repo
+        attribute key { simple-uri-type }
+    k.signing.attlist =
+        k.signing.key.attribute
+    k.signing =
+        ## The signing element holds information about
+        ## repo/package signing keys
+        element signing {
+            k.signing.attlist,
+            empty
+        }
+}
+
+#==========================================
 # common element <source>
 #
 div {
@@ -1037,7 +1056,7 @@
         ## as well as a path specification
         element source {
             k.source.attlist,
-            empty
+            k.signing*
         }
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/schema/kiwi.rng 
new/kiwi-9.24.10/kiwi/schema/kiwi.rng
--- old/kiwi-9.24.6/kiwi/schema/kiwi.rng        2021-11-03 20:37:14.000000000 
+0100
+++ new/kiwi-9.24.10/kiwi/schema/kiwi.rng       2021-11-22 17:18:04.000000000 
+0100
@@ -91,6 +91,11 @@
       <param 
name="pattern">(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])(\.(0|[1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])){3}</param>
     </data>
   </define>
+  <define name="simple-uri-type">
+    <data type="token">
+      <param name="pattern">(file:|https:|http:|ftp:).*</param>
+    </data>
+  </define>
   <!--
     ==========================================
     start with image description
@@ -1573,6 +1578,30 @@
   </div>
   <!--
     ==========================================
+    common element <signing>
+    
+  -->
+  <div>
+    <define name="k.signing.key.attribute">
+      <attribute name="key">
+        <a:documentation>Specify path to a signing key for this 
repo</a:documentation>
+        <ref name="simple-uri-type"/>
+      </attribute>
+    </define>
+    <define name="k.signing.attlist">
+      <ref name="k.signing.key.attribute"/>
+    </define>
+    <define name="k.signing">
+      <element name="signing">
+        <a:documentation>The signing element holds information about
+repo/package signing keys</a:documentation>
+        <ref name="k.signing.attlist"/>
+        <empty/>
+      </element>
+    </define>
+  </div>
+  <!--
+    ==========================================
     common element <source>
     
   -->
@@ -1588,7 +1617,9 @@
         <a:documentation>A Pointer to a data source. This can be a remote 
location
 as well as a path specification</a:documentation>
         <ref name="k.source.attlist"/>
-        <empty/>
+        <zeroOrMore>
+          <ref name="k.signing"/>
+        </zeroOrMore>
       </element>
     </define>
   </div>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/system/uri.py 
new/kiwi-9.24.10/kiwi/system/uri.py
--- old/kiwi-9.24.6/kiwi/system/uri.py  2021-07-14 18:09:36.000000000 +0200
+++ new/kiwi-9.24.10/kiwi/system/uri.py 2021-11-23 09:57:42.000000000 +0100
@@ -17,9 +17,15 @@
 #
 import os
 import logging
-from urllib.parse import urlparse
+from lxml import etree
+from urllib.parse import (
+    urlparse, ParseResult
+)
+from urllib.request import urlopen
+from urllib.request import Request
 import requests
 import hashlib
+from typing import Optional
 
 # project
 from kiwi.defaults import Defaults
@@ -36,20 +42,30 @@
 
 class Uri:
     """
-    **Normalize url types**
-
-    Allow to translate the available KIWI repo source types
-    into standard mime types
-
-    :param str uri: URI, remote or local repository location
-    :param str repo_type:
-        repository type name, defaults to 'rpm-md' and is only
-        effectively used when building inside of the open
-        build service which maps local repositories to a
-        specific environment
+    **Normalize and manage URI types**
     """
-    def __init__(self, uri: str, repo_type: str = 'rpm-md'):
+    def __init__(
+        self, uri: str, repo_type: str = 'rpm-md', source_type: str = ''
+    ):
+        """
+        Manage kiwi source URIs and allow transformation into
+        standard URLs
+
+        :param str uri: URI, remote, local or metalink repository location
+        :param str repo_type:
+            repository type name, defaults to 'rpm-md' and is only
+            effectively used when building inside of the open
+            build service which maps local repositories to a
+            specific environment
+        :param str source_type:
+            specify source type if the provided URI is a service.
+            Currently only the metalink source type is handled
+        """
         self.runtime_config = RuntimeConfig()
+
+        if source_type == 'metalink':
+            uri = self._resolve_metalink_uri(uri)
+
         self.repo_type = repo_type
         self.uri = uri if not uri.startswith(os.sep) else ''.join(
             [Defaults.get_default_uri_type(), uri]
@@ -147,7 +163,7 @@
         query = {'credentials': 'kiwiRepoCredentials'}
 
         if uri:
-            query = dict(params.split('=') for params in uri.query.split('&'))
+            query = dict(params.split('=') for params in uri.query.split('&')) 
 # type: ignore
 
         return query['credentials']
 
@@ -223,15 +239,17 @@
         uri = urlparse(self.uri)
         return uri.fragment
 
-    def _get_credentials_uri(self):
+    def _get_credentials_uri(self) -> Optional[ParseResult]:
         uri = urlparse(self.uri)
+        credentials_uri = None
         if uri.query and uri.query.startswith('credentials='):
-            return uri
+            credentials_uri = uri
+        return credentials_uri
 
-    def _local_path(self, path):
+    def _local_path(self, path: str) -> str:
         return os.path.abspath(os.path.normpath(path))
 
-    def _obs_project_download_link(self, name):
+    def _obs_project_download_link(self, name: str) -> str:
         name_parts = name.split(os.sep)
         repository = name_parts.pop()
         project = os.sep.join(name_parts)
@@ -258,7 +276,9 @@
                 f'{download_link}: {issue}'
             )
 
-    def _buildservice_path(self, name, urischeme, fragment=None):
+    def _buildservice_path(
+        self, name: str, urischeme: str, fragment: str = ''
+    ) -> str:
         """
         Special to openSUSE buildservice. If the buildservice builds
         the image it arranges the repos for each build in a special
@@ -281,3 +301,34 @@
                 [bs_source_dir, 'repos', name]
             )
         return self._local_path(local_path)
+
+    def _resolve_metalink_uri(self, uri: str) -> str:
+        selected_repo_source = uri
+        namespace_map = dict(
+            metalink="http://www.metalinker.org/";
+        )
+        expression = '//metalink:file[@name="repomd.xml"]/metalink:resources/*'
+        try:
+            metalink_location = urlopen(Request(uri))
+            xml = etree.parse(metalink_location)
+            url_list = xml.getroot().xpath(
+                expression, namespaces=namespace_map
+            )
+            source_dict = {}
+            for url in url_list:
+                if url.get('protocol') == 'https':
+                    source_dict[url.text] = int(url.get('preference'))
+            start_preference = 0
+            for url in sorted(source_dict.keys()):
+                preference = source_dict[url]
+                if preference > start_preference:
+                    selected_repo_source = url
+                    start_preference = preference
+        except Exception as issue:
+            raise KiwiUriOpenError(
+                f'Failed to resolve metalink URI: {issue}'
+            )
+        selected_repo_source = selected_repo_source.replace(
+            'repodata/repomd.xml', ''
+        )
+        return selected_repo_source
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/tasks/image_info.py 
new/kiwi-9.24.10/kiwi/tasks/image_info.py
--- old/kiwi-9.24.6/kiwi/tasks/image_info.py    2021-07-14 18:09:36.000000000 
+0200
+++ new/kiwi-9.24.10/kiwi/tasks/image_info.py   2021-11-23 09:57:42.000000000 
+0100
@@ -146,6 +146,7 @@
         solver = Sat()
         for xml_repo in 
self.xml_state.get_repository_sections_used_for_build():
             repo_source = xml_repo.get_source().get_path()
+            repo_sourcetype = xml_repo.get_sourcetype() or ''
             repo_user = xml_repo.get_username()
             repo_secret = xml_repo.get_password()
             repo_type = xml_repo.get_type()
@@ -153,7 +154,8 @@
             repo_components = xml_repo.get_components()
             if not repo_type:
                 repo_type = SolverRepositoryBase(
-                    Uri(repo_source), repo_user, repo_secret
+                    Uri(uri=repo_source, source_type=repo_sourcetype),
+                    repo_user, repo_secret
                 ).get_repo_type()
             if repo_type == 'apt-deb':
                 # Debian based repos can be setup for a specific
@@ -173,14 +175,18 @@
                         )
                         solver.add_repository(
                             SolverRepository.new(
-                                Uri(repo_source_for_component, repo_type),
+                                Uri(
+                                    repo_source_for_component,
+                                    repo_type, repo_sourcetype
+                                ),
                                 repo_user, repo_secret
                             )
                         )
                     continue
             solver.add_repository(
                 SolverRepository.new(
-                    Uri(repo_source, repo_type), repo_user, repo_secret
+                    Uri(repo_source, repo_type, repo_sourcetype),
+                    repo_user, repo_secret
                 )
             )
         return solver
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/tasks/system_build.py 
new/kiwi-9.24.10/kiwi/tasks/system_build.py
--- old/kiwi-9.24.6/kiwi/tasks/system_build.py  2021-07-14 18:09:36.000000000 
+0200
+++ new/kiwi-9.24.10/kiwi/tasks/system_build.py 2021-11-22 17:18:04.000000000 
+0100
@@ -196,7 +196,9 @@
         )
         manager = system.setup_repositories(
             self.command_args['--clear-cache'],
-            self.command_args['--signing-key'],
+            self.command_args[
+                '--signing-key'
+            ] + self.xml_state.get_repositories_signing_keys(),
             self.global_args['--target-arch']
         )
         system.install_bootstrap(
@@ -281,7 +283,9 @@
             abs_target_dir_path,
             image_root,
             custom_args={
-                'signing_keys': self.command_args['--signing-key'],
+                'signing_keys': self.command_args[
+                    '--signing-key'
+                ] + self.xml_state.get_repositories_signing_keys(),
                 'xz_options': self.runtime_config.get_xz_options()
             }
         )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/tasks/system_prepare.py 
new/kiwi-9.24.10/kiwi/tasks/system_prepare.py
--- old/kiwi-9.24.6/kiwi/tasks/system_prepare.py        2021-11-12 
23:11:06.000000000 +0100
+++ new/kiwi-9.24.10/kiwi/tasks/system_prepare.py       2021-11-16 
16:29:43.000000000 +0100
@@ -181,7 +181,9 @@
         )
         manager = system.setup_repositories(
             self.command_args['--clear-cache'],
-            self.command_args['--signing-key'],
+            self.command_args[
+                '--signing-key'
+            ] + self.xml_state.get_repositories_signing_keys(),
             self.global_args['--target-arch']
         )
         run_bootstrap = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/version.py 
new/kiwi-9.24.10/kiwi/version.py
--- old/kiwi-9.24.6/kiwi/version.py     2021-11-12 23:11:19.000000000 +0100
+++ new/kiwi-9.24.10/kiwi/version.py    2021-11-23 15:10:26.000000000 +0100
@@ -18,5 +18,5 @@
 """
 Global version information used in kiwi and the package
 """
-__version__ = '9.24.6'
-__githash__ = '7935bdc2ed71661069459dff1097e14a9ce9812e'
+__version__ = '9.24.10'
+__githash__ = '6c258d7e708572f6456b26d1dd50eb10fd856879'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/xml_parse.py 
new/kiwi-9.24.10/kiwi/xml_parse.py
--- old/kiwi-9.24.6/kiwi/xml_parse.py   2021-11-03 20:37:14.000000000 +0100
+++ new/kiwi-9.24.10/kiwi/xml_parse.py  2021-11-22 17:18:04.000000000 +0100
@@ -16,7 +16,7 @@
 #   kiwi/schema/kiwi_for_generateDS.xsd
 #
 # Command line:
-#   /home/ms/Project/kiwi/.tox/3.6/bin/generateDS.py -f 
--external-encoding="utf-8" --no-dates --no-warnings -o "kiwi/xml_parse.py" 
kiwi/schema/kiwi_for_generateDS.xsd
+#   /home/david/work/kiwi/.tox/3/bin/generateDS.py -f 
--external-encoding="utf-8" --no-dates --no-warnings -o "kiwi/xml_parse.py" 
kiwi/schema/kiwi_for_generateDS.xsd
 #
 # Current working directory (os.getcwd()):
 #   kiwi
@@ -2208,14 +2208,98 @@
 # end class repository
 
 
+class signing(GeneratedsSuper):
+    """The signing element holds information about repo/package signing
+    keys"""
+    subclass = None
+    superclass = None
+    def __init__(self, key=None):
+        self.original_tagname_ = None
+        self.key = _cast(None, key)
+    def factory(*args_, **kwargs_):
+        if CurrentSubclassModule_ is not None:
+            subclass = getSubclassFromModule_(
+                CurrentSubclassModule_, signing)
+            if subclass is not None:
+                return subclass(*args_, **kwargs_)
+        if signing.subclass:
+            return signing.subclass(*args_, **kwargs_)
+        else:
+            return signing(*args_, **kwargs_)
+    factory = staticmethod(factory)
+    def get_key(self): return self.key
+    def set_key(self, key): self.key = key
+    def validate_simple_uri_type(self, value):
+        # Validate type simple-uri-type, a restriction on xs:token.
+        if value is not None and Validate_simpletypes_:
+            if not self.gds_validate_simple_patterns(
+                    self.validate_simple_uri_type_patterns_, value):
+                warnings_.warn('Value "%s" does not match xsd pattern 
restrictions: %s' % (value.encode('utf-8'), 
self.validate_simple_uri_type_patterns_, ))
+    validate_simple_uri_type_patterns_ = [['^(file:|https:|http:|ftp:).*$']]
+    def hasContent_(self):
+        if (
+
+        ):
+            return True
+        else:
+            return False
+    def export(self, outfile, level, namespaceprefix_='', name_='signing', 
namespacedef_='', pretty_print=True):
+        imported_ns_def_ = GenerateDSNamespaceDefs_.get('signing')
+        if imported_ns_def_ is not None:
+            namespacedef_ = imported_ns_def_
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        if self.original_tagname_ is not None:
+            name_ = self.original_tagname_
+        showIndent(outfile, level, pretty_print)
+        outfile.write('<%s%s%s' % (namespaceprefix_, name_, namespacedef_ and 
' ' + namespacedef_ or '', ))
+        already_processed = set()
+        self.exportAttributes(outfile, level, already_processed, 
namespaceprefix_, name_='signing')
+        if self.hasContent_():
+            outfile.write('>%s' % (eol_, ))
+            self.exportChildren(outfile, level + 1, namespaceprefix_='', 
name_='signing', pretty_print=pretty_print)
+            outfile.write('</%s%s>%s' % (namespaceprefix_, name_, eol_))
+        else:
+            outfile.write('/>%s' % (eol_, ))
+    def exportAttributes(self, outfile, level, already_processed, 
namespaceprefix_='', name_='signing'):
+        if self.key is not None and 'key' not in already_processed:
+            already_processed.add('key')
+            outfile.write(' key=%s' % (quote_attrib(self.key), ))
+    def exportChildren(self, outfile, level, namespaceprefix_='', 
name_='signing', fromsubclass_=False, pretty_print=True):
+        pass
+    def build(self, node):
+        already_processed = set()
+        self.buildAttributes(node, node.attrib, already_processed)
+        for child in node:
+            nodeName_ = Tag_pattern_.match(child.tag).groups()[-1]
+            self.buildChildren(child, node, nodeName_)
+        return self
+    def buildAttributes(self, node, attrs, already_processed):
+        value = find_attr_value_('key', node)
+        if value is not None and 'key' not in already_processed:
+            already_processed.add('key')
+            self.key = value
+            self.key = ' '.join(self.key.split())
+            self.validate_simple_uri_type(self.key)    # validate type 
simple-uri-type
+    def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
+        pass
+# end class signing
+
+
 class source(GeneratedsSuper):
     """A Pointer to a data source. This can be a remote location as well as
     a path specification"""
     subclass = None
     superclass = None
-    def __init__(self, path=None):
+    def __init__(self, path=None, signing=None):
         self.original_tagname_ = None
         self.path = _cast(None, path)
+        if signing is None:
+            self.signing = []
+        else:
+            self.signing = signing
     def factory(*args_, **kwargs_):
         if CurrentSubclassModule_ is not None:
             subclass = getSubclassFromModule_(
@@ -2227,11 +2311,16 @@
         else:
             return source(*args_, **kwargs_)
     factory = staticmethod(factory)
+    def get_signing(self): return self.signing
+    def set_signing(self, signing): self.signing = signing
+    def add_signing(self, value): self.signing.append(value)
+    def insert_signing_at(self, index, value): self.signing.insert(index, 
value)
+    def replace_signing_at(self, index, value): self.signing[index] = value
     def get_path(self): return self.path
     def set_path(self, path): self.path = path
     def hasContent_(self):
         if (
-
+            self.signing
         ):
             return True
         else:
@@ -2253,6 +2342,7 @@
         if self.hasContent_():
             outfile.write('>%s' % (eol_, ))
             self.exportChildren(outfile, level + 1, namespaceprefix_='', 
name_='source', pretty_print=pretty_print)
+            showIndent(outfile, level, pretty_print)
             outfile.write('</%s%s>%s' % (namespaceprefix_, name_, eol_))
         else:
             outfile.write('/>%s' % (eol_, ))
@@ -2261,7 +2351,12 @@
             already_processed.add('path')
             outfile.write(' path=%s' % 
(self.gds_encode(self.gds_format_string(quote_attrib(self.path), 
input_name='path')), ))
     def exportChildren(self, outfile, level, namespaceprefix_='', 
name_='source', fromsubclass_=False, pretty_print=True):
-        pass
+        if pretty_print:
+            eol_ = '\n'
+        else:
+            eol_ = ''
+        for signing_ in self.signing:
+            signing_.export(outfile, level, namespaceprefix_, name_='signing', 
pretty_print=pretty_print)
     def build(self, node):
         already_processed = set()
         self.buildAttributes(node, node.attrib, already_processed)
@@ -2275,7 +2370,11 @@
             already_processed.add('path')
             self.path = value
     def buildChildren(self, child_, node, nodeName_, fromsubclass_=False):
-        pass
+        if nodeName_ == 'signing':
+            obj_ = signing.factory()
+            obj_.build(child_)
+            self.signing.append(obj_)
+            obj_.original_tagname_ = 'signing'
 # end class source
 
 
@@ -8266,6 +8365,7 @@
     "profiles",
     "repository",
     "requires",
+    "signing",
     "size",
     "source",
     "strip",
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi/xml_state.py 
new/kiwi-9.24.10/kiwi/xml_state.py
--- old/kiwi-9.24.6/kiwi/xml_state.py   2021-11-03 20:37:14.000000000 +0100
+++ new/kiwi-9.24.10/kiwi/xml_state.py  2021-11-22 17:18:04.000000000 +0100
@@ -1721,6 +1721,16 @@
             ]
         )
 
+    def get_repositories_signing_keys(self) -> List[str]:
+        """
+        Get list of signing keys specified on the repositories
+        """
+        key_file_list: List[str] = []
+        for repository in self.get_repository_sections() or []:
+            for signing in repository.get_source().get_signing() or []:
+                key_file_list.append(Uri(signing.get_key()).translate())
+        return key_file_list
+
     def set_repository(
         self, repo_source: str, repo_type: str, repo_alias: str,
         repo_prio: str, repo_imageinclude: bool = False,
@@ -1755,7 +1765,8 @@
     def add_repository(
         self, repo_source: str, repo_type: str, repo_alias: str = None,
         repo_prio: str = '', repo_imageinclude: bool = False,
-        repo_package_gpgcheck: Optional[bool] = None
+        repo_package_gpgcheck: Optional[bool] = None,
+        repo_signing_keys: List[str] = []
     ) -> None:
         """
         Add a new repository section at the end of the list
@@ -1778,7 +1789,12 @@
                 type_=repo_type,
                 alias=repo_alias,
                 priority=priority_number,
-                source=xml_parse.source(path=repo_source),
+                source=xml_parse.source(
+                    path=repo_source,
+                    signing=[
+                        xml_parse.signing(key=k) for k in repo_signing_keys
+                    ]
+                ),
                 imageinclude=repo_imageinclude,
                 package_gpgcheck=repo_package_gpgcheck
             )
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi.egg-info/PKG-INFO 
new/kiwi-9.24.10/kiwi.egg-info/PKG-INFO
--- old/kiwi-9.24.6/kiwi.egg-info/PKG-INFO      2021-11-12 23:12:47.000000000 
+0100
+++ new/kiwi-9.24.10/kiwi.egg-info/PKG-INFO     2021-11-23 15:12:44.000000000 
+0100
@@ -1,6 +1,6 @@
 Metadata-Version: 2.1
 Name: kiwi
-Version: 9.24.6
+Version: 9.24.10
 Summary: KIWI - Appliance Builder (next generation)
 Home-page: https://osinside.github.io/kiwi
 Author: Marcus Schaefer
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/kiwi.egg-info/SOURCES.txt 
new/kiwi-9.24.10/kiwi.egg-info/SOURCES.txt
--- old/kiwi-9.24.6/kiwi.egg-info/SOURCES.txt   2021-11-12 23:12:47.000000000 
+0100
+++ new/kiwi-9.24.10/kiwi.egg-info/SOURCES.txt  2021-11-23 15:12:44.000000000 
+0100
@@ -436,6 +436,7 @@
 test/data/info.xml
 test/data/iso_listing.txt
 test/data/key_value
+test/data/metalink
 test/data/my_plugin.rnc
 test/data/my_plugin.rng
 test/data/nested_include.xml
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/data/description/config.xml 
new/kiwi-9.24.10/test/data/description/config.xml
--- old/kiwi-9.24.6/test/data/description/config.xml    2021-09-02 
16:55:04.000000000 +0200
+++ new/kiwi-9.24.10/test/data/description/config.xml   2021-11-22 
17:18:04.000000000 +0100
@@ -167,13 +167,17 @@
         <user groups="kiwi,admin,users" pwdformat="plain" password="mypwd" 
name="kiwi"/>
     </users>
     <repository priority="42" sourcetype="baseurl">
-        <source path="iso:///image/CDs/dvd.iso"/>
+        <source path="iso:///image/CDs/dvd.iso">
+            <signing key="file:key_a"/>
+        </source>
     </repository>
     <repository type="rpm-md" imageinclude="true" customize="script">
         <source path="obs://Devel:PubCloud:AmazonEC2/SLE_12_GA"/>
     </repository>
     <repository type="rpm-md" imageonly="true">
-        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker"/>
+        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker">
+            <signing key="file:key_b"/>
+        </source>
     </repository>
     <packages type="image" patternType="plusRecommended">
         <namedCollection name="base"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kiwi-9.24.6/test/data/description.buildservice/appliance.kiwi 
new/kiwi-9.24.10/test/data/description.buildservice/appliance.kiwi
--- old/kiwi-9.24.6/test/data/description.buildservice/appliance.kiwi   
2021-09-02 16:55:04.000000000 +0200
+++ new/kiwi-9.24.10/test/data/description.buildservice/appliance.kiwi  
2021-11-22 17:18:04.000000000 +0100
@@ -167,13 +167,17 @@
         <user groups="kiwi,admin,users" pwdformat="plain" password="mypwd" 
name="kiwi"/>
     </users>
     <repository priority="42" sourcetype="baseurl">
-        <source path="iso:///image/CDs/dvd.iso"/>
+        <source path="iso:///image/CDs/dvd.iso">
+            <signing key="file:key_a"/>
+        </source>
     </repository>
     <repository type="rpm-md" imageinclude="true" customize="script">
         <source path="obs://Devel:PubCloud:AmazonEC2/SLE_12_GA"/>
     </repository>
     <repository type="rpm-md" imageonly="true">
-        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker"/>
+        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker">
+            <signing key="file:key_b"/>
+        </source>
     </repository>
     <packages type="image" patternType="plusRecommended">
         <namedCollection name="base"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/data/example_config.xml 
new/kiwi-9.24.10/test/data/example_config.xml
--- old/kiwi-9.24.6/test/data/example_config.xml        2021-09-02 
16:55:04.000000000 +0200
+++ new/kiwi-9.24.10/test/data/example_config.xml       2021-11-22 
17:18:04.000000000 +0100
@@ -167,13 +167,17 @@
         <user groups="kiwi,admin,users" pwdformat="plain" password="mypwd" 
name="kiwi"/>
     </users>
     <repository priority="42" sourcetype="baseurl">
-        <source path="iso:///image/CDs/dvd.iso"/>
+        <source path="iso:///image/CDs/dvd.iso">
+            <signing key="file:key_a"/>
+        </source>
     </repository>
     <repository type="rpm-md" imageinclude="true" customize="script">
         <source path="obs://Devel:PubCloud:AmazonEC2/SLE_12_GA"/>
     </repository>
     <repository type="rpm-md" imageonly="true">
-        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker"/>
+        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker">
+            <signing key="file:key_b"/>
+        </source>
     </repository>
     <packages type="image" patternType="plusRecommended">
         <namedCollection name="base"/>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/data/metalink 
new/kiwi-9.24.10/test/data/metalink
--- old/kiwi-9.24.6/test/data/metalink  1970-01-01 01:00:00.000000000 +0100
+++ new/kiwi-9.24.10/test/data/metalink 2021-11-23 09:57:42.000000000 +0100
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="utf-8"?>
+<metalink version="3.0" xmlns="http://www.metalinker.org/"; type="dynamic" 
pubdate="Mon, 22 Nov 2021 11:33:26 GMT" generator="mirrormanager" 
xmlns:mm0="http://fedorahosted.org/mirrormanager";>
+ <files>
+  <file name="repomd.xml">
+   <mm0:timestamp>1619174877</mm0:timestamp>
+   <size>6285</size>
+   <verification>
+    <hash type="md5">6d3f3d3b3489e7c3e63203a4accfec52</hash>
+    <hash type="sha1">8865764f043de7527533f07c530205d2f68ae4d4</hash>
+    <hash 
type="sha256">4e48e3e6131dd6956141407656318bde5ff226fa07164a015968133feaa154df</hash>
+    <hash 
type="sha512">30e6cab1ceeed36bf0ad111be66daf2e438bcb79ff420fd090b6c6418bd8d265178e0e5d6515b173834125a30bd4ade60956817efccff86da5f6529a4739ef20</hash>
+   </verification>
+   <resources maxconnections="1">
+    <url protocol="http" type="http" location="DE" 
preference="91">http://mirror.dogado.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="91">https://mirror.dogado.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="98">https://ftp.plusline.net/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="98">rsync://ftp.plusline.net/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="98">http://ftp.plusline.net/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="97">http://mirror.speedpartner.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="96">https://ftp-stud.hs-esslingen.de/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="100">http://mirror2.hs-esslingen.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="100">rsync://mirror2.hs-esslingen.de/fedora-linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="96">rsync://ftp-stud.hs-esslingen.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="96">http://ftp-stud.hs-esslingen.de/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="95">rsync://ftp.halifax.rwth-aachen.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="95">http://ftp.halifax.rwth-aachen.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="95">https://ftp.halifax.rwth-aachen.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="94">http://mirror.netzwerge.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="94">https://mirror.netzwerge.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="94">rsync://mirror.netzwerge.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="93">http://ftp.fau.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="93">https://ftp.fau.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="93">rsync://ftp.fau.de/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="92">http://mirror.23m.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="92">https://mirror.23m.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="92">rsync://mirror.23m.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DE" 
preference="91">https://mirrors.xtom.de/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="91">http://mirrors.xtom.de/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="91">rsync://mirrors.xtom.de/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DE" 
preference="90">rsync://fedora.tu-chemnitz.de/ftp/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DE" 
preference="90">http://fedora.tu-chemnitz.de/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="BG" 
preference="89">http://mirror.telepoint.bg/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="BG" 
preference="89">rsync://mirror.telepoint.bg/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="BG" 
preference="89">https://mirror.telepoint.bg/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="88">http://fedora.mirror.wearetriple.com/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="NL" 
preference="88">https://fedora.mirror.wearetriple.com/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="NL" 
preference="88">rsync://fedora.mirror.wearetriple.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FI" 
preference="87">rsync://rsync.nic.funet.fi/ftp/pub/mirrors/fedora.redhat.com/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FI" 
preference="87">http://www.nic.funet.fi/pub/mirrors/fedora.redhat.com/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="86">http://mirror.serverion.com/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="NL" 
preference="86">https://mirror.serverion.com/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="NL" 
preference="86">rsync://mirror.serverion.com/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="IT" 
preference="85">http://fedora.mirror.garr.it/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="IT" 
preference="85">https://fedora.mirror.garr.it/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="84">http://ftp.tudelft.nl/download.fedora.redhat.com/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="CZ" 
preference="83">http://mirror.karneval.cz/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="CZ" 
preference="83">rsync://mirror.karneval.cz/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="CZ" 
preference="83">https://mirror.karneval.cz/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="UA" 
preference="82">http://fedora.ip-connect.info/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="UA" 
preference="82">https://fedora.ip-connect.info/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="UA" 
preference="82">rsync://fedora.ip-connect.info/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="EE" 
preference="81">https://mirrors.xtom.ee/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="EE" 
preference="81">rsync://mirrors.xtom.ee/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="EE" 
preference="81">http://mirrors.xtom.ee/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="SE" 
preference="80">https://ftp.lysator.liu.se/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="SE" 
preference="80">http://ftp.lysator.liu.se/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="SE" 
preference="80">rsync://ftp.lysator.liu.se/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="PT" 
preference="79">http://mirrors.up.pt/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="PT" 
preference="79">rsync://mirrors.up.pt/pub/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="LT" 
preference="78">http://mirror.vpsnet.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="LT" 
preference="78">https://mirror.vpsnet.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="MD" 
preference="77">http://mirror.ihost.md/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="MD" 
preference="77">rsync://mirror.ihost.md/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="MD" 
preference="77">https://mirror.ihost.md/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DK" 
preference="76">rsync://mirror.netsite.dk/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="DK" 
preference="76">https://mirror.netsite.dk/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DK" 
preference="76">http://mirror.netsite.dk/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="SK" 
preference="75">https://ftp.upjs.sk/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="SK" 
preference="75">http://ftp.upjs.sk/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="SK" 
preference="75">rsync://ftp.upjs.sk/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="74">http://fedora.mirror.liteserver.nl/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="NL" 
preference="74">rsync://mirror.liteserver.nl/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="NL" 
preference="74">https://fedora.mirror.liteserver.nl/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="DK" 
preference="73">http://mirror.easyspeedy.com/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="DK" 
preference="73">rsync://mirror.easyspeedy.com/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="BY" 
preference="72">http://ftp.byfly.by/pub/fedoraproject.org/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="BY" 
preference="72">https://ftp.byfly.by/pub/fedoraproject.org/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="BY" 
preference="72">rsync://ftp.byfly.by/fedora-linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="RU" 
preference="71">http://mirror.yandex.ru/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="RU" 
preference="71">rsync://mirror.yandex.ru/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="RU" 
preference="71">https://mirror.yandex.ru/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="SE" 
preference="70">https://ftp.acc.umu.se/mirror/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="SE" 
preference="70">http://ftp.acc.umu.se/mirror/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="SE" 
preference="70">rsync://ftp.acc.umu.se/mirror/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="GB" 
preference="69">https://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="GB" 
preference="69">http://www.mirrorservice.org/sites/dl.fedoraproject.org/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="GB" 
preference="69">rsync://rsync.mirrorservice.org/dl.fedoraproject.org/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="UA" 
preference="68">http://fedora.astra.in.ua/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="UA" 
preference="68">rsync://fedora.astra.in.ua/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="UA" 
preference="68">https://fedora.astra.in.ua/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="RU" 
preference="67">http://mirror.linux-ia64.org/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="RU" 
preference="67">rsync://rsync.mirror.linux-ia64.org/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="RU" 
preference="67">https://mirror.linux-ia64.org/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="LU" 
preference="66">http://fedora.mirror.root.lu/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="CZ" 
preference="65">rsync://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="CZ" 
preference="65">http://ftp.fi.muni.cz/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="BG" 
preference="64">http://fedora.ipacct.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="BG" 
preference="64">https://fedora.ipacct.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="BG" 
preference="64">rsync://fedora.ipacct.com/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="CH" 
preference="63">https://mirror.init7.net/fedora/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="CH" 
preference="63">http://mirror.init7.net/fedora/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FR" 
preference="62">http://mirror.in2p3.fr/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FR" 
preference="62">rsync://mirror.in2p3.fr/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FR" 
preference="61">rsync://distrib-coffee.ipsl.jussieu.fr/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FR" 
preference="61">http://distrib-coffee.ipsl.jussieu.fr/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="FR" 
preference="60">https://fr2.rpmfind.net/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FR" 
preference="60">http://fr2.rpmfind.net/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FR" 
preference="60">rsync://fr2.rpmfind.net/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="NL" 
preference="59">rsync://mirror.nl.leaseweb.net/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="59">http://mirror.nl.leaseweb.net/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="TR" 
preference="58">http://mirror.veriteknik.net.tr/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="TR" 
preference="58">rsync://mirror.veriteknik.net.tr/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="UA" 
preference="57">http://fedora.ip-connect.vn.ua/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="UA" 
preference="57">https://fedora.ip-connect.vn.ua/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="UA" 
preference="57">rsync://fedora.ip-connect.vn.ua/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="GR" 
preference="56">rsync://ftp.cc.uoc.gr/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="GR" 
preference="56">http://ftp.cc.uoc.gr/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="GR" 
preference="56">https://ftp.cc.uoc.gr/pub/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="NL" 
preference="55">rsync://ftp.nluug.nl/Fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="NL" 
preference="55">http://ftp.nluug.nl/pub/os/Linux/distr/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="RS" 
preference="54">http://mirror.etf.bg.ac.rs/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="RO" 
preference="53">rsync://fedora.mirrors.telekom.ro/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="RO" 
preference="53">http://fedora.mirrors.telekom.ro/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="PT" 
preference="52">http://ftp.dei.uc.pt/pub/linux/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FR" 
preference="51">http://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FR" 
preference="51">rsync://ftp.lip6.fr/Fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="FR" 
preference="51">https://ftp.lip6.fr/ftp/pub/linux/distributions/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="CY" 
preference="50">http://mirror.library.ucy.ac.cy/linux/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="CY" 
preference="50">rsync://mirror.library.ucy.ac.cy/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="BY" 
preference="49">rsync://mirror.datacenter.by/fedora-linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="BY" 
preference="49">https://mirror.datacenter.by/pub/fedoraproject.org/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="BY" 
preference="49">http://mirror.datacenter.by/pub/fedoraproject.org/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="https" type="https" location="HU" 
preference="48">https://mirror.szerverem.hu/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="HU" 
preference="48">rsync://mirror.szerverem.hu/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="HU" 
preference="48">http://mirror.szerverem.hu/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="CZ" 
preference="47">http://mirror.slu.cz/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="CZ" 
preference="47">rsync://mirror.slu.cz/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="FR" 
preference="46">http://mirrors.ircam.fr/pub/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="FR" 
preference="46">rsync://mirrors.ircam.fr/fedora-linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="GB" 
preference="45">http://mirror.bytemark.co.uk/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="GB" 
preference="45">rsync://mirror.bytemark.co.uk/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="rsync" type="rsync" location="MD" 
preference="44">rsync://repo.fedora.md/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="MD" 
preference="44">http://repo.fedora.md/fedora/linux/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+    <url protocol="http" type="http" location="IL" 
preference="43">http://mirror.isoc.org.il/pub/fedora/releases/34/Everything/x86_64/os/repodata/repomd.xml</url>
+   </resources>
+  </file>
+ </files>
+</metalink>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/data/root-dir/image/config.xml 
new/kiwi-9.24.10/test/data/root-dir/image/config.xml
--- old/kiwi-9.24.6/test/data/root-dir/image/config.xml 2021-09-02 
16:55:04.000000000 +0200
+++ new/kiwi-9.24.10/test/data/root-dir/image/config.xml        2021-11-22 
17:18:04.000000000 +0100
@@ -167,13 +167,17 @@
         <user groups="kiwi,admin,users" pwdformat="plain" password="mypwd" 
name="kiwi"/>
     </users>
     <repository priority="42" sourcetype="baseurl">
-        <source path="iso:///image/CDs/dvd.iso"/>
+        <source path="iso:///image/CDs/dvd.iso">
+            <signing key="file:key_a"/>
+        </source>
     </repository>
     <repository type="rpm-md" imageinclude="true" customize="script">
         <source path="obs://Devel:PubCloud:AmazonEC2/SLE_12_GA"/>
     </repository>
     <repository type="rpm-md" imageonly="true">
-        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker"/>
+        <source path="obs://Devel:Docker:Images:SLE12SP2/SLE_12_SP2_Docker">
+            <signing key="file:key_b"/>
+        </source>
     </repository>
     <packages type="image" patternType="plusRecommended">
         <namedCollection name="base"/>
Binary files old/kiwi-9.24.6/test/unit/.coverage and 
new/kiwi-9.24.10/test/unit/.coverage differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/unit/system/uri_test.py 
new/kiwi-9.24.10/test/unit/system/uri_test.py
--- old/kiwi-9.24.6/test/unit/system/uri_test.py        2021-07-14 
18:09:37.000000000 +0200
+++ new/kiwi-9.24.10/test/unit/system/uri_test.py       2021-11-23 
09:57:42.000000000 +0100
@@ -243,3 +243,17 @@
         mock_buildservice.return_value = True
         uri = Uri('obsrepositories:/')
         assert uri.translate() == '/usr/src/packages/SOURCES/repos'
+
+    @patch('kiwi.system.uri.urlopen')
+    @patch('kiwi.system.uri.Request')
+    def test_translate_metalink_uri(self, mock_Request, mock_urlopen):
+        with open('../data/metalink') as metalink:
+            mock_urlopen.return_value = metalink
+            uri = Uri('https://metalink.com/foo', source_type='metalink')
+            assert uri.translate() == \
+                
'https://ftp.plusline.net/fedora/linux/releases/34/Everything/' \
+                'x86_64/os/'
+
+        mock_urlopen.side_effect = Exception
+        with raises(KiwiUriOpenError):
+            uri = Uri('https://metalink.com/foo', source_type='metalink')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/unit/tasks/image_info_test.py 
new/kiwi-9.24.10/test/unit/tasks/image_info_test.py
--- old/kiwi-9.24.6/test/unit/tasks/image_info_test.py  2021-09-02 
16:55:04.000000000 +0200
+++ new/kiwi-9.24.10/test/unit/tasks/image_info_test.py 2021-11-23 
09:57:42.000000000 +0100
@@ -127,24 +127,24 @@
 
         assert self.solver.add_repository.called
         assert mock_uri.call_args_list == [
-            call('http://us.archive.ubuntu.com/ubuntu/'),
+            call(uri='http://us.archive.ubuntu.com/ubuntu/', source_type=''),
             call(
                 'http://us.archive.ubuntu.com/ubuntu/dists/focal/'
-                'main/binary-amd64', 'apt-deb'
+                'main/binary-amd64', 'apt-deb', ''
             ),
             call(
                 'http://us.archive.ubuntu.com/ubuntu/dists/focal/'
-                'multiverse/binary-amd64', 'apt-deb'
+                'multiverse/binary-amd64', 'apt-deb', ''
             ),
             call(
                 'http://us.archive.ubuntu.com/ubuntu/dists/focal/'
-                'restricted/binary-amd64', 'apt-deb'
+                'restricted/binary-amd64', 'apt-deb', ''
             ),
             call(
                 'http://us.archive.ubuntu.com/ubuntu/dists/focal/'
-                'universe/binary-amd64', 'apt-deb'
+                'universe/binary-amd64', 'apt-deb', ''
             ),
-            call('obs://Devel:PubCloud:AmazonEC2/SLE_12_GA', 'rpm-md')
+            call('obs://Devel:PubCloud:AmazonEC2/SLE_12_GA', 'rpm-md', '')
         ]
         mock_out.assert_called_once_with(self.result_info)
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/unit/tasks/system_build_test.py 
new/kiwi-9.24.10/test/unit/tasks/system_build_test.py
--- old/kiwi-9.24.6/test/unit/tasks/system_build_test.py        2021-07-14 
18:09:37.000000000 +0200
+++ new/kiwi-9.24.10/test/unit/tasks/system_build_test.py       2021-11-22 
17:18:04.000000000 +0100
@@ -96,10 +96,12 @@
         self.task.command_args['--set-container-tag'] = None
         self.task.command_args['--add-container-label'] = []
         self.task.command_args['--clear-cache'] = False
-        self.task.command_args['--signing-key'] = None
+        self.task.command_args['--signing-key'] = []
 
     @patch('kiwi.logger.Logger.set_logfile')
-    def test_process_system_build(self, mock_log):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_build(self, mock_keys, mock_log):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['build'] = True
         self.task.process()
@@ -156,7 +158,7 @@
             check_architecture_supports_iso_firmware_setup.\
             assert_called_once_with()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            False, None, None
+            False, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.install_bootstrap.assert_called_once_with(
             self.manager, []
@@ -193,24 +195,28 @@
         )
 
     @patch('kiwi.logger.Logger.set_logfile')
-    def test_process_system_build_add_package(self, mock_log):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_build_add_package(self, mock_keys, mock_log):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['--add-package'] = ['vim']
         self.task.process()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            False, None, None
+            False, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.install_packages.assert_called_once_with(
             self.manager, ['vim']
         )
 
     @patch('kiwi.logger.Logger.set_logfile')
-    def test_process_system_update_delete_package(self, mock_log):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_update_delete_package(self, mock_keys, mock_log):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['--delete-package'] = ['vim']
         self.task.process()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            False, None, None
+            False, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.delete_packages.assert_called_once_with(
             self.manager, ['vim']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/unit/tasks/system_prepare_test.py 
new/kiwi-9.24.10/test/unit/tasks/system_prepare_test.py
--- old/kiwi-9.24.6/test/unit/tasks/system_prepare_test.py      2021-11-12 
23:11:06.000000000 +0100
+++ new/kiwi-9.24.10/test/unit/tasks/system_prepare_test.py     2021-11-22 
17:18:04.000000000 +0100
@@ -89,9 +89,11 @@
         self.task.command_args['--set-container-derived-from'] = None
         self.task.command_args['--set-container-tag'] = None
         self.task.command_args['--add-container-label'] = []
-        self.task.command_args['--signing-key'] = None
+        self.task.command_args['--signing-key'] = []
 
-    def test_process_system_prepare(self):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_prepare(self, mock_keys):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['prepare'] = True
         self.task.command_args['--clear-cache'] = True
@@ -144,7 +146,7 @@
             check_architecture_supports_iso_firmware_setup.\
             assert_called_once_with()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            True, None, None
+            True, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.install_bootstrap.assert_called_once_with(
             self.manager, []
@@ -195,23 +197,27 @@
             self.task.process()
         assert not self.system_prepare.install_bootstrap.called
 
-    def test_process_system_prepare_add_package(self):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_prepare_add_package(self, mock_keys):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['--add-package'] = ['vim']
         self.task.process()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            False, None, None
+            False, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.install_packages.assert_called_once_with(
             self.manager, ['vim']
         )
 
-    def test_process_system_prepare_delete_package(self):
+    @patch('kiwi.xml_state.XMLState.get_repositories_signing_keys')
+    def test_process_system_prepare_delete_package(self, mock_keys):
+        mock_keys.return_value = ['some_key', 'some_other_key']
         self._init_command_args()
         self.task.command_args['--delete-package'] = ['vim']
         self.task.process()
         self.system_prepare.setup_repositories.assert_called_once_with(
-            False, None, None
+            False, ['some_key', 'some_other_key'], None
         )
         self.system_prepare.delete_packages.assert_called_once_with(
             self.manager, ['vim']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kiwi-9.24.6/test/unit/xml_state_test.py 
new/kiwi-9.24.10/test/unit/xml_state_test.py
--- old/kiwi-9.24.6/test/unit/xml_state_test.py 2021-11-03 20:37:14.000000000 
+0100
+++ new/kiwi-9.24.10/test/unit/xml_state_test.py        2021-11-22 
17:18:04.000000000 +0100
@@ -1006,3 +1006,8 @@
         xml_data = self.description.load()
         state = XMLState(xml_data, ['vmxSimpleFlavour'], 'oem')
         state.get_installmedia_initrd_modules('add') == []
+
+    @patch('kiwi.system.uri.os.path.abspath')
+    def test_get_repositories_signing_keys(self, mock_root_path):
+        mock_root_path.side_effect = lambda x: f'/some/path/{x}'
+        assert self.state.get_repositories_signing_keys() == 
['/some/path/key_a', '/some/path/key_b']

Reply via email to