Merge pull request #346 from SUSE/signing_key_option

Add --signing-key option
This commit is contained in:
Marcus Schäfer 2017-05-31 16:42:55 +02:00 committed by GitHub
commit 38ced54ca4
37 changed files with 226 additions and 50 deletions

View File

@ -18,6 +18,7 @@ SYNOPSIS
[--obs-repo-internal]
[--add-package=<name>...]
[--delete-package=<name>...]
[--signing-key=<key-file>...]
kiwi system build help
DESCRIPTION
@ -61,6 +62,14 @@ OPTIONS
is shared between multiple image builds on that host for performance
reasons.
--signing-key=<key-file>
set the key file to be trusted and imported into the package
manager database before performing any opertaion. This is useful
if an image build should take and validate repository and package
signatures during build time. This option can be specified multiple
times
--delete-package=<name>
specify package to delete. The option can be specified

View File

@ -10,6 +10,7 @@ SYNOPSIS
kiwi system create -h | --help
kiwi system create --root=<directory> --target-dir=<directory>
[--signing-key=<key-file>...]
kiwi system create help
DESCRIPTION
@ -33,3 +34,12 @@ OPTIONS
--target-dir=<directory>
Path to store the build results.
--signing-key=<key-file>
set the key file to be trusted and imported into the package
manager database before performing any opertaion. This is useful
if an image build should take and validate repository and package
signatures during build time. In create step this option only
affects the boot image. This option can be specified multiple
times

View File

@ -18,6 +18,7 @@ SYNOPSIS
[--obs-repo-internal]
[--add-package=<name>...]
[--delete-package=<name>...]
[--signing-key=<key-file>...]
kiwi system prepare help
DESCRIPTION
@ -59,6 +60,14 @@ OPTIONS
is shared between multiple image builds on that host for performance
reasons.
--signing-key=<key-file>
set the key file to be trusted and imported into the package
manager database before performing any opertaion. This is useful
if an image build should take and validate repository and package
signatures during build time. This option can be specified multiple
times
--delete-package=<name>
specify package to delete. The option can be specified

View File

@ -28,12 +28,14 @@ class BootImage(object):
"""
BootImge factory
"""
def __new__(self, xml_state, target_dir, root_dir=None):
def __new__(self, xml_state, target_dir, root_dir=None, signing_keys=None):
initrd_system = xml_state.build_type.get_initrd_system()
if not initrd_system:
initrd_system = 'kiwi'
if initrd_system == 'kiwi':
return BootImageKiwi(xml_state, target_dir)
return BootImageKiwi(
xml_state, target_dir, signing_keys=signing_keys
)
elif initrd_system == 'dracut':
return BootImageDracut(xml_state, target_dir, root_dir)
else:

View File

@ -56,7 +56,9 @@ class BootImageBase(object):
Instance of XMLState of the boot image description
"""
def __init__(self, xml_state, target_dir, root_dir=None):
def __init__(
self, xml_state, target_dir, root_dir=None, signing_keys=None
):
self.xml_state = xml_state
self.target_dir = target_dir
self.initrd_filename = None
@ -64,6 +66,7 @@ class BootImageBase(object):
self.setup = None
self.temp_directories = []
self.call_destructor = True
self.signing_keys = signing_keys
self.boot_root_directory = root_dir
if not self.boot_root_directory:

View File

@ -52,7 +52,7 @@ class BootImageKiwi(BootImageBase):
root_dir=self.boot_root_directory,
allow_existing=True
)
manager = system.setup_repositories()
manager = system.setup_repositories(signing_keys=self.signing_keys)
system.install_bootstrap(
manager
)

View File

@ -33,7 +33,7 @@ class ImageBuilder(object):
"""
image builder factory
"""
def __new__(self, xml_state, target_dir, root_dir):
def __new__(self, xml_state, target_dir, root_dir, custom_args=None):
requested_image_type = xml_state.get_build_type_name()
if requested_image_type in Defaults.get_filesystem_image_types():
return FileSystemBuilder(
@ -41,15 +41,15 @@ class ImageBuilder(object):
)
elif requested_image_type in Defaults.get_disk_image_types():
return DiskBuilder(
xml_state, target_dir, root_dir
xml_state, target_dir, root_dir, custom_args
)
elif requested_image_type in Defaults.get_live_image_types():
return LiveImageBuilder(
xml_state, target_dir, root_dir
xml_state, target_dir, root_dir, custom_args
)
elif requested_image_type in Defaults.get_network_image_types():
return PxeBuilder(
xml_state, target_dir, root_dir
xml_state, target_dir, root_dir, custom_args
)
elif requested_image_type in Defaults.get_archive_image_types():
return ArchiveBuilder(

View File

@ -171,7 +171,7 @@ class DiskBuilder(object):
* :attr:`result`
Instance of Result
"""
def __init__(self, xml_state, target_dir, root_dir):
def __init__(self, xml_state, target_dir, root_dir, custom_args=None):
self.arch = platform.machine()
if self.arch == 'i686' or self.arch == 'i586':
self.arch = 'ix86'
@ -206,8 +206,15 @@ class DiskBuilder(object):
self.disk_setup = DiskSetup(
xml_state, root_dir
)
self.custom_args = custom_args
self.signing_keys = None
if custom_args and 'signing_keys' in custom_args:
self.signing_keys = custom_args['signing_keys']
self.boot_image = BootImage(
xml_state, target_dir, root_dir
xml_state, target_dir, root_dir,
signing_keys=self.signing_keys
)
self.firmware = FirmWare(
xml_state
@ -256,7 +263,7 @@ class DiskBuilder(object):
* image="vmx"
"""
disk = DiskBuilder(
self.xml_state, self.target_dir, self.root_dir
self.xml_state, self.target_dir, self.root_dir, self.custom_args
)
result = disk.create_disk()
@ -480,7 +487,8 @@ class DiskBuilder(object):
self.xml_state.build_type.get_initrd_system()
self.boot_image = BootImageKiwi(
self.xml_state, self.target_dir
self.xml_state, self.target_dir,
signing_keys=self.signing_keys
)
self.boot_image.prepare()

View File

@ -100,7 +100,7 @@ class LiveImageBuilder(object):
* :attr:`result`
Instance of Result
"""
def __init__(self, xml_state, target_dir, root_dir):
def __init__(self, xml_state, target_dir, root_dir, custom_args=None):
self.media_dir = None
self.arch = platform.machine()
if self.arch == 'i686' or self.arch == 'i586':
@ -122,8 +122,12 @@ class LiveImageBuilder(object):
if not self.live_type:
self.live_type = Defaults.get_default_live_iso_type()
boot_signing_keys = None
if custom_args and 'signing_keys' in custom_args:
boot_signing_keys = custom_args['signing_keys']
self.boot_image_task = BootImage(
xml_state, target_dir
xml_state, target_dir, signing_keys=boot_signing_keys
)
self.firmware = FirmWare(
xml_state

View File

@ -73,7 +73,7 @@ class PxeBuilder(object):
* :attr:`result`
Instance of Result
"""
def __init__(self, xml_state, target_dir, root_dir):
def __init__(self, xml_state, target_dir, root_dir, custom_args=None):
self.target_dir = target_dir
self.compressed = xml_state.build_type.get_compressed()
self.machine = xml_state.get_build_type_machine_section()
@ -84,8 +84,13 @@ class PxeBuilder(object):
self.system_setup = SystemSetup(
xml_state=xml_state, root_dir=root_dir
)
boot_signing_keys = None
if custom_args and 'signing_keys' in custom_args:
boot_signing_keys = custom_args['signing_keys']
self.boot_image_task = BootImage(
xml_state, target_dir
xml_state, target_dir, signing_keys=boot_signing_keys
)
self.image_name = ''.join(
[

View File

@ -132,6 +132,13 @@ class PackageManagerApt(PackageManagerBase):
device='/dev', mountpoint=self.root_dir + '/dev'
)
dev_mount.umount()
if self.repository.unauthenticated == 'false':
log.warning(
'KIWI does not support signature checks for apt-get '
'package manager during the bootstrap procedure, any '
'provided key will only be used inside the chroot '
'environment'
)
Command.run(
[
'debootstrap', '--no-check-gpg', self.distribution,
@ -144,6 +151,10 @@ class PackageManagerApt(PackageManagerBase):
data.sync_data(
options=['-a', '-H', '-X', '-A']
)
for key in self.repository.signing_keys:
Command.run([
'chroot', self.root_dir, 'apt-key', 'add', key
], self.command_env)
except Exception as e:
raise KiwiDebootstrapError(
'%s: %s' % (type(e).__name__, format(e))

View File

@ -56,6 +56,7 @@ class RepositoryApt(RepositoryBase):
"""
self.custom_args = custom_args
self.exclude_docs = False
self.signing_keys = []
if not custom_args:
self.custom_args = []
@ -167,6 +168,16 @@ class RepositoryApt(RepositoryBase):
'deb %s %s %s\n' % (uri, dist, components)
)
def import_trusted_keys(self, signing_keys):
"""
Keeps trusted keys so that later on they can be imported into
the image by the PackageManager instance.
:param list signing_keys: list of the key files to import
"""
for key in signing_keys:
self.signing_keys.append(key)
def delete_repo(self, name):
"""
Delete apt-get repository

View File

@ -86,6 +86,16 @@ class RepositoryBase(object):
"""
raise NotImplementedError
def import_trusted_keys(self, signing_keys):
"""
Imports trusted keys into the image
Implementation in specialized repository class
:param list signing_keys: list of the key files to import
"""
raise NotImplementedError
def cleanup_unused_repos(self):
"""
Cleanup/Delete unused repositories

View File

@ -23,6 +23,7 @@ from tempfile import NamedTemporaryFile
# project
from kiwi.repository.base import RepositoryBase
from kiwi.path import Path
from kiwi.command import Command
class RepositoryDnf(RepositoryBase):
@ -160,6 +161,15 @@ class RepositoryDnf(RepositoryBase):
with open(repo_file, 'w') as repo:
repo_config.write(repo)
def import_trusted_keys(self, signing_keys):
"""
Imports trusted keys into the image
:param list signing_keys: list of the key files to import
"""
for key in signing_keys:
Command.run(['rpm', '--root', self.root_dir, '--import', key])
def delete_repo(self, name):
"""
Delete dnf repository
@ -253,9 +263,9 @@ class RepositoryDnf(RepositoryBase):
self.runtime_dnf_config.set(
'main', 'gpgcheck', self.gpg_check
)
self.runtime_dnf_config.set(
'main', 'repo_gpgcheck', self.gpg_check
)
# We are not setting repo_gpgcheck, which forces repository
# signatures checks, because current Fedora 25 releases do not
# provide signed repositories, only signed packages
if self.exclude_docs:
self.runtime_dnf_config.set(
'main', 'tsflags', 'nodocs'

View File

@ -21,6 +21,7 @@ from tempfile import NamedTemporaryFile
# project
from kiwi.logger import log
from kiwi.command import Command
from kiwi.repository.base import RepositoryBase
from kiwi.path import Path
@ -159,6 +160,15 @@ class RepositoryYum(RepositoryBase):
with open(repo_file, 'w') as repo:
repo_config.write(repo)
def import_trusted_keys(self, signing_keys):
"""
Imports trusted keys into the image
:param list signing_keys: list of the key files to import
"""
for key in signing_keys:
Command.run(['rpm', '--root', self.root_dir, '--import', key])
def delete_repo(self, name):
"""
Delete yum repository
@ -248,9 +258,9 @@ class RepositoryYum(RepositoryBase):
self.runtime_yum_config.set(
'main', 'gpgcheck', self.gpg_check
)
self.runtime_yum_config.set(
'main', 'repo_gpgcheck', self.gpg_check
)
# We are not setting repo_gpgcheck, which forces repository
# signature checks. Because, at the time of writing this comment,
# yum v3.4.3 was not capable to perform a repository key validation
self.runtime_yum_config.set(
'main', 'metadata_expire', '1800'
)

View File

@ -243,6 +243,15 @@ class RepositoryZypper(RepositoryBase):
)
self._restore_package_cache()
def import_trusted_keys(self, signing_keys):
"""
Imports trusted keys into the image
:param list signing_keys: list of the key files to import
"""
for key in signing_keys:
Command.run(['rpm', '--root', self.root_dir, '--import', key])
def delete_repo(self, name):
"""
Delete zypper repository

View File

@ -90,7 +90,7 @@ class SystemPrepare(object):
# for System operations
self.uri_list = []
def setup_repositories(self, clear_cache=False):
def setup_repositories(self, clear_cache=False, signing_keys=None):
"""
Set up repositories for software installation and return a
package manager for performing software installation tasks
@ -108,6 +108,8 @@ class SystemPrepare(object):
repo = Repository(
self.root_bind, package_manager, repository_options
)
if signing_keys:
repo.import_trusted_keys(signing_keys)
for xml_repo in repository_sections:
repo_type = xml_repo.get_type()
repo_source = xml_repo.get_source().get_path()

View File

@ -28,6 +28,7 @@ usage: kiwi system build -h | --help
[--delete-package=<name>...]
[--set-container-derived-from=<uri>]
[--set-container-tag=<name>]
[--signing-key=<key-file>...]
kiwi system build help
commands:
@ -75,6 +76,8 @@ options:
repository in the XML description
--target-dir=<directory>
the target directory to store the system image file(s)
--signing-key=<key-file>
includes the key-file as a trusted key for package manager validations
"""
import os
@ -190,7 +193,8 @@ class SystemBuildTask(CliTask):
self.command_args['--allow-existing-root']
)
manager = system.setup_repositories(
self.command_args['--clear-cache']
self.command_args['--clear-cache'],
self.command_args['--signing-key']
)
system.install_bootstrap(manager)
system.install_system(
@ -248,7 +252,8 @@ class SystemBuildTask(CliTask):
image_builder = ImageBuilder(
self.xml_state,
abs_target_dir_path,
image_root
image_root,
{'signing_keys': self.command_args['--signing-key']}
)
result = image_builder.create()
result.print_results()

View File

@ -18,6 +18,7 @@
"""
usage: kiwi system create -h | --help
kiwi system create --root=<directory> --target-dir=<directory>
[--signing-key=<key-file>...]
kiwi system create help
commands:
@ -34,6 +35,8 @@ options:
a former system prepare call
--target-dir=<directory>
the target directory to store the system image file(s)
--signing-key=<key-file>
includes the key-file as a trusted key for package manager validations
"""
import os
@ -93,7 +96,8 @@ class SystemCreateTask(CliTask):
image_builder = ImageBuilder(
self.xml_state,
abs_target_dir_path,
abs_root_path
abs_root_path,
custom_args={'signing_keys': self.command_args['--signing-key']}
)
result = image_builder.create()
result.print_results()

View File

@ -28,6 +28,7 @@ usage: kiwi system prepare -h | --help
[--delete-package=<name>...]
[--set-container-derived-from=<uri>]
[--set-container-tag=<name>]
[--signing-key=<key-file>...]
kiwi system prepare help
commands:
@ -73,6 +74,8 @@ options:
--set-repo=<source,type,alias,priority>
overwrite the repo source, type, alias or priority for the first
repository in the XML description
--signing-key=<key-file>
includes the key-file as a trusted key for package manager validations
"""
import os
@ -174,7 +177,8 @@ class SystemPrepareTask(CliTask):
self.command_args['--allow-existing-root']
)
manager = system.setup_repositories(
self.command_args['--clear-cache']
self.command_args['--clear-cache'],
self.command_args['--signing-key']
)
system.install_bootstrap(manager)
system.install_system(

View File

@ -50,7 +50,9 @@ class TestBootImageKiwi(object):
def test_prepare(self, mock_boot_path):
mock_boot_path.return_value = '../data'
self.boot_image.prepare()
self.system_prepare.setup_repositories.assert_called_once_with()
self.system_prepare.setup_repositories.assert_called_once_with(
signing_keys=None
)
self.system_prepare.install_bootstrap.assert_called_once_with(
self.manager
)

View File

@ -23,7 +23,7 @@ class TestBootImage(object):
self.xml_state.build_type.get_initrd_system.return_value = None
BootImage(self.xml_state, 'target_dir')
mock_kiwi.assert_called_once_with(
self.xml_state, 'target_dir'
self.xml_state, 'target_dir', signing_keys=None
)
@patch('kiwi.boot.image.BootImageKiwi')
@ -31,13 +31,13 @@ class TestBootImage(object):
self.xml_state.build_type.get_initrd_system.return_value = 'kiwi'
BootImage(self.xml_state, 'target_dir')
mock_kiwi.assert_called_once_with(
self.xml_state, 'target_dir'
self.xml_state, 'target_dir', signing_keys=None
)
@patch('kiwi.boot.image.BootImageDracut')
def test_boot_image_task_dracut(self, mock_dracut):
self.xml_state.build_type.get_initrd_system.return_value = 'dracut'
BootImage(self.xml_state, 'target_dir')
BootImage(self.xml_state, 'target_dir', 'root_dir')
mock_dracut.assert_called_once_with(
self.xml_state, 'target_dir', None
self.xml_state, 'target_dir', 'root_dir'
)

View File

@ -163,7 +163,8 @@ class TestDiskBuilder(object):
return_value=self.luks_root
)
self.disk_builder = DiskBuilder(
XMLState(description.load()), 'target_dir', 'root_dir'
XMLState(description.load()), 'target_dir', 'root_dir',
custom_args={'signing_keys': ['key_file_a', 'key_file_b']}
)
self.disk_builder.root_filesystem_is_overlay = False
self.disk_builder.build_type_name = 'oem'

View File

@ -67,7 +67,8 @@ class TestLiveImageBuilder(object):
return_value='custom_cmdline'
)
self.live_image = LiveImageBuilder(
self.xml_state, 'target_dir', 'root_dir'
self.xml_state, 'target_dir', 'root_dir',
custom_args={'signing_keys': ['key_file_a', 'key_file_b']}
)
self.live_image.machine = mock.Mock()
self.live_image.machine.get_domain = mock.Mock(

View File

@ -50,7 +50,8 @@ class TestPxeBuilder(object):
return_value=self.kernel
)
self.pxe = PxeBuilder(
self.xml_state, 'target_dir', 'root_dir'
self.xml_state, 'target_dir', 'root_dir',
custom_args={'signing_keys': ['key_file_a', 'key_file_b']}
)
self.machine = mock.Mock()
self.machine.get_domain = mock.Mock(

View File

@ -29,7 +29,7 @@ class TestImageBuilder(object):
)
ImageBuilder(xml_state, 'target_dir', 'root_dir')
mock_builder.assert_called_once_with(
xml_state, 'target_dir', 'root_dir'
xml_state, 'target_dir', 'root_dir', None
)
@patch('kiwi.builder.LiveImageBuilder')
@ -40,7 +40,7 @@ class TestImageBuilder(object):
)
ImageBuilder(xml_state, 'target_dir', 'root_dir')
mock_builder.assert_called_once_with(
xml_state, 'target_dir', 'root_dir'
xml_state, 'target_dir', 'root_dir', None
)
@patch('kiwi.builder.PxeBuilder')
@ -51,7 +51,7 @@ class TestImageBuilder(object):
)
ImageBuilder(xml_state, 'target_dir', 'root_dir')
mock_builder.assert_called_once_with(
xml_state, 'target_dir', 'root_dir'
xml_state, 'target_dir', 'root_dir', None
)
@patch('kiwi.builder.ArchiveBuilder')

View File

@ -46,6 +46,7 @@ class TestCli(object):
'--delete-package': [],
'--set-container-derived-from': None,
'--set-container-tag': None,
'--signing-key': [],
'-h': False,
'help': False,
'prepare': True,

View File

@ -12,6 +12,8 @@ class TestPackageManagerApt(object):
def setup(self):
repository = mock.Mock()
repository.root_dir = 'root-dir'
repository.signing_keys = ['key-file.asc']
repository.unauthenticated = 'false'
root_bind = mock.Mock()
root_bind.move_to_root = mock.Mock(
@ -76,12 +78,13 @@ class TestPackageManagerApt(object):
mock_exists.return_value = True
self.manager.process_install_requests_bootstrap()
@patch('kiwi.logger.log.warning')
@patch('kiwi.command.Command.call')
@patch('kiwi.command.Command.run')
@patch('os.path.exists')
@patch('kiwi.package_manager.apt.DataSync')
def test_process_install_requests_bootstrap(
self, mock_sync, mock_exists, mock_run, mock_call
self, mock_sync, mock_exists, mock_run, mock_call, mock_warn
):
self.manager.request_package('apt-get')
self.manager.request_package('vim')
@ -101,6 +104,9 @@ class TestPackageManagerApt(object):
'debootstrap', '--no-check-gpg', 'xenial',
'root-dir.debootstrap', 'xenial_path'],
['env']),
call([
'chroot', 'root-dir', 'apt-key', 'add', 'key-file.asc'
], ['env']),
call(['rm', '-r', '-f', 'root-dir.debootstrap']),
call([
'chroot', 'root-dir', 'apt-get',
@ -112,6 +118,7 @@ class TestPackageManagerApt(object):
'root-moved-arguments', 'install', 'vim'],
['env']
)
assert mock_warn.called
@patch('kiwi.command.Command.call')
@patch('kiwi.command.Command.run')

View File

@ -128,6 +128,10 @@ class TestRepositoryApt(object):
'/shared-dir/apt-get/sources.list.d/foo.list', 'w'
)
def test_import_trusted_keys(self):
self.repo.import_trusted_keys(['key-file-a.asc', 'key-file-b.asc'])
assert self.repo.signing_keys == ['key-file-a.asc', 'key-file-b.asc']
@patch('kiwi.path.Path.wipe')
def test_delete_repo(self, mock_wipe):
self.repo.delete_repo('foo')

View File

@ -27,6 +27,10 @@ class TestRepositoryBase(object):
'user', 'secret', 'credentials-file'
)
@raises(NotImplementedError)
def test_import_trusted_keys(self):
self.repo.import_trusted_keys(['key-file.asc'])
@raises(NotImplementedError)
def test_delete_repo(self):
self.repo.delete_repo('name')

View File

@ -41,7 +41,6 @@ class TestRepositoryDnf(object):
call('main', 'obsoletes', '1'),
call('main', 'plugins', '1'),
call('main', 'gpgcheck', '0'),
call('main', 'repo_gpgcheck', '0'),
call('main', 'tsflags', 'nodocs'),
call('main', 'enabled', '1')
]
@ -81,7 +80,6 @@ class TestRepositoryDnf(object):
call('main', 'obsoletes', '1'),
call('main', 'plugins', '1'),
call('main', 'gpgcheck', '0'),
call('main', 'repo_gpgcheck', '0'),
call('main', 'tsflags', 'nodocs'),
call('main', 'enabled', '1')
]
@ -112,6 +110,14 @@ class TestRepositoryDnf(object):
'/shared-dir/dnf/repos/foo.repo', 'w'
)
@patch('kiwi.command.Command.run')
def test_import_trusted_keys(self, mock_run):
self.repo.import_trusted_keys(['key-file-a.asc', 'key-file-b.asc'])
assert mock_run.call_args_list == [
call(['rpm', '--root', '../data', '--import', 'key-file-a.asc']),
call(['rpm', '--root', '../data', '--import', 'key-file-b.asc'])
]
@patch('kiwi.path.Path.wipe')
def test_delete_repo(self, mock_wipe):
self.repo.delete_repo('foo')

View File

@ -40,7 +40,6 @@ class TestRepositoryYum(object):
call('main', 'obsoletes', '1'),
call('main', 'plugins', '1'),
call('main', 'gpgcheck', '0'),
call('main', 'repo_gpgcheck', '0'),
call('main', 'metadata_expire', '1800'),
call('main', 'group_command', 'compat'),
call('main', 'enabled', '1')
@ -84,7 +83,6 @@ class TestRepositoryYum(object):
call('main', 'obsoletes', '1'),
call('main', 'plugins', '1'),
call('main', 'gpgcheck', '0'),
call('main', 'repo_gpgcheck', '0'),
call('main', 'metadata_expire', '1800'),
call('main', 'group_command', 'compat'),
call('main', 'enabled', '1')
@ -116,6 +114,14 @@ class TestRepositoryYum(object):
'/shared-dir/yum/repos/foo.repo', 'w'
)
@patch('kiwi.command.Command.run')
def test_import_trusted_keys(self, mock_run):
self.repo.import_trusted_keys(['key-file-a.asc', 'key-file-b.asc'])
assert mock_run.call_args_list == [
call(['rpm', '--root', '../data', '--import', 'key-file-a.asc']),
call(['rpm', '--root', '../data', '--import', 'key-file-b.asc'])
]
@patch('kiwi.path.Path.wipe')
def test_delete_repo(self, mock_wipe):
self.repo.delete_repo('foo')

View File

@ -126,6 +126,14 @@ class TestRepositoryZypper(object):
])
]
@patch('kiwi.command.Command.run')
def test_import_trusted_keys(self, mock_run):
self.repo.import_trusted_keys(['key-file-a.asc', 'key-file-b.asc'])
assert mock_run.call_args_list == [
call(['rpm', '--root', '../data', '--import', 'key-file-a.asc']),
call(['rpm', '--root', '../data', '--import', 'key-file-b.asc'])
]
@patch('kiwi.command.Command.run')
@patch('kiwi.repository.zypper.Path.wipe')
@patch('os.path.exists')

View File

@ -181,7 +181,10 @@ class TestSystemPrepare(object):
repo = mock.Mock()
mock_repo.return_value = repo
self.system.setup_repositories(clear_cache=True)
self.system.setup_repositories(
clear_cache=True,
signing_keys=['key-file-a.asc', 'key-file-b.asc']
)
mock_repo.assert_called_once_with(
self.system.root_bind, 'package-manager-name',
@ -211,6 +214,9 @@ class TestSystemPrepare(object):
call('uri-alias'),
call('uri-alias')
]
repo.import_trusted_keys.assert_called_once_with(
['key-file-a.asc', 'key-file-b.asc']
)
@patch('kiwi.system.prepare.Repository')
@patch('kiwi.system.prepare.Uri')

View File

@ -82,6 +82,7 @@ class TestSystemBuildTask(object):
self.task.command_args['--set-container-derived-from'] = None
self.task.command_args['--set-container-tag'] = None
self.task.command_args['--clear-cache'] = False
self.task.command_args['--signing-key'] = None
@patch('kiwi.logger.Logger.set_logfile')
def test_process_system_build(self, mock_log):
@ -92,7 +93,7 @@ class TestSystemBuildTask(object):
self.runtime_checker.check_image_include_repos_http_resolvable.assert_called_once_with()
self.runtime_checker.check_target_directory_not_in_shared_cache.assert_called_once_with(self.abs_target_dir)
self.runtime_checker.check_repositories_configured.assert_called_once_with()
self.system_prepare.setup_repositories.assert_called_once_with(False)
self.system_prepare.setup_repositories.assert_called_once_with(False, None)
self.system_prepare.install_bootstrap.assert_called_once_with(
self.manager
)
@ -127,7 +128,7 @@ class TestSystemBuildTask(object):
self._init_command_args()
self.task.command_args['--add-package'] = ['vim']
self.task.process()
self.system_prepare.setup_repositories.assert_called_once_with(False)
self.system_prepare.setup_repositories.assert_called_once_with(False, None)
self.system_prepare.install_packages.assert_called_once_with(
self.manager, ['vim']
)
@ -137,7 +138,7 @@ class TestSystemBuildTask(object):
self._init_command_args()
self.task.command_args['--delete-package'] = ['vim']
self.task.process()
self.system_prepare.setup_repositories.assert_called_once_with(False)
self.system_prepare.setup_repositories.assert_called_once_with(False, None)
self.system_prepare.delete_packages.assert_called_once_with(
self.manager, ['vim']
)

View File

@ -57,6 +57,7 @@ class TestSystemCreateTask(object):
self.task.command_args['create'] = False
self.task.command_args['--root'] = '../data/root-dir'
self.task.command_args['--target-dir'] = 'some-target'
self.task.command_args['--signing-key'] = ['some-key-file']
def test_process_system_create(self):
self._init_command_args()

View File

@ -72,6 +72,7 @@ class TestSystemPrepareTask(object):
self.task.command_args['--clear-cache'] = False
self.task.command_args['--set-container-derived-from'] = None
self.task.command_args['--set-container-tag'] = None
self.task.command_args['--signing-key'] = None
def test_process_system_prepare(self):
self._init_command_args()
@ -84,7 +85,7 @@ class TestSystemPrepareTask(object):
self.abs_root_dir
)
self.runtime_checker.check_repositories_configured.assert_called_once_with()
self.system_prepare.setup_repositories.assert_called_once_with(True)
self.system_prepare.setup_repositories.assert_called_once_with(True, None)
self.system_prepare.install_bootstrap.assert_called_once_with(
self.manager
)
@ -113,7 +114,7 @@ class TestSystemPrepareTask(object):
self._init_command_args()
self.task.command_args['--add-package'] = ['vim']
self.task.process()
self.system_prepare.setup_repositories.assert_called_once_with(False)
self.system_prepare.setup_repositories.assert_called_once_with(False, None)
self.system_prepare.install_packages.assert_called_once_with(
self.manager, ['vim']
)
@ -122,7 +123,7 @@ class TestSystemPrepareTask(object):
self._init_command_args()
self.task.command_args['--delete-package'] = ['vim']
self.task.process()
self.system_prepare.setup_repositories.assert_called_once_with(False)
self.system_prepare.setup_repositories.assert_called_once_with(False, None)
self.system_prepare.delete_packages.assert_called_once_with(
self.manager, ['vim']
)