kiwi-el8/test/unit/builder_live_test.py
Marcus Schäfer 37c8851d12
Make sure profile env is included in live images
For all images which boots via dracut the .profile file is included
except for live iso's because no information is needed from that file
to boot or customize the boot. However the .profile contains the
kiwi_revision information which is useful for any image type.
This Fixes #755
2018-06-04 11:18:13 +02:00

349 lines
12 KiB
Python

from mock import patch
from mock import call
import mock
import kiwi
from .test_helper import raises, patch_open
from kiwi.exceptions import KiwiLiveBootImageError
from kiwi.builder.live import LiveImageBuilder
class TestLiveImageBuilder(object):
@patch('platform.machine')
def setup(self, mock_machine):
mock_machine.return_value = 'x86_64'
self.firmware = mock.Mock()
self.firmware.efi_mode = mock.Mock(
return_value='uefi'
)
kiwi.builder.live.FirmWare = mock.Mock(
return_value=self.firmware
)
self.setup = mock.Mock()
kiwi.builder.live.SystemSetup = mock.Mock(
return_value=self.setup
)
self.filesystem = mock.Mock()
kiwi.builder.live.FileSystem = mock.Mock(
return_value=self.filesystem
)
self.filesystem_setup = mock.Mock()
kiwi.builder.live.FileSystemSetup = mock.Mock(
return_value=self.filesystem_setup
)
self.loop = mock.Mock()
kiwi.builder.live.LoopDevice = mock.Mock(
return_value=self.loop
)
self.bootloader = mock.Mock()
kiwi.builder.live.BootLoaderConfig = mock.Mock(
return_value=self.bootloader
)
self.boot_image_task = mock.Mock()
self.boot_image_task.boot_root_directory = 'initrd_dir'
self.boot_image_task.initrd_filename = 'initrd'
kiwi.builder.live.BootImageDracut = mock.Mock(
return_value=self.boot_image_task
)
self.mbrid = mock.Mock()
self.mbrid.get_id = mock.Mock(
return_value='0xffffffff'
)
kiwi.builder.live.SystemIdentifier = mock.Mock(
return_value=self.mbrid
)
kiwi.builder.live.Path = mock.Mock()
self.kernel = mock.Mock()
self.kernel.get_kernel = mock.Mock()
self.kernel.get_xen_hypervisor = mock.Mock()
self.kernel.copy_kernel = mock.Mock()
self.kernel.copy_xen_hypervisor = mock.Mock()
kiwi.builder.live.Kernel = mock.Mock(
return_value=self.kernel
)
self.xml_state = mock.Mock()
self.xml_state.get_fs_mount_option_list = mock.Mock(
return_value='async'
)
self.xml_state.build_type.get_flags = mock.Mock(
return_value=None
)
self.xml_state.get_image_version = mock.Mock(
return_value='1.2.3'
)
self.xml_state.xml_data.get_name = mock.Mock(
return_value='result-image'
)
self.xml_state.build_type.get_volid = mock.Mock(
return_value='volid'
)
self.xml_state.build_type.get_kernelcmdline = mock.Mock(
return_value='custom_cmdline'
)
self.xml_state.build_type.get_mediacheck = mock.Mock(
return_value=True
)
self.xml_state.build_type.get_publisher = mock.Mock(
return_value='Custom publisher'
)
self.live_image = LiveImageBuilder(
self.xml_state, 'target_dir', 'root_dir',
custom_args={'signing_keys': ['key_file_a', 'key_file_b']}
)
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.result = mock.Mock()
self.live_image.result = self.result
@patch('platform.machine')
def test_init_for_ix86_platform(self, mock_machine):
xml_state = mock.Mock()
xml_state.xml_data.get_name = mock.Mock(
return_value='some-image'
)
xml_state.get_image_version = mock.Mock(
return_value='1.2.3'
)
mock_machine.return_value = 'i686'
live_image = LiveImageBuilder(
xml_state, 'target_dir', 'root_dir'
)
assert live_image.arch == 'ix86'
@patch('kiwi.builder.live.mkdtemp')
@patch('kiwi.builder.live.NamedTemporaryFile')
@patch('kiwi.builder.live.shutil')
@patch('kiwi.builder.live.Iso.set_media_tag')
@patch('kiwi.builder.live.FileSystemIsoFs')
@patch('kiwi.builder.live.SystemSize')
@patch('kiwi.builder.live.Defaults.get_grub_boot_directory_name')
@patch('os.path.exists')
@patch_open
def test_create_overlay_structure(
self, mock_open, mock_exists, mock_grub_dir, mock_size,
mock_isofs, mock_tag, mock_shutil, mock_tmpfile, mock_dtemp
):
tempfile = mock.Mock()
tempfile.name = 'tmpfile'
mock_tmpfile.return_value = tempfile
mock_exists.return_value = True
mock_grub_dir.return_value = 'grub2'
tmpdir_name = ['temp-squashfs', 'temp_media_dir']
def side_effect(prefix, dir):
return tmpdir_name.pop()
mock_dtemp.side_effect = side_effect
mock_open.return_value = self.context_manager_mock
self.live_image.live_type = 'overlay'
iso_image = mock.Mock()
iso_image.create_on_file.return_value = 'offset'
mock_isofs.return_value = iso_image
rootsize = mock.Mock()
rootsize.accumulate_mbyte_file_sizes = mock.Mock(
return_value=8192
)
mock_size.return_value = rootsize
self.setup.export_package_verification.return_value = '.verified'
self.setup.export_package_list.return_value = '.packages'
self.live_image.create()
self.setup.import_cdroot_files.assert_called_once_with('temp_media_dir')
assert kiwi.builder.live.FileSystem.call_args_list == [
call(
custom_args={'mount_options': 'async'},
device_provider=self.loop, name='ext4',
root_dir='root_dir/'
),
call(
device_provider=None, name='squashfs',
root_dir='temp-squashfs'
)
]
self.filesystem.create_on_device.assert_called_once_with()
self.filesystem.sync_data.assert_called_once_with(
['image', '.profile', '.kconfig', '.buildenv', 'var/cache/kiwi']
)
self.filesystem.create_on_file.assert_called_once_with('tmpfile')
assert mock_shutil.copy.call_args_list == [
call('tmpfile', 'temp-squashfs/LiveOS/rootfs.img'),
call('tmpfile', 'temp_media_dir/LiveOS/squashfs.img')
]
self.setup.call_edit_boot_config_script.assert_called_once_with(
boot_part_id=1, filesystem='iso:temp_media_dir',
working_directory='root_dir'
)
assert call(
'root_dir/etc/dracut.conf.d/02-livecd.conf', 'w'
) in mock_open.call_args_list
assert self.file_mock.write.call_args_list == [
call('add_dracutmodules+=" kiwi-live pollcdrom "\n'),
call(
'omit_dracutmodules+=" '
'kiwi-dump kiwi-overlay kiwi-repart kiwi-lib multipath "\n'
),
call('hostonly="no"\n'),
call('dracut_rescue_image="no"\n')
]
assert kiwi.builder.live.BootLoaderConfig.call_args_list[0] == call(
'isolinux', self.xml_state, 'temp_media_dir'
)
assert self.bootloader.setup_live_boot_images.call_args_list[0] == call(
lookup_path=self.live_image.boot_image.boot_root_directory,
mbrid=None
)
assert self.bootloader.setup_live_image_config.call_args_list[0] == \
call(mbrid=None)
assert self.bootloader.write.call_args_list[0] == call()
assert kiwi.builder.live.BootLoaderConfig.call_args_list[1] == call(
'grub2', self.xml_state, 'temp_media_dir',
{'grub_directory_name': 'grub2'}
)
assert self.bootloader.setup_live_boot_images.call_args_list[1] == call(
lookup_path='root_dir', mbrid=self.mbrid
)
assert self.bootloader.setup_live_image_config.call_args_list[1] == \
call(mbrid=self.mbrid)
assert self.bootloader.write.call_args_list[1] == call()
self.boot_image_task.prepare.assert_called_once_with()
self.boot_image_task.create_initrd.assert_called_once_with(
self.mbrid
)
self.kernel.copy_kernel.assert_called_once_with(
'temp_media_dir/boot/x86_64/loader', '/linux'
)
self.kernel.copy_xen_hypervisor.assert_called_once_with(
'temp_media_dir/boot/x86_64/loader', '/xen.gz'
)
mock_shutil.move.assert_called_once_with(
'initrd', 'temp_media_dir/boot/x86_64/loader/initrd'
)
mock_size.assert_called_once_with(
'temp_media_dir'
)
rootsize.accumulate_mbyte_file_sizes.assert_called_once_with()
mock_isofs.assert_called_once_with(
custom_args={
'meta_data': {
'mbr_id': '0xffffffff',
'preparer': 'KIWI - http://suse.github.com/kiwi',
'publisher': 'Custom publisher',
'volume_id': 'volid',
'efi_mode': 'uefi',
'udf': True
}
}, device_provider=None, root_dir='temp_media_dir'
)
iso_image.create_on_file.assert_called_once_with(
'target_dir/result-image.x86_64-1.2.3.iso'
)
assert self.result.add.call_args_list == [
call(
key='live_image',
filename='target_dir/result-image.x86_64-1.2.3.iso',
use_for_bundle=True,
compress=False,
shasum=True
),
call(
key='image_packages',
filename='.packages',
use_for_bundle=True,
compress=False,
shasum=False
),
call(
key='image_verified',
filename='.verified',
use_for_bundle=True,
compress=False,
shasum=False
)
]
self.setup.export_package_verification.assert_called_once_with(
'target_dir'
)
self.setup.export_package_list.assert_called_once_with(
'target_dir'
)
@patch('kiwi.builder.live.mkdtemp')
@patch('kiwi.builder.live.shutil')
@patch_open
@raises(KiwiLiveBootImageError)
def test_create_no_kernel_found(self, mock_open, mock_shutil, mock_dtemp):
mock_dtemp.return_value = 'tmpdir'
self.kernel.get_kernel.return_value = False
self.live_image.create()
@patch('kiwi.builder.live.mkdtemp')
@patch('kiwi.builder.live.shutil')
@patch_open
@raises(KiwiLiveBootImageError)
def test_create_no_hypervisor_found(
self, mock_open, mock_shutil, mock_dtemp
):
mock_dtemp.return_value = 'tmpdir'
self.kernel.get_xen_hypervisor.return_value = False
self.live_image.create()
@patch('kiwi.builder.live.mkdtemp')
@patch('kiwi.builder.live.shutil')
@patch('os.path.exists')
@patch_open
@raises(KiwiLiveBootImageError)
def test_create_no_initrd_found(
self, mock_open, mock_exists, mock_shutil, mock_dtemp
):
mock_dtemp.return_value = 'tmpdir'
mock_exists.return_value = False
self.live_image.create()
@patch('kiwi.builder.live.Path.wipe')
def test_destructor(self, mock_wipe):
self.live_image.media_dir = 'media-dir'
self.live_image.live_container_dir = 'container-dir'
self.live_image.__del__()
assert mock_wipe.call_args_list == [
call('media-dir'),
call('container-dir')
]
self.live_image.media_dir = None
self.live_image.live_container_dir = None