diff options
Diffstat (limited to 'functest/tests')
-rw-r--r-- | functest/tests/unit/ci/__init__.py | 0 | ||||
-rw-r--r-- | functest/tests/unit/ci/test_prepare_env.py | 347 | ||||
-rw-r--r-- | functest/tests/unit/odl/test_odl.py | 26 | ||||
-rw-r--r-- | functest/tests/unit/utils/test_openstack_utils.py | 58 |
4 files changed, 421 insertions, 10 deletions
diff --git a/functest/tests/unit/ci/__init__.py b/functest/tests/unit/ci/__init__.py new file mode 100644 index 00000000..e69de29b --- /dev/null +++ b/functest/tests/unit/ci/__init__.py diff --git a/functest/tests/unit/ci/test_prepare_env.py b/functest/tests/unit/ci/test_prepare_env.py new file mode 100644 index 00000000..540501ff --- /dev/null +++ b/functest/tests/unit/ci/test_prepare_env.py @@ -0,0 +1,347 @@ +#!/usr/bin/env python + +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 + +import logging +import unittest + +import mock + +from functest.ci import prepare_env +from functest.tests.unit import test_utils +from functest.utils.constants import CONST +from opnfv.utils import constants as opnfv_constants + + +class PrepareEnvTesting(unittest.TestCase): + + logging.disable(logging.CRITICAL) + + @mock.patch('functest.ci.prepare_env.logger.info') + def test_print_separator(self, mock_logger_info): + str = "==============================================" + prepare_env.print_separator() + mock_logger_info.assert_called_once_with(str) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_missing_inst_type(self, mock_logger_warn, + mock_logger_info): + CONST.INSTALLER_TYPE = None + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_warn.assert_any_call("The env variable 'INSTALLER_TYPE'" + " is not defined.") + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_missing_inst_ip(self, mock_logger_warn, + mock_logger_info): + CONST.INSTALLER_IP = None + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_warn.assert_any_call("The env variable 'INSTALLER_IP'" + " is not defined. It is needed to" + " fetch the OpenStack credentials." + " If the credentials are not" + " provided to the container as a" + " volume, please add this env" + " variable to the 'docker run'" + " command.") + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_inst_ip(self, mock_logger_warn, + mock_logger_info): + CONST.INSTALLER_IP = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_info.assert_any_call(test_utils. + SubstrMatch(" INSTALLER_IP=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_missing_scenario(self, mock_logger_warn, + mock_logger_info): + CONST.DEPLOY_SCENARIO = None + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_warn.assert_any_call("The env variable" + " 'DEPLOY_SCENARIO' is not defined" + ". Setting CI_SCENARIO=undefined.") + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_scenario(self, mock_logger_warn, + mock_logger_info): + CONST.DEPLOY_SCENARIO = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_info.assert_any_call(test_utils. + SubstrMatch("DEPLOY_SCENARIO=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_ci_debug(self, mock_logger_warn, + mock_logger_info): + CONST.CI_DEBUG = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_info.assert_any_call(test_utils. + SubstrMatch(" CI_DEBUG=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_node(self, mock_logger_warn, + mock_logger_info): + CONST.NODE_NAME = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + mock_logger_info.assert_any_call(test_utils. + SubstrMatch(" NODE_NAME=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_build_tag(self, mock_logger_warn, + mock_logger_info): + CONST.BUILD_TAG = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + + mock_logger_info.assert_any_call(test_utils. + SubstrMatch(" BUILD_TAG=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_check_env_variables_with_is_ci_run(self, mock_logger_warn, + mock_logger_info): + CONST.IS_CI_RUN = mock.Mock() + prepare_env.check_env_variables() + mock_logger_info.assert_any_call("Checking environment variables" + "...") + + mock_logger_info.assert_any_call(test_utils. + SubstrMatch(" IS_CI_RUN=")) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.debug') + def test_create_directories_missing_dir(self, mock_logger_debug, + mock_logger_info): + with mock.patch('functest.ci.prepare_env.os.path.exists', + return_value=False), \ + mock.patch('functest.ci.prepare_env.os.makedirs') \ + as mock_method: + prepare_env.create_directories() + mock_logger_info.assert_any_call("Creating needed directories...") + mock_method.assert_any_call(CONST.dir_functest_conf) + mock_method.assert_any_call(CONST.dir_functest_data) + mock_logger_info.assert_any_call(" %s created." % + CONST.dir_functest_conf) + mock_logger_info.assert_any_call(" %s created." % + CONST.dir_functest_data) + + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.debug') + def test_create_directories_with_dir(self, mock_logger_debug, + mock_logger_info): + with mock.patch('functest.ci.prepare_env.os.path.exists', + return_value=True): + prepare_env.create_directories() + mock_logger_info.assert_any_call("Creating needed directories...") + mock_logger_debug.assert_any_call(" %s already exists." % + CONST.dir_functest_conf) + mock_logger_debug.assert_any_call(" %s already exists." % + CONST.dir_functest_data) + + def _get_env_cred_dict(self, os_prefix=''): + return {'OS_USERNAME': os_prefix + 'username', + 'OS_PASSWORD': os_prefix + 'password', + 'OS_AUTH_URL': 'http://test_ip:test_port/v2.0', + 'OS_TENANT_NAME': os_prefix + 'tenant_name', + 'OS_USER_DOMAIN_NAME': os_prefix + 'user_domain_name', + 'OS_PROJECT_DOMAIN_NAME': os_prefix + 'project_domain_name', + 'OS_PROJECT_NAME': os_prefix + 'project_name', + 'OS_ENDPOINT_TYPE': os_prefix + 'endpoint_type', + 'OS_REGION_NAME': os_prefix + 'region_name'} + + @mock.patch('functest.ci.prepare_env.logger.error') + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.logger.warning') + def test_source_rc_missing_rc_file(self, mock_logger_warn, + mock_logger_info, + mock_logger_error): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=True), \ + mock.patch('functest.ci.prepare_env.os.path.getsize', + return_value=0), \ + self.assertRaises(Exception): + CONST.openstack_creds = 'test_creds' + prepare_env.source_rc_file() + + def test_source_rc_missing_installer_ip(self): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=False), \ + self.assertRaises(Exception): + CONST.INSTALLER_IP = None + CONST.openstack_creds = 'test_creds' + prepare_env.source_rc_file() + + def test_source_rc_missing_installer_type(self): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=False), \ + self.assertRaises(Exception): + CONST.INSTALLER_IP = 'test_ip' + CONST.openstack_creds = 'test_creds' + CONST.INSTALLER_TYPE = 'test_type' + opnfv_constants.INSTALLERS = [] + prepare_env.source_rc_file() + + def test_source_rc_missing_os_credfile_ci_inst(self): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=False), \ + mock.patch('functest.ci.prepare_env.os.path.getsize'), \ + mock.patch('functest.ci.prepare_env.os.path.join'), \ + mock.patch('functest.ci.prepare_env.subprocess.Popen') \ + as mock_subproc_popen, \ + self.assertRaises(Exception): + CONST.openstack_creds = 'test_creds' + CONST.INSTALLER_IP = None + CONST.INSTALLER_TYPE = 'test_type' + opnfv_constants.INSTALLERS = ['test_type'] + + process_mock = mock.Mock() + attrs = {'communicate.return_value': ('output', 'error'), + 'return_code': 1} + process_mock.configure_mock(**attrs) + mock_subproc_popen.return_value = process_mock + + prepare_env.source_rc_file() + + def _get_rally_creds(self): + return {"type": "ExistingCloud", + "admin": {"username": 'test_user_name', + "password": 'test_password', + "tenant": 'test_tenant'}} + + @mock.patch('functest.ci.prepare_env.os_utils.get_credentials_for_rally') + @mock.patch('functest.ci.prepare_env.logger.info') + @mock.patch('functest.ci.prepare_env.ft_utils.execute_command_raise') + @mock.patch('functest.ci.prepare_env.ft_utils.execute_command') + def test_install_rally(self, mock_exec, mock_exec_raise, mock_logger_info, + mock_os_utils): + + mock_os_utils.return_value = self._get_rally_creds() + + prepare_env.install_rally() + + cmd = "rally deployment destroy opnfv-rally" + error_msg = "Deployment %s does not exist." % \ + CONST.rally_deployment_name + mock_logger_info.assert_any_call("Creating Rally environment...") + mock_exec.assert_any_call(cmd, error_msg=error_msg, verbose=False) + + cmd = "rally deployment create --file=rally_conf.json --name=" + cmd += CONST.rally_deployment_name + error_msg = "Problem while creating Rally deployment" + mock_exec_raise.assert_any_call(cmd, error_msg=error_msg) + + cmd = "rally deployment check" + error_msg = ("OpenStack not responding or " + "faulty Rally deployment.") + mock_exec_raise.assert_any_call(cmd, error_msg=error_msg) + + cmd = "rally deployment list" + error_msg = ("Problem while listing " + "Rally deployment.") + mock_exec.assert_any_call(cmd, error_msg=error_msg) + + cmd = "rally plugin list | head -5" + error_msg = ("Problem while showing " + "Rally plugins.") + mock_exec.assert_any_call(cmd, error_msg=error_msg) + + @mock.patch('functest.ci.prepare_env.sys.exit') + @mock.patch('functest.ci.prepare_env.logger.error') + def test_check_environment_missing_file(self, mock_logger_error, + mock_sys_exit): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=False), \ + self.assertRaises(Exception): + prepare_env.check_environment() + + @mock.patch('functest.ci.prepare_env.sys.exit') + @mock.patch('functest.ci.prepare_env.logger.error') + def test_check_environment_with_error(self, mock_logger_error, + mock_sys_exit): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=True), \ + mock.patch("__builtin__.open", mock.mock_open(read_data='0')), \ + self.assertRaises(Exception): + prepare_env.check_environment() + + @mock.patch('functest.ci.prepare_env.logger.info') + def test_check_environment_default(self, mock_logger_info): + with mock.patch('functest.ci.prepare_env.os.path.isfile', + return_value=True): + with mock.patch("__builtin__.open", mock.mock_open(read_data='1')): + prepare_env.check_environment() + mock_logger_info.assert_any_call("Functest environment" + " is installed.") + + @mock.patch('functest.ci.prepare_env.check_environment') + @mock.patch('functest.ci.prepare_env.create_flavor') + @mock.patch('functest.ci.prepare_env.install_tempest') + @mock.patch('functest.ci.prepare_env.install_rally') + @mock.patch('functest.ci.prepare_env.verify_deployment') + @mock.patch('functest.ci.prepare_env.patch_config_file') + @mock.patch('functest.ci.prepare_env.source_rc_file') + @mock.patch('functest.ci.prepare_env.create_directories') + @mock.patch('functest.ci.prepare_env.check_env_variables') + @mock.patch('functest.ci.prepare_env.logger.info') + def test_main_start(self, mock_logger_info, mock_env_var, + mock_create_dir, mock_source_rc, mock_patch_config, + mock_verify_depl, mock_install_rally, + mock_install_temp, mock_create_flavor, + mock_check_env): + with mock.patch("__builtin__.open", mock.mock_open()) as m: + args = {'action': 'start'} + self.assertEqual(prepare_env.main(**args), 0) + mock_logger_info.assert_any_call("######### Preparing Functest " + "environment #########\n") + self.assertTrue(mock_env_var.called) + self.assertTrue(mock_create_dir.called) + self.assertTrue(mock_source_rc.called) + self.assertTrue(mock_patch_config.called) + self.assertTrue(mock_verify_depl.called) + self.assertTrue(mock_install_rally.called) + self.assertTrue(mock_install_temp.called) + self.assertTrue(mock_create_flavor.called) + m.assert_called_once_with(CONST.env_active, "w") + self.assertTrue(mock_check_env.called) + + @mock.patch('functest.ci.prepare_env.check_environment') + def test_main_check(self, mock_check_env): + args = {'action': 'check'} + self.assertEqual(prepare_env.main(**args), 0) + self.assertTrue(mock_check_env.called) + + @mock.patch('functest.ci.prepare_env.logger.error') + def test_main_no_arg(self, mock_logger_error): + args = {'action': 'not_valid'} + self.assertEqual(prepare_env.main(**args), -1) + mock_logger_error.assert_called_once_with('Argument not valid.') + + +if __name__ == "__main__": + unittest.main(verbosity=2) diff --git a/functest/tests/unit/odl/test_odl.py b/functest/tests/unit/odl/test_odl.py index 8f2a5d7e..5961940f 100644 --- a/functest/tests/unit/odl/test_odl.py +++ b/functest/tests/unit/odl/test_odl.py @@ -30,6 +30,7 @@ class ODLTesting(unittest.TestCase): _keystone_ip = "127.0.0.1" _neutron_ip = "127.0.0.2" _sdn_controller_ip = "127.0.0.3" + _os_auth_url = "http://{}:5000/v2.0".format(_keystone_ip) _os_tenantname = "admin" _os_username = "admin" _os_password = "admin" @@ -42,14 +43,15 @@ class ODLTesting(unittest.TestCase): for var in ("INSTALLER_TYPE", "SDN_CONTROLLER", "SDN_CONTROLLER_IP"): if var in os.environ: del os.environ[var] + os.environ["OS_AUTH_URL"] = self._os_auth_url os.environ["OS_USERNAME"] = self._os_username os.environ["OS_PASSWORD"] = self._os_password os.environ["OS_TENANT_NAME"] = self._os_tenantname self.test = odl.ODLTests() self.defaultargs = {'odlusername': self._odl_username, 'odlpassword': self._odl_password, - 'keystoneip': self._keystone_ip, 'neutronip': self._keystone_ip, + 'osauthurl': self._os_auth_url, 'osusername': self._os_username, 'ostenantname': self._os_tenantname, 'ospassword': self._os_password, @@ -157,8 +159,8 @@ class ODLTesting(unittest.TestCase): def _get_main_kwargs(self, key=None): kwargs = {'odlusername': self._odl_username, 'odlpassword': self._odl_password, - 'keystoneip': self._keystone_ip, 'neutronip': self._neutron_ip, + 'osauthurl': self._os_auth_url, 'osusername': self._os_username, 'ostenantname': self._os_tenantname, 'ospassword': self._os_password, @@ -178,6 +180,7 @@ class ODLTesting(unittest.TestCase): if len(args) > 1: variable = ['KEYSTONE:{}'.format(self._keystone_ip), 'NEUTRON:{}'.format(self._neutron_ip), + 'OS_AUTH_URL:"{}"'.format(self._os_auth_url), 'OSUSERNAME:"{}"'.format(self._os_username), 'OSTENANTNAME:"{}"'.format(self._os_tenantname), 'OSPASSWORD:"{}"'.format(self._os_password), @@ -207,12 +210,12 @@ class ODLTesting(unittest.TestCase): def test_main_missing_odlpassword(self): self._test_main_missing_keyword('odlpassword') - def test_main_missing_keystoneip(self): - self._test_main_missing_keyword('keystoneip') - def test_main_missing_neutronip(self): self._test_main_missing_keyword('neutronip') + def test_main_missing_osauthurl(self): + self._test_main_missing_keyword('osauthurl') + def test_main_missing_osusername(self): self._test_main_missing_keyword('osusername') @@ -347,10 +350,11 @@ class ODLTesting(unittest.TestCase): self.assertEqual(self.test.run(), status) self.test.main.assert_called_once_with( odl.ODLTests.default_suites, - keystoneip=self._keystone_ip, neutronip=self._neutron_ip, + neutronip=self._neutron_ip, odlip=odlip, odlpassword=self._odl_password, odlrestconfport=odlrestconfport, odlusername=self._odl_username, odlwebport=odlwebport, + osauthurl=self._os_auth_url, ospassword=self._os_password, ostenantname=self._os_tenantname, osusername=self._os_username) @@ -368,10 +372,11 @@ class ODLTesting(unittest.TestCase): self.assertEqual(self.test.run(suites=suites), status) self.test.main.assert_called_once_with( suites, - keystoneip=self._keystone_ip, neutronip=self._neutron_ip, + neutronip=self._neutron_ip, odlip=odlip, odlpassword=self._odl_password, odlrestconfport=odlrestconfport, odlusername=self._odl_username, odlwebport=odlwebport, + osauthurl=self._os_auth_url, ospassword=self._os_password, ostenantname=self._os_tenantname, osusername=self._os_username) @@ -381,6 +386,9 @@ class ODLTesting(unittest.TestCase): self.assertEqual(self.test.run(), testcase_base.TestcaseBase.EX_RUN_ERROR) + def test_run_missing_os_auth_url(self): + self._test_run_missing_env_var("OS_AUTH_URL") + def test_run_missing_os_username(self): self._test_run_missing_env_var("OS_USERNAME") @@ -507,8 +515,8 @@ class ODLTesting(unittest.TestCase): def test_argparser_odlpassword(self): self._test_argparser('odlpassword', 'foo') - def test_argparser_keystoneip(self): - self._test_argparser('keystoneip', '127.0.0.4') + def test_argparser_osauthurl(self): + self._test_argparser('osauthurl', 'http://127.0.0.4:5000/v2') def test_argparser_neutronip(self): self._test_argparser('neutronip', '127.0.0.4') diff --git a/functest/tests/unit/utils/test_openstack_utils.py b/functest/tests/unit/utils/test_openstack_utils.py index 447271fc..ef3764cc 100644 --- a/functest/tests/unit/utils/test_openstack_utils.py +++ b/functest/tests/unit/utils/test_openstack_utils.py @@ -104,7 +104,6 @@ class OSUtilsTesting(unittest.TestCase): 'servers.create.return_value': self.instance, 'flavors.list.return_value': [self.flavor], 'flavors.find.return_value': self.flavor, - 'flavors.list.return_value': [self.flavor], 'servers.add_floating_ip.return_value': mock.Mock(), 'servers.force_delete.return_value': mock.Mock(), 'aggregates.list.return_value': [self.aggregate], @@ -162,6 +161,15 @@ class OSUtilsTesting(unittest.TestCase): } self.cinder_client.configure_mock(**attrs) + self.resource = mock.Mock() + attrs = {'id': 'resource_test_id', + 'name': 'resource_test_name' + } + + self.heat_client = mock.Mock() + attrs = {'resources.get.return_value': self.resource} + self.heat_client.configure_mock(**attrs) + mock_obj = mock.Mock() attrs = {'id': 'tenant_id', 'name': 'test_tenant'} @@ -543,6 +551,36 @@ class OSUtilsTesting(unittest.TestCase): mock_glan_client.assert_called_once_with('3', session=mock_session_obj) + @mock.patch('functest.utils.openstack_utils.os.getenv', + return_value=None) + def test_get_heat_client_version_missing_env(self, mock_os_getenv): + self.assertEqual(openstack_utils.get_heat_client_version(), + openstack_utils.DEFAULT_HEAT_API_VERSION) + + @mock.patch('functest.utils.openstack_utils.logger.info') + @mock.patch('functest.utils.openstack_utils.os.getenv', return_value='1') + def test_get_heat_client_version_default(self, mock_os_getenv, + mock_logger_info): + self.assertEqual(openstack_utils.get_heat_client_version(), '1') + mock_logger_info.assert_called_once_with( + "OS_ORCHESTRATION_API_VERSION is set in env as '%s'", '1') + + def test_get_heat_client(self): + mock_heat_obj = mock.Mock() + mock_session_obj = mock.Mock() + with mock.patch('functest.utils.openstack_utils' + '.get_heat_client_version', return_value='1'), \ + mock.patch('functest.utils.openstack_utils' + '.heatclient.Client', + return_value=mock_heat_obj) \ + as mock_heat_client, \ + mock.patch('functest.utils.openstack_utils.get_session', + return_value=mock_session_obj): + self.assertEqual(openstack_utils.get_heat_client(), + mock_heat_obj) + mock_heat_client.assert_called_once_with('1', + session=mock_session_obj) + def test_get_instances_default(self): self.assertEqual(openstack_utils.get_instances(self.nova_client), [self.instance]) @@ -1700,6 +1738,24 @@ class OSUtilsTesting(unittest.TestCase): 'user_id')) self.assertTrue(mock_logger_error.called) + def test_get_resource_default(self): + with mock.patch('functest.utils.openstack_utils.' + 'is_keystone_v3', return_value=True): + self.assertEqual(openstack_utils. + get_resource(self.heat_client, + 'stack_id', + 'resource'), + self.resource) + + @mock.patch('functest.utils.openstack_utils.logger.error') + def test_get_resource_exception(self, mock_logger_error): + self.assertEqual(openstack_utils. + get_resource(Exception, + 'stack_id', + 'resource'), + None) + self.assertTrue(mock_logger_error.called) + if __name__ == "__main__": unittest.main(verbosity=2) |