
In Python 3, the mock module is now part of the unittest module. We no longer support Python 2, so there's no reason for the import checks. Change-Id: I7b4d68cba4b587ad9f0121058ba615a9bb0aec93
109 lines
4.0 KiB
Python
109 lines
4.0 KiB
Python
# Copyright 2014 Cloudbase Solutions Srl
|
|
#
|
|
# 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 os
|
|
import unittest
|
|
import unittest.mock as mock
|
|
|
|
from cloudbaseinit.plugins.common import execcmd
|
|
from cloudbaseinit.plugins.common import userdatautils
|
|
from cloudbaseinit.tests import testutils
|
|
|
|
|
|
def _safe_remove(filepath):
|
|
if not filepath:
|
|
return
|
|
try:
|
|
os.remove(filepath)
|
|
except OSError:
|
|
pass
|
|
|
|
|
|
@mock.patch('cloudbaseinit.osutils.factory.get_os_utils')
|
|
class UserDataUtilsTest(unittest.TestCase):
|
|
|
|
def _get_command(self, data):
|
|
"""Get a command from the given data.
|
|
|
|
If a command was obtained, then a cleanup will be added in order
|
|
to remove the underlying target path of the command.
|
|
"""
|
|
command = userdatautils.get_command(data)
|
|
if command and not isinstance(command, execcmd.CommandExecutor):
|
|
self.addCleanup(_safe_remove, command._target_path)
|
|
return command
|
|
|
|
def test_get_command(self, _):
|
|
command = self._get_command(b'rem cmd test')
|
|
self.assertIsInstance(command, execcmd.Shell)
|
|
|
|
command = self._get_command(b'#!/usr/bin/env python\ntest')
|
|
self.assertIsInstance(command, execcmd.Python)
|
|
|
|
command = self._get_command(b'#!/bin/bash')
|
|
self.assertIsInstance(command, execcmd.Bash)
|
|
|
|
command = self._get_command(b'#ps1_sysnative\n')
|
|
self.assertIsInstance(command, execcmd.PowershellSysnative)
|
|
|
|
command = self._get_command(b'#ps1_x86\n')
|
|
self.assertIsInstance(command, execcmd.Powershell)
|
|
|
|
command = self._get_command(b'<script>echo test</script>')
|
|
self.assertIsInstance(command, execcmd.CommandExecutor)
|
|
|
|
command = self._get_command(b'unknown')
|
|
self.assertIsNone(command)
|
|
|
|
def test_execute_user_data_script_no_commands(self, _):
|
|
with testutils.LogSnatcher('cloudbaseinit.plugins.common.'
|
|
'userdatautils') as snatcher:
|
|
retval = userdatautils.execute_user_data_script(b"unknown")
|
|
|
|
expected_logging = [
|
|
'Unsupported user_data format'
|
|
]
|
|
self.assertEqual(0, retval)
|
|
self.assertEqual(expected_logging, snatcher.output)
|
|
|
|
@mock.patch('cloudbaseinit.plugins.common.userdatautils.'
|
|
'get_command')
|
|
def test_execute_user_data_script_fails(self, mock_get_command, _):
|
|
mock_command = mock.Mock()
|
|
mock_command.execute.side_effect = ValueError
|
|
mock_get_command.return_value = mock_command
|
|
with testutils.LogSnatcher('cloudbaseinit.plugins.common.'
|
|
'userdatautils') as snatcher:
|
|
retval = userdatautils.execute_user_data_script(
|
|
mock.sentinel.user_data)
|
|
|
|
expected_logging = [
|
|
"An error occurred during user_data execution: ''",
|
|
'User_data script ended with return code: 0']
|
|
self.assertEqual(0, retval)
|
|
self.assertEqual(expected_logging, snatcher.output)
|
|
|
|
@mock.patch('cloudbaseinit.plugins.common.userdatautils.'
|
|
'get_command')
|
|
def test_execute_user_data_script(self, mock_get_command, _):
|
|
mock_command = mock.Mock()
|
|
mock_command.execute.return_value = (
|
|
mock.sentinel.output, mock.sentinel.error, -1
|
|
)
|
|
mock_get_command.return_value = mock_command
|
|
retval = userdatautils.execute_user_data_script(
|
|
mock.sentinel.user_data)
|
|
self.assertEqual(-1, retval)
|