kiwi-el8/test/unit/container/image_oci_test.py
Marcus Schäfer bdb7123fa1
Refactor use of logging facility
Use getLogger method instead of a global log object
Also use caplog fixture to capture log messages in
unit tests. This Fixes #1244
2019-10-23 17:54:27 +02:00

185 lines
7.0 KiB
Python

import logging
from pytest import fixture
from mock import (
patch, mock_open
)
import mock
from kiwi.container.oci import ContainerImageOCI
from kiwi.version import __version__
class TestContainerImageOCI:
@fixture(autouse=True)
def inject_fixtures(self, caplog):
self._caplog = caplog
@patch('kiwi.oci_tools.umoci.CommandCapabilities.has_option_in_help')
@patch('kiwi.container.oci.RuntimeConfig')
def setup(self, mock_RuntimeConfig, mock_cmd_caps):
mock_cmd_caps.return_value = True
self.oci = ContainerImageOCI(
'root_dir', 'docker-archive', {
'container_name': 'foo/bar',
'additional_tags': ['current', 'foobar']
}
)
@patch('kiwi.oci_tools.umoci.CommandCapabilities.has_option_in_help')
def test_init_custom_args(self, mock_cmd_caps):
mock_cmd_caps.return_value = True
custom_args = {
'container_name': 'foo',
'container_tag': '1.0',
'additional_tags': ['current', 'foobar'],
'entry_command': ['/bin/bash', '-x'],
'entry_subcommand': ['ls', '-l'],
'maintainer': 'tux',
'user': 'root',
'workingdir': '/root',
'expose_ports': ['80', '42'],
'volumes': ['/var/log', '/tmp'],
'environment': {'PATH': '/bin', 'FOO': 'bar'},
'labels': {'a': 'value', 'b': 'value'}
}
container = ContainerImageOCI(
'root_dir', 'oci-archive', custom_args
)
assert container.oci_config == custom_args
@patch('kiwi.oci_tools.umoci.CommandCapabilities.has_option_in_help')
def test_init_without_custom_args(self, mock_cmd_caps):
mock_cmd_caps.return_value = True
container = ContainerImageOCI('root_dir', 'oci-archive')
assert container.oci_config == {
'container_name': 'kiwi-container',
'container_tag': 'latest',
'entry_subcommand': ['/bin/bash'],
'history': {'created_by': 'KIWI {0}'.format(__version__)}
}
@patch('kiwi.container.oci.RuntimeConfig')
@patch('kiwi.oci_tools.umoci.CommandCapabilities.has_option_in_help')
@patch('kiwi.defaults.Defaults.is_buildservice_worker')
def test_init_in_buildservice(
self, mock_buildservice, mock_cmd_caps, mock_RuntimeConfig
):
mock_buildservice.return_value = True
mock_cmd_caps.return_value = True
m_open = mock_open()
with patch('builtins.open', m_open, create=True):
m_open.return_value.__iter__ = lambda _:\
iter(['BUILD_DISTURL=obs://build.opensuse.org/some:project'])
container = ContainerImageOCI('root_dir', 'oci-archive')
m_open.assert_called_once_with('/.buildenv')
assert container.oci_config['labels'] == {
'org.openbuildservice.disturl':
'obs://build.opensuse.org/some:project'
}
@patch('kiwi.container.oci.RuntimeConfig')
@patch('kiwi.oci_tools.umoci.CommandCapabilities.has_option_in_help')
@patch('kiwi.defaults.Defaults.is_buildservice_worker')
def test_init_in_buildservice_without_disturl(
self, mock_buildservice, mock_cmd_caps, mock_RuntimeConfig
):
mock_buildservice.return_value = True
mock_cmd_caps.return_value = True
m_open = mock_open()
with patch('builtins.open', m_open, create=True):
m_open.return_value.__iter__ = lambda _: iter(['line content'])
with self._caplog.at_level(logging.WARNING):
container = ContainerImageOCI('root_dir', 'oci-archive')
m_open.assert_called_once_with('/.buildenv')
assert 'labels' not in container.oci_config
@patch('kiwi.container.oci.OCI')
@patch('kiwi.container.oci.Defaults.get_shared_cache_location')
def test_create_oci_archive(self, mock_cache, mock_OCI):
mock_cache.return_value = 'var/cache/kiwi'
mock_oci = mock.Mock()
mock_OCI.return_value = mock_oci
self.oci.runtime_config.get_container_compression = mock.Mock(
return_value=None
)
self.oci.archive_transport = 'oci-archive'
self.oci.create('result.tar', None)
mock_oci.init_container.assert_called_once_with()
mock_oci.unpack.assert_called_once_with()
mock_oci.sync_rootfs.assert_called_once_with(
'root_dir', [
'image', '.profile', '.kconfig', '.buildenv',
'var/cache/kiwi', 'boot', 'dev', 'sys', 'proc'
]
)
mock_oci.repack.assert_called_once_with({
'container_name': 'foo/bar',
'additional_tags': ['current', 'foobar'],
'container_tag': 'latest',
'entry_subcommand': ['/bin/bash'],
'history': {'created_by': 'KIWI {0}'.format(__version__)}
})
mock_oci.set_config.assert_called_once_with({
'container_name': 'foo/bar',
'additional_tags': ['current', 'foobar'],
'container_tag': 'latest',
'entry_subcommand': ['/bin/bash'],
'history': {'created_by': 'KIWI {0}'.format(__version__)}
})
mock_oci.post_process.assert_called_once_with()
mock_oci.export_container_image.assert_called_once_with(
'result.tar', 'oci-archive', 'latest', []
)
@patch('kiwi.container.oci.Compress')
@patch('kiwi.container.oci.OCI')
@patch('kiwi.container.oci.Defaults.get_shared_cache_location')
def test_create_derived_docker_archive(
self, mock_cache, mock_OCI, mock_compress
):
mock_cache.return_value = 'var/cache/kiwi'
mock_oci = mock.Mock()
mock_OCI.return_value = mock_oci
self.oci.create('result.tar', 'root_dir/image/image_file')
mock_oci.import_container_image.assert_called_once_with(
'oci-archive:root_dir/image/image_file:base_layer'
)
mock_oci.unpack.assert_called_once_with()
mock_oci.sync_rootfs.assert_called_once_with(
'root_dir', [
'image', '.profile', '.kconfig', '.buildenv',
'var/cache/kiwi', 'boot', 'dev', 'sys', 'proc'
]
)
mock_oci.repack.assert_called_once_with({
'container_name': 'foo/bar',
'additional_tags': ['current', 'foobar'],
'container_tag': 'latest',
'entry_subcommand': ['/bin/bash'],
'history': {'created_by': 'KIWI {0}'.format(__version__)}
})
mock_oci.set_config.assert_called_once_with({
'container_name': 'foo/bar',
'additional_tags': ['current', 'foobar'],
'container_tag': 'latest',
'entry_subcommand': ['/bin/bash'],
'history': {'created_by': 'KIWI {0}'.format(__version__)}
})
mock_oci.post_process.assert_called_once_with()
mock_oci.export_container_image.assert_called_once_with(
'result.tar', 'docker-archive', 'foo/bar:latest',
['foo/bar:current', 'foo/bar:foobar']
)
mock_compress.assert_called_once_with('result.tar')