Call chkstat in system mode which reads /etc/sysconfig/security to determine the configured security level and applies the appropriate permission definitions from the /etc/permissions* files. It's possible to provide those files as overlay files in the image description to apply a certain permission setup when needed. Otherwise the default setup as provided on the package level applies. It's required that the image root system has chkstat installed. If not present KIWI skips this step and continuous with a warning. This Fixes #895
976 lines
34 KiB
Python
976 lines
34 KiB
Python
|
|
from mock import patch
|
|
from mock import call
|
|
|
|
import mock
|
|
|
|
from .test_helper import raises, patch_open
|
|
from collections import namedtuple
|
|
|
|
from kiwi.system.setup import SystemSetup
|
|
from kiwi.xml_description import XMLDescription
|
|
from kiwi.xml_state import XMLState
|
|
from kiwi.exceptions import (
|
|
KiwiScriptFailed,
|
|
KiwiImportDescriptionError,
|
|
KiwiCommandError
|
|
)
|
|
from kiwi.defaults import Defaults
|
|
|
|
|
|
class TestSystemSetup(object):
|
|
@patch('platform.machine')
|
|
def setup(self, mock_machine):
|
|
mock_machine.return_value = 'x86_64'
|
|
self.context_manager_mock = mock.Mock()
|
|
self.file_mock = mock.Mock()
|
|
self.enter_mock = mock.Mock()
|
|
self.exit_mock = mock.Mock()
|
|
self.enter_mock.return_value = self.file_mock
|
|
setattr(self.context_manager_mock, '__enter__', self.enter_mock)
|
|
setattr(self.context_manager_mock, '__exit__', self.exit_mock)
|
|
self.xml_state = mock.MagicMock()
|
|
self.xml_state.get_package_manager = mock.Mock(
|
|
return_value='zypper'
|
|
)
|
|
self.xml_state.build_type.get_filesystem = mock.Mock(
|
|
return_value='ext3'
|
|
)
|
|
self.xml_state.xml_data.get_name = mock.Mock(
|
|
return_value='some-image'
|
|
)
|
|
self.xml_state.get_image_version = mock.Mock(
|
|
return_value='1.2.3'
|
|
)
|
|
self.xml_state.xml_data.description_dir = 'description_dir'
|
|
self.setup = SystemSetup(
|
|
self.xml_state, 'root_dir'
|
|
)
|
|
description = XMLDescription(
|
|
description='../data/example_config.xml',
|
|
derived_from='derived/description'
|
|
)
|
|
self.setup_with_real_xml = SystemSetup(
|
|
XMLState(description.load()), 'root_dir'
|
|
)
|
|
command_run = namedtuple(
|
|
'command', ['output', 'error', 'returncode']
|
|
)
|
|
self.run_result = command_run(
|
|
output='password-hash\n',
|
|
error='stderr',
|
|
returncode=0
|
|
)
|
|
|
|
@patch('platform.machine')
|
|
def test_setup_ix86(self, mock_machine):
|
|
mock_machine.return_value = 'i686'
|
|
setup = SystemSetup(
|
|
mock.MagicMock(), 'root_dir'
|
|
)
|
|
assert setup.arch == 'ix86'
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
@patch('kiwi.system.setup.glob.iglob')
|
|
def test_import_description(
|
|
self, mock_iglob, mock_path, mock_open, mock_command
|
|
):
|
|
mock_iglob.return_value = ['config-cdroot.tar.xz']
|
|
mock_path.return_value = True
|
|
self.setup_with_real_xml.import_description()
|
|
|
|
mock_iglob.assert_called_once_with(
|
|
'../data/config-cdroot.tar*'
|
|
)
|
|
assert mock_command.call_args_list == [
|
|
call(['mkdir', '-p', 'root_dir/image']),
|
|
call(['cp', '../data/config.sh', 'root_dir/image/config.sh']),
|
|
call([
|
|
'cp', '../data/my_edit_boot_script',
|
|
'root_dir/image/edit_boot_config.sh'
|
|
]),
|
|
call([
|
|
'cp', '/absolute/path/to/my_edit_boot_install',
|
|
'root_dir/image/edit_boot_install.sh'
|
|
]),
|
|
call(['cp', '../data/images.sh', 'root_dir/image/images.sh']),
|
|
call([
|
|
'cp', Defaults.project_file('config/functions.sh'),
|
|
'root_dir/.kconfig'
|
|
]),
|
|
call(['cp', '/absolute/path/to/image.tgz', 'root_dir/image/']),
|
|
call(['cp', '../data/bootstrap.tgz', 'root_dir/image/']),
|
|
call(['cp', 'config-cdroot.tar.xz', 'root_dir/image/'])
|
|
]
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
def test_import_description_archive_from_derived(
|
|
self, mock_path, mock_open, mock_command
|
|
):
|
|
path_return_values = [
|
|
True, False, True, True, True, True, True
|
|
]
|
|
|
|
def side_effect(arg):
|
|
return path_return_values.pop()
|
|
|
|
mock_path.side_effect = side_effect
|
|
self.setup_with_real_xml.import_description()
|
|
|
|
assert mock_command.call_args_list == [
|
|
call(['mkdir', '-p', 'root_dir/image']),
|
|
call(['cp', '../data/config.sh', 'root_dir/image/config.sh']),
|
|
call([
|
|
'cp', '../data/my_edit_boot_script',
|
|
'root_dir/image/edit_boot_config.sh'
|
|
]),
|
|
call([
|
|
'cp', '/absolute/path/to/my_edit_boot_install',
|
|
'root_dir/image/edit_boot_install.sh'
|
|
]),
|
|
call(['cp', '../data/images.sh', 'root_dir/image/images.sh']),
|
|
call([
|
|
'cp', Defaults.project_file('config/functions.sh'),
|
|
'root_dir/.kconfig'
|
|
]),
|
|
call(['cp', '/absolute/path/to/image.tgz', 'root_dir/image/']),
|
|
call([
|
|
'cp', 'derived/description/bootstrap.tgz', 'root_dir/image/'
|
|
])
|
|
]
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
@raises(KiwiImportDescriptionError)
|
|
def test_import_description_configured_editboot_scripts_not_found(
|
|
self, mock_path, mock_open, mock_command
|
|
):
|
|
path_return_values = [False, True, True]
|
|
|
|
def side_effect(arg):
|
|
return path_return_values.pop()
|
|
|
|
mock_path.side_effect = side_effect
|
|
self.setup_with_real_xml.import_description()
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
@raises(KiwiImportDescriptionError)
|
|
def test_import_description_configured_archives_not_found(
|
|
self, mock_path, mock_open, mock_command
|
|
):
|
|
path_return_values = [False, False, True, True, True, True]
|
|
|
|
def side_effect(arg):
|
|
return path_return_values.pop()
|
|
|
|
mock_path.side_effect = side_effect
|
|
self.setup_with_real_xml.import_description()
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
def test_cleanup(self, mock_command):
|
|
self.setup.cleanup()
|
|
mock_command.assert_called_once_with(
|
|
['rm', '-r', '-f', '/.kconfig', '/image']
|
|
)
|
|
|
|
@patch_open
|
|
def test_import_shell_environment(self, mock_open):
|
|
mock_profile = mock.MagicMock()
|
|
mock_profile.create = mock.Mock(
|
|
return_value=['a']
|
|
)
|
|
mock_open.return_value = self.context_manager_mock
|
|
self.setup.import_shell_environment(mock_profile)
|
|
mock_profile.create.assert_called_once_with()
|
|
mock_open.assert_called_once_with('root_dir/.profile', 'w')
|
|
self.file_mock.write.assert_called_once_with('a\n')
|
|
|
|
@patch('kiwi.system.setup.ArchiveTar')
|
|
@patch('kiwi.system.setup.glob.iglob')
|
|
def test_import_cdroot_files(self, mock_iglob, mock_ArchiveTar):
|
|
archive = mock.Mock()
|
|
mock_ArchiveTar.return_value = archive
|
|
mock_iglob.return_value = ['config-cdroot.tar.xz']
|
|
self.setup.import_cdroot_files('target_dir')
|
|
mock_iglob.assert_called_once_with('description_dir/config-cdroot.tar*')
|
|
mock_ArchiveTar.assert_called_once_with('config-cdroot.tar.xz')
|
|
archive.extract.assert_called_once_with('target_dir')
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch('kiwi.system.setup.DataSync')
|
|
@patch('os.path.exists')
|
|
def test_import_overlay_files_copy_links(
|
|
self, mock_os_path, mock_DataSync, mock_command
|
|
):
|
|
data = mock.Mock()
|
|
mock_DataSync.return_value = data
|
|
mock_os_path.return_value = True
|
|
self.setup.import_overlay_files(
|
|
follow_links=True, preserve_owner_group=True
|
|
)
|
|
mock_DataSync.assert_called_once_with(
|
|
'description_dir/root/', 'root_dir'
|
|
)
|
|
data.sync_data.assert_called_once_with(
|
|
options=[
|
|
'-r', '-p', '-t', '-D', '-H', '-X', '-A',
|
|
'--one-file-system', '--copy-links', '-o', '-g'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch('kiwi.system.setup.DataSync')
|
|
@patch('os.path.exists')
|
|
def test_import_overlay_files_links(
|
|
self, mock_os_path, mock_DataSync, mock_command
|
|
):
|
|
data = mock.Mock()
|
|
mock_DataSync.return_value = data
|
|
mock_os_path.return_value = True
|
|
self.setup.import_overlay_files(
|
|
follow_links=False, preserve_owner_group=True
|
|
)
|
|
mock_DataSync.assert_called_once_with(
|
|
'description_dir/root/', 'root_dir'
|
|
)
|
|
data.sync_data.assert_called_once_with(
|
|
options=[
|
|
'-r', '-p', '-t', '-D', '-H', '-X', '-A',
|
|
'--one-file-system', '--links', '-o', '-g'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.system.setup.ArchiveTar')
|
|
@patch('os.path.exists')
|
|
def test_import_overlay_files_from_archive(
|
|
self, mock_os_path, mock_archive
|
|
):
|
|
archive = mock.Mock()
|
|
mock_archive.return_value = archive
|
|
|
|
exists_results = [True, False]
|
|
|
|
def side_effect(arg):
|
|
return exists_results.pop()
|
|
|
|
mock_os_path.side_effect = side_effect
|
|
|
|
self.setup.import_overlay_files()
|
|
|
|
mock_archive.assert_called_once_with(
|
|
'description_dir/root.tar.gz'
|
|
)
|
|
archive.extract.assert_called_once_with(
|
|
'root_dir'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Shell.run_common_function')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('os.path.exists')
|
|
def test_setup_keyboard_map(self, mock_path, mock_run, mock_shell):
|
|
mock_path.return_value = True
|
|
self.setup.preferences['keytable'] = 'keytable'
|
|
self.setup.setup_keyboard_map()
|
|
mock_shell.assert_called_once_with(
|
|
'baseUpdateSysConfig', [
|
|
'root_dir/etc/sysconfig/keyboard', 'KEYTABLE', '"keytable"'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.system.setup.CommandCapabilities.has_option_in_help')
|
|
@patch('kiwi.system.setup.Shell.run_common_function')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('os.path.exists')
|
|
def test_setup_keyboard_map_with_systemd(
|
|
self, mock_path, mock_run, mock_shell, mock_caps
|
|
):
|
|
mock_caps.return_value = True
|
|
mock_path.return_value = True
|
|
self.setup.preferences['keytable'] = 'keytable'
|
|
self.setup.setup_keyboard_map()
|
|
mock_run.assert_has_calls([
|
|
call(['rm', '-r', '-f', 'root_dir/etc/vconsole.conf']),
|
|
call([
|
|
'chroot', 'root_dir', 'systemd-firstboot',
|
|
'--keymap=keytable'
|
|
])
|
|
])
|
|
|
|
@patch('kiwi.logger.log.warning')
|
|
@patch('os.path.exists')
|
|
def test_setup_keyboard_skipped(self, mock_exists, mock_log_warn):
|
|
mock_exists.return_value = False
|
|
self.setup.preferences['keytable'] = 'keytable'
|
|
self.setup.setup_keyboard_map()
|
|
assert mock_log_warn.called
|
|
|
|
@patch('kiwi.system.setup.Shell.run_common_function')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('os.path.exists')
|
|
def test_setup_locale(self, mock_path, mock_run, mock_shell):
|
|
mock_path.return_value = True
|
|
self.setup.preferences['locale'] = 'locale1,locale2'
|
|
self.setup.setup_locale()
|
|
mock_shell.assert_called_once_with(
|
|
'baseUpdateSysConfig', [
|
|
'root_dir/etc/sysconfig/language', 'RC_LANG', 'locale1.UTF-8'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.system.setup.CommandCapabilities.has_option_in_help')
|
|
@patch('kiwi.system.setup.Shell.run_common_function')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('os.path.exists')
|
|
def test_setup_locale_with_systemd(
|
|
self, mock_path, mock_run, mock_shell, mock_caps
|
|
):
|
|
mock_caps.return_valure = True
|
|
mock_path.return_value = True
|
|
self.setup.preferences['locale'] = 'locale1,locale2'
|
|
self.setup.setup_locale()
|
|
mock_run.assert_has_calls([
|
|
call(['rm', '-r', '-f', 'root_dir/etc/locale.conf']),
|
|
call([
|
|
'chroot', 'root_dir', 'systemd-firstboot',
|
|
'--locale=locale1.UTF-8'
|
|
])
|
|
])
|
|
|
|
@patch('kiwi.system.setup.Shell.run_common_function')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('os.path.exists')
|
|
def test_setup_locale_POSIX(self, mock_path, mock_run, mock_shell):
|
|
mock_path.return_value = True
|
|
self.setup.preferences['locale'] = 'POSIX,locale2'
|
|
self.setup.setup_locale()
|
|
mock_shell.assert_called_once_with(
|
|
'baseUpdateSysConfig', [
|
|
'root_dir/etc/sysconfig/language', 'RC_LANG', 'POSIX'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.logger.log.warning')
|
|
@patch('os.path.exists')
|
|
def test_setup_locale_skipped(self, mock_exists, mock_log_warn):
|
|
mock_exists.return_value = False
|
|
self.setup.preferences['locale'] = 'locale1,locale2'
|
|
self.setup.setup_locale()
|
|
assert mock_log_warn.called
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_setup_timezone(self, mock_command):
|
|
self.setup.preferences['timezone'] = 'timezone'
|
|
self.setup.setup_timezone()
|
|
mock_command.assert_has_calls([
|
|
call([
|
|
'chroot', 'root_dir', 'ln', '-s', '-f',
|
|
'/usr/share/zoneinfo/timezone', '/etc/localtime'
|
|
])
|
|
])
|
|
|
|
@patch('kiwi.system.setup.CommandCapabilities.has_option_in_help')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_setup_timezone_with_systemd(self, mock_command, mock_caps):
|
|
mock_caps.return_value = True
|
|
self.setup.preferences['timezone'] = 'timezone'
|
|
self.setup.setup_timezone()
|
|
mock_command.assert_has_calls([
|
|
call(['rm', '-r', '-f', 'root_dir/etc/localtime']),
|
|
call([
|
|
'chroot', 'root_dir', 'systemd-firstboot',
|
|
'--timezone=timezone'
|
|
])
|
|
])
|
|
|
|
@patch('kiwi.system.setup.Users')
|
|
def test_setup_groups(self, mock_users):
|
|
users = mock.Mock()
|
|
users.group_exists = mock.Mock(
|
|
return_value=False
|
|
)
|
|
mock_users.return_value = users
|
|
|
|
self.setup_with_real_xml.setup_groups()
|
|
|
|
calls = [
|
|
call('users'),
|
|
call('kiwi'),
|
|
call('admin')
|
|
]
|
|
users.group_exists.assert_has_calls(calls)
|
|
|
|
calls = [
|
|
call('users', []),
|
|
call('kiwi', []),
|
|
call('admin', [])
|
|
]
|
|
users.group_add.assert_has_calls(calls)
|
|
|
|
@patch('kiwi.system.setup.Users')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_setup_users_add(self, mock_command, mock_users):
|
|
users = mock.Mock()
|
|
users.user_exists = mock.Mock(
|
|
return_value=False
|
|
)
|
|
mock_users.return_value = users
|
|
mock_command.return_value = self.run_result
|
|
|
|
self.setup_with_real_xml.setup_users()
|
|
|
|
calls = [
|
|
call('root'),
|
|
call('tux'),
|
|
call('kiwi')
|
|
]
|
|
users.user_exists.assert_has_calls(calls)
|
|
|
|
calls = [
|
|
call(
|
|
'root', [
|
|
'-p', 'password-hash',
|
|
'-s', '/bin/bash',
|
|
'-u', '815', '-c', 'Bob',
|
|
'-m', '-d', '/root'
|
|
]
|
|
),
|
|
call(
|
|
'tux', [
|
|
'-p', 'password-hash',
|
|
'-g', 'users',
|
|
'-m', '-d', '/home/tux'
|
|
]
|
|
),
|
|
call(
|
|
'kiwi', [
|
|
'-p', 'password-hash',
|
|
'-g', 'kiwi', '-G', 'admin,users',
|
|
'-m', '-d', '/home/kiwi'
|
|
]
|
|
)
|
|
]
|
|
users.user_add.assert_has_calls(calls)
|
|
|
|
mock_command.assert_called_with(
|
|
['openssl', 'passwd', '-1', '-salt', 'xyz', 'mypwd']
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Users')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_setup_users_modify(self, mock_command, mock_users):
|
|
users = mock.Mock()
|
|
users.user_exists = mock.Mock(
|
|
return_value=True
|
|
)
|
|
mock_users.return_value = users
|
|
mock_command.return_value = self.run_result
|
|
|
|
self.setup_with_real_xml.setup_users()
|
|
calls = [
|
|
call('root'),
|
|
call('tux'),
|
|
call('kiwi')
|
|
]
|
|
users.user_exists.assert_has_calls(calls)
|
|
|
|
calls = [
|
|
call(
|
|
'root', [
|
|
'-p', 'password-hash',
|
|
'-s', '/bin/bash', '-u', '815', '-c', 'Bob'
|
|
]
|
|
),
|
|
call(
|
|
'tux', [
|
|
'-p', 'password-hash',
|
|
'-g', 'users'
|
|
]
|
|
),
|
|
call(
|
|
'kiwi', [
|
|
'-p', 'password-hash',
|
|
'-g', 'kiwi', '-G', 'admin,users'
|
|
]
|
|
)
|
|
]
|
|
users.user_modify.assert_has_calls(calls)
|
|
|
|
@patch('kiwi.system.setup.Path.which')
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_setup_plymouth_splash(self, mock_command, mock_which):
|
|
mock_which.return_value = 'plymouth-set-default-theme'
|
|
preferences = mock.Mock()
|
|
preferences.get_bootsplash_theme = mock.Mock(
|
|
return_value=['some-theme']
|
|
)
|
|
self.xml_state.get_preferences_sections = mock.Mock(
|
|
return_value=[preferences]
|
|
)
|
|
self.setup.setup_plymouth_splash()
|
|
mock_which.assert_called_once_with(
|
|
custom_env={'PATH': 'root_dir/usr/sbin'},
|
|
filename='plymouth-set-default-theme'
|
|
)
|
|
mock_command.assert_called_once_with(
|
|
['chroot', 'root_dir', 'plymouth-set-default-theme', 'some-theme']
|
|
)
|
|
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
def test_import_image_identifier(self, mock_os_path, mock_open):
|
|
self.xml_state.xml_data.get_id = mock.Mock(
|
|
return_value='42'
|
|
)
|
|
mock_os_path.return_value = True
|
|
mock_open.return_value = self.context_manager_mock
|
|
self.setup.import_image_identifier()
|
|
mock_open.assert_called_once_with('root_dir/etc/ImageID', 'w')
|
|
self.file_mock.write.assert_called_once_with('42\n')
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
def test_call_config_script(self, mock_os_path, mock_watch, mock_command):
|
|
result_type = namedtuple(
|
|
'result', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=0)
|
|
mock_os_path.return_value = True
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_config_script()
|
|
mock_command.assert_called_once_with(
|
|
['chroot', 'root_dir', 'bash', '/image/config.sh']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
def test_call_image_script(self, mock_os_path, mock_watch, mock_command):
|
|
result_type = namedtuple(
|
|
'result_type', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=0)
|
|
mock_os_path.return_value = True
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_image_script()
|
|
mock_command.assert_called_once_with(
|
|
['chroot', 'root_dir', 'bash', '/image/images.sh']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
@patch('os.path.abspath')
|
|
def test_call_edit_boot_config_script(
|
|
self, mock_abspath, mock_exists, mock_watch, mock_command
|
|
):
|
|
result_type = namedtuple(
|
|
'result_type', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=0)
|
|
mock_exists.return_value = True
|
|
mock_abspath.return_value = '/root_dir/image/edit_boot_config.sh'
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_edit_boot_config_script('ext4', 1)
|
|
mock_abspath.assert_called_once_with(
|
|
'root_dir/image/edit_boot_config.sh'
|
|
)
|
|
mock_command.assert_called_once_with([
|
|
'bash', '-c',
|
|
'cd root_dir && bash --norc /root_dir/image/edit_boot_config.sh ext4 1'
|
|
])
|
|
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
@patch('os.path.abspath')
|
|
def test_call_edit_boot_install_script(
|
|
self, mock_abspath, mock_exists, mock_watch, mock_command
|
|
):
|
|
result_type = namedtuple(
|
|
'result_type', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=0)
|
|
mock_exists.return_value = True
|
|
mock_abspath.return_value = '/root_dir/image/edit_boot_install.sh'
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_edit_boot_install_script(
|
|
'my_image.raw', '/dev/mapper/loop0p1'
|
|
)
|
|
mock_abspath.assert_called_once_with(
|
|
'root_dir/image/edit_boot_install.sh'
|
|
)
|
|
mock_command.assert_called_once_with([
|
|
'bash', '-c',
|
|
'cd root_dir && bash --norc /root_dir/image/edit_boot_install.sh my_image.raw /dev/mapper/loop0p1'
|
|
])
|
|
|
|
@raises(KiwiScriptFailed)
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
def test_call_image_script_raises(
|
|
self, mock_os_path, mock_watch, mock_command
|
|
):
|
|
result_type = namedtuple(
|
|
'result_type', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=1)
|
|
mock_os_path.return_value = True
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_image_script()
|
|
|
|
@raises(KiwiScriptFailed)
|
|
@patch('kiwi.command.Command.call')
|
|
@patch('kiwi.command_process.CommandProcess.poll_and_watch')
|
|
@patch('os.path.exists')
|
|
def test_call_edit_boot_install_script_raises(
|
|
self, mock_os_path, mock_watch, mock_command
|
|
):
|
|
result_type = namedtuple(
|
|
'result_type', ['stderr', 'returncode']
|
|
)
|
|
mock_result = result_type(stderr='stderr', returncode=1)
|
|
mock_os_path.return_value = True
|
|
mock_watch.return_value = mock_result
|
|
self.setup.call_edit_boot_install_script(
|
|
'my_image.raw', '/dev/mapper/loop0p1'
|
|
)
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
def test_create_init_link_from_linuxrc(self, mock_command):
|
|
self.setup.create_init_link_from_linuxrc()
|
|
mock_command.assert_called_once_with(
|
|
['ln', 'root_dir/linuxrc', 'root_dir/init']
|
|
)
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
def test_create_recovery_archive_cleanup_only(self, mock_command):
|
|
self.setup.oemconfig['recovery'] = False
|
|
self.setup.create_recovery_archive()
|
|
assert mock_command.call_args_list[0] == call(
|
|
['bash', '-c', 'rm -f root_dir/recovery.*']
|
|
)
|
|
|
|
@patch_open
|
|
@patch('os.path.exists')
|
|
@patch('kiwi.system.setup.Path.wipe')
|
|
def test_create_fstab(self, mock_wipe, mock_exists, mock_open):
|
|
mock_exists.return_value = True
|
|
mock_open.return_value = self.context_manager_mock
|
|
self.file_mock.read.return_value = 'append_entry'
|
|
self.setup.create_fstab(['fstab_entry'])
|
|
|
|
assert mock_open.call_args_list == [
|
|
call('root_dir/etc/fstab', 'w'),
|
|
call('root_dir/etc/fstab.append', 'r')
|
|
]
|
|
assert self.file_mock.write.call_args_list == [
|
|
call('fstab_entry\n'),
|
|
call('append_entry')
|
|
]
|
|
mock_wipe.assert_called_once_with('root_dir/etc/fstab.append')
|
|
|
|
@patch('kiwi.command.Command.run')
|
|
@patch('kiwi.system.setup.NamedTemporaryFile')
|
|
@patch('kiwi.system.setup.ArchiveTar')
|
|
@patch_open
|
|
@patch('kiwi.system.setup.Compress')
|
|
@patch('os.path.getsize')
|
|
@patch('kiwi.system.setup.Path.wipe')
|
|
def test_create_recovery_archive(
|
|
self, mock_wipe, mock_getsize, mock_compress,
|
|
mock_open, mock_archive, mock_temp, mock_command
|
|
):
|
|
mock_open.return_value = self.context_manager_mock
|
|
mock_getsize.return_value = 42
|
|
compress = mock.Mock()
|
|
mock_compress.return_value = compress
|
|
archive = mock.Mock()
|
|
mock_archive.return_value = archive
|
|
tmpdir = mock.Mock()
|
|
tmpdir.name = 'tmpdir'
|
|
mock_temp.return_value = tmpdir
|
|
self.setup.oemconfig['recovery'] = True
|
|
self.setup.oemconfig['recovery_inplace'] = True
|
|
|
|
self.setup.create_recovery_archive()
|
|
|
|
assert mock_command.call_args_list[0] == call(
|
|
['bash', '-c', 'rm -f root_dir/recovery.*']
|
|
)
|
|
mock_archive.assert_called_once_with(
|
|
create_from_file_list=False, filename='tmpdir'
|
|
)
|
|
archive.create.assert_called_once_with(
|
|
exclude=['dev', 'proc', 'sys'],
|
|
options=[
|
|
'--numeric-owner',
|
|
'--hard-dereference',
|
|
'--preserve-permissions'
|
|
],
|
|
source_dir='root_dir'
|
|
)
|
|
assert mock_command.call_args_list[1] == call(
|
|
['mv', 'tmpdir', 'root_dir/recovery.tar']
|
|
)
|
|
assert mock_open.call_args_list[0] == call(
|
|
'root_dir/recovery.tar.filesystem', 'w'
|
|
)
|
|
assert self.file_mock.write.call_args_list[0] == call('ext3')
|
|
assert mock_command.call_args_list[2] == call(
|
|
['bash', '-c', 'tar -tf root_dir/recovery.tar | wc -l']
|
|
)
|
|
assert mock_open.call_args_list[1] == call(
|
|
'root_dir/recovery.tar.files', 'w'
|
|
)
|
|
assert mock_getsize.call_args_list[0] == call(
|
|
'root_dir/recovery.tar'
|
|
)
|
|
assert self.file_mock.write.call_args_list[1] == call('1\n')
|
|
assert mock_open.call_args_list[2] == call(
|
|
'root_dir/recovery.tar.size', 'w'
|
|
)
|
|
assert self.file_mock.write.call_args_list[2] == call('42')
|
|
mock_compress.assert_called_once_with(
|
|
'root_dir/recovery.tar'
|
|
)
|
|
compress.gzip.assert_called_once_with()
|
|
assert mock_getsize.call_args_list[1] == call(
|
|
'root_dir/recovery.tar.gz'
|
|
)
|
|
assert mock_open.call_args_list[3] == call(
|
|
'root_dir/recovery.partition.size', 'w'
|
|
)
|
|
assert self.file_mock.write.call_args_list[3] == call('300')
|
|
mock_wipe.assert_called_once_with(
|
|
'root_dir/recovery.tar.gz'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('kiwi.system.setup.Path.create')
|
|
@patch('kiwi.system.setup.DataSync')
|
|
@patch('os.path.exists')
|
|
def test_export_modprobe_setup(
|
|
self, mock_exists, mock_DataSync, mock_path, mock_command
|
|
):
|
|
data = mock.Mock()
|
|
mock_DataSync.return_value = data
|
|
mock_exists.return_value = True
|
|
self.setup.export_modprobe_setup('target_root_dir')
|
|
mock_path.assert_called_once_with('target_root_dir/etc')
|
|
mock_DataSync.assert_called_once_with(
|
|
'root_dir/etc/modprobe.d', 'target_root_dir/etc/'
|
|
)
|
|
data.sync_data.assert_called_once_with(
|
|
options=['-z', '-a']
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_list_rpm(
|
|
self, mock_open, mock_command
|
|
):
|
|
command = mock.Mock()
|
|
command.output = 'packages_data'
|
|
mock_command.return_value = command
|
|
result = self.setup.export_package_list('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.packages'
|
|
mock_command.assert_has_calls([
|
|
call(['chroot', 'root_dir', 'rpm', '-E', '%_dbpath']),
|
|
call([
|
|
'rpm', '--root', 'root_dir', '-qa', '--qf',
|
|
'%{NAME}|%{EPOCH}|%{VERSION}|%{RELEASE}|%{ARCH}|%{DISTURL}\\n',
|
|
'--dbpath', 'packages_data'
|
|
])
|
|
])
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.packages', 'w'
|
|
)
|
|
|
|
@patch_open
|
|
def test_setup_machine_id(self, mock_open):
|
|
self.setup.setup_machine_id()
|
|
mock_open.assert_called_once_with(
|
|
'root_dir/etc/machine-id', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch('kiwi.system.setup.Path.which')
|
|
@patch('kiwi.logger.log.warning')
|
|
def test_setup_permissions(
|
|
self, mock_log_warn, mock_path_which, mock_command
|
|
):
|
|
mock_path_which.return_value = 'chkstat'
|
|
self.setup.setup_permissions()
|
|
mock_command.assert_called_once_with(
|
|
['chroot', 'root_dir', 'chkstat', '--system', '--set']
|
|
)
|
|
mock_path_which.return_value = None
|
|
self.setup.setup_permissions()
|
|
mock_log_warn.assert_called_once()
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_list_rpm_no_dbpath(
|
|
self, mock_open, mock_command
|
|
):
|
|
cmd = mock.Mock()
|
|
cmd.output = 'packages_data'
|
|
|
|
def dbpath_check_fails(command):
|
|
if '%_dbpath' in command:
|
|
raise KiwiCommandError()
|
|
else:
|
|
return cmd
|
|
|
|
mock_command.side_effect = dbpath_check_fails
|
|
result = self.setup.export_package_list('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.packages'
|
|
mock_command.assert_has_calls([
|
|
call(['chroot', 'root_dir', 'rpm', '-E', '%_dbpath']),
|
|
call([
|
|
'rpm', '--root', 'root_dir', '-qa', '--qf',
|
|
'%{NAME}|%{EPOCH}|%{VERSION}|%{RELEASE}|%{ARCH}|%{DISTURL}\\n'
|
|
])
|
|
])
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.packages', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_list_dpkg(
|
|
self, mock_open, mock_command
|
|
):
|
|
command = mock.Mock()
|
|
command.output = 'packages_data'
|
|
mock_command.return_value = command
|
|
self.xml_state.get_package_manager = mock.Mock(
|
|
return_value='apt-get'
|
|
)
|
|
result = self.setup.export_package_list('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.packages'
|
|
mock_command.assert_called_once_with([
|
|
'dpkg-query', '--admindir', 'root_dir/var/lib/dpkg', '-W',
|
|
'-f', '${Package}|None|${Version}|None|${Architecture}|None\\n'
|
|
])
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.packages', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_verification(
|
|
self, mock_open, mock_command
|
|
):
|
|
command = mock.Mock()
|
|
command.output = 'verification_data'
|
|
mock_command.return_value = command
|
|
result = self.setup.export_package_verification('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.verified'
|
|
mock_command.assert_has_calls([
|
|
call(['chroot', 'root_dir', 'rpm', '-E', '%_dbpath']),
|
|
call(command=[
|
|
'rpm', '--root', 'root_dir', '-Va',
|
|
'--dbpath', 'verification_data'
|
|
], raise_on_error=False)
|
|
])
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.verified', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_verification_no_dbpath(
|
|
self, mock_open, mock_command
|
|
):
|
|
cmd = mock.Mock()
|
|
cmd.output = 'verification_data'
|
|
|
|
def dbpath_check_fails(command, raise_on_error):
|
|
if '%_dbpath' in command:
|
|
raise KiwiCommandError()
|
|
else:
|
|
return cmd
|
|
|
|
mock_command.side_effect = dbpath_check_fails
|
|
result = self.setup.export_package_verification('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.verified'
|
|
mock_command.assert_has_calls([
|
|
call(['chroot', 'root_dir', 'rpm', '-E', '%_dbpath']),
|
|
call(
|
|
command=['rpm', '--root', 'root_dir', '-Va'],
|
|
raise_on_error=False
|
|
)
|
|
])
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.verified', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
@patch_open
|
|
def test_export_package_verification_dpkg(
|
|
self, mock_open, mock_command
|
|
):
|
|
command = mock.Mock()
|
|
command.output = 'verification_data'
|
|
mock_command.return_value = command
|
|
self.xml_state.get_package_manager = mock.Mock(
|
|
return_value='apt-get'
|
|
)
|
|
result = self.setup.export_package_verification('target_dir')
|
|
assert result == 'target_dir/some-image.x86_64-1.2.3.verified'
|
|
mock_command.assert_called_once_with(
|
|
command=[
|
|
'dpkg', '--root', 'root_dir', '-V',
|
|
'--verify-format', 'rpm'
|
|
],
|
|
raise_on_error=False
|
|
)
|
|
mock_open.assert_called_once_with(
|
|
'target_dir/some-image.x86_64-1.2.3.verified', 'w'
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Command.run')
|
|
def test_set_selinux_file_contexts(self, mock_command):
|
|
self.setup.set_selinux_file_contexts('security_context_file')
|
|
mock_command.assert_called_once_with(
|
|
[
|
|
'chroot', 'root_dir',
|
|
'setfiles', 'security_context_file', '/', '-v'
|
|
]
|
|
)
|
|
|
|
@patch('kiwi.system.setup.Repository')
|
|
@patch('kiwi.system.setup.Uri')
|
|
def test_import_repositories_marked_as_imageinclude(
|
|
self, mock_uri, mock_repo
|
|
):
|
|
uri = mock.Mock()
|
|
mock_uri.return_value = uri
|
|
uri.translate = mock.Mock(
|
|
return_value="uri"
|
|
)
|
|
uri.alias = mock.Mock(
|
|
return_value="uri-alias"
|
|
)
|
|
uri.credentials_file_name = mock.Mock(
|
|
return_value='kiwiRepoCredentials'
|
|
)
|
|
mock_uri.return_value = uri
|
|
repo = mock.Mock()
|
|
mock_repo.return_value = repo
|
|
self.setup_with_real_xml.import_repositories_marked_as_imageinclude()
|
|
assert repo.add_repo.call_args_list[0] == call(
|
|
'uri-alias', 'uri', 'rpm-md', None, None, None, None, None,
|
|
'kiwiRepoCredentials', None, None
|
|
)
|