kiwi-el8/test/unit/storage_subformat_vmdk_test.py
Marcus Schäfer 18ba277113
Change bundling of image formats
By default none of the image formats were stored as compressed
file. The reason behind this was the assumption that some
formats automatically makes use of compression, which is true
but only in their processing and not in their data blocks at
creation time. Storage and handling of the image file itself
becomes cumbersome and therefore we change the default bundle
setup for image formats to be compressed. This means the image
as it gets packed by KIWI needs to be uncompressed before use.
The following image formats are affected by the change in a
call of the result bundler:

    kiwi result bundle ...

    * qcow2 (.qcow2.xz)
    * vdi   (.vdi.xz)
    * vhd   (.vhd.xz)
    * vhdx  (.vhdx.xz)
    * vmdk  (.vmdk.xz)

All other image formats already defined a custom bundling
setup including compression and are not affected by this change.
This Fixes #650
2018-11-06 12:16:36 +01:00

199 lines
6.4 KiB
Python

from mock import patch
from mock import call
import mock
import os
from .test_helper import raises, patch_open
from kiwi.exceptions import (
KiwiTemplateError
)
from kiwi.storage.subformat.vmdk import DiskFormatVmdk
class TestDiskFormatVmdk(object):
@patch('platform.machine')
def setup(self, mock_machine):
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)
mock_machine.return_value = 'x86_64'
xml_data = mock.Mock()
xml_data.get_name = mock.Mock(
return_value='some-disk-image'
)
xml_data.get_displayname = mock.Mock(
return_value=None
)
self.xml_state = mock.Mock()
self.xml_state.xml_data = xml_data
self.xml_state.get_image_version = mock.Mock(
return_value='1.2.3'
)
self.xml_state.get_build_type_vmconfig_entries = mock.Mock(
return_value=['custom entry 1', 'custom entry 2']
)
self.machine_setup = mock.Mock()
self.xml_state.get_build_type_machine_section = mock.Mock(
return_value=self.machine_setup
)
self.machine_setup.get_HWversion = mock.Mock(
return_value='42'
)
self.machine_setup.get_guestOS = mock.Mock(
return_value='suse'
)
self.machine_setup.get_memory = mock.Mock(
return_value='4096'
)
self.machine_setup.get_ncpus = mock.Mock(
return_value='2'
)
self.iso_setup = mock.Mock()
self.xml_state.get_build_type_vmdvd_section = mock.Mock(
return_value=self.iso_setup
)
self.iso_setup.get_controller = mock.Mock(
return_value='ide'
)
self.iso_setup.get_id = mock.Mock(
return_value='0'
)
self.network_setup = [mock.Mock()]
self.xml_state.get_build_type_vmnic_entries = mock.Mock(
return_value=self.network_setup
)
self.network_setup[0].get_interface = mock.Mock(
return_value='0'
)
self.network_setup[0].get_mac = mock.Mock(
return_value='98:90:96:a0:3c:58'
)
self.network_setup[0].get_mode = mock.Mock(
return_value='bridged'
)
self.network_setup[0].get_driver = mock.Mock(
return_value='e1000'
)
self.disk_setup = mock.Mock()
self.xml_state.get_build_type_vmdisk_section = mock.Mock(
return_value=self.disk_setup
)
self.disk_setup.get_controller = mock.Mock(
return_value='lsilogic'
)
self.disk_setup.get_id = mock.Mock(
return_value='0'
)
self.disk_format = DiskFormatVmdk(
self.xml_state, 'root_dir', 'target_dir'
)
def test_post_init(self):
self.disk_format.post_init(
{'option': 'value', 'adapter_type=pvscsi': None}
)
assert self.disk_format.options == [
'-o', 'adapter_type=lsilogic', '-o', 'option=value'
]
assert self.disk_format.patch_header_for_pvscsi is True
def test_store_to_result(self):
result = mock.Mock()
self.disk_format.store_to_result(result)
assert result.add.call_args_list == [
call(
compress=True,
filename='target_dir/some-disk-image.x86_64-1.2.3.vmdk',
key='disk_format_image',
shasum=True,
use_for_bundle=True
),
call(
compress=False,
filename='target_dir/some-disk-image.x86_64-1.2.3.vmx',
key='disk_format_machine_settings',
shasum=False,
use_for_bundle=True
)
]
@raises(KiwiTemplateError)
@patch('kiwi.storage.subformat.vmdk.VmwareSettingsTemplate.get_template')
@patch('kiwi.storage.subformat.vmdk.Command.run')
@patch('os.path.exists')
@patch_open
def test_create_image_format_template_error(
self, mock_open, mock_exists, mock_command, mock_get_template
):
template = mock.Mock()
mock_get_template.return_value = template
template.substitute.side_effect = Exception
self.disk_format.create_image_format()
@patch('kiwi.storage.subformat.vmdk.Command.run')
@patch('os.path.exists')
@patch_open
def test_create_image_format(
self, mock_open, mock_exists, mock_command
):
mock_open.return_value = self.context_manager_mock
mock_exists.return_value = True
self.disk_format.create_image_format()
assert mock_open.call_args_list == [
call('target_dir/some-disk-image.x86_64-1.2.3.vmx', 'w')
]
@patch('kiwi.storage.subformat.vmdk.Command.run')
@patch('os.path.exists')
@patch_open
def test_create_image_format_encoding_exists(
self, mock_open, mock_exists, mock_command
):
mock_open.return_value = self.context_manager_mock
mock_exists.return_value = True
self.disk_format.create_image_format()
assert mock_open.call_args_list == [
call('target_dir/some-disk-image.x86_64-1.2.3.vmx', 'w')
]
assert self.file_mock.write.call_args_list[2] == call(
'custom entry 2' + os.linesep
)
@patch('kiwi.storage.subformat.vmdk.Command.run')
@patch('os.path.exists')
@patch_open
def test_create_image_format_pvscsi_adapter(
self, mock_open, mock_exists, mock_command
):
self.disk_format.patch_header_for_pvscsi = True
mock_open.return_value = self.context_manager_mock
self.file_mock.read.return_value = b'ddb.adapterType = "lsilogic"'
self.disk_format.create_image_format()
assert mock_open.call_args_list[0:2] == [
call('target_dir/some-disk-image.x86_64-1.2.3.vmdk', 'rb'),
call('target_dir/some-disk-image.x86_64-1.2.3.vmdk', 'r+b')
]
assert self.file_mock.seek.called_once_with(512, 0)
assert self.file_mock.read.called_once_with(1024)
assert self.file_mock.write.call_args_list[0] == call(
b'ddb.adapterType = "pvscsi"'
)