110 lines
4.6 KiB
Python
110 lines
4.6 KiB
Python
# Copyright 2015 Red Hat, Inc.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
# not use this file except in compliance with the License. You may obtain
|
|
# a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
# License for the specific language governing permissions and limitations
|
|
# under the License.
|
|
#
|
|
|
|
|
|
import mock
|
|
import subprocess
|
|
|
|
from tripleo_common.image.exception import ImageBuilderException
|
|
from tripleo_common.image.image_builder import DibImageBuilder
|
|
from tripleo_common.image.image_builder import ImageBuilder
|
|
from tripleo_common.tests import base
|
|
|
|
|
|
class TestImageBuilder(base.TestCase):
|
|
|
|
def test_get_builder_dib(self):
|
|
builder = ImageBuilder.get_builder('dib')
|
|
assert isinstance(builder, DibImageBuilder)
|
|
|
|
def test_get_builder_unknown(self):
|
|
self.assertRaises(ImageBuilderException, ImageBuilder.get_builder,
|
|
'unknown')
|
|
|
|
|
|
class TestDibImageBuilder(base.TestCase):
|
|
|
|
def setUp(self):
|
|
super(TestDibImageBuilder, self).setUp()
|
|
self.builder = DibImageBuilder()
|
|
|
|
@mock.patch('tripleo_common.image.image_builder.open',
|
|
create=True)
|
|
@mock.patch('subprocess.Popen')
|
|
def test_build_image(self, mock_popen, mock_open):
|
|
mock_process = mock.Mock()
|
|
mock_process.stdout.readline.side_effect = ['foo\n', 'bar\n', '']
|
|
mock_process.poll.side_effect = [0, 0, 1]
|
|
mock_process.returncode = 0
|
|
mock_popen.return_value = mock_process
|
|
mock_open.return_value = mock.MagicMock()
|
|
mock_file = mock.Mock()
|
|
mock_open.return_value.__enter__.return_value = mock_file
|
|
self.builder.logger = mock.Mock()
|
|
self.builder.build_image('image/path', 'imgtype', 'node_dist', 'arch',
|
|
['element1', 'element2'], ['options'],
|
|
['package1', 'package2'],
|
|
{'skip_base': True,
|
|
'docker_target': 'docker-target'})
|
|
mock_popen.assert_called_once_with(
|
|
['disk-image-create', '-a', 'arch', '-o', 'image/path',
|
|
'-t', 'imgtype',
|
|
'-p', 'package1,package2', 'options', '-n',
|
|
'--docker-target', 'docker-target', 'node_dist',
|
|
'element1', 'element2'],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT)
|
|
mock_open.assert_called_once_with(
|
|
'image/path.log', 'w', encoding='utf-8')
|
|
self.assertEqual([mock.call(u'foo\n'),
|
|
mock.call(u'bar\n')],
|
|
mock_file.write.mock_calls)
|
|
self.builder.logger.info.assert_has_calls([mock.call(u'foo'),
|
|
mock.call(u'bar')])
|
|
|
|
@mock.patch('tripleo_common.image.image_builder.open',
|
|
create=True)
|
|
@mock.patch('subprocess.Popen')
|
|
def test_build_image_fails(self, mock_popen, mock_open):
|
|
mock_process = mock.Mock()
|
|
mock_process.stdout.readline.side_effect = ['error\n', '']
|
|
mock_process.poll.side_effect = [0, 1]
|
|
mock_process.returncode = 1
|
|
mock_popen.return_value = mock_process
|
|
mock_open.return_value = mock.MagicMock()
|
|
mock_file = mock.Mock()
|
|
mock_open.return_value.__enter__.return_value = mock_file
|
|
self.builder.logger = mock.Mock()
|
|
self.assertRaises(subprocess.CalledProcessError,
|
|
self.builder.build_image,
|
|
'image/path', 'imgtype', 'node_dist', 'arch',
|
|
['element1', 'element2'], ['options'],
|
|
['package1', 'package2'],
|
|
{'skip_base': True,
|
|
'docker_target': 'docker-target'})
|
|
mock_popen.assert_called_once_with(
|
|
['disk-image-create', '-a', 'arch', '-o', 'image/path',
|
|
'-t', 'imgtype',
|
|
'-p', 'package1,package2', 'options', '-n',
|
|
'--docker-target', 'docker-target', 'node_dist',
|
|
'element1', 'element2'],
|
|
stdout=subprocess.PIPE,
|
|
stderr=subprocess.STDOUT)
|
|
mock_open.assert_called_once_with(
|
|
'image/path.log', 'w', encoding='utf-8')
|
|
self.assertEqual([mock.call(u'error\n')],
|
|
mock_file.write.mock_calls)
|
|
self.builder.logger.info.assert_has_calls([mock.call(u'error')])
|