The location of the rpm database is no longer a standard path one can trust. Some distributions put it to /var/lib others to /usr/lib. This introduces the problem of dealing with different locations between the bootstrapping (host rpm) phase and the image installation (image rpm) phase. This commit implements a solution based on an intermediate rpm database configuration. KIWI creates the macros.kiwi file inside of the image root which is read by any call of rpm in the inner and outer system. During bootstrap phase the rpm dbpath from the host system is used and later in the install phase the dbpath from the rpm package as it was installed by the target image distribution is used. In case of a dbpath difference the database is automatically moved to the new location by setting the _dbpath_rebuild macro to the correct location. At the end the custom KIWI macro is deleted. As this process allows custom macro defintions during the KIWI run it also serves as the base for a solution to Issue #771 which will be done in a follow up request to this commit. Also the workaround for bsc#1112357 which uses a static dbpath to store an optionally given signing key will be addressed with this commit. The macro setup happens before the import_trusted_keys method which makes any specification for a strict dbpath obsolete. Last the implementation deletes the obsolete dump_reload_package_database code. rpm is able to automatically do the conversion of different db versions such that the code in kiwi is obsolete. In addition that code only worked for rather old db versions. The public API has not changed though, but the method is marked obsolete and does nothing anymore. In addition to the deletion of obsolete code a new API method post_process_install_requests_bootstrap has been introduced to handle actions required after bootstrap and before installing of packages from inside the new image
160 lines
5.5 KiB
Python
160 lines
5.5 KiB
Python
from mock import patch
|
|
import mock
|
|
|
|
from .test_helper import raises
|
|
|
|
from kiwi.package_manager.dnf import PackageManagerDnf
|
|
from kiwi.exceptions import KiwiRequestError
|
|
|
|
|
|
class TestPackageManagerDnf(object):
|
|
def setup(self):
|
|
repository = mock.Mock()
|
|
repository.root_dir = 'root-dir'
|
|
|
|
root_bind = mock.Mock()
|
|
root_bind.move_to_root = mock.Mock(
|
|
return_value=['root-moved-arguments']
|
|
)
|
|
repository.root_bind = root_bind
|
|
|
|
repository.runtime_config = mock.Mock(
|
|
return_value={
|
|
'dnf_args': ['-c', 'dnf.conf', '-y'],
|
|
'command_env': ['env']
|
|
}
|
|
)
|
|
self.manager = PackageManagerDnf(repository)
|
|
|
|
def test_request_package(self):
|
|
self.manager.request_package('name')
|
|
assert self.manager.package_requests == ['name']
|
|
|
|
def test_request_collection(self):
|
|
self.manager.request_collection('name')
|
|
assert self.manager.collection_requests == ['"name"']
|
|
|
|
def test_request_product(self):
|
|
self.manager.request_product('name')
|
|
assert self.manager.product_requests == []
|
|
|
|
def test_request_package_exclusion(self):
|
|
self.manager.request_package_exclusion('name')
|
|
assert self.manager.exclude_requests == ['name']
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command.Command.run')
|
|
def test_process_install_requests_bootstrap(self, mock_run, mock_call):
|
|
self.manager.request_package('vim')
|
|
self.manager.request_collection('collection')
|
|
self.manager.process_install_requests_bootstrap()
|
|
mock_run.assert_called_once_with(
|
|
['dnf', '-c', 'dnf.conf', '-y', 'makecache']
|
|
)
|
|
mock_call.assert_called_once_with(
|
|
[
|
|
'bash', '-c',
|
|
'dnf -c dnf.conf -y --installroot root-dir install vim && '
|
|
'dnf -c dnf.conf -y --installroot root-dir group install '
|
|
'"collection"'
|
|
], ['env']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
def test_process_install_requests(self, mock_call):
|
|
self.manager.request_package('vim')
|
|
self.manager.request_collection('collection')
|
|
self.manager.request_package_exclusion('skipme')
|
|
self.manager.process_install_requests()
|
|
self.manager.root_bind.move_to_root(
|
|
self.manager.dnf_args
|
|
)
|
|
mock_call.assert_called_once_with(
|
|
[
|
|
'bash', '-c',
|
|
'chroot root-dir dnf root-moved-arguments '
|
|
'--exclude=skipme install vim && '
|
|
'chroot root-dir dnf root-moved-arguments '
|
|
'--exclude=skipme group install '
|
|
'"collection"'
|
|
], ['env']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command.Command.run')
|
|
def test_process_delete_requests_force(self, mock_run, mock_call):
|
|
self.manager.request_package('vim')
|
|
self.manager.process_delete_requests(True)
|
|
mock_call.assert_called_once_with(
|
|
[
|
|
'chroot', 'root-dir', 'rpm', '-e',
|
|
'--nodeps', '--allmatches', '--noscripts', 'vim'
|
|
],
|
|
[
|
|
'env'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command.Command.run')
|
|
def test_process_delete_requests_no_force(self, mock_run, mock_call):
|
|
self.manager.request_package('vim')
|
|
self.manager.process_delete_requests()
|
|
mock_call.assert_called_once_with(
|
|
[
|
|
'chroot', 'root-dir', 'dnf',
|
|
'root-moved-arguments', 'autoremove', 'vim'
|
|
],
|
|
['env']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch('kiwi.command.Command.call')
|
|
@raises(KiwiRequestError)
|
|
def test_process_delete_requests_package_missing(
|
|
self, mock_call, mock_run
|
|
):
|
|
mock_run.side_effect = Exception
|
|
self.manager.request_package('vim')
|
|
self.manager.process_delete_requests()
|
|
mock_run.assert_called_once_with(
|
|
['chroot', 'root-dir', 'rpm', '-q', 'vim']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
def test_update(self, mock_call):
|
|
self.manager.update()
|
|
self.manager.root_bind.move_to_root(
|
|
self.manager.dnf_args
|
|
)
|
|
mock_call.assert_called_once_with(
|
|
[
|
|
'chroot', 'root-dir', 'dnf',
|
|
'root-moved-arguments', 'upgrade'
|
|
], ['env']
|
|
)
|
|
|
|
def test_process_only_required(self):
|
|
self.manager.process_only_required()
|
|
assert self.manager.custom_args == ['--setopt=install_weak_deps=False']
|
|
|
|
def test_process_plus_recommended(self):
|
|
self.manager.process_only_required()
|
|
assert self.manager.custom_args == ['--setopt=install_weak_deps=False']
|
|
self.manager.process_plus_recommended()
|
|
assert \
|
|
'--setopt=install_weak_deps=False' not in self.manager.custom_args
|
|
|
|
def test_match_package_installed(self):
|
|
assert self.manager.match_package_installed('foo', 'Installing : foo')
|
|
|
|
def test_match_package_deleted(self):
|
|
assert self.manager.match_package_deleted('foo', 'Removing: foo')
|
|
|
|
@patch('kiwi.package_manager.dnf.RpmDataBase')
|
|
def test_post_process_install_requests_bootstrap(self, mock_RpmDataBase):
|
|
rpmdb = mock.Mock()
|
|
mock_RpmDataBase.return_value = rpmdb
|
|
self.manager.post_process_install_requests_bootstrap()
|
|
rpmdb.set_database_to_image_path.assert_called_once_with()
|