Make tripleo_shell_script more robust

1. avoid "null" (NoneType) env variables
2. ensures "quote()" gets only string

Change-Id: Id62b0dd5e952cb70aa4d773195dcab6dc78cae1a
This commit is contained in:
Cédric Jeanneret 2020-04-09 13:33:53 +02:00
parent 0ab073c09b
commit 67a13ccb1e
2 changed files with 63 additions and 2 deletions

View File

@ -114,8 +114,10 @@ class TripleoShellScript(object):
with open(dest, 'w') as fh:
fh.write(_SHELL_HEADER)
for k, v in shell_environment.items():
fh.write("export %(key)s=%(val)s\n" % {'key': k,
'val': quote(v)})
if v:
val = quote(str(v))
fh.write("export %(key)s=%(val)s\n" % {'key': k,
'val': val})
fh.write(shell_command)
fh.write("\n")
os.chmod(dest, 0o755)

View File

@ -73,6 +73,65 @@ class TestTripleoShellScript(tests_base.TestCase):
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()