tripleo-operator-ansible/tests/plugins/modules/test_tripleo_shell_script.py
Cédric Jeanneret 67a13ccb1e Make tripleo_shell_script more robust
1. avoid "null" (NoneType) env variables
2. ensures "quote()" gets only string

Change-Id: Id62b0dd5e952cb70aa4d773195dcab6dc78cae1a
2020-04-09 14:07:17 +02:00

184 lines
6.8 KiB
Python

# Copyright 2019 Red Hat, Inc.
# All Rights Reserved.
#
# 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
from plugins.modules import tripleo_shell_script
from tests import base as tests_base
class TestTripleoShellScript(tests_base.TestCase):
@mock.patch('os.chmod')
def test_run(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo'}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_calls = [
mock.call().write(tripleo_shell_script._SHELL_HEADER),
mock.call().write('foo'),
mock.call().write("\n")
]
mock_open.assert_has_calls(mock_calls)
mock_chmod.assert_called_once_with('/tmo/foo.sh', 0o755)
mock_exit_json.assert_called_once_with(changed=True)
@mock.patch('os.chmod')
def test_run_env(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo',
'shell_environment': {
'OS_CLOUD': 'undercloud'}
}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_calls = [
mock.call().write(tripleo_shell_script._SHELL_HEADER),
mock.call().write('export OS_CLOUD=undercloud\n'),
mock.call().write('foo'),
mock.call().write("\n")
]
mock_open.assert_has_calls(mock_calls)
mock_chmod.assert_called_once_with('/tmo/foo.sh', 0o755)
mock_exit_json.assert_called_once_with(changed=True)
@mock.patch('os.chmod')
def test_run_env_avoid_none(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo',
'shell_environment': {
'OS_CLOUD': 'undercloud',
'FOO_BAR': None}
}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_calls = [
mock.call().write(tripleo_shell_script._SHELL_HEADER),
mock.call().write('export OS_CLOUD=undercloud\n'),
mock.call().write('foo'),
mock.call().write("\n")
]
mock_open.assert_has_calls(mock_calls)
mock_chmod.assert_called_once_with('/tmo/foo.sh', 0o755)
mock_exit_json.assert_called_once_with(changed=True)
@mock.patch('os.chmod')
def test_run_env_quote_int(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo',
'shell_environment': {
'OS_CLOUD': 'undercloud',
'FOO_BAR': 1}
}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_calls = [
mock.call().write(tripleo_shell_script._SHELL_HEADER),
mock.call().write('export OS_CLOUD=undercloud\n'),
mock.call().write('export FOO_BAR=1\n'),
mock.call().write('foo'),
mock.call().write("\n")
]
mock_open.assert_has_calls(mock_calls)
mock_chmod.assert_called_once_with('/tmo/foo.sh', 0o755)
mock_exit_json.assert_called_once_with(changed=True)
@mock.patch('os.chmod')
def test_run_env_quoted(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo',
'shell_environment': {
'OS_CLOUD': 'undercloud',
'FILES': 'a.yaml b.yaml'}
}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_calls = [
mock.call().write(tripleo_shell_script._SHELL_HEADER),
mock.call().write('export OS_CLOUD=undercloud\n'),
mock.call().write('export FILES=\'a.yaml b.yaml\'\n'),
mock.call().write('foo'),
mock.call().write("\n")
]
mock_open.assert_has_calls(mock_calls)
mock_chmod.assert_called_once_with('/tmo/foo.sh', 0o755)
mock_exit_json.assert_called_once_with(changed=True)
@mock.patch('os.chmod')
def test_run_fail(self, mock_chmod):
mock_module = mock.Mock()
mock_exit_json = mock.Mock()
mock_open = mock.mock_open()
mock_open.side_effect = Exception('err')
mock_module.exit_json = mock_exit_json
params = {'dest': '/tmo/foo.sh',
'shell_command': 'foo'}
mock_module.params = params
results = {}
with mock.patch('plugins.modules.tripleo_shell_script.open',
mock_open):
tripleo_shell_script.TripleoShellScript(mock_module, results)
mock_exit_json.assert_called_once_with(
error='err',
failed=True,
msg='Unable to output shell script /tmo/foo.sh: err')