| ''' |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you 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 sys |
| from mock.mock import patch, MagicMock, call |
| |
| with patch.object(os, "geteuid", new=MagicMock(return_value=0)): |
| from resource_management.core import sudo |
| reload(sudo) |
| |
| import datetime |
| import json |
| import operator |
| from ambari_commons import subprocess32 |
| import platform |
| import socket |
| import re |
| import signal |
| import stat |
| import StringIO |
| import tempfile |
| from unittest import TestCase |
| os.environ["ROOT"] = "" |
| |
| from only_for_platform import get_platform, not_for_platform, only_for_platform, os_distro_value, PLATFORM_WINDOWS |
| from ambari_commons import os_utils |
| |
| if get_platform() != PLATFORM_WINDOWS: |
| pass |
| |
| import shutil |
| project_dir = os.path.join(os.path.abspath(os.path.dirname(__file__)),os.path.normpath("../../../../")) |
| shutil.copyfile(project_dir+"/ambari-server/conf/unix/ambari.properties", "/tmp/ambari.properties") |
| |
| # We have to use this import HACK because the filename contains a dash |
| _search_file = os_utils.search_file |
| |
| |
| def search_file_proxy(filename, searchpatch, pathsep=os.pathsep): |
| global _search_file |
| |
| if "ambari.properties" in filename: |
| return "/tmp/ambari.properties" |
| |
| return _search_file(filename, searchpatch, pathsep) |
| |
| |
| os_utils.search_file = search_file_proxy |
| with patch.object(platform, "linux_distribution", return_value = MagicMock(return_value=('Redhat', '6.4', 'Final'))): |
| with patch("os.path.isdir", return_value = MagicMock(return_value=True)): |
| with patch("os.access", return_value = MagicMock(return_value=True)): |
| with patch.object(os_utils, "parse_log4j_file", return_value={'ambari.log.dir': '/var/log/ambari-server'}): |
| with patch("platform.linux_distribution", return_value = os_distro_value): |
| with patch("os.symlink"): |
| with patch.object(os_utils, "is_service_exist", return_value = True): |
| with patch("glob.glob", return_value = ['/etc/init.d/postgresql-9.3']): |
| _ambari_server_ = __import__('ambari-server') |
| with patch("__builtin__.open"): |
| from ambari_commons.firewall import Firewall |
| from ambari_commons.os_check import OSCheck, OSConst |
| from ambari_commons.os_family_impl import OsFamilyImpl, OsFamilyFuncImpl |
| from ambari_commons.exceptions import FatalException, NonFatalException |
| from ambari_commons.logging_utils import get_verbose, set_verbose, get_silent, set_silent, get_debug_mode, \ |
| print_info_msg, print_warning_msg, print_error_msg |
| from ambari_commons.os_utils import run_os_command, search_file, set_file_permissions, remove_file, copy_file, \ |
| is_valid_filepath |
| from ambari_server.dbConfiguration import DBMSConfigFactory, check_jdbc_drivers, DBMSConfig |
| from ambari_server.dbConfiguration_linux import PGConfig, LinuxDBMSConfig, OracleConfig |
| from ambari_server.properties import Properties |
| from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException |
| from ambari_server.serverConfiguration import configDefaults, check_database_name_property, OS_FAMILY_PROPERTY, \ |
| find_properties_file, get_ambari_properties, get_JAVA_HOME, \ |
| parse_properties_file, read_ambari_user, update_ambari_properties, update_properties_2, write_property, find_jdk, \ |
| get_is_active_instance, \ |
| AMBARI_CONF_VAR, AMBARI_SERVER_LIB, JDBC_DATABASE_PROPERTY, JDBC_RCA_PASSWORD_FILE_PROPERTY, \ |
| PERSISTENCE_TYPE_PROPERTY, JDBC_URL_PROPERTY, get_conf_dir, JDBC_USER_NAME_PROPERTY, JDBC_PASSWORD_PROPERTY, \ |
| JDBC_DATABASE_NAME_PROPERTY, OS_TYPE_PROPERTY, validate_jdk, JDBC_POSTGRES_SCHEMA_PROPERTY, \ |
| RESOURCES_DIR_PROPERTY, JDBC_RCA_PASSWORD_ALIAS, JDBC_RCA_SCHEMA_PROPERTY, \ |
| SSL_API, SSL_API_PORT, CLIENT_API_PORT_PROPERTY,\ |
| JDBC_CONNECTION_POOL_TYPE, LDAP_MGR_PASSWORD_PROPERTY, LDAP_MGR_PASSWORD_ALIAS, JDBC_PASSWORD_FILENAME, NR_USER_PROPERTY, SECURITY_KEY_IS_PERSISTED, \ |
| SSL_TRUSTSTORE_PASSWORD_PROPERTY, SECURITY_IS_ENCRYPTION_ENABLED, PID_DIR_PROPERTY, SSL_TRUSTSTORE_PASSWORD_ALIAS, \ |
| SECURITY_MASTER_KEY_LOCATION, SECURITY_KEYS_DIR, store_password_file, \ |
| get_pass_file_path, GET_FQDN_SERVICE_URL, SECURITY_KEY_ENV_VAR_NAME, \ |
| JAVA_HOME_PROPERTY, JDK_NAME_PROPERTY, JCE_NAME_PROPERTY, STACK_LOCATION_KEY, SERVER_VERSION_FILE_PATH, \ |
| COMMON_SERVICES_PATH_PROPERTY, WEBAPP_DIR_PROPERTY, SHARED_RESOURCES_DIR, BOOTSTRAP_SCRIPT, \ |
| CUSTOM_ACTION_DEFINITIONS, BOOTSTRAP_SETUP_AGENT_SCRIPT, STACKADVISOR_SCRIPT, BOOTSTRAP_DIR_PROPERTY, MPACKS_STAGING_PATH_PROPERTY, STACK_JAVA_VERSION |
| from ambari_server.serverUtils import is_server_runing, refresh_stack_hash |
| from ambari_server.serverSetup import check_selinux, check_ambari_user, proceedJDBCProperties, SE_STATUS_DISABLED, SE_MODE_ENFORCING, configure_os_settings, \ |
| download_and_install_jdk, prompt_db_properties, setup, \ |
| AmbariUserChecks, JDKSetup, reset, setup_jce_policy, expand_jce_zip_file, check_ambari_java_version_is_valid |
| from ambari_server.serverUpgrade import upgrade, run_schema_upgrade, move_user_custom_actions, find_and_copy_custom_services |
| from ambari_server.setupHttps import is_valid_https_port, setup_https, import_cert_and_key_action, get_fqdn, \ |
| generate_random_string, get_cert_info, COMMON_NAME_ATTR, is_valid_cert_exp, NOT_AFTER_ATTR, NOT_BEFORE_ATTR, \ |
| SSL_DATE_FORMAT, import_cert_and_key, is_valid_cert_host, setup_truststore, \ |
| SRVR_ONE_WAY_SSL_PORT_PROPERTY, SRVR_TWO_WAY_SSL_PORT_PROPERTY |
| from ambari_server.setupSecurity import adjust_directory_permissions, get_alias_string, get_ldap_event_spec_names, sync_ldap, \ |
| configure_ldap_password, setup_ldap, REGEX_HOSTNAME_PORT, REGEX_TRUE_FALSE, REGEX_ANYTHING, setup_master_key, \ |
| setup_ambari_krb5_jaas, LDAP_GENERIC, should_query_ldap_type, LdapPropTemplate, LdapDefault, LdapDefaultMap |
| from ambari_server.userInput import get_YN_input, get_choice_string_input, get_validated_string_input, \ |
| read_password |
| from ambari_server_main import get_ulimit_open_files, ULIMIT_OPEN_FILES_KEY, ULIMIT_OPEN_FILES_DEFAULT |
| from ambari_server.serverClassPath import JDBC_DRIVER_PATH_PROPERTY, ServerClassPath |
| from ambari_server.hostUpdate import update_host_names |
| from ambari_server.checkDatabase import check_database |
| |
| CURR_AMBARI_VERSION = "2.0.0" |
| |
| @patch.object(platform, "linux_distribution", new = MagicMock(return_value=('Redhat', '6.4', 'Final'))) |
| @patch("ambari_server.dbConfiguration_linux.get_postgre_hba_dir", new = MagicMock(return_value = "/var/lib/pgsql/data")) |
| @patch("ambari_server.dbConfiguration_linux.get_postgre_running_status", new = MagicMock(return_value = "running")) |
| class TestAmbariServer(TestCase): |
| def setUp(self): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| |
| def tearDown(self): |
| sys.stdout = sys.__stdout__ |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_configure_pg_hba_ambaridb_users(self, run_os_command_method): |
| # Prepare mocks |
| run_os_command_method.return_value = (0, "", "") |
| database_username = "ffdf" |
| tf1 = tempfile.NamedTemporaryFile() |
| # Run test |
| PGConfig._configure_pg_hba_ambaridb_users(tf1.name, database_username) |
| # Check results |
| self.assertTrue(run_os_command_method.called) |
| string_expected = self.get_file_string(self.get_samples_dir("configure_pg_hba_ambaridb_users1")) |
| string_actual = self.get_file_string(tf1.name) |
| self.assertEquals(string_expected, string_actual) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("__builtin__.raw_input") |
| def test_servicename_regex(self, raw_input_method): |
| |
| ''' Test to make sure the service name can contain digits ''' |
| set_silent(False) |
| raw_input_method.return_value = "OT100" |
| result = OracleConfig._get_validated_service_name("ambari", 1) |
| self.assertEqual("OT100", result, "Not accepting digits") |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("__builtin__.raw_input") |
| def test_dbname_regex(self, raw_input_method): |
| |
| ''' Test to make sure the service name can contain digits ''' |
| set_silent(False) |
| raw_input_method.return_value = "OT100" |
| result = LinuxDBMSConfig._get_validated_db_name("Database", "ambari") |
| self.assertEqual("OT100", result, "Not accepting digits") |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| def test_configure_pg_hba_postgres_user(self): |
| |
| tf1 = tempfile.NamedTemporaryFile() |
| PGConfig.PG_HBA_CONF_FILE = tf1.name |
| |
| with open(PGConfig.PG_HBA_CONF_FILE, 'w') as fout: |
| fout.write("\n") |
| fout.write("local all all md5\n") |
| fout.write("host all all 0.0.0.0/0 md5\n") |
| fout.write("host all all ::/0 md5\n") |
| |
| PGConfig._configure_pg_hba_postgres_user() |
| |
| expected = self.get_file_string(self.get_samples_dir( |
| "configure_pg_hba_ambaridb_users2")) |
| result = self.get_file_string(PGConfig.PG_HBA_CONF_FILE) |
| self.assertEqual(expected, result, "pg_hba_conf not processed") |
| |
| mode = oct(os.stat(PGConfig.PG_HBA_CONF_FILE)[stat.ST_MODE]) |
| str_mode = str(mode)[-4:] |
| self.assertEqual("0644", str_mode, "Wrong file permissions") |
| pass |
| |
| |
| @patch("__builtin__.raw_input") |
| def test_get_choice_string_input(self, raw_input_method): |
| prompt = "blablabla" |
| default = "default blablabla" |
| firstChoice = set(['yes', 'ye', 'y']) |
| secondChoice = set(['no', 'n']) |
| # test first input |
| raw_input_method.return_value = "Y" |
| |
| result = get_choice_string_input(prompt, default, |
| firstChoice, secondChoice) |
| self.assertEquals(result, True) |
| raw_input_method.reset_mock() |
| # test second input |
| |
| raw_input_method.return_value = "N" |
| |
| result = get_choice_string_input(prompt, default, |
| firstChoice, secondChoice) |
| self.assertEquals(result, False) |
| |
| raw_input_method.reset_mock() |
| |
| # test enter pressed |
| |
| raw_input_method.return_value = "" |
| |
| result = get_choice_string_input(prompt, default, |
| firstChoice, secondChoice) |
| self.assertEquals(result, default) |
| |
| raw_input_method.reset_mock() |
| |
| # test wrong input |
| list_of_return_values = ['yes', 'dsad', 'fdsfds'] |
| |
| def side_effect(list): |
| return list_of_return_values.pop() |
| |
| raw_input_method.side_effect = side_effect |
| |
| result = get_choice_string_input(prompt, default, |
| firstChoice, secondChoice) |
| self.assertEquals(result, True) |
| self.assertEquals(raw_input_method.call_count, 3) |
| |
| pass |
| |
| |
| @patch("re.search") |
| @patch("__builtin__.raw_input") |
| @patch("getpass.getpass") |
| def test_get_validated_string_input(self, get_pass_method, |
| raw_input_method, re_search_method): |
| prompt = "blabla" |
| default = "default_pass" |
| pattern = "pattern_pp" |
| description = "blabla2" |
| # check password input |
| self.assertFalse(False, get_silent()) |
| is_pass = True |
| get_pass_method.return_value = "dfdsfdsfds" |
| |
| result = get_validated_string_input(prompt, default, |
| pattern, description, is_pass) |
| |
| self.assertEquals(get_pass_method.return_value, result) |
| get_pass_method.assure_called_once(prompt) |
| self.assertFalse(raw_input_method.called) |
| |
| # check raw input |
| get_pass_method.reset_mock() |
| raw_input_method.reset_mock() |
| is_pass = False |
| raw_input_method.return_value = "dkf90ewuf0" |
| |
| result = get_validated_string_input(prompt, default, |
| pattern, description, is_pass) |
| |
| self.assertEquals(raw_input_method.return_value, result) |
| self.assertFalse(get_pass_method.called) |
| raw_input_method.assure_called_once(prompt) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| def test_get_pass_file_path(self): |
| result = get_pass_file_path("/etc/ambari/conf_file", JDBC_PASSWORD_FILENAME) |
| self.assertEquals("/etc/ambari/password.dat", result) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup_security") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_setup_security(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, setup_security_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', 'setup-security', '--security-option=setup-security'] |
| setup_security_method.return_value = None |
| |
| _ambari_server_.mainBody() |
| |
| _ambari_server_.mainBody() |
| self.assertTrue(setup_security_method.called) |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| finally: |
| sys.argv = tmp_argv |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup_ambari_krb5_jaas") |
| @patch.object(_ambari_server_, "setup_master_key") |
| @patch.object(_ambari_server_, "setup_truststore") |
| @patch.object(_ambari_server_, "setup_https") |
| @patch.object(_ambari_server_, "get_validated_string_input") |
| @patch.object(_ambari_server_, "logger") |
| def test_setup_security(self, logger_mock, get_validated_string_input_mock, setup_https_mock, |
| setup_truststore_mock, setup_master_key_mock, |
| setup_ambari_krb5_jaas_mock): |
| |
| args = self._create_empty_options_mock() |
| get_validated_string_input_mock.return_value = '1' |
| _ambari_server_.setup_security(args) |
| self.assertTrue(setup_https_mock.called) |
| |
| get_validated_string_input_mock.return_value = '2' |
| _ambari_server_.setup_security(args) |
| self.assertTrue(setup_master_key_mock.called) |
| |
| get_validated_string_input_mock.return_value = '3' |
| _ambari_server_.setup_security(args) |
| self.assertTrue(setup_ambari_krb5_jaas_mock.called) |
| |
| get_validated_string_input_mock.return_value = '4' |
| _ambari_server_.setup_security(args) |
| self.assertTrue(setup_truststore_mock.called) |
| |
| get_validated_string_input_mock.return_value = '5' |
| _ambari_server_.setup_security(args) |
| self.assertTrue(setup_truststore_mock.called) |
| pass |
| |
| |
| @patch("re.sub") |
| @patch("fileinput.FileInput") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("os.path.exists") |
| def test_setup_ambari_krb5_jaas(self, exists_mock, search_mock, |
| get_validated_string_input_mock, |
| fileinput_mock, re_sub_mock): |
| |
| search_mock.return_value = 'filepath' |
| exists_mock.return_value = False |
| |
| # Negative case |
| try: |
| setup_ambari_krb5_jaas(self._create_empty_options_mock()) |
| self.fail("Should throw exception") |
| except NonFatalException as fe: |
| # Expected |
| self.assertTrue("No jaas config file found at location" in fe.reason) |
| pass |
| |
| # Positive case |
| exists_mock.reset_mock() |
| exists_mock.return_value = True |
| get_validated_string_input_mock.side_effect = ['aaa@aaa.cnn', |
| 'pathtokeytab'] |
| |
| fileinput_mock.return_value = [ 'keyTab=xyz', 'principal=xyz' ] |
| |
| setup_ambari_krb5_jaas(self._create_empty_options_mock()) |
| |
| self.assertTrue(fileinput_mock.called) |
| self.assertTrue(re_sub_mock.called) |
| self.assertTrue(re_sub_mock.call_args_list, [('aaa@aaa.cnn'), |
| ('pathtokeytab')]) |
| pass |
| |
| @patch("sys.exit") |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_setup(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, reset_method, stop_method, |
| start_method, setup_method, exit_mock): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ["ambari-server", "setup"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| |
| setup_method.reset_mock() |
| start_method.reset_mock() |
| stop_method.reset_mock() |
| reset_method.reset_mock() |
| exit_mock.reset_mock() |
| sys.argv = ["ambari-server", "setup", "-v"] |
| setup_method.side_effect = Exception("Unexpected error") |
| try: |
| _ambari_server_.mainBody() |
| except Exception: |
| self.assertTrue(True) |
| self.assertTrue(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| self.assertTrue(get_verbose()) |
| |
| setup_method.reset_mock() |
| start_method.reset_mock() |
| stop_method.reset_mock() |
| reset_method.reset_mock() |
| exit_mock.reset_mock() |
| sys.argv = ["ambari-server", "setup"] |
| setup_method.side_effect = Exception("Unexpected error") |
| _ambari_server_.mainBody() |
| self.assertTrue(exit_mock.called) |
| self.assertTrue(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| self.assertFalse(get_verbose()) |
| |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(PGConfig, "_setup_local_server") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch('ambari_server.serverSetup.download_and_install_jdk') |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch.object(DBMSConfig, "setup_database") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.extract_views") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("ambari_server.serverSetup.service_setup") |
| @patch("ambari_server.serverConfiguration.search_file") |
| def test_main_with_preset_dbms(self, search_file_mock, service_setup_mock, adjust_directory_permissions_mock, extract_views_mock, check_jdbc_drivers_mock, setup_database_mock, configure_os_settings_mock, download_and_install_jdk_mock, check_ambari_user_mock, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, setup_local_db_method): |
| extract_views_mock.return_value = 0 |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| configure_os_settings_mock.return_value = 0 |
| search_file_mock.return_value = '/tmp/ambari.properties' |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ["ambari-server", "setup", "-s"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(setup_local_db_method.called) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "fix_database_options") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_fix_database_options_called(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, |
| fixDBOptionsMock, setup_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', 'setup'] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(setup_method.called) |
| self.assertTrue(fixDBOptionsMock.called) |
| set_silent(False) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_start(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, |
| reset_method, stop_method, |
| start_method, setup_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "setup"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| def test_main_test_start_debug_short(self, reset_method, stop_method, |
| start_method, setup_method): |
| temp_args = sys.argv |
| |
| try: |
| sys.argv = ["ambari-server", "start", "-g"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertTrue(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertTrue(get_debug_mode()) |
| finally: |
| sys.argv = temp_args |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| def test_main_test_start_debug_short(self, reset_method, stop_method, |
| start_method, setup_method): |
| temp_args = sys.argv |
| |
| try: |
| sys.argv = ["ambari-server", "pstart", "-g"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertTrue(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertTrue(get_debug_mode()) |
| finally: |
| sys.argv = temp_args |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| def test_main_test_start_debug_long(self, reset_method, stop_method, |
| start_method, setup_method): |
| temp_args = sys.argv |
| |
| try: |
| sys.argv = ["ambari-server", "start", "--debug"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertTrue(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertTrue(get_debug_mode()) |
| finally: |
| sys.argv = temp_args |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| def test_main_test_start_debug_long(self, reset_method, stop_method, |
| start_method, setup_method): |
| temp_args = sys.argv |
| |
| try: |
| sys.argv = ["ambari-server", "pstart", "--debug"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertTrue(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertTrue(get_debug_mode()) |
| finally: |
| sys.argv = temp_args |
| pass |
| |
| #Backup is not yet supported on Windows |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| @patch.object(_ambari_server_, "backup") |
| @patch.object(_ambari_server_, "restore") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_backup(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, |
| restore_mock, backup_mock, reset_method, stop_method, |
| start_method, setup_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "backup"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(backup_mock.called) |
| self.assertFalse(restore_mock.called) |
| self.assertFalse(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| #Restore is not yet supported on Windows |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| @patch.object(_ambari_server_, "backup") |
| @patch.object(_ambari_server_, "restore") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_restore(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, logger_mock, |
| restore_mock, backup_mock, reset_method, stop_method, |
| start_method, setup_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "restore"] |
| _ambari_server_.mainBody() |
| |
| self.assertTrue(restore_mock.called) |
| self.assertFalse(backup_mock.called) |
| self.assertFalse(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "is_server_runing") |
| @patch.object(_ambari_server_, "reset") |
| @patch("optparse.OptionParser") |
| def test_main_test_stop(self, optionParserMock, reset_method, is_server_runing_method, |
| start_method, setup_method): |
| opm = optionParserMock.return_value |
| options = self._create_empty_options_mock() |
| del options.exit_message |
| |
| args = ["stop"] |
| opm.parse_args.return_value = (options, args) |
| |
| is_server_runing_method.return_value = (False, None) |
| |
| options.dbms = None |
| options.sid_or_sname = "sid" |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertTrue(is_server_runing_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| |
| self.assertTrue(options.exit_message is None) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch("os_windows.win32serviceutil.WaitForServiceStatus") |
| @patch("os_windows.win32serviceutil.StopService") |
| @patch("os_windows.win32serviceutil.StopServiceWithDeps") |
| @patch.object(_ambari_server_, "reset") |
| def test_main_test_stop(self, reset_method, service_stop_w_deps_method, |
| service_stop_method, service_status_wait_method, |
| start_method, setup_method): |
| temp_args = sys.argv |
| |
| try: |
| sys.argv = ["ambari-server", "stop"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertTrue(service_stop_w_deps_method.called) |
| self.assertTrue(service_status_wait_method.called) |
| self.assertFalse(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| finally: |
| sys.argv = temp_args |
| pass |
| |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| @patch.object(_ambari_server_, "start") |
| @patch.object(_ambari_server_, "stop") |
| @patch.object(_ambari_server_, "reset") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_reset(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, reset_method, stop_method, |
| start_method, setup_method): |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "reset"] |
| |
| _ambari_server_.mainBody() |
| |
| self.assertFalse(setup_method.called) |
| self.assertFalse(start_method.called) |
| self.assertFalse(stop_method.called) |
| self.assertTrue(reset_method.called) |
| |
| self.assertFalse(False, get_verbose()) |
| self.assertFalse(False, get_silent()) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| def test_configure_postgresql_conf(self): |
| tf1 = tempfile.NamedTemporaryFile() |
| PGConfig.POSTGRESQL_CONF_FILE = tf1.name |
| |
| with open(PGConfig.POSTGRESQL_CONF_FILE, 'w') as f: |
| f.write("#listen_addresses = '127.0.0.1' #\n") |
| f.write("#listen_addresses = '127.0.0.1'") |
| |
| PGConfig._configure_postgresql_conf() |
| |
| expected = self.get_file_string(self.get_samples_dir( |
| "configure_postgresql_conf1")) |
| result = self.get_file_string(PGConfig.POSTGRESQL_CONF_FILE) |
| self.assertEqual(expected, result, "postgresql.conf not updated") |
| |
| mode = oct(os.stat(PGConfig.POSTGRESQL_CONF_FILE)[stat.ST_MODE]) |
| str_mode = str(mode)[-4:] |
| self.assertEqual("0644", str_mode, "Wrong file permissions") |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(PGConfig, "_restart_postgres") |
| @patch.object(PGConfig, "_get_postgre_status") |
| @patch.object(PGConfig, "_configure_postgresql_conf") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_configure_postgres(self, |
| run_os_command_mock, |
| configure_postgresql_conf_mock, |
| get_postgre_status_mock, |
| restart_postgres_mock): |
| args = MagicMock() |
| properties = Properties() |
| |
| args.database_index = 0 |
| |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.silent |
| |
| factory = DBMSConfigFactory() |
| dbConfig = factory.create(args, properties) |
| |
| self.assertTrue(dbConfig.dbms, "postgres") |
| self.assertTrue(dbConfig.persistence_type, "local") |
| |
| tf1 = tempfile.NamedTemporaryFile() |
| tf2 = tempfile.NamedTemporaryFile() |
| |
| PGConfig.PG_HBA_CONF_FILE = tf1.name |
| PGConfig.PG_HBA_CONF_FILE_BACKUP = tf2.name |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| retcode, out1, err = dbConfig._configure_postgres() |
| sys.stdout = sys.__stdout__ |
| self.assertEqual(0, retcode) |
| self.assertEqual("Backup for pg_hba found, reconfiguration not required\n", |
| out.getvalue()) |
| tf2.close() |
| |
| get_postgre_status_mock.return_value = PGConfig.PG_STATUS_RUNNING, 0, "", "" |
| run_os_command_mock.return_value = 0, "", "" |
| restart_postgres_mock.return_value = 0, "", "" |
| |
| rcode, out, err = dbConfig._configure_postgres() |
| |
| self.assertTrue(os.path.isfile(PGConfig.PG_HBA_CONF_FILE_BACKUP), |
| "postgresql.conf backup not created") |
| self.assertTrue(run_os_command_mock.called) |
| mode = oct(os.stat(PGConfig.PG_HBA_CONF_FILE)[stat.ST_MODE]) |
| str_mode = str(mode)[-4:] |
| self.assertEqual("0644", str_mode, "Wrong file permissions") |
| self.assertTrue(configure_postgresql_conf_mock.called) |
| self.assertEqual(0, rcode) |
| |
| os.unlink(PGConfig.PG_HBA_CONF_FILE_BACKUP) |
| |
| get_postgre_status_mock.return_value = "stopped", 0, "", "" |
| rcode, out, err = dbConfig._configure_postgres() |
| self.assertEqual(0, rcode) |
| os.unlink(PGConfig.PG_HBA_CONF_FILE_BACKUP) |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("time.sleep") |
| @patch.object(subprocess32, "Popen") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch.object(PGConfig, "_get_postgre_status") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| def test_restart_postgres(self, printInfoMsg_mock, get_postgre_status_mock, |
| run_os_command_mock, popenMock, sleepMock): |
| p = MagicMock() |
| p.poll.return_value = 0 |
| popenMock.return_value = p |
| retcode, out, err = PGConfig._restart_postgres() |
| self.assertEqual(0, retcode) |
| |
| p.poll.return_value = None |
| get_postgre_status_mock.return_value = "stopped", 0, "", "" |
| run_os_command_mock.return_value = (1, None, None) |
| retcode, out, err = PGConfig._restart_postgres() |
| self.assertEqual(1, retcode) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("shlex.split") |
| @patch("subprocess32.Popen") |
| @patch("ambari_commons.os_linux.print_info_msg") |
| def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock): |
| |
| p = MagicMock() |
| p.communicate.return_value = (None, None) |
| p.returncode = 3 |
| popenMock.return_value = p |
| |
| # with list arg |
| cmd = ["exec", "arg"] |
| run_os_command(cmd) |
| self.assertFalse(splitMock.called) |
| |
| # with str arg |
| resp = run_os_command("runme") |
| self.assertEqual(3, resp[0]) |
| self.assertTrue(splitMock.called) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("shlex.split") |
| @patch("subprocess32.Popen") |
| @patch("ambari_commons.os_windows.print_info_msg") |
| def test_run_os_command(self, printInfoMsg_mock, popenMock, splitMock): |
| |
| p = MagicMock() |
| p.communicate.return_value = (None, None) |
| p.returncode = 3 |
| popenMock.return_value = p |
| |
| # with list arg |
| cmd = ["exec", "arg"] |
| run_os_command(cmd) |
| self.assertFalse(splitMock.called) |
| |
| # with str arg |
| resp = run_os_command("runme") |
| self.assertEqual(3, resp[0]) |
| self.assertTrue(splitMock.called) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| @patch("ambari_server.serverConfiguration.search_file") |
| def test_write_property(self, search_file_mock, get_conf_dir_mock): |
| |
| expected_content = "key1=val1\n" |
| |
| tf1 = tempfile.NamedTemporaryFile() |
| search_file_mock.return_value = tf1.name |
| write_property("key1", "val1") |
| result = tf1.read() |
| self.assertTrue(expected_content in result) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| @patch("ambari_server.serverConfiguration.search_file") |
| def test_write_property(self, search_file_mock, get_conf_dir_mock): |
| |
| expected_content = "key1=val1\n" |
| |
| tf1 = tempfile.NamedTemporaryFile("r+b", delete=False) |
| search_file_mock.return_value = tf1.name |
| tf1.close() |
| write_property("key1", "val1") |
| hf1 = open(tf1.name, "r") |
| try: |
| result = hf1.read() |
| self.assertTrue(expected_content in result) |
| finally: |
| hf1.close() |
| os.unlink(tf1.name) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_setup_db(self, run_os_command_mock, |
| decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| properties.process_pair(JDBC_PASSWORD_PROPERTY, get_alias_string("mypwdalias")) |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| dbms = PGConfig(args, properties, "local") |
| |
| self.assertTrue(decrypt_password_for_alias_mock.called) |
| |
| run_os_command_mock.return_value = (0, None, None) |
| result = dbms._setup_db() |
| self.assertTrue(run_os_command_mock.called) |
| self.assertEqual(run_os_command_mock.call_count, 2) |
| self.assertEqual((0, None, None), result) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("time.sleep") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_setup_db_connect_attempts_fail(self, run_os_command_mock, |
| sleep_mock, decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| dbms = PGConfig(args, properties, "local") |
| |
| run_os_command_mock.side_effect = [(1, "error", "error"), (1, "error", "error"), |
| (1, "error", "error")] |
| result = dbms._setup_db() |
| self.assertTrue(run_os_command_mock.called) |
| self.assertEqual((1, 'error', 'error') , result) |
| self.assertEqual(2, sleep_mock.call_count) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("time.sleep") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_setup_db_connect_attempts_success(self, run_os_command_mock, |
| sleep_mock, decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| dbms = PGConfig(args, properties, "local") |
| |
| run_os_command_mock.side_effect = [(1, "error", "error"), (0, None, None), |
| (0, None, None)] |
| result = dbms._setup_db() |
| self.assertTrue(run_os_command_mock.called) |
| self.assertEqual((0, None, None) , result) |
| self.assertEqual(1, sleep_mock.call_count) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.run_os_command") |
| def test_check_selinux(self, run_os_command_mock, getYNInput_mock): |
| run_os_command_mock.return_value = (0, SE_STATUS_DISABLED, |
| None) |
| rcode = check_selinux() |
| self.assertEqual(0, rcode) |
| |
| getYNInput_mock.return_value = True |
| run_os_command_mock.return_value = (0, "enabled " |
| + SE_MODE_ENFORCING, |
| None) |
| rcode = check_selinux() |
| self.assertEqual(0, rcode) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertTrue(getYNInput_mock.called) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.print_info_msg") |
| def test_get_ambari_jars(self, printInfoMsg_mock): |
| |
| env = "/ambari/jars" |
| os.environ[AMBARI_SERVER_LIB] = env |
| result = get_ambari_jars() |
| self.assertEqual(env, result) |
| |
| del os.environ[AMBARI_SERVER_LIB] |
| result = get_ambari_jars() |
| self.assertEqual("/usr/lib/ambari-server", result) |
| self.assertTrue(printInfoMsg_mock.called) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.print_info_msg") |
| def test_get_ambari_jars(self, printInfoMsg_mock): |
| |
| env = "\\ambari\\jars" |
| os.environ[AMBARI_SERVER_LIB] = env |
| result = get_ambari_jars() |
| self.assertEqual(env, result) |
| |
| del os.environ[AMBARI_SERVER_LIB] |
| result = get_ambari_jars() |
| self.assertEqual("lib", result) |
| self.assertTrue(printInfoMsg_mock.called) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.print_info_msg") |
| def test_get_conf_dir(self, printInfoMsg_mock): |
| env = "/dummy/ambari/conf" |
| os.environ[AMBARI_CONF_VAR] = env |
| result = get_conf_dir() |
| self.assertEqual(env, result) |
| |
| del os.environ[AMBARI_CONF_VAR] |
| result = get_conf_dir() |
| self.assertEqual("/etc/ambari-server/conf", result) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.print_info_msg") |
| def test_get_conf_dir(self, printInfoMsg_mock): |
| env = "\\dummy\\ambari\\conf" |
| os.environ[AMBARI_CONF_VAR] = env |
| result = get_conf_dir() |
| self.assertEqual(env, result) |
| |
| del os.environ[AMBARI_CONF_VAR] |
| result = get_conf_dir() |
| self.assertEqual("conf", result) |
| pass |
| |
| def _test_search_file(self): |
| path = os.path.dirname(__file__) |
| result = search_file(__file__, path) |
| expected = os.path.abspath(__file__) |
| self.assertEqual(expected, result) |
| |
| result = search_file("non_existent_file", path) |
| self.assertEqual(None, result) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.search_file") |
| def test_find_properties_file(self, search_file_mock): |
| # Testing case when file is not found |
| search_file_mock.return_value = None |
| try: |
| find_properties_file() |
| self.fail("File not found'") |
| except FatalException: |
| # Expected |
| pass |
| self.assertTrue(search_file_mock.called) |
| |
| # Testing case when file is found |
| value = MagicMock() |
| search_file_mock.return_value = value |
| result = find_properties_file() |
| self.assertTrue(result is value) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.Properties") |
| def test_read_ambari_user(self, properties_mock, get_ambari_properties_mock): |
| # Testing with defined user |
| properties_mock.__getitem__.return_value = "dummy_user" |
| get_ambari_properties_mock.return_value = properties_mock |
| user = read_ambari_user() |
| self.assertEquals(user, "dummy_user") |
| # Testing with undefined user |
| properties_mock.__getitem__.return_value = None |
| user = read_ambari_user() |
| self.assertEquals(user, None) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.Properties") |
| def test_read_active_instance(self, properties_mock, get_ambari_properties_mock): |
| # Set up the mock |
| properties_mock.propertyNames = MagicMock(return_value=['active.instance']) |
| get_ambari_properties_mock.return_value = properties_mock |
| |
| # Test with explicitly set value of "false" (should return False) |
| properties_mock.__getitem__.return_value = "false" |
| is_active_instance = get_is_active_instance() |
| self.assertFalse(is_active_instance) |
| |
| # Test with empty string (should return False) |
| properties_mock.__getitem__.return_value = "" |
| is_active_instance = get_is_active_instance() |
| self.assertFalse(is_active_instance) |
| |
| # Test with a random string (should return False) |
| properties_mock.__getitem__.return_value = "xyz" |
| is_active_instance = get_is_active_instance() |
| self.assertFalse(is_active_instance) |
| |
| # Test with a explicit false string (should return False) |
| properties_mock.__getitem__.return_value = "false" |
| is_active_instance = get_is_active_instance() |
| self.assertFalse(is_active_instance) |
| |
| # Test with explicitly set value of "true" (should return True) |
| properties_mock.__getitem__.return_value = "true" |
| is_active_instance = get_is_active_instance() |
| self.assertTrue(is_active_instance) |
| |
| # Test with missing active.instance entry (should return True) |
| properties_mock.propertyNames = MagicMock(return_value=[]) |
| is_active_instance = get_is_active_instance() |
| self.assertTrue(is_active_instance) |
| |
| pass |
| |
| @patch("ambari_server.setupSecurity.get_file_owner") |
| @patch("ambari_server.setupSecurity.get_ambari_repo_file_full_name") |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.set_file_permissions") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.get_resources_location") |
| @patch("ambari_server.setupSecurity.get_value_from_properties") |
| @patch("os.mkdir") |
| @patch("shutil.rmtree") |
| @patch("ambari_commons.os_utils.print_info_msg") |
| @patch("ambari_server.setupSecurity.change_owner") |
| def test_adjust_directory_permissions(self, change_owner_mock, print_info_msg_mock, rmtree_mock, mkdir_mock, |
| get_value_from_properties_mock, get_resources_location_mock, |
| get_ambari_properties_mock, set_file_permissions_mock, exists_mock, |
| get_ambari_repo_file_full_name_mock, get_file_owner_mock): |
| # Testing boostrap dir wipe |
| properties_mock = Properties() |
| properties_mock.process_pair(JDK_NAME_PROPERTY, "dummy_jdk") |
| properties_mock.process_pair(JCE_NAME_PROPERTY, "dummy_jce") |
| properties_mock.process_pair(JAVA_HOME_PROPERTY, "dummy_java_home") |
| get_ambari_properties_mock.return_value = properties_mock |
| |
| get_value_from_properties_mock.return_value = "dummy_bootstrap_dir" |
| get_resources_location_mock.return_value = "dummy_resources_dir" |
| exists_mock.return_value = False |
| adjust_directory_permissions("user") |
| self.assertTrue(mkdir_mock.called) |
| |
| set_file_permissions_mock.reset_mock() |
| change_owner_mock.reset_mock() |
| # Test recursive calls |
| old_adjust_owner_list = configDefaults.NR_ADJUST_OWNERSHIP_LIST |
| old_change_owner_list = configDefaults.NR_CHANGE_OWNERSHIP_LIST |
| try: |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = [ |
| ( "/etc/ambari-server/conf", "755", "{0}", True ), |
| ( "/etc/ambari-server/conf/ambari.properties", "644", "{0}", False ) |
| ] |
| |
| configDefaults.NR_CHANGE_OWNERSHIP_LIST = [ |
| ( "/etc/ambari-server", "{0}", True ) |
| ] |
| |
| adjust_directory_permissions("user") |
| self.assertTrue(len(set_file_permissions_mock.call_args_list) == |
| len(configDefaults.NR_ADJUST_OWNERSHIP_LIST)) |
| self.assertEquals(set_file_permissions_mock.call_args_list[0][0][3], True) |
| self.assertEquals(set_file_permissions_mock.call_args_list[1][0][3], False) |
| self.assertTrue(len(change_owner_mock.call_args_list) == |
| len(configDefaults.NR_CHANGE_OWNERSHIP_LIST)) |
| self.assertEquals(change_owner_mock.call_args_list[0][0][2], True) |
| finally: |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = old_adjust_owner_list |
| configDefaults.NR_CHANGE_OWNERSHIP_LIST = old_change_owner_list |
| pass |
| |
| # |
| # Test ambari repo file permission change call |
| # |
| |
| # Test the case when ambari repo file is available |
| |
| # Reset the set_file_permissions() mock function |
| set_file_permissions_mock.reset_mock() |
| |
| # Save the existing permissions list |
| old_adjust_owner_list = configDefaults.NR_ADJUST_OWNERSHIP_LIST |
| |
| # Set up the mock function for os_utils.get_ambari_repo_file_full_name() |
| get_ambari_repo_file_full_name_mock.return_value = "ambari.dummy.repo" |
| |
| # Set up the mock function for os_utils.get_file_owner() |
| get_file_owner_mock.return_value = "dummy.root" |
| |
| # Set os.path.exists to return true when the input file is an ambari repo file |
| def file_exists_side_effect(*args, **kwargs): |
| if args[0] == get_ambari_repo_file_full_name_mock(): |
| return True |
| else: |
| return False |
| |
| exists_mock.side_effect = file_exists_side_effect |
| exists_mock.return_value = None |
| |
| try: |
| # Clear the list of files whose permissions are to be changed |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = [ |
| ] |
| |
| # Call the function to be tested. |
| adjust_directory_permissions("dummy_user") |
| |
| # Assert that set_file_permissions() was called |
| self.assertTrue(set_file_permissions_mock.called) |
| |
| # One of the entries in NR_ADJUST_OWNERSHIP_LIST should be the full path to the ambari repo file. |
| # These are the expected values: |
| |
| ambari_repo_file_entry = ( |
| get_ambari_repo_file_full_name_mock(), |
| '644', |
| get_file_owner_mock(), |
| False |
| ) |
| |
| # Assert the arguments to the call set_file_permissions() - got from NR_ADJUST_OWNERSHIP_LIST |
| # Flag to ensure we found our entry in the set_file_permissions() call |
| entry_found = False |
| |
| for args_entry in set_file_permissions_mock.call_args_list: |
| if args_entry[0][0] == ambari_repo_file_entry[0]: # File name |
| # ambari repo file name matched; assert the rest of the entries |
| self.assertEquals(args_entry[0][1], ambari_repo_file_entry[1]) # Permissions |
| self.assertEquals(args_entry[0][2], ambari_repo_file_entry[2]) # File owner |
| self.assertEquals(args_entry[0][3], ambari_repo_file_entry[3]) # Non-recursive |
| entry_found = True |
| break |
| |
| # Ensure that the ambari repo file entry was found |
| self.assertTrue(entry_found) |
| |
| finally: |
| # Restore the permissions list |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = old_adjust_owner_list |
| pass |
| |
| #Test the case when ambari repo file is unavailable |
| |
| # Reset the set_file_permissions() mock function |
| set_file_permissions_mock.reset_mock() |
| |
| # Save the existing permissions list |
| old_adjust_owner_list = configDefaults.NR_ADJUST_OWNERSHIP_LIST |
| |
| # Set up the mock function for os_utils.get_ambari_repo_file_full_name() |
| get_ambari_repo_file_full_name_mock.return_value = "ambari.dummy.repo" |
| |
| # Set up the mock function for os_utils.get_file_owner() |
| get_file_owner_mock.return_value = "dummy.root" |
| |
| # Set os.path.exists to return false always |
| exists_mock.side_effect = None |
| exists_mock.return_value = False |
| |
| try: |
| # Clear the list of files whose permissions are to be changed |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = [ |
| ] |
| |
| # Call the function to be tested. |
| adjust_directory_permissions("dummy_user") |
| |
| # One of the entries in NR_ADJUST_OWNERSHIP_LIST should be the full path to the ambari repo file. |
| # These are the expected values: |
| |
| ambari_repo_file_entry = ( |
| get_ambari_repo_file_full_name_mock(), |
| '644', |
| get_file_owner_mock(), |
| False |
| ) |
| |
| # Assert the arguments to the call set_file_permissions() - got from NR_ADJUST_OWNERSHIP_LIST |
| # Flag to ensure we found our entry in the set_file_permissions() call |
| entry_found = False |
| |
| for args_entry in set_file_permissions_mock.call_args_list: |
| if args_entry[0][0] == ambari_repo_file_entry[0]: # File name |
| entry_found = True |
| break |
| |
| # Ensure that the ambari repo file entry was not found |
| self.assertFalse(entry_found) |
| |
| finally: |
| # Restore the permissions list |
| configDefaults.NR_ADJUST_OWNERSHIP_LIST = old_adjust_owner_list |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("os.path.exists") |
| @patch("ambari_commons.os_linux.os_run_os_command") |
| @patch("ambari_commons.os_linux.print_warning_msg") |
| @patch("ambari_commons.os_utils.print_info_msg") |
| def test_set_file_permissions(self, print_info_msg_mock, print_warning_msg_mock, |
| run_os_command_mock, exists_mock): |
| |
| # Testing not existent file scenario |
| exists_mock.return_value = False |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", False) |
| self.assertFalse(run_os_command_mock.called) |
| self.assertTrue(print_info_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| |
| # Testing OK scenario |
| exists_mock.return_value = True |
| run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")] |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", False) |
| self.assertTrue(len(run_os_command_mock.call_args_list) == 2) |
| self.assertFalse(print_warning_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| |
| # Testing first command fail |
| run_os_command_mock.side_effect = [(1, "", ""), (0, "", "")] |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", False) |
| self.assertTrue(len(run_os_command_mock.call_args_list) == 2) |
| self.assertTrue(print_warning_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| |
| # Testing second command fail |
| run_os_command_mock.side_effect = [(0, "", ""), (1, "", "")] |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", False) |
| self.assertTrue(len(run_os_command_mock.call_args_list) == 2) |
| self.assertTrue(print_warning_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| |
| # Testing recursive operation |
| |
| exists_mock.return_value = True |
| run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")] |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", True) |
| self.assertTrue(len(run_os_command_mock.call_args_list) == 2) |
| self.assertTrue("-R" in run_os_command_mock.call_args_list[0][0][0]) |
| self.assertTrue("-R" in run_os_command_mock.call_args_list[1][0][0]) |
| self.assertFalse(print_warning_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| |
| # Testing non-recursive operation |
| |
| exists_mock.return_value = True |
| run_os_command_mock.side_effect = [(0, "", ""), (0, "", "")] |
| set_file_permissions("dummy-file", "dummy-mod", |
| "dummy-user", False) |
| self.assertTrue(len(run_os_command_mock.call_args_list) == 2) |
| self.assertFalse("-R" in run_os_command_mock.call_args_list[0][0][0]) |
| self.assertFalse("-R" in run_os_command_mock.call_args_list[1][0][0]) |
| self.assertFalse(print_warning_msg_mock.called) |
| |
| run_os_command_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.get_validated_string_input") |
| @patch("ambari_server.serverSetup.print_info_msg") |
| @patch("ambari_server.serverSetup.print_warning_msg") |
| @patch("ambari_server.serverSetup.run_os_command") |
| def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock, |
| print_info_msg_mock, get_validated_string_input_mock): |
| options = self._create_empty_options_mock() |
| |
| user = "dummy-user" |
| get_validated_string_input_mock.return_value = user |
| |
| userChecks = AmbariUserChecks(options) |
| |
| # Testing scenario: absent user |
| run_os_command_mock.side_effect = [(0, "", "")] |
| result = userChecks._create_custom_user() |
| self.assertFalse(print_warning_msg_mock.called) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, user) |
| |
| print_info_msg_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| |
| # Testing scenario: existing user |
| run_os_command_mock.side_effect = [(9, "", "")] |
| result = userChecks._create_custom_user() |
| self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0])) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, user) |
| |
| print_info_msg_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| |
| # Testing scenario: os command fail |
| run_os_command_mock.side_effect = [(1, "", "")] |
| result = userChecks._create_custom_user() |
| self.assertTrue(print_warning_msg_mock.called) |
| self.assertEquals(result, 1) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("win32security.LsaAddAccountRights") |
| @patch("win32security.LookupAccountName") |
| @patch("win32net.NetUserAdd") |
| @patch("win32net.NetUserGetInfo") |
| @patch("win32security.LsaOpenPolicy") |
| @patch("win32net.NetGetDCName") |
| @patch("ambari_server.serverSetup.get_validated_string_input") |
| @patch("ambari_server.serverSetup.print_info_msg") |
| @patch("ambari_server.serverSetup.print_warning_msg") |
| def test_create_custom_user(self, print_warning_msg_mock, |
| print_info_msg_mock, get_validated_string_input_mock, |
| net_get_dc_name_mock, lsa_open_policy_mock, |
| net_user_get_info_mock, net_user_add_mock, |
| lookup_account_name_mock, lsa_add_account_rights_mock): |
| def _reset_mocks(): |
| get_validated_string_input_mock.reset_mock() |
| print_info_msg_mock.reset_mock() |
| print_warning_msg_mock.reset_mock() |
| net_get_dc_name_mock.reset_mock() |
| net_user_get_info_mock.reset_mock() |
| net_user_add_mock.reset_mock() |
| lookup_account_name_mock.reset_mock() |
| lsa_add_account_rights_mock.reset_mock() |
| pass |
| |
| options = MagicMock() |
| |
| user = "dummy-user" |
| get_validated_string_input_mock.return_value = user |
| |
| userChecks = AmbariUserChecks(options) |
| |
| # Testing scenario: absent user |
| def user_not_found(*args, **keywargs): |
| import pywintypes |
| raise pywintypes.error(2221) |
| |
| net_user_get_info_mock.side_effect = user_not_found |
| result = userChecks._create_custom_user() |
| self.assertTrue(print_warning_msg_mock.called) |
| self.assertTrue(net_user_add_mock.called) |
| self.assertEqual(str(net_user_add_mock.call_args_list[0][0]), str((None, 1, {'comment': 'Ambari user', 'password': 'dummy-user', 'flags': 513, 'name': 'dummy-user', 'priv': 1}))) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, ".\\" + user) |
| |
| _reset_mocks() |
| |
| # Testing scenario: existing user |
| net_user_get_info_mock.side_effect = None |
| net_user_get_info_mock.return_value = { "name":"dummy_user" } |
| #lookup_account_name_mock |
| #lsa_add_account_rights_mock |
| result = userChecks._create_custom_user() |
| self.assertTrue("User dummy-user already exists" in print_info_msg_mock.call_args_list[0][0][0]) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, ".\\" + user) |
| self.assertFalse(net_user_add_mock.called) |
| |
| _reset_mocks() |
| |
| # Testing scenario: new domain user |
| get_validated_string_input_mock.side_effect = ["dummy_domain\\dummy_user", "newpassword"] |
| net_get_dc_name_mock.return_value = "dummy_dc" |
| net_user_get_info_mock.side_effect = user_not_found |
| result = userChecks._create_custom_user() |
| self.assertTrue(net_get_dc_name_mock.called) |
| self.assertEqual(str(net_get_dc_name_mock.call_args_list[0][0]), str((None, "dummy_domain"))) |
| self.assertTrue(net_user_add_mock.called) |
| self.assertEqual(str(net_user_add_mock.call_args_list[0][0]), str(('dummy_dc', 1, {'comment': 'Ambari user', 'password': 'newpassword', 'flags': 513, 'name': 'dummy_user', 'priv': 1}))) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, "dummy_domain\\dummy_user") |
| |
| _reset_mocks() |
| |
| # Testing scenario: existing domain user |
| get_validated_string_input_mock.side_effect = ["dummy_domain\\dummy_user", "newpassword"] |
| net_user_get_info_mock.side_effect = None |
| net_user_get_info_mock.return_value = { "name":"dummy_domain\\dummy_user" } |
| result = userChecks._create_custom_user() |
| self.assertTrue("User dummy_domain\\dummy_user already exists" in print_info_msg_mock.call_args_list[0][0][0]) |
| self.assertTrue(net_get_dc_name_mock.called) |
| self.assertEqual(str(net_get_dc_name_mock.call_args_list[0][0]), str((None, "dummy_domain"))) |
| self.assertFalse(net_user_add_mock.called) |
| self.assertEquals(result, 0) |
| self.assertEquals(userChecks.user, "dummy_domain\\dummy_user") |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.read_ambari_user") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.get_validated_string_input") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("ambari_server.serverSetup.run_os_command") |
| @patch("ambari_server.serverSetup.print_error_msg") |
| @patch("ambari_server.serverSetup.print_warning_msg") |
| @patch("ambari_server.serverSetup.print_info_msg") |
| def test_check_ambari_user(self, print_info_msg_mock, print_warning_msg_mock, print_error_msg_mock, |
| run_os_command_mock, adjust_directory_permissions_mock, |
| get_validated_string_input_mock, get_YN_input_mock, read_ambari_user_mock): |
| def _reset_mocks(): |
| get_YN_input_mock.reset_mock() |
| get_validated_string_input_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| adjust_directory_permissions_mock.reset_mock() |
| pass |
| |
| options = self._create_empty_options_mock() |
| |
| run_os_command_mock.return_value = (0, "", "") |
| |
| # Scenario: user is already defined, user does not want to reconfigure it |
| read_ambari_user_mock.return_value = "dummy-user" |
| get_YN_input_mock.return_value = False |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertFalse(get_validated_string_input_mock.called) |
| self.assertFalse(run_os_command_mock.called) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Scenario: user is already defined, but user wants to reconfigure it |
| |
| read_ambari_user_mock.return_value = "dummy-user" |
| get_validated_string_input_mock.return_value = "new-dummy-user" |
| get_YN_input_mock.return_value = True |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(result[2] == "new-dummy-user") |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Negative scenario: user is already defined, but user wants |
| # to reconfigure it, user creation failed |
| |
| read_ambari_user_mock.return_value = "dummy-user" |
| run_os_command_mock.return_value = (1, "", "") |
| get_YN_input_mock.return_value = True |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertFalse(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 1) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined (setup process) |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.return_value = "dummy-user" |
| run_os_command_mock.return_value = (0, "", "") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertTrue(result[2] == "dummy-user") |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined (setup process), user creation failed |
| |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| run_os_command_mock.return_value = (1, "", "") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertFalse(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 1) |
| |
| _reset_mocks() |
| |
| # negative scenario: user is not defined (setup process), user creation failed |
| |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| run_os_command_mock.return_value = (1, "", "") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertFalse(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 1) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined and left to be root |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = False |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertFalse(get_validated_string_input_mock.called) |
| self.assertFalse(run_os_command_mock.called) |
| self.assertTrue(result[2] == "root") |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_commons.os_windows.UserHelper.add_user_privilege") |
| @patch("ambari_commons.os_windows.UserHelper.create_user") |
| @patch("ambari_commons.os_windows.UserHelper.find_user") |
| @patch("ambari_server.serverSetup.read_ambari_user") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.get_validated_string_input") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("ambari_server.serverSetup.run_os_command") |
| @patch("ambari_server.serverSetup.print_error_msg") |
| @patch("ambari_server.serverSetup.print_warning_msg") |
| @patch("ambari_server.serverSetup.print_info_msg") |
| def test_check_ambari_user(self, print_info_msg_mock, print_warning_msg_mock, print_error_msg_mock, |
| run_os_command_mock, adjust_directory_permissions_mock, |
| get_validated_string_input_mock, get_YN_input_mock, read_ambari_user_mock, |
| find_user_mock, create_user_mock, add_user_privilege_mock): |
| def _reset_mocks(): |
| get_YN_input_mock.reset_mock() |
| get_validated_string_input_mock.reset_mock() |
| find_user_mock.reset_mock() |
| create_user_mock.reset_mock() |
| adjust_directory_permissions_mock.reset_mock() |
| pass |
| |
| options = MagicMock() |
| options.svc_user = None |
| options.svc_password = None |
| |
| run_os_command_mock.return_value = (0, "", "") |
| |
| # Scenario: user is already defined, user does not want to reconfigure it |
| read_ambari_user_mock.return_value = "dummy-user" |
| get_YN_input_mock.return_value = False |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertFalse(get_validated_string_input_mock.called) |
| self.assertFalse(find_user_mock.called) |
| self.assertFalse(create_user_mock.called) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Scenario: user is already defined, but user wants to reconfigure it |
| |
| read_ambari_user_mock.return_value = "dummy-user" |
| get_validated_string_input_mock.side_effect = ["new-dummy-user", "new_password"] |
| get_YN_input_mock.return_value = True |
| find_user_mock.return_value = False |
| create_user_mock.return_value = (0, "User created") |
| add_user_privilege_mock.return_value = (0, "Privilege added") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertEqual(result[2], ".\\new-dummy-user") |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertTrue(find_user_mock.called) |
| self.assertTrue(create_user_mock.called) |
| self.assertTrue(add_user_privilege_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Negative scenario: user is already defined, but user wants |
| # to reconfigure it, user creation failed |
| |
| read_ambari_user_mock.return_value = "dummy-user" |
| get_validated_string_input_mock.side_effect = ["new-dummy-user", "new_password"] |
| find_user_mock.return_value = False |
| create_user_mock.return_value = (-1, "Failed") |
| get_YN_input_mock.return_value = True |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(create_user_mock.called) |
| self.assertFalse(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], -1) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined (setup process) |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.side_effect = ["dummy-user", "new_password"] |
| create_user_mock.return_value = (0, "User created") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(create_user_mock.called) |
| self.assertTrue(result[2] == ".\\dummy-user") |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined, use system account (setup process) |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.side_effect = ["NT AUTHORITY\\SYSTEM"] |
| create_user_mock.return_value = (0, "User created") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertEqual(get_validated_string_input_mock.call_count, 1) |
| self.assertFalse(find_user_mock.called) |
| self.assertFalse(create_user_mock.called) |
| self.assertTrue(result[2] == "NT AUTHORITY\\SYSTEM") |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined (setup process), user creation failed |
| |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.side_effect = ["new-dummy-user", "new_password"] |
| find_user_mock.return_value = False |
| create_user_mock.return_value = (-1, "Failed") |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertTrue(create_user_mock.called) |
| self.assertFalse(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], -1) |
| |
| _reset_mocks() |
| |
| # Scenario: user is not defined and left to be the default |
| read_ambari_user_mock.return_value = None |
| get_YN_input_mock.return_value = False |
| result = check_ambari_user(options) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertFalse(get_validated_string_input_mock.called) |
| self.assertFalse(run_os_command_mock.called) |
| self.assertTrue(result[2] == "NT AUTHORITY\\SYSTEM") |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| self.assertEqual(result[0], 0) |
| pass |
| |
| |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("__builtin__.open") |
| @patch("ambari_server.serverConfiguration.read_ambari_user") |
| @patch("ambari_server.serverConfiguration.set_file_permissions") |
| def test_store_password_file(self, set_file_permissions_mock, |
| read_ambari_user_mock, open_mock, search_file_mock): |
| search_file_mock.return_value = "/etc/ambari-server/conf/ambari.properties" |
| open_mock.return_value = MagicMock() |
| store_password_file("password", "passfile") |
| self.assertTrue(set_file_permissions_mock.called) |
| pass |
| |
| @patch("resource_management.core.shell.call") |
| @patch.object(OSCheck, "get_os_family") |
| @patch.object(OSCheck, "get_os_type") |
| @patch.object(OSCheck, "get_os_major_version") |
| def test_check_firewall_is_running(self, get_os_major_version_mock, get_os_type_mock, get_os_family_mock, shell_call_mock): |
| |
| get_os_major_version_mock.return_value = 18 |
| get_os_type_mock.return_value = OSConst.OS_FEDORA |
| get_os_family_mock.return_value = OSConst.REDHAT_FAMILY |
| |
| firewall_obj = Firewall().getFirewallObject() |
| shell_call_mock.return_value = (0, "active", "err") |
| self.assertEqual("Fedora18FirewallChecks", firewall_obj.__class__.__name__) |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (3, "", "err") |
| self.assertFalse(firewall_obj.check_firewall()) |
| self.assertEqual("err", firewall_obj.stderrdata) |
| |
| |
| get_os_type_mock.return_value = OSConst.OS_UBUNTU |
| get_os_family_mock.return_value = OSConst.UBUNTU_FAMILY |
| |
| firewall_obj = Firewall().getFirewallObject() |
| shell_call_mock.return_value = (0, "Status: active", "err") |
| self.assertEqual("UbuntuFirewallChecks", firewall_obj.__class__.__name__) |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (0, "Status: inactive", "err") |
| self.assertFalse(firewall_obj.check_firewall()) |
| self.assertEqual("err", firewall_obj.stderrdata) |
| |
| get_os_type_mock.return_value = "" |
| get_os_family_mock.return_value = OSConst.SUSE_FAMILY |
| |
| firewall_obj = Firewall().getFirewallObject() |
| shell_call_mock.return_value = (0, "running", "err") |
| self.assertEqual("SuseFirewallChecks", firewall_obj.__class__.__name__) |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (0, "unused", "err") |
| self.assertFalse(firewall_obj.check_firewall()) |
| self.assertEqual("err", firewall_obj.stderrdata) |
| |
| get_os_major_version_mock.return_value = 7 |
| get_os_type_mock.return_value = "" |
| get_os_family_mock.return_value = OSConst.REDHAT_FAMILY |
| |
| firewall_obj = Firewall().getFirewallObject() |
| shell_call_mock.return_value = (0, "active\nactive", "err") |
| self.assertEqual("RedHat7FirewallChecks", firewall_obj.__class__.__name__) |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (3, "inactive\nactive", "err") |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (3, "active\ninactive", "err") |
| self.assertTrue(firewall_obj.check_firewall()) |
| shell_call_mock.return_value = (3, "inactive\ninactive", "err") |
| self.assertFalse(firewall_obj.check_firewall()) |
| self.assertEqual("err", firewall_obj.stderrdata) |
| |
| pass |
| |
| @patch("ambari_server.setupHttps.get_validated_filepath_input") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| @patch("ambari_server.setupHttps.run_os_command") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_type") |
| @patch("__builtin__.open") |
| @patch("ambari_server.setupHttps.find_properties_file") |
| @patch("ambari_server.setupHttps.run_component_https_cmd") |
| @patch("ambari_server.setupHttps.get_delete_cert_command") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_password") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_path") |
| @patch("ambari_server.setupHttps.get_YN_input") |
| @patch("ambari_server.setupHttps.get_ambari_properties") |
| @patch("ambari_server.setupHttps.find_jdk") |
| def test_setup_truststore(self, find_jdk_mock, get_ambari_properties_mock, get_YN_input_mock, |
| get_and_persist_truststore_path_mock, get_and_persist_truststore_password_mock, |
| get_delete_cert_command_mock, run_component_https_cmd_mock, |
| find_properties_file_mock, open_mock, |
| get_and_persist_truststore_type_mock, run_os_command_mock, |
| get_validated_string_input_mock, |
| get_validated_filepath_input_mock): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| component = "component" |
| command = "command" |
| property = "use_ssl" |
| alias = "alias" |
| options = self._create_empty_options_mock() |
| #Silent mode |
| set_silent(True) |
| setup_truststore(options) |
| self.assertEqual('setup-security is not enabled in silent mode.\n', out.getvalue()) |
| sys.stdout = sys.__stdout__ |
| #Verbouse mode and jdk_path is None |
| set_silent(False) |
| p = get_ambari_properties_mock.return_value |
| # Dont disable ssl |
| get_YN_input_mock.side_effect = [False] |
| get_validated_string_input_mock.return_value = "alias" |
| setup_truststore(options) |
| self.assertTrue(get_YN_input_mock.called) |
| p.get_property.reset_mock() |
| get_YN_input_mock.reset_mock() |
| # Cant find jdk |
| find_jdk_mock.return_value = None |
| try: |
| setup_truststore(options) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue('No JDK found, please run the "ambari-server setup" command to install a' + |
| ' JDK automatically or install any JDK manually to ' in fe.reason) |
| pass |
| #Verbouse mode and jdk_path is not None (use_https = true) |
| find_jdk_mock.return_value = "/jdk_path" |
| p.get_property.side_effect = ["true"] |
| get_YN_input_mock.side_effect = [True,True] |
| get_and_persist_truststore_path_mock.return_value = "/truststore_path" |
| get_and_persist_truststore_password_mock.return_value = "/truststore_password" |
| get_delete_cert_command_mock.return_value = "rm -f" |
| setup_truststore(options, True) |
| |
| self.assertTrue(get_and_persist_truststore_path_mock.called) |
| self.assertTrue(get_and_persist_truststore_password_mock.called) |
| self.assertTrue(get_delete_cert_command_mock.called) |
| self.assertTrue(find_properties_file_mock.called) |
| self.assertTrue(open_mock.called) |
| self.assertTrue(p.store.called) |
| self.assertTrue(run_component_https_cmd_mock.called) |
| |
| p.process_pair.reset_mock() |
| get_and_persist_truststore_path_mock.reset_mock() |
| get_and_persist_truststore_password_mock.reset_mock() |
| get_delete_cert_command_mock.reset_mock() |
| find_properties_file_mock.reset_mock() |
| open_mock.reset_mock() |
| p.store.reset_mock() |
| #Verbouse mode and jdk_path is not None (use_https = false) and import cert |
| p.get_property.side_effect = ["false"] |
| get_YN_input_mock.side_effect = [True,True] |
| setup_truststore(options, True) |
| |
| self.assertTrue(get_and_persist_truststore_type_mock.called) |
| self.assertTrue(get_and_persist_truststore_path_mock.called) |
| self.assertTrue(get_and_persist_truststore_password_mock.called) |
| self.assertTrue(get_delete_cert_command_mock.called) |
| self.assertTrue(find_properties_file_mock.called) |
| self.assertTrue(open_mock.called) |
| self.assertTrue(p.store.called) |
| self.assertTrue(run_component_https_cmd_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertTrue(get_validated_filepath_input_mock.called) |
| |
| p.process_pair.reset_mock() |
| get_and_persist_truststore_type_mock.reset_mock() |
| get_and_persist_truststore_path_mock.reset_mock() |
| get_and_persist_truststore_password_mock.reset_mock() |
| get_delete_cert_command_mock.reset_mock() |
| find_properties_file_mock.reset_mock() |
| open_mock.reset_mock() |
| p.store.reset_mock() |
| run_os_command_mock.reset_mock() |
| get_validated_filepath_input_mock.reset_mock() |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("ambari_commons.logging_utils.get_silent") |
| @patch("ambari_server.setupHttps.find_jdk") |
| @patch("ambari_server.setupHttps.get_ambari_properties") |
| @patch("ambari_server.setupHttps.get_YN_input") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_type") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_path") |
| @patch("ambari_server.setupHttps.get_and_persist_truststore_password") |
| @patch("ambari_server.setupHttps.find_properties_file") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| @patch("ambari_server.setupHttps.run_os_command") |
| @patch("ambari_server.setupHttps.get_validated_filepath_input") |
| @patch("ambari_server.setupHttps.get_import_cert_command") |
| @patch("ambari_server.setupHttps.run_component_https_cmd") |
| def test_reconfigure_truststore(self, run_component_https_cmd_mock, |
| get_import_cert_command_mock, |
| get_validated_filepath_input_mock, run_os_command_mock, |
| get_validated_string_input_mock, find_properties_file_mock, |
| get_and_persist_truststore_password_mock, get_and_persist_truststore_path_mock, |
| get_and_persist_truststore_type_mock, get_YN_input_mock, |
| get_ambari_properties_mock, find_jdk_mock, get_silent_mock, |
| open_mock): |
| |
| def reset_mocks(): |
| open_mock.reset_mock() |
| find_jdk_mock.reset_mock() |
| get_ambari_properties_mock.reset_mock() |
| get_YN_input_mock.reset_mock() |
| get_and_persist_truststore_type_mock.reset_mock() |
| get_and_persist_truststore_path_mock.reset_mock() |
| get_and_persist_truststore_password_mock.reset_mock() |
| find_properties_file_mock.reset_mock() |
| get_validated_string_input_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| get_validated_filepath_input_mock.reset_mock() |
| get_import_cert_command_mock.reset_mock() |
| run_component_https_cmd_mock.reset_mock() |
| |
| #Test preconditions |
| get_silent_mock.return_value = False |
| find_jdk_mock.return_value = "/path" |
| options = self._create_empty_options_mock() |
| |
| #Reconfiguration allowed by the user |
| reset_mocks() |
| get_YN_input_mock.side_effect = [True, True, True] |
| setup_truststore(options) |
| self.assertTrue(get_and_persist_truststore_type_mock.called) |
| self.assertTrue(get_and_persist_truststore_path_mock.called) |
| self.assertTrue(get_and_persist_truststore_password_mock.called) |
| |
| #Reconfiguration disallowed by the user |
| reset_mocks() |
| get_YN_input_mock.side_effect = [True, False] |
| setup_truststore(options) |
| self.assertTrue(get_and_persist_truststore_type_mock.called) |
| self.assertTrue(get_and_persist_truststore_path_mock.called) |
| self.assertTrue(get_and_persist_truststore_password_mock.called) |
| |
| #Reconfiguration should be disabled when 'import_cert' flag is 'True' |
| reset_mocks() |
| get_YN_input_mock.side_effect = [True, True] |
| setup_truststore(options, True) |
| self.assertTrue(get_and_persist_truststore_type_mock.called) |
| self.assertTrue(get_and_persist_truststore_path_mock.called) |
| self.assertTrue(get_and_persist_truststore_password_mock.called) |
| self.assertTrue(get_import_cert_command_mock.called) |
| |
| pass |
| |
| @patch("ambari_server.setupHttps.adjust_directory_permissions") |
| @patch("ambari_server.setupHttps.read_ambari_user") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| @patch("ambari_server.setupHttps.find_properties_file") |
| @patch("ambari_server.setupHttps.get_ambari_properties") |
| @patch("ambari_server.setupHttps.import_cert_and_key_action") |
| @patch("ambari_server.setupHttps.get_YN_input") |
| @patch("__builtin__.open") |
| @patch("ambari_server.setupHttps.is_root") |
| @patch("ambari_server.setupHttps.is_valid_cert_host") |
| @patch("ambari_server.setupHttps.is_valid_cert_exp") |
| def test_setup_https(self, is_valid_cert_exp_mock, is_valid_cert_host_mock, \ |
| is_root_mock, open_Mock, get_YN_input_mock, \ |
| import_cert_and_key_action_mock, |
| get_ambari_properties_mock, \ |
| find_properties_file_mock, \ |
| get_validated_string_input_mock, read_ambari_user_method, \ |
| adjust_directory_permissions_mock): |
| |
| is_valid_cert_exp_mock.return_value = True |
| is_valid_cert_host_mock.return_value = True |
| open_Mock.return_value = file |
| p = get_ambari_properties_mock.return_value |
| |
| args = MagicMock() |
| args.api_ssl_port = None |
| args.api_ssl = None |
| args.import_cert_path = None |
| args.import_key_path = None |
| args.pem_password = None |
| # Testing call under root |
| is_root_mock.return_value = True |
| read_ambari_user_method.return_value = "user" |
| #Case #1: if client ssl is on and user didnt choose |
| #disable ssl option and choose import certs and keys |
| p.get_property.side_effect = ["key_dir", "5555", "6666", "true", "5555", "true", "true", "5555"] |
| get_YN_input_mock.side_effect = [False, True] |
| get_validated_string_input_mock.side_effect = ["4444"] |
| get_property_expected = "[call('security.server.keys_dir'),\n" + \ |
| " call('client.api.ssl.port'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('api.ssl'),\n call('client.api.ssl.port')]" |
| process_pair_expected = "[call('client.api.ssl.port', '4444')]" |
| set_silent(False) |
| setup_https(args) |
| |
| self.assertTrue(p.process_pair.called) |
| self.assertTrue(p.get_property.call_count == 8) |
| self.assertEqual(str(p.get_property.call_args_list), get_property_expected) |
| self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected) |
| self.assertTrue(p.store.called) |
| self.assertTrue(import_cert_and_key_action_mock.called) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #2: if client ssl is on and user choose to disable ssl option |
| p.get_property.side_effect = ["key_dir", "", "true", "", "true", "false", ""] |
| get_YN_input_mock.side_effect = [True] |
| get_validated_string_input_mock.side_effect = ["4444"] |
| get_property_expected = "[call('security.server.keys_dir'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('api.ssl')]" |
| process_pair_expected = "[call('api.ssl', 'false')]" |
| setup_https(args) |
| |
| self.assertTrue(p.process_pair.called) |
| self.assertTrue(p.get_property.call_count == 6) |
| self.assertEqual(str(p.get_property.call_args_list), get_property_expected) |
| self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected) |
| self.assertTrue(p.store.called) |
| self.assertFalse(import_cert_and_key_action_mock.called) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #3: if client ssl is off and user choose option |
| #to import cert and keys |
| p.get_property.side_effect = ["key_dir", "", None, "", None, None, ""] |
| get_YN_input_mock.side_effect = [True, True] |
| get_validated_string_input_mock.side_effect = ["4444"] |
| get_property_expected = "[call('security.server.keys_dir'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('api.ssl'),\n call('client.api.ssl.port')]" |
| process_pair_expected = "[call('client.api.ssl.port', '4444')]" |
| setup_https(args) |
| |
| self.assertTrue(p.process_pair.called) |
| self.assertTrue(p.get_property.call_count == 7) |
| self.assertEqual(str(p.get_property.call_args_list), get_property_expected) |
| self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected) |
| self.assertTrue(p.store.called) |
| self.assertTrue(import_cert_and_key_action_mock.called) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #4: if client ssl is off and |
| #user did not choose option to import cert and keys |
| p.get_property.side_effect = ["key_dir", "", None, "", None] |
| get_YN_input_mock.side_effect = [False] |
| get_validated_string_input_mock.side_effect = ["4444"] |
| get_property_expected = "[call('security.server.keys_dir'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl')]" |
| process_pair_expected = "[]" |
| setup_https(args) |
| |
| self.assertFalse(p.process_pair.called) |
| self.assertTrue(p.get_property.call_count == 5) |
| self.assertEqual(str(p.get_property.call_args_list), get_property_expected) |
| self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected) |
| self.assertFalse(p.store.called) |
| self.assertFalse(import_cert_and_key_action_mock.called) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #5: if cert must be imported but didnt imported |
| p.get_property.side_effect = ["key_dir", "", "false", "", "false"] |
| get_YN_input_mock.side_effect = [True] |
| import_cert_and_key_action_mock.side_effect = [False] |
| get_validated_string_input_mock.side_effect = ["4444"] |
| get_property_expected = "[call('security.server.keys_dir'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl'),\n" + \ |
| " call('client.api.ssl.port'),\n call('api.ssl')]" |
| process_pair_expected = "[call('client.api.ssl.port', '4444')]" |
| self.assertFalse(setup_https(args)) |
| self.assertTrue(p.process_pair.called) |
| self.assertTrue(p.get_property.call_count == 5) |
| self.assertEqual(str(p.get_property.call_args_list), get_property_expected) |
| self.assertEqual(str(p.process_pair.call_args_list), process_pair_expected) |
| self.assertFalse(p.store.called) |
| self.assertTrue(import_cert_and_key_action_mock.called) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #6: if silent mode is enabled |
| set_silent(True) |
| try: |
| setup_https(args) |
| self.fail("Should throw exception") |
| except NonFatalException as fe: |
| self.assertTrue("setup-https is not enabled in silent mode" in fe.reason) |
| |
| p.process_pair.reset_mock() |
| p.get_property.reset_mock() |
| p.store.reset_mock() |
| import_cert_and_key_action_mock.reset_mock() |
| |
| #Case #7: read property throw exception |
| set_silent(False) |
| find_properties_file_mock.return_value = "propertyFile" |
| p.get_property.side_effect = KeyError("Failed to read property") |
| try: |
| setup_https(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| self.assertTrue("Failed to read property" in fe.reason) |
| pass |
| |
| @patch("ambari_server.setupHttps.import_cert_and_key") |
| def test_import_cert_and_key_action(self, import_cert_and_key_mock): |
| import_cert_and_key_mock.return_value = True |
| properties = MagicMock() |
| properties.get_property.side_effect = ["key_dir", "5555", "6666", "true"] |
| properties.process_pair = MagicMock() |
| expect_process_pair = "[call('client.api.ssl.cert_name', 'https.crt'),\n" + \ |
| " call('client.api.ssl.key_name', 'https.key'),\n" + \ |
| " call('api.ssl', 'true')]" |
| options = self._create_empty_options_mock() |
| import_cert_and_key_action("key_dir", properties, options) |
| |
| self.assertEqual(str(properties.process_pair.call_args_list), \ |
| expect_process_pair) |
| pass |
| |
| @patch("ambari_server.setupHttps.remove_file") |
| @patch("ambari_server.setupHttps.copy_file") |
| @patch("ambari_server.setupHttps.read_ambari_user") |
| @patch("ambari_server.setupHttps.set_file_permissions") |
| @patch("ambari_server.setupHttps.import_file_to_keystore") |
| @patch("__builtin__.open") |
| @patch("ambari_server.setupHttps.run_os_command") |
| @patch("os.path.join") |
| @patch("os.path.isfile") |
| @patch("__builtin__.raw_input") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| @patch("ambari_server.setupHttps.is_valid_cert_host") |
| @patch("ambari_server.setupHttps.is_valid_cert_exp") |
| def test_ambariServerSetupWithCustomDbName(self, is_valid_cert_exp_mock, \ |
| is_valid_cert_host_mock, \ |
| get_validated_string_input_mock, \ |
| raw_input_mock, \ |
| os_path_isfile_mock, \ |
| os_path_join_mock, run_os_command_mock, \ |
| open_mock, import_file_to_keystore_mock, \ |
| set_file_permissions_mock, read_ambari_user_mock, copy_file_mock, \ |
| remove_file_mock): |
| is_valid_cert_exp_mock.return_value = True |
| is_valid_cert_host_mock.return_value = True |
| os_path_isfile_mock.return_value = True |
| get_validated_string_input_mock.return_value = "password" |
| raw_input_mock.side_effect = \ |
| ["cert_file_path", "key_file_path"] |
| os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp", \ |
| "pass_file_path", "pass_file_path_tmp", \ |
| "passin_file_path", "password_file_path", \ |
| "keystore_cert_file_path", \ |
| "keystore_cert_key_file_path", ] |
| run_os_command_mock.return_value = (0, "", "") |
| om = open_mock.return_value |
| expect_import_file_to_keystore = "[call('keystore_file_path_tmp'," + \ |
| " 'keystore_file_path'),\n" + \ |
| " call('pass_file_path_tmp'," + \ |
| " 'pass_file_path'),\n" + \ |
| " call('cert_file_path'," + \ |
| " 'keystore_cert_file_path'),\n" + \ |
| " call('key_file_path'," + \ |
| " 'keystore_cert_key_file_path')]" |
| options = self._create_empty_options_mock() |
| import_cert_and_key("key_dir", options) |
| self.assertTrue(raw_input_mock.call_count == 2) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertEqual(os_path_join_mock.call_count, 8) |
| self.assertTrue(set_file_permissions_mock.call_count == 1) |
| self.assertEqual(str(import_file_to_keystore_mock.call_args_list), \ |
| expect_import_file_to_keystore) |
| pass |
| |
| @patch("ambari_server.setupHttps.remove_file") |
| @patch("ambari_server.setupHttps.copy_file") |
| @patch("ambari_server.setupHttps.generate_random_string") |
| @patch("ambari_server.setupHttps.read_ambari_user") |
| @patch("ambari_server.setupHttps.set_file_permissions") |
| @patch("ambari_server.setupHttps.import_file_to_keystore") |
| @patch("__builtin__.open") |
| @patch("ambari_server.setupHttps.run_os_command") |
| @patch("os.path.join") |
| @patch("ambari_server.setupHttps.get_validated_filepath_input") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| @patch("ambari_server.setupHttps.is_valid_cert_host") |
| @patch("ambari_server.setupHttps.is_valid_cert_exp") |
| def test_import_cert_and_key_with_empty_password(self, \ |
| is_valid_cert_exp_mock, is_valid_cert_host_mock, |
| get_validated_string_input_mock, get_validated_filepath_input_mock, \ |
| os_path_join_mock, run_os_command_mock, open_mock, \ |
| import_file_to_keystore_mock, set_file_permissions_mock, |
| read_ambari_user_mock, generate_random_string_mock, copy_file_mock, \ |
| remove_file_mock): |
| |
| is_valid_cert_exp_mock.return_value = True |
| is_valid_cert_host_mock.return_value = True |
| get_validated_string_input_mock.return_value = "" |
| get_validated_filepath_input_mock.side_effect = \ |
| ["cert_file_path", "key_file_path"] |
| os_path_join_mock.side_effect = ["keystore_file_path", "keystore_file_path_tmp", \ |
| "pass_file_path", "pass_file_path_tmp", \ |
| "passin_file_path", "password_file_path", \ |
| "keystore_cert_file_path", \ |
| "keystore_cert_key_file_path", ] |
| run_os_command_mock.return_value = (0, "", "") |
| |
| expect_import_file_to_keystore = "[call('keystore_file_path_tmp'," + \ |
| " 'keystore_file_path'),\n" + \ |
| " call('pass_file_path_tmp'," + \ |
| " 'pass_file_path'),\n" + \ |
| " call('cert_file_path'," + \ |
| " 'keystore_cert_file_path'),\n" + \ |
| " call('key_file_path.secured'," + \ |
| " 'keystore_cert_key_file_path')]" |
| options = self._create_empty_options_mock() |
| import_cert_and_key("key_dir", options) |
| self.assertEquals(get_validated_filepath_input_mock.call_count, 2) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertEquals(os_path_join_mock.call_count, 8) |
| self.assertEquals(set_file_permissions_mock.call_count, 1) |
| self.assertEqual(str(import_file_to_keystore_mock.call_args_list), \ |
| expect_import_file_to_keystore) |
| self.assertTrue(generate_random_string_mock.called) |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("ambari_server.setupHttps.copy_file") |
| @patch("ambari_server.setupHttps.is_root") |
| @patch("ambari_server.setupHttps.read_ambari_user") |
| @patch("ambari_server.setupHttps.set_file_permissions") |
| @patch("ambari_server.setupHttps.import_file_to_keystore") |
| @patch("ambari_server.setupHttps.run_os_command") |
| @patch("os.path.join") |
| @patch("ambari_server.setupHttps.get_validated_filepath_input") |
| @patch("ambari_server.setupHttps.get_validated_string_input") |
| def test_import_cert_and_key_with_incorrect_password(self, |
| get_validated_string_input_mock, \ |
| get_validated_filepath_input_mock, \ |
| os_path_join_mock, \ |
| run_os_command_mock, \ |
| import_file_to_keystore_mock, \ |
| set_file_permissions_mock, \ |
| read_ambari_user_mock, \ |
| is_root_mock, \ |
| copy_file_mock, \ |
| open_mock): |
| get_validated_string_input_mock.return_value = "incorrect_password" |
| get_validated_filepath_input_mock.return_value = 'filename' |
| open_mock.return_value = MagicMock() |
| |
| os_path_join_mock.return_value = '' |
| is_root_mock.return_value = True |
| options = self._create_empty_options_mock() |
| |
| #provided password doesn't match, openssl command returns an error |
| run_os_command_mock.return_value = (1, "", "Some error message") |
| |
| self.assertFalse(import_cert_and_key_action(*["key_dir", None, options])) |
| self.assertFalse(import_cert_and_key("key_dir", options)) |
| pass |
| |
| def test_is_valid_cert_exp(self): |
| #No data in certInfo |
| certInfo = {} |
| is_valid = is_valid_cert_exp(certInfo) |
| self.assertFalse(is_valid) |
| |
| #Issued in future |
| issuedOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(SSL_DATE_FORMAT) |
| expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=2000)).strftime(SSL_DATE_FORMAT) |
| certInfo = {NOT_BEFORE_ATTR: issuedOn, |
| NOT_AFTER_ATTR: expiresOn} |
| is_valid = is_valid_cert_exp(certInfo) |
| self.assertFalse(is_valid) |
| |
| #Was expired |
| issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(SSL_DATE_FORMAT) |
| expiresOn = (datetime.datetime.now() - datetime.timedelta(hours=1000)).strftime(SSL_DATE_FORMAT) |
| certInfo = {NOT_BEFORE_ATTR: issuedOn, |
| NOT_AFTER_ATTR: expiresOn} |
| is_valid = is_valid_cert_exp(certInfo) |
| self.assertFalse(is_valid) |
| |
| #Valid |
| issuedOn = (datetime.datetime.now() - datetime.timedelta(hours=2000)).strftime(SSL_DATE_FORMAT) |
| expiresOn = (datetime.datetime.now() + datetime.timedelta(hours=1000)).strftime(SSL_DATE_FORMAT) |
| certInfo = {NOT_BEFORE_ATTR: issuedOn, |
| NOT_AFTER_ATTR: expiresOn} |
| is_valid = is_valid_cert_exp(certInfo) |
| self.assertTrue(is_valid) |
| pass |
| |
| @patch("ambari_server.setupHttps.get_fqdn") |
| def test_is_valid_cert_host(self, get_fqdn_mock): |
| |
| #No data in certInfo |
| certInfo = {} |
| is_valid = is_valid_cert_host(certInfo) |
| self.assertFalse(is_valid) |
| |
| #Failed to get FQDN |
| get_fqdn_mock.return_value = None |
| is_valid = is_valid_cert_host(certInfo) |
| self.assertFalse(is_valid) |
| |
| #FQDN and Common name in certificated don't correspond |
| get_fqdn_mock.return_value = 'host1' |
| certInfo = {COMMON_NAME_ATTR: 'host2'} |
| is_valid = is_valid_cert_host(certInfo) |
| self.assertFalse(is_valid) |
| |
| #FQDN and Common name in certificated correspond |
| get_fqdn_mock.return_value = 'host1' |
| certInfo = {COMMON_NAME_ATTR: 'host1'} |
| is_valid = is_valid_cert_host(certInfo) |
| self.assertTrue(is_valid) |
| pass |
| |
| @patch("ambari_server.setupHttps.get_ambari_properties") |
| def test_is_valid_https_port(self, get_ambari_properties_mock): |
| |
| #No ambari.properties |
| get_ambari_properties_mock.return_value = -1 |
| is_valid = is_valid_https_port(1111) |
| self.assertEqual(is_valid, False) |
| |
| #User entered port used by one way auth |
| portOneWay = "1111" |
| portTwoWay = "2222" |
| validPort = "3333" |
| get_ambari_properties_mock.return_value = {SRVR_ONE_WAY_SSL_PORT_PROPERTY: portOneWay, |
| SRVR_TWO_WAY_SSL_PORT_PROPERTY: portTwoWay} |
| is_valid = is_valid_https_port(portOneWay) |
| self.assertEqual(is_valid, False) |
| |
| #User entered port used by two way auth |
| is_valid = is_valid_https_port(portTwoWay) |
| self.assertEqual(is_valid, False) |
| |
| #User entered valid port |
| get_ambari_properties_mock.return_value = {SRVR_ONE_WAY_SSL_PORT_PROPERTY: portOneWay, |
| SRVR_TWO_WAY_SSL_PORT_PROPERTY: portTwoWay} |
| is_valid = is_valid_https_port(validPort) |
| self.assertEqual(is_valid, True) |
| pass |
| |
| @patch("socket.getfqdn") |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupHttps.get_ambari_properties") |
| def test_get_fqdn(self, get_ambari_properties_mock, url_open_mock, getfqdn_mock): |
| #No ambari.properties |
| get_ambari_properties_mock.return_value = -1 |
| fqdn = get_fqdn() |
| self.assertEqual(fqdn, None) |
| |
| #Check mbari_server.GET_FQDN_SERVICE_URL property name (AMBARI-2612) |
| #property name should be server.fqdn.service.url |
| self.assertEqual(GET_FQDN_SERVICE_URL, "server.fqdn.service.url") |
| |
| #Read FQDN from service |
| p = MagicMock() |
| p[GET_FQDN_SERVICE_URL] = 'someurl' |
| get_ambari_properties_mock.return_value = p |
| |
| u = MagicMock() |
| host = 'host1.domain.com' |
| u.read.return_value = host |
| url_open_mock.return_value = u |
| |
| fqdn = get_fqdn() |
| self.assertEqual(fqdn, host) |
| |
| #Failed to read FQDN from service, getting from socket |
| u.reset_mock() |
| u.side_effect = Exception("Failed to read FQDN from service") |
| getfqdn_mock.return_value = host |
| fqdn = get_fqdn() |
| self.assertEqual(fqdn, host) |
| pass |
| |
| def test_get_ulimit_open_files(self): |
| # 1 - No ambari.properties |
| p = Properties() |
| |
| open_files = get_ulimit_open_files(p) |
| self.assertEqual(open_files, ULIMIT_OPEN_FILES_DEFAULT) |
| |
| # 2 - With ambari.properties - ok |
| prop_value = 65000 |
| p.process_pair(ULIMIT_OPEN_FILES_KEY, str(prop_value)) |
| open_files = get_ulimit_open_files(p) |
| self.assertEqual(open_files, 65000) |
| |
| # 2 - With ambari.properties - default |
| tf1 = tempfile.NamedTemporaryFile() |
| prop_value = 0 |
| p.process_pair(ULIMIT_OPEN_FILES_KEY, str(prop_value)) |
| open_files = get_ulimit_open_files(p) |
| self.assertEqual(open_files, ULIMIT_OPEN_FILES_DEFAULT) |
| pass |
| |
| @patch("ambari_server.setupHttps.run_os_command") |
| def test_get_cert_info(self, run_os_command_mock): |
| # Error running openssl command |
| path = 'path/to/certificate' |
| run_os_command_mock.return_value = -1, None, None |
| cert_info = get_cert_info(path) |
| self.assertEqual(cert_info, None) |
| |
| #Empty result of openssl command |
| run_os_command_mock.return_value = 0, None, None |
| cert_info = get_cert_info(path) |
| self.assertEqual(cert_info, None) |
| |
| #Positive scenario |
| notAfter = 'Jul 3 14:12:57 2014 GMT' |
| notBefore = 'Jul 3 14:12:57 2013 GMT' |
| attr1_key = 'A' |
| attr1_value = 'foo' |
| attr2_key = 'B' |
| attr2_value = 'bar' |
| attr3_key = 'CN' |
| attr3_value = 'host.domain.com' |
| subject_pattern = '/{attr1_key}={attr1_value}/{attr2_key}={attr2_value}/{attr3_key}={attr3_value}' |
| subject = subject_pattern.format(attr1_key=attr1_key, attr1_value=attr1_value, |
| attr2_key=attr2_key, attr2_value=attr2_value, |
| attr3_key=attr3_key, attr3_value=attr3_value) |
| out_pattern = \ |
| "notAfter={notAfter}" + os.linesep + \ |
| "notBefore={notBefore}" + os.linesep + \ |
| "subject={subject}" + os.linesep + \ |
| "-----BEGIN CERTIFICATE-----" + os.linesep + \ |
| "MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV" + os.linesep + \ |
| "..." + os.linesep + \ |
| "5lqd8XxOGSYoMOf+70BLN2sB" + os.linesep + \ |
| "-----END CERTIFICATE-----" + os.linesep + \ |
| "" |
| out = out_pattern.format(notAfter=notAfter, notBefore=notBefore, subject=subject) |
| run_os_command_mock.return_value = 0, out, None |
| cert_info = get_cert_info(path) |
| self.assertEqual(cert_info['notAfter'], notAfter) |
| self.assertEqual(cert_info['notBefore'], notBefore) |
| self.assertEqual(cert_info['subject'], subject) |
| self.assertEqual(cert_info[attr1_key], attr1_value) |
| self.assertEqual(cert_info[attr2_key], attr2_value) |
| self.assertEqual(cert_info[attr3_key], attr3_value) |
| pass |
| |
| @patch("__builtin__.raw_input") |
| def test_get_validated_string_input(self, raw_input_mock): |
| prompt = 'prompt' |
| default_value = 'default' |
| description = 'desc' |
| validator = MagicMock() |
| validator.return_value = True |
| inputed_value1 = 'val1' |
| inputed_value2 = 'val2' |
| raw_input_mock.return_value = inputed_value1 |
| input = get_validated_string_input(prompt, default_value, None, |
| description, False, False, validator) |
| self.assertTrue(validator.called) |
| self.assertEqual(inputed_value1, input) |
| |
| validator.side_effect = [False, True] |
| raw_input_mock.side_effect = [inputed_value1, inputed_value2] |
| input = get_validated_string_input(prompt, default_value, None, |
| description, False, False, validator) |
| self.assertEqual(inputed_value2, input) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverUtils.run_os_command") |
| @patch("__builtin__.open") |
| @patch("os.path.exists") |
| def test_is_server_runing(self, os_path_exists_mock, open_mock, \ |
| run_os_command_mock): |
| os_path_exists_mock.return_value = True |
| f = open_mock.return_value |
| f.readline.return_value = "111" |
| run_os_command_mock.return_value = 0, "", "" |
| status, pid = is_server_runing() |
| self.assertTrue(status) |
| self.assertEqual(111, pid) |
| os_path_exists_mock.return_value = False |
| status, pid = is_server_runing() |
| self.assertFalse(status) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("os_windows.win32serviceutil.QueryServiceStatus") |
| def test_is_server_runing(self, query_service_status_mock): |
| query_service_status_mock.return_value = ("", 4) |
| |
| status, desc = is_server_runing() |
| |
| self.assertTrue(status) |
| self.assertEqual("", desc) |
| |
| query_service_status_mock.return_value = ("", 1) |
| status, desc = is_server_runing() |
| self.assertFalse(status) |
| self.assertEqual("stopped", desc) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverUtils.run_os_command") |
| @patch("__builtin__.open") |
| @patch("os.path.exists") |
| def test_is_server_runing_bad_file(self, os_path_exists_mock, open_mock, \ |
| run_os_command_mock): |
| os_path_exists_mock.return_value = True |
| f = open_mock.return_value |
| f.readline.return_value = "" # empty file content |
| run_os_command_mock.return_value = 0, "", "" |
| self.assertRaises(NonFatalException, is_server_runing) |
| |
| open_mock.side_effect = IOError('[Errno 13] Permission denied: /var/run/ambari-server/ambari-server.pid') |
| self.assertRaises(FatalException, is_server_runing) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("os.path.exists") |
| @patch("os.makedirs") |
| @patch("os.chdir") |
| @patch("ambari_server.serverSetup.run_os_command") |
| def test_install_jdk(self, run_os_command_mock, os_chdir_mock, os_makedirs_mock, os_path_exists_mock): |
| run_os_command_mock.return_value = 1, "", "" |
| os_path_exists_mock.return_value = False |
| failed = False |
| try: |
| jdkSetup = JDKSetup() |
| jdkSetup._install_jdk(MagicMock(), MagicMock()) |
| self.fail("Exception was not rised!") |
| except FatalException: |
| failed = True |
| self.assertTrue(failed) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("os.path.exists") |
| @patch("os.makedirs") |
| @patch("os.chdir") |
| @patch("ambari_server.serverSetup.run_os_command") |
| def test_install_jdk(self, run_os_command_mock, os_chdir_mock, os_makedirs_mock, os_path_exists_mock): |
| jdk_cfg = MagicMock() |
| jdk_cfg.inst_dir = "java_home_dir" |
| run_os_command_mock.return_value = 1, "", "" |
| os_path_exists_mock.return_value = False |
| failed = False |
| try: |
| jdkSetup = JDKSetup() |
| jdkSetup._install_jdk("jdk.exe", jdk_cfg) |
| self.fail("Exception was not rised!") |
| except FatalException: |
| failed = True |
| self.assertTrue(failed) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.read_ambari_user") |
| @patch("os.stat") |
| @patch("os.path.isfile") |
| @patch("os.path.exists") |
| @patch("os.chdir") |
| @patch("os.makedirs") |
| @patch("ambari_server.serverSetup.JDKSetupLinux.adjust_jce_permissions") |
| @patch("ambari_server.serverSetup.expand_jce_zip_file") |
| @patch("ambari_server.serverSetup.force_download_file") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.run_os_command") |
| @patch("ambari_server.serverSetup.update_properties") |
| @patch("ambari_server.serverSetup.get_validated_string_input") |
| @patch("ambari_server.serverSetup.print_info_msg") |
| @patch("ambari_server.serverSetup.validate_jdk") |
| @patch("ambari_server.serverSetup.get_JAVA_HOME") |
| @patch("ambari_server.serverSetup.get_resources_location") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.check_ambari_java_version_is_valid") |
| @patch("shutil.copyfile") |
| @patch("sys.exit") |
| def test_download_jdk(self, exit_mock, copyfile_mock, check_ambari_java_version_is_valid_mock, get_ambari_properties_mock, get_resources_location_mock, get_JAVA_HOME_mock, \ |
| validate_jdk_mock, print_info_msg_mock, get_validated_string_input_mock, update_properties_mock, \ |
| run_os_command_mock, get_YN_input_mock, force_download_file_mock, expand_jce_zip_file_mock, |
| adjust_jce_permissions_mock, os_makedirs_mock, |
| os_chdir_mock, path_existsMock, path_isfileMock, statMock, read_ambari_user_mock): |
| @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) |
| def _init_test_jdk_mocks(): |
| jdk1_url = "http://somewhere/myjdk.exe" |
| |
| res_location = "resources" |
| |
| p = Properties() |
| p.process_pair("java.releases", "jdk1") |
| p.process_pair("jdk1.desc", "JDK name") |
| p.process_pair("jdk1.url", "http://somewhere/myjdk.exe") |
| p.process_pair("jdk1.dest-file", "myjdk.exe") |
| p.process_pair("jdk1.jcpol-url", "http://somewhere/some-jcpol.zip") |
| p.process_pair("jdk1.jcpol-file", "some-jcpol.zip") |
| p.process_pair("jdk1.home", "C:\\jdk1") |
| p.process_pair("jdk1.re", "(jdk.*)/jre") |
| p.process_pair("jdk.download.supported", "true") |
| p.process_pair("jce.download.supported", "true") |
| |
| pem_side_effect1 = [False, True, False] |
| |
| return p, jdk1_url, res_location, pem_side_effect1 |
| |
| @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) |
| def _init_test_jdk_mocks(): |
| jdk1_url = "http://somewhere/somewhere.tar.gz" |
| |
| res_location = MagicMock() |
| |
| p = Properties() |
| p.process_pair("java.releases", "jdk1") |
| p.process_pair("jdk1.desc", "JDK name") |
| p.process_pair("jdk1.url", jdk1_url) |
| p.process_pair("jdk1.dest-file", "somewhere.tar.gz") |
| p.process_pair("jdk1.jcpol-url", "http://somewhere/some-jcpol.tar.gz") |
| p.process_pair("jdk1.jcpol-file", "some-jcpol.tar.gz") |
| p.process_pair("jdk1.home", "/jdk1") |
| p.process_pair("jdk1.re", "(jdk.*)/jre") |
| p.process_pair("jdk.download.supported", "true") |
| p.process_pair("jce.download.supported", "true") |
| |
| pem_side_effect1 = [True, False, True, False] |
| |
| return p, jdk1_url, res_location, pem_side_effect1 |
| |
| args = MagicMock() |
| args.java_home = "somewhere" |
| args.silent = False |
| |
| p, jdk1_url, res_location, pem_side_effect1 = _init_test_jdk_mocks() |
| |
| validate_jdk_mock.return_value = False |
| path_existsMock.return_value = False |
| get_resources_location_mock.return_value = res_location |
| get_JAVA_HOME_mock.return_value = False |
| read_ambari_user_mock.return_value = "ambari" |
| get_ambari_properties_mock.return_value = p |
| check_ambari_java_version_is_valid_mock.return_value = True |
| # Test case: ambari.properties not found |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception because of not found ambari.properties") |
| except FatalException: |
| # Expected |
| self.assertTrue(get_ambari_properties_mock.called) |
| pass |
| |
| # Test case: JDK already exists |
| args.java_home = None |
| args.jdk_location = None |
| get_JAVA_HOME_mock.return_value = "some_jdk" |
| validate_jdk_mock.return_value = True |
| get_YN_input_mock.return_value = False |
| path_existsMock.return_value = False |
| run_os_command_mock.return_value = 0, "", "" |
| rcode = download_and_install_jdk(args) |
| self.assertEqual(0, rcode) |
| |
| # Test case: java home setup |
| args.java_home = "somewhere" |
| validate_jdk_mock.return_value = True |
| path_existsMock.return_value = False |
| get_JAVA_HOME_mock.return_value = None |
| rcode = download_and_install_jdk(args) |
| self.assertEqual(0, rcode) |
| self.assertTrue(update_properties_mock.called) |
| |
| # Test case: JDK file does not exist, property not defined |
| validate_jdk_mock.return_value = False |
| path_existsMock.return_value = False |
| get_ambari_properties_mock.return_value = p |
| p.removeProp("jdk1.url") |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| # Test case: JDK file does not exist, HTTP response does not |
| # contain Content-Length |
| p.process_pair("jdk1.url", jdk1_url) |
| validate_jdk_mock.return_value = False |
| path_existsMock.return_value = False |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.return_value = "1" |
| run_os_command_mock.return_value = (0, "Wrong out", None) |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| # Successful JDK download |
| args.java_home = None |
| validate_jdk_mock.return_value = False |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = [False, False, False] |
| path_isfileMock.return_value = False |
| args.jdk_location = None |
| run_os_command_mock.return_value = (0, "Creating jdk1/jre", None) |
| statResult = MagicMock() |
| statResult.st_size = 32000 |
| statMock.return_value = statResult |
| try: |
| rcode = download_and_install_jdk(args) |
| except Exception, e: |
| raise |
| self.assertEqual(0, rcode) |
| |
| # Test case: not accept the license" |
| get_YN_input_mock.return_value = False |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = [False, False, True, False, True, False] |
| download_and_install_jdk(args) |
| self.assertTrue(exit_mock.called) |
| |
| # Test case: jdk is already installed, ensure that JCE check is skipped if -j option is not supplied. |
| args.jdk_location = None |
| get_JAVA_HOME_mock.return_value = "some_jdk" |
| validate_jdk_mock.return_value = True |
| get_YN_input_mock.return_value = False |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = pem_side_effect1 |
| force_download_file_mock.reset_mock() |
| with patch("ambari_server.serverSetup.JDKSetup._download_jce_policy") as download_jce_policy_mock: |
| rcode = download_and_install_jdk(args) |
| self.assertFalse(download_jce_policy_mock.called) |
| self.assertFalse(force_download_file_mock.called) |
| |
| # Test case: Update JAVA_HOME location using command: ambari-server setup -j %NEW_LOCATION% |
| update_properties_mock.reset_mock() |
| args.java_home = "somewhere" |
| validate_jdk_mock.return_value = True |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = pem_side_effect1 |
| get_JAVA_HOME_mock.return_value = "some_jdk" |
| path_isfileMock.return_value = True |
| download_and_install_jdk(args) |
| self.assertTrue(update_properties_mock.call_count == 1) |
| |
| # Test case: Negative test case JAVA_HOME location should not be updated if -j option is supplied and |
| # jce_policy file already exists in resources dir. |
| #write_property_mock.reset_mock() |
| #args.java_home = "somewhere" |
| #path_existsMock.side_effect = None |
| #path_existsMock.return_value = True |
| #get_JAVA_HOME_mock.return_value = "some_jdk" |
| #try: |
| # download_and_install_jdk(args) |
| # self.fail("Should throw exception") |
| #except FatalException as fe: |
| # Expected |
| # self.assertFalse(write_property_mock.called) |
| |
| # Test case: Setup ambari-server first time, Custom JDK selected, JDK exists |
| args.java_home = None |
| args.jdk_location = None |
| validate_jdk_mock.return_value = False |
| update_properties_mock.reset_mock() |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = [True, True, True, True] |
| get_validated_string_input_mock.return_value = "2" |
| get_JAVA_HOME_mock.return_value = None |
| rcode = download_and_install_jdk(args) |
| self.assertEqual(0, rcode) |
| self.assertTrue(update_properties_mock.called) |
| |
| # Test case: Setup ambari-server first time, Custom JDK selected, JDK not exists |
| update_properties_mock.reset_mock() |
| validate_jdk_mock.return_value = False |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = pem_side_effect1 |
| get_validated_string_input_mock.return_value = "2" |
| get_JAVA_HOME_mock.return_value = None |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| pass |
| |
| # Test when custom java home exists but java binary file doesn't exist |
| args.java_home = None |
| validate_jdk_mock.return_value = False |
| path_isfileMock.return_value = False |
| update_properties_mock.reset_mock() |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = pem_side_effect1 |
| get_validated_string_input_mock.return_value = "2" |
| get_JAVA_HOME_mock.return_value = None |
| flag = False |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| flag = True |
| pass |
| self.assertTrue(flag) |
| |
| #Test case: Setup ambari-server with java home passed. Path to java home doesn't exist |
| args.java_home = "somewhere" |
| validate_jdk_mock.return_value = False |
| path_existsMock.reset_mock() |
| path_existsMock.side_effect = pem_side_effect1 |
| try: |
| download_and_install_jdk(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| self.assertTrue("Path to java home somewhere or java binary file does not exists" in fe.reason) |
| pass |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| def test_get_postgre_status(self, run_os_command_mock): |
| |
| run_os_command_mock.return_value = (0, "running", None) |
| pg_status, retcode, out, err = PGConfig._get_postgre_status() |
| self.assertEqual("running", pg_status) |
| |
| run_os_command_mock.return_value = (1, "wrong", None) |
| pg_status, retcode, out, err = PGConfig._get_postgre_status() |
| self.assertEqual(None, pg_status) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("time.sleep") |
| @patch("subprocess32.Popen") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch.object(PGConfig, "_get_postgre_status") |
| def test_check_postgre_up(self, get_postgre_status_mock, run_os_command_mock, |
| popen_mock, sleep_mock): |
| from ambari_server import serverConfiguration |
| |
| p = MagicMock() |
| p.communicate.return_value = (None, None) |
| p.returncode = 0 |
| popen_mock.return_value = p |
| get_postgre_status_mock.return_value = "running", 0, "", "" |
| |
| serverConfiguration.OS_TYPE = OSConst.OS_REDHAT |
| p.poll.return_value = 0 |
| |
| run_os_command_mock.return_value = (0, None, None) |
| pg_status, retcode, out, err = PGConfig._check_postgre_up() |
| self.assertEqual(0, retcode) |
| |
| serverConfiguration.OS_TYPE = OSConst.OS_SUSE |
| run_os_command_mock.return_value = (0, None, None) |
| p.poll.return_value = 0 |
| get_postgre_status_mock.return_value = "stopped", 0, "", "" |
| pg_status, retcode, out, err = PGConfig._check_postgre_up() |
| self.assertEqual(0, retcode) |
| pass |
| |
| @patch("platform.linux_distribution") |
| @patch("platform.system") |
| @patch("ambari_commons.logging_utils.print_info_msg") |
| @patch("ambari_commons.logging_utils.print_error_msg") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.write_property") |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| def test_configure_os_settings(self, get_conf_dir_mock, write_property_mock, get_ambari_properties_mock, |
| print_error_msg_mock, print_info_msg_mock, |
| systemMock, distMock): |
| get_ambari_properties_mock.return_value = -1 |
| rcode = configure_os_settings() |
| self.assertEqual(-1, rcode) |
| |
| p = MagicMock() |
| p[OS_TYPE_PROPERTY] = 'somevalue' |
| get_ambari_properties_mock.return_value = p |
| rcode = configure_os_settings() |
| self.assertEqual(0, rcode) |
| |
| p.__getitem__.return_value = "" |
| rcode = configure_os_settings() |
| self.assertEqual(0, rcode) |
| self.assertTrue(write_property_mock.called) |
| self.assertEqual(2, write_property_mock.call_count) |
| self.assertEquals(write_property_mock.call_args_list[0][0][0], "server.os_family") |
| self.assertEquals(write_property_mock.call_args_list[1][0][0], "server.os_type") |
| pass |
| |
| |
| @patch("__builtin__.open") |
| @patch("ambari_server.serverConfiguration.Properties") |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| def test_get_JAVA_HOME(self, get_conf_dir_mock, search_file_mock, |
| Properties_mock, openMock): |
| openMock.side_effect = Exception("exception") |
| result = get_JAVA_HOME() |
| self.assertEqual(None, result) |
| |
| expected = os.path.dirname(__file__) |
| p = MagicMock() |
| p.__getitem__.return_value = expected |
| openMock.side_effect = None |
| Properties_mock.return_value = p |
| result = get_JAVA_HOME() |
| self.assertEqual(expected, result) |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| def test_prompt_db_properties_default(self, get_ambari_properties_mock): |
| args = MagicMock() |
| args.must_set_database_options = False |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| |
| get_ambari_properties_mock.return_value = Properties() |
| |
| prompt_db_properties(args) |
| |
| self.assertEqual(args.database_index, 0) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(subprocess32, "Popen") |
| def test_check_ambari_java_version_is_valid(self, popenMock): |
| # case 1: jdk7 is picked for stacks |
| properties = Properties() |
| p = MagicMock() |
| p.communicate.return_value = ('7', None) |
| p.returncode = 0 |
| popenMock.return_value = p |
| result = check_ambari_java_version_is_valid('/usr/jdk64/jdk_1.7.0/', 'java', 8, properties) |
| self.assertEqual(properties.get_property(STACK_JAVA_VERSION), "7") |
| self.assertFalse(result) |
| |
| # case 2: jdk8 is picked for stacks |
| properties = Properties() |
| p.communicate.return_value = ('8', None) |
| p.returncode = 0 |
| result = check_ambari_java_version_is_valid('/usr/jdk64/jdk_1.8.0/', 'java', 8, properties) |
| self.assertFalse(properties.get_property(STACK_JAVA_VERSION)) |
| self.assertTrue(result) |
| |
| # case 3: return code is not 0 |
| p.returncode = 1 |
| try: |
| check_ambari_java_version_is_valid('/usr/jdk64/jdk_1.8.0/', 'java', 8, properties) |
| self.fail("Should throw exception") |
| except FatalException: |
| # expected |
| pass |
| |
| # case 4: unparseable response - type error |
| p.communicate.return_value = ('something else', None) |
| p.returncode = 0 |
| try: |
| check_ambari_java_version_is_valid('/usr/jdk64/jdk_1.8.0/', 'java', 8, properties) |
| self.fail("Should throw exception") |
| except FatalException as e: |
| # expected |
| self.assertEqual(e.code, 1) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(LinuxDBMSConfig, "_setup_remote_server") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| def test_prompt_db_properties_oracle_sname(self, gyni_mock, gvsi_mock, gvsi_2_mock, rp_mock, print_info_msg_mock, srs_mock): |
| gyni_mock.return_value = True |
| list_of_return_values = ["ambari-server", "ambari", "1", "1521", "localhost", "2"] |
| |
| def side_effect(*args, **kwargs): |
| return list_of_return_values.pop() |
| |
| gvsi_mock.side_effect = side_effect |
| gvsi_2_mock.side_effect = side_effect |
| rp_mock.return_value = "password" |
| |
| args = MagicMock() |
| args.must_set_database_options = True |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| set_silent(False) |
| |
| prompt_db_properties(args) |
| |
| self.assertEqual(args.database_index, 1) |
| |
| props = Properties() |
| |
| factory = DBMSConfigFactory() |
| dbmsConfig = factory.create(args, props) |
| |
| self.assertEqual(dbmsConfig.dbms, "oracle") |
| self.assertEqual(dbmsConfig.database_port, "1521") |
| self.assertEqual(dbmsConfig.database_host, "localhost") |
| self.assertEqual(dbmsConfig.database_name, "ambari") |
| self.assertEqual(dbmsConfig.database_username, "ambari") |
| self.assertEqual(dbmsConfig.database_password, "bigdata") |
| self.assertEqual(dbmsConfig.sid_or_sname, "sid") |
| |
| dbmsConfig.configure_database(props, args) |
| |
| self.assertEqual(dbmsConfig.database_username, "ambari-server") |
| self.assertEqual(dbmsConfig.sid_or_sname, "sname") |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("os.path.isdir") |
| @patch("os.mkdir") |
| @patch("os.chown") |
| @patch("pwd.getpwnam") |
| @patch.object(OSCheck, "get_os_family") |
| @patch.object(LinuxDBMSConfig, "_setup_remote_server") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, gvsi_2_mock, rp_mock, print_info_msg_mock, sls_mock, |
| get_os_family_mock, get_pw_nam_mock, chown_mock, mkdir_mock, isdir_mock): |
| gyni_mock.return_value = True |
| list_of_return_values = ["ambari-server", "ambari", "2", "1521", "localhost", "2"] |
| get_os_family_mock.return_value = OSConst.SUSE_FAMILY |
| pw = MagicMock() |
| pw.setattr('pw_uid', 0) |
| pw.setattr('pw_gid', 0) |
| get_pw_nam_mock.return_value = pw |
| |
| |
| def side_effect(*args, **kwargs): |
| return list_of_return_values.pop() |
| |
| gvsi_mock.side_effect = side_effect |
| gvsi_2_mock.side_effect = side_effect |
| rp_mock.return_value = "password" |
| |
| args = MagicMock() |
| args.must_set_database_options = True |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| set_silent(False) |
| |
| prompt_db_properties(args) |
| |
| self.assertEqual(args.database_index, 1) |
| |
| props = Properties() |
| |
| factory = DBMSConfigFactory() |
| dbmsConfig = factory.create(args, props) |
| |
| self.assertEqual(dbmsConfig.dbms, "oracle") |
| self.assertEqual(dbmsConfig.database_port, "1521") |
| self.assertEqual(dbmsConfig.database_host, "localhost") |
| self.assertEqual(dbmsConfig.database_name, "ambari") |
| self.assertEqual(dbmsConfig.database_username, "ambari") |
| self.assertEqual(dbmsConfig.database_password, "bigdata") |
| |
| isdir_mock.return_value = False |
| |
| dbmsConfig.configure_database(props, args) |
| |
| self.assertEqual(dbmsConfig.database_username, "ambari-server") |
| self.assertEqual(dbmsConfig.database_password, "password") |
| self.assertEqual(dbmsConfig.sid_or_sname, "sid") |
| self.assertTrue(chown_mock.called) |
| self.assertTrue(mkdir_mock.called) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("os.path.isdir") |
| @patch("os.mkdir") |
| @patch("os.chown") |
| @patch("pwd.getpwnam") |
| @patch.object(OSCheck, "get_os_family") |
| @patch.object(PGConfig, "_setup_local_server") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, gvsi_2_mock, rp_mock, print_info_msg_mock, sls_mock, |
| get_os_family_mock, get_pw_nam_mock, chown_mock, mkdir_mock, isdir_mock): |
| gyni_mock.return_value = True |
| list_of_return_values = ["ambari-server", "postgres", "ambari", "ambari", "1"] |
| get_os_family_mock.return_value = OSConst.SUSE_FAMILY |
| pw = MagicMock() |
| pw.setattr('pw_uid', 0) |
| pw.setattr('pw_gid', 0) |
| get_pw_nam_mock.return_value = pw |
| |
| def side_effect(*args, **kwargs): |
| return list_of_return_values.pop() |
| |
| gvsi_mock.side_effect = side_effect |
| gvsi_2_mock.side_effect = side_effect |
| rp_mock.return_value = "password" |
| |
| args = MagicMock() |
| args.must_set_database_options = True |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| |
| set_silent(False) |
| |
| prompt_db_properties(args) |
| |
| self.assertEqual(args.database_index, 0) |
| |
| props = Properties() |
| |
| factory = DBMSConfigFactory() |
| dbmsConfig = factory.create(args, props) |
| |
| self.assertEqual(dbmsConfig.dbms, "postgres") |
| self.assertEqual(dbmsConfig.database_port, "5432") |
| self.assertEqual(dbmsConfig.database_host, "localhost") |
| self.assertEqual(dbmsConfig.database_name, "ambari") |
| self.assertEqual(dbmsConfig.database_username, "ambari") |
| self.assertEqual(dbmsConfig.database_password, "bigdata") |
| |
| dbmsConfig.configure_database(props, args) |
| |
| self.assertEqual(dbmsConfig.database_username, "ambari-server") |
| self.assertEqual(dbmsConfig.database_password, "password") |
| self.assertEqual(dbmsConfig.sid_or_sname, "sid") |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.dbConfiguration_linux.store_password_file") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration_linux.get_YN_input") |
| def test_prompt_db_properties_for_each_database_type(self, gyni_mock, gvsi_mock, rp_mock, spf_mock): |
| """ |
| :return: Validates that installation for each database type correctly stores the database type, database name, |
| and optionally the postgres schema name. |
| """ |
| from ambari_server import serverConfiguration |
| |
| gyni_mock.return_value = True |
| rp_mock.return_value = "password" |
| spf_mock.return_value = "encrypted password" |
| |
| # Values to use while installing several database types |
| hostname = "localhost" |
| db_name = "db_ambari" |
| postgres_schema = "sc_ambari" |
| port = "1234" |
| local_admin_user = "postgres" |
| oracle_service = "1" |
| oracle_service_name = "ambari" |
| user_name = "ambari" |
| |
| # Input values |
| postgres_embedded_values = [local_admin_user, db_name, postgres_schema, hostname] |
| oracle_values = [hostname, port, oracle_service, oracle_service_name, user_name] |
| mysql_values = [hostname, port, db_name, user_name] |
| postgres_external_values = [hostname, port, db_name, postgres_schema, user_name] |
| mssql_values = [hostname, port, db_name, user_name] |
| |
| list_of_return_values = postgres_embedded_values + oracle_values + mysql_values + postgres_external_values + mssql_values |
| list_of_return_values = list_of_return_values[::-1] # Reverse the list since the input will be popped |
| |
| def side_effect(*args, **kwargs): |
| return list_of_return_values.pop() |
| gvsi_mock.side_effect = side_effect |
| |
| if AMBARI_CONF_VAR in os.environ: |
| del os.environ[AMBARI_CONF_VAR] |
| |
| tempdir = tempfile.gettempdir() |
| os.environ[AMBARI_CONF_VAR] = tempdir |
| prop_file = os.path.join(tempdir, "ambari.properties") |
| |
| for i in range(0, 5): |
| # Use the expected path of the ambari.properties file to delete it if it exists, and then create a new one |
| # during each use case. |
| if os.path.exists(prop_file): |
| os.remove(prop_file) |
| with open(prop_file, "w") as f: |
| f.write("server.jdbc.database_name=oldDBName") |
| f.close() |
| |
| serverConfiguration.AMBARI_PROPERTIES_FILE = prop_file |
| |
| args = MagicMock() |
| properties = Properties() |
| |
| args.database_index = i |
| args.silent = False |
| |
| del args.dbms |
| del args.database_host |
| del args.local_admin_user |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| factory = DBMSConfigFactory() |
| dbConfig = factory.create(args, properties) |
| dbConfig._prompt_db_properties() |
| |
| if dbConfig._is_local_database(): |
| dbConfig._setup_local_server(properties, None) |
| else: |
| dbConfig._setup_remote_server(properties, None) |
| |
| if i == 0: |
| # Postgres Embedded |
| self.assertEqual(properties[JDBC_DATABASE_PROPERTY], "postgres") |
| self.assertEqual(properties[JDBC_DATABASE_NAME_PROPERTY], db_name) |
| self.assertEqual(properties[JDBC_POSTGRES_SCHEMA_PROPERTY], postgres_schema) |
| self.assertEqual(properties[PERSISTENCE_TYPE_PROPERTY], "local") |
| elif i == 1: |
| # Oracle |
| self.assertEqual(properties[JDBC_DATABASE_PROPERTY], "oracle") |
| self.assertFalse(JDBC_POSTGRES_SCHEMA_PROPERTY in properties.propertyNames()) |
| self.assertEqual(properties[PERSISTENCE_TYPE_PROPERTY], "remote") |
| elif i == 2: |
| # MySQL |
| self.assertEqual(properties[JDBC_DATABASE_PROPERTY], "mysql") |
| self.assertFalse(JDBC_POSTGRES_SCHEMA_PROPERTY in properties.propertyNames()) |
| self.assertEqual(properties[PERSISTENCE_TYPE_PROPERTY], "remote") |
| elif i == 3: |
| # Postgres External |
| self.assertEqual(properties[JDBC_DATABASE_PROPERTY], "postgres") |
| self.assertEqual(properties[JDBC_DATABASE_NAME_PROPERTY], db_name) |
| self.assertEqual(properties[JDBC_POSTGRES_SCHEMA_PROPERTY], postgres_schema) |
| self.assertEqual(properties[PERSISTENCE_TYPE_PROPERTY], "remote") |
| elif i == 4: |
| # MSSQL |
| self.assertEqual(properties[JDBC_DATABASE_PROPERTY], "mssql") |
| self.assertFalse(JDBC_POSTGRES_SCHEMA_PROPERTY in properties.propertyNames()) |
| self.assertEqual(properties[PERSISTENCE_TYPE_PROPERTY], "remote") |
| pass |
| |
| @patch.object(os.path, "exists") |
| @patch.object(os.path, "isfile") |
| def test_validate_jdk(self, isfile_mock, exists_mock): |
| exists_mock.side_effect = [False] |
| result = validate_jdk("path") |
| self.assertFalse(result) |
| |
| exists_mock.side_effect = [True, False] |
| result = validate_jdk("path") |
| self.assertFalse(result) |
| |
| exists_mock.side_effect = [True, True] |
| isfile_mock.return_value = False |
| result = validate_jdk("path") |
| self.assertFalse(result) |
| |
| exists_mock.side_effect = [True, True] |
| isfile_mock.return_value = True |
| result = validate_jdk("path") |
| self.assertTrue(result) |
| pass |
| |
| @patch("glob.glob") |
| @patch("ambari_server.serverConfiguration.get_JAVA_HOME") |
| @patch("ambari_server.serverConfiguration.validate_jdk") |
| def test_find_jdk(self, validate_jdk_mock, get_JAVA_HOME_mock, globMock): |
| get_JAVA_HOME_mock.return_value = "somewhere" |
| validate_jdk_mock.return_value = True |
| result = find_jdk() |
| self.assertEqual("somewhere", result) |
| |
| get_JAVA_HOME_mock.return_value = None |
| globMock.return_value = [] |
| result = find_jdk() |
| self.assertEqual(None, result) |
| |
| globMock.return_value = ["one", "two"] |
| result = find_jdk() |
| self.assertNotEqual(None, result) |
| |
| globMock.return_value = ["one", "two"] |
| validate_jdk_mock.side_effect = [False, True] |
| result = find_jdk() |
| self.assertEqual(result, "one") |
| pass |
| |
| |
| @patch("os.path.exists") |
| @patch("zipfile.ZipFile") |
| @patch("os.path.split") |
| @patch("os.listdir") |
| @patch("ambari_server.serverSetup.copy_files") |
| @patch("shutil.rmtree") |
| def test_unpack_jce_policy(self, rmtree_mock, copy_files_mock, os_listdir_mock, os_path_split_mock, zipfile_mock, exists_mock): |
| |
| # Testing the case when the zip file doesn't contains any folder |
| exists_mock.return_value = True |
| zipfile = MagicMock() |
| zipfile_mock.return_value = zipfile |
| zip_members = ["US_export_policy.jar", "local_policy.jar", "README.txt"] |
| zipfile.namelist.return_value = zip_members |
| os_path_split_mock.return_value = [""] |
| |
| expand_jce_zip_file("", "") |
| self.assertTrue(exists_mock.called) |
| self.assertTrue(zipfile_mock.called) |
| self.assertTrue(os_path_split_mock.called) |
| |
| # Testing the case when the zip file contains a folder |
| unziped_jce_path = "jce" |
| os_path_split_mock.return_value = unziped_jce_path |
| |
| expand_jce_zip_file("", "") |
| self.assertTrue(exists_mock.called) |
| self.assertTrue(zipfile_mock.called) |
| self.assertTrue(os_listdir_mock.called) |
| self.assertTrue(copy_files_mock.called) |
| self.assertTrue(rmtree_mock.called) |
| |
| # Testing when the jdk_security_path or jce_zip_path doesn't exist |
| exists_mock.return_value = False |
| try: |
| expand_jce_zip_file("", "") |
| except FatalException: |
| self.assertTrue(True) |
| exists_mock.return_value = True |
| |
| # Testing when zipfile fail with an error |
| zipfile_mock.side_effect = FatalException(1,"Extract error") |
| try: |
| expand_jce_zip_file("", "") |
| except FatalException: |
| self.assertTrue(True) |
| |
| |
| @patch("os.path.exists") |
| @patch("shutil.copy") |
| @patch("os.path.split") |
| @patch("ambari_server.serverSetup.update_properties") |
| @patch.object(JDKSetup, "unpack_jce_policy") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_commons.os_utils.search_file") |
| @patch("__builtin__.open") |
| @patch("ambari_server.serverSetup.logger") |
| def test_setup_jce_policy(self, logger_mock, open_mock, search_file_mock, get_ambari_properties_mock, unpack_jce_policy_mock, |
| update_properties_mock, path_split_mock, shutil_copy_mock, exists_mock): |
| exists_mock.return_value = True |
| properties = Properties() |
| properties.process_pair(JAVA_HOME_PROPERTY, "/java_home") |
| unpack_jce_policy_mock.return_value = 0 |
| get_ambari_properties_mock.return_value = properties |
| conf_file = 'etc/ambari-server/conf/ambari.properties' |
| search_file_mock.return_value = conf_file |
| path_split_mock.return_value = ["/path/to", "JCEPolicy.zip"] |
| args = ['setup-jce', '/path/to/JCEPolicy.zip'] |
| |
| setup_jce_policy(args) |
| shutil_copy_mock.assert_called_with(args[1], configDefaults.SERVER_RESOURCES_DIR) |
| self.assertTrue(unpack_jce_policy_mock.called) |
| self.assertTrue(get_ambari_properties_mock.called) |
| self.assertTrue(update_properties_mock.called) |
| |
| # Testing that if the source and the destination is the same will not try to copy the file |
| path_split_mock.return_value = [configDefaults.SERVER_RESOURCES_DIR, "JCEPolicy.zip"] |
| shutil_copy_mock.reset_mock() |
| |
| setup_jce_policy(args) |
| self.assertFalse(shutil_copy_mock.called) |
| self.assertTrue(unpack_jce_policy_mock.called) |
| self.assertTrue(get_ambari_properties_mock.called) |
| self.assertTrue(update_properties_mock.called) |
| path_split_mock.return_value = ["/path/to", "JCEPolicy.zip"] |
| |
| # Testing with bad path |
| exists_mock.return_value = False |
| try: |
| setup_jce_policy(args) |
| except FatalException: |
| self.assertTrue(True) |
| exists_mock.return_value = True |
| |
| # Testing with an error produced by shutil.copy |
| shutil_copy_mock.reset_mock() |
| shutil_copy_mock.side_effect = FatalException(1, "Error trying to copy the file.") |
| try: |
| setup_jce_policy(args) |
| except FatalException: |
| self.assertTrue(True) |
| |
| # Testing with an error produced by Properties.store function |
| update_properties_mock.side_effect = Exception("Invalid file.") |
| try: |
| setup_jce_policy(args) |
| except Exception: |
| self.assertTrue(True) |
| update_properties_mock.reset_mock() |
| |
| # Testing with an error produced by unpack_jce_policy |
| unpack_jce_policy_mock.side_effect = FatalException(1, "Can not install JCE policy") |
| try: |
| setup_jce_policy(args) |
| except FatalException: |
| self.assertTrue(True) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("pwd.getpwnam") |
| @patch("resource_management.core.shell.call") |
| @patch("os.path.exists") |
| @patch("os.path.isfile") |
| @patch("ambari_commons.os_utils.remove_file") |
| @patch("ambari_server.dbConfiguration_linux.LinuxDBMSConfig.ensure_jdbc_driver_installed") |
| @patch("ambari_server.dbConfiguration_linux.get_YN_input") |
| @patch("ambari_server.serverSetup.update_properties") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.dbConfiguration_linux.get_ambari_properties") |
| @patch("ambari_server.dbConfiguration_linux.store_password_file") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.dbConfiguration_linux.PGConfig._configure_postgres") |
| @patch("ambari_server.dbConfiguration_linux.PGConfig._check_postgre_up") |
| @patch("ambari_server.dbConfiguration_linux.PGConfig._is_jdbc_user_changed") |
| @patch("ambari_server.serverSetup.verify_setup_allowed") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch("ambari_server.serverSetup.download_and_install_jdk") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.disable_security_enhancements") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.proceedJDBCProperties") |
| @patch("ambari_server.serverSetup.extract_views") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("ambari_server.serverSetup.service_setup") |
| @patch("ambari_server.serverSetup.read_ambari_user") |
| @patch("ambari_server.serverSetup.expand_jce_zip_file") |
| @patch("ambari_server.serverSetup.write_gpl_license_accepted") |
| def test_setup_linux(self, write_gpl_license_accepted_mock, expand_jce_zip_file_mock, read_ambari_user_mock, |
| service_setup_mock, adjust_dirs_mock, extract_views_mock, proceedJDBCProperties_mock, is_root_mock, |
| disable_security_enhancements_mock, check_jdbc_drivers_mock, check_ambari_user_mock, |
| download_jdk_mock, configure_os_settings_mock, get_ambari_properties_mock, |
| get_YN_input_mock, gvsi_mock, gvsi_1_mock, |
| read_password_mock, verify_setup_allowed_method, is_jdbc_user_changed_mock, check_postgre_up_mock, |
| configure_postgres_mock, run_os_command_1_mock, |
| store_password_file_mock, get_ambari_properties_1_mock, get_ambari_properties_2_mock, update_properties_mock, |
| get_YN_input_1_mock, ensure_jdbc_driver_installed_mock, |
| remove_file_mock, isfile_mock, exists_mock, |
| run_os_command_mock, get_pw_nam_mock): |
| hostname = "localhost" |
| db_admin_user = 'postgres' |
| db_name = "db_ambari" |
| postgres_schema = "sc_ambari" |
| db_username = 'u_ambari' |
| port = "1234" |
| oracle_service = "1" |
| oracle_service_name = "ambari" |
| user_name = "ambari" |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| |
| args.silent = False |
| |
| failed = False |
| properties = Properties() |
| |
| def side_effect(username): |
| raise KeyError("") |
| |
| get_pw_nam_mock.side_effect = side_effect |
| get_YN_input_mock.return_value = False |
| isfile_mock.return_value = False |
| verify_setup_allowed_method.return_value = 0 |
| exists_mock.return_value = False |
| remove_file_mock.return_value = 0 |
| run_os_command_mock.return_value = 3,"","" |
| extract_views_mock.return_value = 0 |
| read_ambari_user_mock.return_value = "ambari" |
| read_password_mock.return_value = "bigdata2" |
| get_ambari_properties_mock.return_value = properties |
| get_ambari_properties_1_mock.return_value = properties |
| get_ambari_properties_2_mock.return_value = properties |
| store_password_file_mock.return_value = "encrypted_bigdata2" |
| ensure_jdbc_driver_installed_mock.return_value = True |
| check_postgre_up_mock.return_value = (PGConfig.PG_STATUS_RUNNING, 0, "", "") |
| configure_postgres_mock.return_value = (0, "", "") |
| run_os_command_1_mock.return_value = (0, "", "") |
| expand_jce_zip_file_mock.return_value = 0 |
| |
| def reset_mocks(): |
| is_jdbc_user_changed_mock.reset_mock() |
| is_root_mock.reset_mock() |
| disable_security_enhancements_mock.reset_mock() |
| check_jdbc_drivers_mock.reset_mock() |
| check_ambari_user_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| configure_os_settings_mock.reset_mock() |
| run_os_command_1_mock.reset_mock() |
| get_YN_input_1_mock.reset_mock() |
| update_properties_mock.reset_mock() |
| extract_views_mock.reset_mock() |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.sid_or_sname |
| del args.jdbc_url |
| del args.init_script_file |
| del args.drop_script_file |
| |
| args.jdbc_driver= None |
| args.jdbc_db = None |
| |
| args.silent = False |
| args.skip_view_extraction = False |
| |
| return args |
| |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| setup(args) |
| except FatalException as fe: |
| self.fail("Should not throw exception, only print warning") # see AMBARI-15245 |
| |
| args = reset_mocks() |
| |
| # Testing calls under root |
| # remote case |
| is_root_mock.return_value = True |
| disable_security_enhancements_mock.return_value = (0, "") |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| check_jdbc_drivers_mock.return_value = 0 |
| download_jdk_mock.return_value = 0 |
| configure_os_settings_mock.return_value = 0 |
| write_gpl_license_accepted_mock.return_value = 0 |
| |
| result = setup(args) |
| |
| self.assertEqual(None, result) |
| self.assertTrue(check_ambari_user_mock.called) |
| self.assertEqual(1, run_os_command_mock.call_count) |
| self.assertTrue(extract_views_mock.called) |
| |
| # test view extraction is skipped on-demand |
| args = reset_mocks() |
| args.skip_view_extraction = True |
| setup(args) |
| self.assertFalse(extract_views_mock.called) |
| |
| #Local case |
| args = reset_mocks() |
| |
| # Input values |
| db_selection_values = ["1"] |
| postgres_values = [db_admin_user, db_name, postgres_schema, db_username] |
| postgres_values = postgres_values[::-1] # Reverse the list since the input will be popped |
| |
| def side_effect(*args, **kwargs): |
| return db_selection_values.pop() |
| gvsi_mock.side_effect = side_effect |
| |
| def side_effect_1(*args, **kwargs): |
| return postgres_values.pop() |
| gvsi_1_mock.side_effect = side_effect_1 |
| |
| get_YN_input_mock.return_value = True |
| # is_local_database_mock.return_value = True |
| is_jdbc_user_changed_mock.return_value = False |
| |
| try: |
| result = setup(args) |
| except FatalException: |
| self.fail("Setup should be successful") |
| self.assertEqual(None, result) |
| self.assertTrue(is_jdbc_user_changed_mock.called) |
| self.assertTrue(update_properties_mock.called) |
| self.assertTrue(run_os_command_1_mock.called) |
| self.assertFalse(remove_file_mock.called) |
| |
| self.assertTrue("Ambari-DDL-Postgres-CREATE.sql" in run_os_command_1_mock.call_args[0][0][3]) |
| self.assertTrue("-U {0}".format(db_username) in run_os_command_1_mock.call_args[0][0][3]) |
| |
| #if DB user name was changed |
| args = reset_mocks() |
| |
| # is_local_database_mock.return_value = True |
| is_jdbc_user_changed_mock.return_value = True |
| |
| db_selection_values = ["1"] |
| postgres_values = [db_admin_user, db_name, postgres_schema, db_username] |
| postgres_values = postgres_values[::-1] # Reverse the list since the input will be popped |
| |
| try: |
| result = setup(args) |
| except FatalException: |
| self.fail("Setup should be successful") |
| self.assertEqual(None, result) |
| self.assertTrue(is_jdbc_user_changed_mock.called) |
| self.assertTrue(update_properties_mock.called) |
| self.assertTrue(run_os_command_1_mock.called) |
| self.assertFalse(remove_file_mock.called) |
| |
| #negative case |
| args = reset_mocks() |
| |
| # Use remote database |
| get_YN_input_1_mock.return_value = False |
| db_selection_values = ["4"] |
| postgres_values = [hostname, port, db_name, postgres_schema, user_name] |
| postgres_values = postgres_values[::-1] # Reverse the list since the input will be popped |
| |
| try: |
| result = setup(args) |
| self.fail("Should throw exception") |
| except NonFatalException as fe: |
| self.assertTrue("Remote database setup aborted." in fe.reason) |
| |
| self.assertFalse(run_os_command_1_mock.called) |
| |
| # test not run setup if ambari-server setup executed with jdbc properties |
| args = reset_mocks() |
| args.jdbc_driver= "path/to/driver" |
| args.jdbc_db = "test_db_name" |
| |
| |
| setup(args) |
| self.assertTrue(proceedJDBCProperties_mock.called) |
| self.assertFalse(disable_security_enhancements_mock.called) |
| self.assertFalse(check_ambari_user_mock.called) |
| |
| pass |
| |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("resource_management.core.shell.call") |
| @patch("os.path.exists") |
| @patch("os.path.isfile") |
| @patch("ambari_commons.os_utils.remove_file") |
| @patch("ambari_server.dbConfiguration_windows.MSSQLConfig.ensure_jdbc_driver_installed") |
| @patch("ambari_server.serverSetup.update_properties") |
| @patch("ambari_server.dbConfiguration_windows.store_password_file") |
| @patch("ambari_server.dbConfiguration_windows.run_os_command") |
| @patch("ambari_server.serverSetup.verify_setup_allowed") |
| @patch("ambari_server.dbConfiguration_windows.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch("ambari_server.serverSetup.download_and_install_jdk") |
| @patch("ambari_server.serverSetup.check_firewall") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.disable_security_enhancements") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.proceedJDBCProperties") |
| @patch("ambari_server.serverSetup.extract_views") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("ambari_server.serverSetup.service_setup") |
| @patch("ambari_server.serverSetup.read_ambari_user") |
| @patch("ambari_server.serverSetup.expand_jce_zip_file") |
| def test_setup_windows(self, expand_jce_zip_file_mock, read_ambari_user_mock, |
| service_setup_mock, adjust_dirs_mock, extract_views_mock, proceedJDBCProperties_mock, is_root_mock, |
| disable_security_enhancements_mock, check_jdbc_drivers_mock, check_ambari_user_mock, check_firewall_mock, |
| download_jdk_mock, configure_os_settings_mock, get_ambari_properties_mock, |
| get_YN_input_mock, gvsi_mock, gvsi_1_mock, |
| verify_setup_allowed_method, run_os_command_1_mock, |
| store_password_file_mock, update_properties_mock, |
| ensure_jdbc_driver_installed_mock, |
| remove_file_mock, isfile_mock, exists_mock, |
| run_os_command_mock): |
| hostname = "localhost" |
| db_name = "db_ambari" |
| port = "1433" |
| user_name = "ambari" |
| password = "bigdata2" |
| |
| failed = False |
| properties = Properties() |
| |
| get_YN_input_mock.return_value = False |
| isfile_mock.return_value = False |
| verify_setup_allowed_method.return_value = 0 |
| exists_mock.return_value = False |
| remove_file_mock.return_value = 0 |
| run_os_command_mock.return_value = 3,"","" |
| extract_views_mock.return_value = 0 |
| read_ambari_user_mock.return_value = "ambari" |
| get_ambari_properties_mock.return_value = properties |
| store_password_file_mock.return_value = "encrypted_bigdata2" |
| ensure_jdbc_driver_installed_mock.return_value = True |
| run_os_command_1_mock.return_value = (0, "", "") |
| expand_jce_zip_file_mock.return_value = 0 |
| |
| def reset_mocks(): |
| is_root_mock.reset_mock() |
| disable_security_enhancements_mock.reset_mock() |
| check_jdbc_drivers_mock.reset_mock() |
| check_ambari_user_mock.reset_mock() |
| run_os_command_mock.reset_mock() |
| configure_os_settings_mock.reset_mock() |
| run_os_command_1_mock.reset_mock() |
| update_properties_mock.reset_mock() |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.default_database_host |
| del args.persistence_type |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| args.jdbc_driver= None |
| args.jdbc_db = None |
| |
| args.silent = False |
| args.must_set_database_options = True |
| |
| return args |
| |
| args = reset_mocks() |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| setup(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("administrator-level" in fe.reason) |
| pass |
| |
| args = reset_mocks() |
| |
| # Testing calls under root |
| is_root_mock.return_value = True |
| disable_security_enhancements_mock.return_value = (0, "") |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| check_jdbc_drivers_mock.return_value = 0 |
| download_jdk_mock.return_value = 0 |
| configure_os_settings_mock.return_value = 0 |
| |
| result = setup(args) |
| |
| self.assertEqual(None, result) |
| self.assertTrue(check_ambari_user_mock.called) |
| self.assertEqual(2, run_os_command_1_mock.call_count) |
| |
| #negative case |
| args = reset_mocks() |
| |
| # Use Windows authentication |
| get_YN_input_mock.return_value = True |
| gvsi_1_mock.side_effect = [hostname, "1"] |
| |
| try: |
| result = setup(args) |
| except Exception: |
| self.fail("Shouldn't throw exception") |
| |
| self.assertTrue(run_os_command_1_mock.called) |
| |
| # Use SQL Server authentication |
| get_YN_input_mock.return_value = True |
| gvsi_1_mock.side_effect = [hostname, "2", user_name, password] |
| |
| try: |
| result = setup(args) |
| except Exception: |
| self.fail("Shouldn't throw exception") |
| |
| self.assertTrue(run_os_command_1_mock.called) |
| |
| # test not run setup if ambari-server setup executed with jdbc properties |
| args = reset_mocks() |
| args.jdbc_driver= "path/to/driver" |
| args.jdbc_db = "test_db_name" |
| |
| |
| setup(args) |
| self.assertTrue(proceedJDBCProperties_mock.called) |
| self.assertFalse(disable_security_enhancements_mock.called) |
| self.assertFalse(check_ambari_user_mock.called) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(OracleConfig, "_get_remote_script_line") |
| @patch("ambari_server.serverSetup.is_server_runing") |
| @patch("ambari_server.dbConfiguration_linux.get_YN_input") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch.object(PGConfig, "_setup_db") |
| @patch("ambari_server.dbConfiguration_linux.print_warning_msg") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.is_root") |
| def test_reset(self, is_root_mock, get_ambari_properties_mock, decrypt_password_for_alias_mock, |
| run_os_command_mock, print_info_msg_mock, print_warning_msg_mock, |
| setup_db_mock, get_YN_input_mock, get_YN_input_2_mock, is_server_running_mock, |
| get_remote_script_line_mock): |
| def reset_mocks(): |
| args = MagicMock() |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.init_script_file |
| del args.drop_script_file |
| del args.sid_or_sname |
| del args.jdbc_url |
| return args |
| |
| properties = Properties() |
| |
| get_ambari_properties_mock.return_value = properties |
| |
| args = reset_mocks() |
| args.persistence_type = "local" |
| |
| get_YN_input_mock.return_value = False |
| decrypt_password_for_alias_mock.return_value = "password" |
| is_server_running_mock.return_value = (False, 0) |
| setup_db_mock.side_effect = [(0,None, None),(0,None, "ERROR: database 'ambari' is being accessed by other users"), (0, None, "ERROR: user 'mapred' already exist")] |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("root-level" in fe.reason) |
| pass |
| |
| # Testing calls under root |
| is_root_mock.return_value = True |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertFalse("root-level" in fe.reason) |
| pass |
| |
| get_YN_input_mock.return_value = True |
| get_YN_input_2_mock.return_value = True |
| run_os_command_mock.return_value = (1, None, None) |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| run_os_command_mock.return_value = (0, None, None) |
| reset(args) |
| self.assertTrue(setup_db_mock.called) |
| |
| # Database errors cases |
| is_server_running_mock.side_effect = [(True, 123), (False, 0), (False, 0), (False, 0), (False, 0)] |
| |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except NonFatalException: |
| # Expected |
| pass |
| |
| args = reset_mocks() |
| args.dbms = "postgres" |
| |
| try: |
| #remote db case |
| reset(args) |
| self.fail("Should throw exception") |
| except NonFatalException: |
| # Expected |
| pass |
| |
| args = reset_mocks() |
| args.dbms = "oracle" |
| |
| print_warning_msg_mock.reset_mock() |
| get_remote_script_line_mock.reset_mock() |
| get_remote_script_line_mock.side_effect = ["drop", "create"] |
| try: |
| #remote db case (not Postgres) |
| rcode = reset(args) |
| self.fail("Should throw exception") |
| except NonFatalException: |
| # Expected |
| self.assertTrue(get_remote_script_line_mock.called) |
| self.assertTrue(print_warning_msg_mock.called) |
| pass |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.is_server_runing") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.dbConfiguration_windows.print_warning_msg") |
| @patch("ambari_server.dbConfiguration_windows.print_info_msg") |
| @patch("ambari_server.dbConfiguration_windows.run_os_command") |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.is_root") |
| def test_reset(self, is_root_mock, get_ambari_properties_mock, decrypt_password_for_alias_mock, |
| run_os_command_mock, print_info_msg_mock, print_warning_msg_mock, |
| get_YN_input_mock, is_server_running_mock): |
| def reset_mocks(): |
| args = MagicMock() |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.default_database_host |
| del args.persistence_type |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| del args.sid_or_sname |
| del args.jdbc_url |
| return args |
| |
| properties = Properties() |
| |
| get_ambari_properties_mock.return_value = properties |
| |
| args = reset_mocks() |
| args.persistence_type = "local" |
| |
| get_YN_input_mock.return_value = False |
| decrypt_password_for_alias_mock.return_value = "password" |
| is_server_running_mock.return_value = (False, 0) |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("administrator-level" in fe.reason) |
| pass |
| |
| # Testing calls under root |
| is_root_mock.return_value = True |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertFalse("administrator-level" in fe.reason) |
| pass |
| |
| get_YN_input_mock.return_value = True |
| run_os_command_mock.return_value = (1, None, None) |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| run_os_command_mock.reset_mock() |
| run_os_command_mock.return_value = (0, None, None) |
| reset(args) |
| self.assertTrue(run_os_command_mock.called) |
| self.assertEqual(run_os_command_mock.call_count, 2) |
| |
| # Database errors cases |
| is_server_running_mock.side_effect = [(True, 123), (False, 0)] |
| |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException: |
| # Expected |
| pass |
| |
| try: |
| reset(args) |
| except NonFatalException: |
| self.fail("Shouldn't throw exception") |
| pass |
| pass |
| |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("__builtin__.raw_input") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.logger") |
| def test_reset_default(self, logger_mock, is_root_mock, raw_input_mock, get_YN_inputMock): |
| is_root_mock.return_value=True |
| get_YN_inputMock.return_value = False |
| raw_input_mock.return_value="" |
| args = MagicMock() |
| |
| try: |
| reset(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue(fe.code == 1) |
| pass |
| |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(PGConfig, "_setup_db") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.is_server_runing") |
| def test_silent_reset(self, is_server_runing_mock, |
| is_root_mock, |
| run_os_command_mock, print_info_msg_mock, |
| setup_db_mock): |
| is_root_mock.return_value = True |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.init_script_file |
| del args.drop_script_file |
| |
| set_silent(True) |
| |
| self.assertTrue(get_silent()) |
| setup_db_mock.return_value = (0, None, None) |
| run_os_command_mock.return_value = (0, None, None) |
| is_server_runing_mock.return_value = (False, 0) |
| |
| def signal_handler(signum, frame): |
| self.fail("Timed out!") |
| |
| signal.signal(signal.SIGALRM, signal_handler) |
| |
| try: |
| signal.alarm(5) |
| rcode = reset(args) |
| signal.alarm(0) |
| self.assertEqual(None, rcode) |
| self.assertTrue(setup_db_mock.called) |
| finally: |
| signal.signal(signal.SIGALRM, signal.SIG_IGN) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.dbConfiguration_windows.MSSQLConfig._execute_db_script") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.is_server_runing") |
| def test_silent_reset(self, is_server_runing_mock, |
| is_root_mock, get_ambari_properties_mock, |
| execute_db_script_mock): |
| is_root_mock.return_value = True |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.default_database_host |
| del args.persistence_type |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| |
| set_silent(True) |
| |
| self.assertTrue(get_silent()) |
| |
| properties = Properties() |
| |
| get_ambari_properties_mock.return_value = properties |
| |
| is_server_runing_mock.return_value = (False, 0) |
| |
| rcode = reset(args) |
| self.assertEqual(None, rcode) |
| self.assertEqual(execute_db_script_mock.call_count, 2) |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("os.path.isdir", new = MagicMock(return_value=True)) |
| @patch("os.access", new = MagicMock(return_value=True)) |
| @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", |
| new = MagicMock(return_value = '/etc/conf' + os.pathsep + 'test' + os.pathsep + 'path12')) |
| @patch("ambari_server_main.get_is_active_instance") |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("sys.stdout.flush") |
| @patch("sys.stdout.write") |
| @patch("ambari_server_main.looking_for_pid") |
| @patch("ambari_server_main.wait_for_ui_start") |
| @patch("ambari_server_main.save_main_pid_ex") |
| @patch("ambari_server_main.check_exitcode") |
| @patch("os.makedirs") |
| @patch("ambari_server_main.locate_file") |
| @patch.object(_ambari_server_, "is_server_runing") |
| @patch("os.chown") |
| @patch("ambari_server.setupSecurity.get_master_key_location") |
| @patch("ambari_server.setupSecurity.save_master_key") |
| @patch("ambari_server.setupSecurity.get_is_persisted") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch('os.chmod', autospec=True) |
| @patch("ambari_server.serverConfiguration.write_property") |
| @patch("ambari_server.serverConfiguration.get_validated_string_input") |
| @patch("os.environ") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server_main.get_ambari_properties") |
| @patch("os.path.exists") |
| @patch("__builtin__.open") |
| @patch.object(subprocess32, "Popen") |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("ambari_server_main.check_database_name_property") |
| @patch("ambari_server_main.find_jdk") |
| @patch("ambari_server_main.print_warning_msg") |
| @patch("ambari_server_main.print_info_msg") |
| @patch.object(PGConfig, "_check_postgre_up") |
| @patch("ambari_server_main.read_ambari_user") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.dbConfiguration_linux.is_root") |
| @patch("ambari_server_main.is_root") |
| @patch.object(LinuxDBMSConfig, "_find_jdbc_driver") |
| @patch("getpass.getuser") |
| @patch("os.chdir") |
| @patch.object(ResourceFilesKeeper, "perform_housekeeping") |
| @patch.object(_ambari_server_, "logger") |
| def test_start(self, logger_mock, perform_housekeeping_mock, chdir_mock, getuser_mock, find_jdbc_driver_mock, |
| is_root_mock, is_root_2_mock, is_root_3_mock, read_ambari_user_mock, |
| check_postgre_up_mock, print_info_msg_mock, print_warning_msg_mock, |
| find_jdk_mock, check_database_name_property_mock, search_file_mock, |
| popenMock, openMock, pexistsMock, |
| get_ambari_properties_mock, get_ambari_properties_2_mock, get_ambari_properties_3_mock, |
| get_ambari_properties_4_mock, get_ambari_properties_5_mock, os_environ_mock, |
| get_validated_string_input_method, write_property_method, |
| os_chmod_method, get_is_secure_mock, get_is_persisted_mock, |
| save_master_key_method, get_master_key_location_method, |
| os_chown_mock, is_server_running_mock, locate_file_mock, |
| os_makedirs_mock, check_exitcode_mock, save_main_pid_ex_mock, |
| wait_for_ui_start_mock, looking_for_pid_mock, stdout_write_mock, stdout_flush_mock, |
| get_is_active_instance_mock): |
| |
| def reset_mocks(): |
| pexistsMock.reset_mock() |
| get_is_active_instance_mock.reset_mock() |
| get_is_active_instance_mock.return_value = True |
| |
| args = MagicMock() |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.sid_or_sname |
| del args.jdbc_url |
| del args.debug |
| del args.suspend_start |
| args.skip_properties_validation = False |
| |
| return args |
| |
| args = reset_mocks() |
| |
| locate_file_mock.side_effect = lambda *args: '/bin/su' if args[0] == 'su' else '/bin/sh' |
| f = MagicMock() |
| f.readline.return_value = '42' |
| openMock.return_value = f |
| |
| looking_for_pid_mock.return_value = [{ |
| "pid": "777", |
| "exe": "/test", |
| "cmd": "test arg" |
| }] |
| wait_for_ui_start_mock.return_value = True |
| check_exitcode_mock.return_value = 0 |
| |
| p = Properties() |
| p.process_pair(PID_DIR_PROPERTY, '/var/run/ambari-server') |
| p.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, 'False') |
| p.process_pair(JDBC_DATABASE_NAME_PROPERTY, 'some_value') |
| p.process_pair(NR_USER_PROPERTY, 'some_value') |
| p.process_pair(STACK_LOCATION_KEY, 'some_value') |
| p.process_pair(SERVER_VERSION_FILE_PATH, 'some_value') |
| p.process_pair(OS_TYPE_PROPERTY, 'some_value') |
| p.process_pair(JAVA_HOME_PROPERTY, 'some_value') |
| p.process_pair(JDK_NAME_PROPERTY, 'some_value') |
| p.process_pair(JCE_NAME_PROPERTY, 'some_value') |
| p.process_pair(COMMON_SERVICES_PATH_PROPERTY, 'some_value') |
| p.process_pair(JDBC_PASSWORD_PROPERTY, 'some_value') |
| p.process_pair(WEBAPP_DIR_PROPERTY, 'some_value') |
| p.process_pair(SHARED_RESOURCES_DIR, 'some_value') |
| p.process_pair(SECURITY_KEYS_DIR, 'some_value') |
| p.process_pair(JDBC_USER_NAME_PROPERTY, 'some_value') |
| p.process_pair(BOOTSTRAP_SCRIPT, 'some_value') |
| p.process_pair(OS_FAMILY_PROPERTY, 'some_value') |
| p.process_pair(RESOURCES_DIR_PROPERTY, 'some_value') |
| p.process_pair(CUSTOM_ACTION_DEFINITIONS, 'some_value') |
| p.process_pair(BOOTSTRAP_SETUP_AGENT_SCRIPT, 'some_value') |
| p.process_pair(STACKADVISOR_SCRIPT, 'some_value') |
| p.process_pair(BOOTSTRAP_DIR_PROPERTY, 'some_value') |
| p.process_pair(MPACKS_STAGING_PATH_PROPERTY, 'some_value') |
| |
| get_ambari_properties_5_mock.return_value = get_ambari_properties_4_mock.return_value = \ |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = p |
| get_is_secure_mock.return_value = False |
| get_is_persisted_mock.return_value = (False, None) |
| search_file_mock.return_value = None |
| is_server_running_mock.return_value = (True, 123) |
| os_chown_mock.return_value = None |
| # Checking "server is running" |
| pexistsMock.return_value = True |
| if get_platform() != PLATFORM_WINDOWS: |
| with patch("pwd.getpwnam") as getpwnam_mock: |
| pw = MagicMock() |
| pw.setattr('pw_uid', 0) |
| pw.setattr('pw_gid', 0) |
| getpwnam_mock.return_value = pw |
| |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'Server is running'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Ambari Server is already running.' in e.reason) |
| |
| args = reset_mocks() |
| |
| is_server_running_mock.return_value = (False, 0) |
| pexistsMock.return_value = False |
| |
| # Checking situation when ambari user is not set up |
| read_ambari_user_mock.return_value = None |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'Can not detect a system user for Ambari'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Unable to detect a system user for Ambari Server.' in e.reason) |
| |
| # Checking start from non-root when current user is not the same as a |
| # custom user |
| args = reset_mocks() |
| read_ambari_user_mock.return_value = "dummy-user" |
| getuser_mock.return_value = "non_custom_user" |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = False |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'Can not start ambari-server as user...'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Unable to start Ambari Server as user' in e.reason) |
| |
| # If not active instance, exception should be thrown |
| args = reset_mocks() |
| get_is_active_instance_mock.return_value = False |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'This is not an active instance. Shutting down...'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('This is not an active instance' in e.reason) |
| pass |
| |
| # Checking "jdk not found" |
| args = reset_mocks() |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = True |
| find_jdk_mock.return_value = None |
| |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'No JDK found'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('No JDK found' in e.reason) |
| |
| args = reset_mocks() |
| find_jdk_mock.return_value = "somewhere" |
| |
| ## Testing workflow under root |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = True |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'oracle') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| # Case when jdbc driver is not used |
| find_jdbc_driver_mock.return_value = -1 |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with exception") |
| except FatalException as e: |
| self.assertTrue('Before starting Ambari Server' in e.reason) |
| |
| args = reset_mocks() |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'oracle') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| find_jdbc_driver_mock.reset_mock() |
| find_jdbc_driver_mock.return_value = -1 |
| try: |
| _ambari_server_.start(args) |
| except FatalException as e: |
| # Ignored |
| pass |
| |
| args = reset_mocks() |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'oracle') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| find_jdbc_driver_mock.reset_mock() |
| find_jdbc_driver_mock.return_value = 0 |
| |
| # Test exception handling on resource files housekeeping |
| perform_housekeeping_mock.reset_mock() |
| perform_housekeeping_mock.side_effect = KeeperException("some_reason") |
| |
| pexistsMock.return_value = True |
| |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with exception") |
| except FatalException as e: |
| self.assertTrue('some_reason' in e.reason) |
| self.assertTrue(perform_housekeeping_mock.called) |
| |
| perform_housekeeping_mock.side_effect = lambda *v, **kv : None |
| perform_housekeeping_mock.reset_mock() |
| |
| self.assertFalse('Unable to start PostgreSQL server' in e.reason) |
| self.assertFalse(check_postgre_up_mock.called) |
| |
| args = reset_mocks() |
| |
| # Local DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| |
| check_postgre_up_mock.reset_mock() |
| |
| # case: postgres failed to start |
| check_postgre_up_mock.return_value = None, 1, "Unable to start PostgreSQL serv", "error" |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'Unable to start PostgreSQL server'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Unable to start PostgreSQL server' in e.reason) |
| self.assertTrue(check_postgre_up_mock.called) |
| |
| args = reset_mocks() |
| |
| # Local DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| |
| check_postgre_up_mock.return_value = "running", 0, "success", "" |
| |
| # Case: custom user is "root" |
| read_ambari_user_mock.return_value = "root" |
| |
| # Java failed to start |
| proc = MagicMock() |
| proc.pid = -186 |
| popenMock.return_value = proc |
| |
| try: |
| _ambari_server_.start(args) |
| except FatalException as e: |
| # Expected |
| self.assertTrue(popenMock.called) |
| self.assertTrue('Ambari Server java process died' in e.reason) |
| self.assertTrue(perform_housekeeping_mock.called) |
| |
| args = reset_mocks() |
| |
| # Java OK |
| proc.pid = 186 |
| popenMock.reset_mock() |
| |
| _ambari_server_.start(args) |
| self.assertTrue(popenMock.called) |
| popen_arg = popenMock.call_args[0][0] |
| self.assertTrue(popen_arg[0] == "/bin/sh") |
| self.assertTrue(perform_housekeeping_mock.called) |
| |
| args = reset_mocks() |
| |
| # Local DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| |
| perform_housekeeping_mock.reset_mock() |
| popenMock.reset_mock() |
| |
| # Case: custom user is not "root" |
| read_ambari_user_mock.return_value = "not-root-user" |
| _ambari_server_.start(args) |
| self.assertTrue(chdir_mock.called) |
| self.assertTrue(popenMock.called) |
| popen_arg = popenMock.call_args_list[0][0][0] |
| self.assertTrue("; /bin/su" in popen_arg[2]) |
| self.assertTrue(perform_housekeeping_mock.called) |
| |
| args = reset_mocks() |
| |
| # Local DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| |
| check_postgre_up_mock.reset_mock() |
| popenMock.reset_mock() |
| |
| ## Testing workflow under non-root |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = False |
| read_ambari_user_mock.return_value = "not-root-user" |
| getuser_mock.return_value = read_ambari_user_mock.return_value |
| |
| _ambari_server_.start(args) |
| |
| self.assertFalse(check_postgre_up_mock.called) |
| |
| args = reset_mocks() |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| _ambari_server_.start(args) |
| |
| self.assertFalse(check_postgre_up_mock.called) |
| |
| args = reset_mocks() |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| # Checking call |
| _ambari_server_.start(args) |
| self.assertTrue(popenMock.called) |
| popen_arg = popenMock.call_args[0][0] |
| self.assertTrue(popen_arg[0] == "/bin/sh") |
| |
| args = reset_mocks() |
| |
| # Remote DB |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'remote') |
| |
| # Test start under wrong user |
| read_ambari_user_mock.return_value = "not-root-user" |
| getuser_mock.return_value = "non_custom_user" |
| try: |
| _ambari_server_.start(args) |
| self.fail("Can not start ambari-server as user non_custom_user.") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Unable to start Ambari Server as user' in e.reason) |
| |
| args = reset_mocks() |
| |
| # Check environ master key is set |
| popenMock.reset_mock() |
| os_environ_mock.copy.return_value = {"a": "b", |
| SECURITY_KEY_ENV_VAR_NAME: "masterkey"} |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| read_ambari_user_mock.return_value = "root" |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = True |
| |
| _ambari_server_.start(args) |
| |
| self.assertFalse(get_validated_string_input_method.called) |
| self.assertFalse(save_master_key_method.called) |
| popen_arg = popenMock.call_args[1]['env'] |
| self.assertEquals(os_environ_mock.copy.return_value, popen_arg) |
| |
| args = reset_mocks() |
| |
| # Check environ master key is not set |
| popenMock.reset_mock() |
| os_environ_mock.reset_mock() |
| p.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, 'True') |
| os_environ_mock.copy.return_value = {"a": "b"} |
| p.process_pair(JDBC_DATABASE_PROPERTY, 'postgres') |
| p.process_pair(PERSISTENCE_TYPE_PROPERTY, 'local') |
| read_ambari_user_mock.return_value = "root" |
| is_root_3_mock.return_value = \ |
| is_root_2_mock.return_value = \ |
| is_root_mock.return_value = True |
| get_validated_string_input_method.return_value = "masterkey" |
| os_chmod_method.return_value = None |
| get_is_secure_mock.return_value = True |
| |
| _ambari_server_.start(args) |
| |
| self.assertTrue(get_validated_string_input_method.called) |
| self.assertTrue(save_master_key_method.called) |
| popen_arg = popenMock.call_args[1]['env'] |
| self.assertEquals(os_environ_mock.copy.return_value, popen_arg) |
| |
| # Checking situation when required properties not set up |
| args = reset_mocks() |
| p.removeProp(JAVA_HOME_PROPERTY) |
| get_ambari_properties_mock.return_value = p |
| try: |
| _ambari_server_.start(args) |
| self.fail("Should fail with 'Required properties are not found:'") |
| except FatalException as e: |
| # Expected |
| self.assertTrue('Required properties are not found:' in e.reason) |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "is_server_runing") |
| @patch("os.remove") |
| @patch("os.killpg") |
| @patch("os.getpgid") |
| @patch.object(_ambari_server_, "print_info_msg") |
| def test_stop(self, print_info_msg_mock, gpidMock, removeMock, |
| killMock, isServerRuningMock): |
| isServerRuningMock.return_value = (True, 123) |
| |
| _ambari_server_.stop(None) |
| |
| self.assertTrue(killMock.called) |
| self.assertTrue(removeMock.called) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("win32serviceutil.StopServiceWithDeps") |
| @patch("win32serviceutil.StopService") |
| @patch("win32serviceutil.WaitForServiceStatus") |
| def test_stop(self, WaitForServiceStatusMock, StopServiceMock, StopServiceWithDepsMock): |
| _ambari_server_.stop() |
| |
| self.assertTrue(StopServiceWithDepsMock.called) |
| self.assertFalse(StopServiceMock.called) |
| self.assertTrue(WaitForServiceStatusMock.called) |
| pass |
| |
| @patch.object(_ambari_server_, "BackupRestore_main") |
| def test_backup(self, bkrestore_mock): |
| args = ["", "/some/path/file.zip"] |
| _ambari_server_.backup(args) |
| self.assertTrue(bkrestore_mock.called) |
| pass |
| |
| @patch.object(_ambari_server_, "BackupRestore_main") |
| def test_backup_no_path(self, bkrestore_mock): |
| args = [""] |
| _ambari_server_.backup(args) |
| self.assertTrue(bkrestore_mock.called) |
| pass |
| |
| @patch.object(_ambari_server_, "BackupRestore_main") |
| @patch.object(_ambari_server_, "logger") |
| def test_restore(self, logger_mock, bkrestore_mock): |
| args = ["", "/some/path/file.zip"] |
| _ambari_server_.restore(args) |
| self.assertTrue(bkrestore_mock.called) |
| pass |
| |
| @patch.object(_ambari_server_, "BackupRestore_main") |
| @patch.object(_ambari_server_, "logger") |
| def test_restore_no_path(self, logger_mock, bkrestore_mock): |
| args = [""] |
| _ambari_server_.restore(args) |
| self.assertTrue(bkrestore_mock.called) |
| pass |
| |
| @patch("ambari_server.serverUpgrade.get_ambari_properties") |
| @patch("os.listdir") |
| @patch("os.path.isfile") |
| @patch("shutil.move") |
| def test_move_user_custom_actions(self, shutil_move_mock, os_path_isfile_mock, os_listdir_mock, get_ambari_properties_mock): |
| properties = Properties() |
| properties.process_pair(RESOURCES_DIR_PROPERTY, 'some/test/fake/resources/dir/path') |
| get_ambari_properties_mock.return_value = properties |
| os_listdir_mock.return_value = ['sometestdir', 'sometestfile.md', 'sometestfile.py', 'sometestfile2.java', 'sometestfile2.py', 'sometestdir2.py'] |
| os_path_isfile_mock.side_effect = [False, True, True, True, True, False] |
| |
| move_user_custom_actions() |
| |
| custom_actions_scripts_dir = os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'scripts') |
| shutil_move_mock.assert_has_calls([call(os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'sometestfile.py'), custom_actions_scripts_dir), |
| call(os.path.join('some/test/fake/resources/dir/path', 'custom_actions', 'sometestfile2.py'), custom_actions_scripts_dir)]) |
| self.assertEqual(shutil_move_mock.call_count, 2) |
| pass |
| |
| @patch("os.path.isdir", new = MagicMock(return_value=True)) |
| @patch("os.access", new = MagicMock(return_value=True)) |
| @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", |
| new = MagicMock(return_value = '/etc/conf' + os.pathsep + 'test' + |
| os.pathsep + 'path12' + os.pathsep +'/path/to/jdbc.jar')) |
| @patch("ambari_server.serverUpgrade.ensure_jdbc_driver_is_installed") |
| @patch("ambari_server.serverUpgrade.get_jdbc_driver_path") |
| @patch("ambari_server.serverUpgrade.ensure_can_start_under_current_user") |
| @patch("ambari_server.serverUpgrade.generate_env") |
| @patch("ambari_server.serverUpgrade.read_ambari_user") |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| @patch("ambari_server.serverUpgrade.run_os_command") |
| @patch("ambari_server.serverUpgrade.get_java_exe_path") |
| @patch("ambari_server.serverUpgrade.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.get_YN_input") |
| def test_run_schema_upgrade(self, get_YN_input_mock, get_ambari_properties_mock, java_exe_path_mock, run_os_command_mock, |
| get_conf_dir_mock, |
| read_ambari_user_mock, generate_env_mock, |
| ensure_can_start_under_current_user_mock, get_jdbc_mock, |
| ensure_jdbc_driver_is_installed_mock): |
| java_exe_path_mock.return_value = "/usr/lib/java/bin/java" |
| run_os_command_mock.return_value = (0, '{"lzo_enabled":"false"}', None) |
| get_conf_dir_mock.return_value = '/etc/conf' |
| command = '/usr/lib/java/bin/java -cp /etc/conf' + os.pathsep + 'test' + os.pathsep + 'path12' + \ |
| os.pathsep +'/path/to/jdbc.jar ' \ |
| 'org.apache.ambari.server.upgrade.SchemaUpgradeHelper ' \ |
| '> ' + os.sep + 'var' + os.sep + 'log' + os.sep + 'ambari-server' + os.sep + 'ambari-server.out 2>&1' |
| environ = {} |
| generate_env_mock.return_value = environ |
| ensure_can_start_under_current_user_mock.return_value = "root" |
| read_ambari_user_mock.return_value = "ambari" |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "local") |
| get_ambari_properties_mock.return_value = properties |
| get_YN_input_mock.return_value = True |
| get_jdbc_mock.return_value = '/path/to/jdbc.jar' |
| |
| run_schema_upgrade(None) |
| |
| self.assertTrue(java_exe_path_mock.called) |
| self.assertTrue(ensure_can_start_under_current_user_mock.called) |
| self.assertTrue(generate_env_mock.called) |
| self.assertTrue(read_ambari_user_mock.called) |
| self.assertTrue(run_os_command_mock.called) |
| run_os_command_mock.assert_called_with(command, env=environ) |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("os.path.isfile") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("os.path.exists") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch("shutil.copy") |
| def test_proceedJDBCProperties(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mock, exists_mock, |
| get_ambari_properties_mock, isfile_mock): |
| args = MagicMock() |
| |
| # test incorrect path to jdbc-driver |
| isfile_mock.return_value = False |
| args.jdbc_driver = "test jdbc" |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("File test jdbc does not exist!", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test incorrect jdbc-db |
| isfile_mock.return_value = True |
| args.jdbc_db = "incorrect db" |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("Unsupported database name incorrect db. Please see help for more information.", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test getAmbariProperties failed |
| args.jdbc_db = "mysql" |
| get_ambari_properties_mock.return_value = -1 |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("Error getting ambari properties", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test getAmbariProperties failed |
| args.jdbc_db = "mssql" |
| get_ambari_properties_mock.return_value = -1 |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("Error getting ambari properties", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test get resource dir param failed |
| args.jdbc_db = "oracle" |
| p = MagicMock() |
| get_ambari_properties_mock.return_value = p |
| p.__getitem__.side_effect = KeyError("test exception") |
| exists_mock.return_value = False |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| fail = True |
| self.assertTrue(fail) |
| |
| # test copy jdbc failed and symlink exists |
| lexists_mock.return_value = True |
| args.jdbc_db = "postgres" |
| get_ambari_properties_mock.return_value = MagicMock() |
| isfile_mock.side_effect = [True, False] |
| exists_mock.return_value = True |
| fail = False |
| |
| def side_effect(): |
| raise Exception(-1, "Failed to copy!") |
| |
| copy_mock.side_effect = side_effect |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| fail = True |
| self.assertTrue(fail) |
| self.assertTrue(os_remove_mock.called) |
| |
| # test success symlink creation |
| get_ambari_properties_mock.reset_mock() |
| os_remove_mock.reset_mock() |
| p = MagicMock() |
| get_ambari_properties_mock.return_value = p |
| p.__getitem__.side_effect = None |
| p.__getitem__.return_value = "somewhere" |
| copy_mock.reset_mock() |
| copy_mock.side_effect = None |
| isfile_mock.side_effect = [True, False] |
| |
| proceedJDBCProperties(args) |
| self.assertTrue(os_remove_mock.called) |
| self.assertTrue(os_symlink_mock.called) |
| self.assertTrue(copy_mock.called) |
| self.assertEquals(os_symlink_mock.call_args_list[0][0][0], os.path.join("somewhere","test jdbc")) |
| self.assertEquals(os_symlink_mock.call_args_list[0][0][1], os.path.join("somewhere","postgres-jdbc-driver.jar")) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("os.path.isfile") |
| @patch("ambari_server.serverSetup.get_ambari_properties") |
| @patch("os.path.exists") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch("shutil.copy") |
| def test_proceedJDBCProperties(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mock, exists_mock, |
| get_ambari_properties_mock, isfile_mock): |
| args = MagicMock() |
| |
| # test incorrect path to jdbc-driver |
| isfile_mock.return_value = False |
| args.jdbc_driver = "test jdbc" |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("File test jdbc does not exist!", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test incorrect jdbc-db |
| isfile_mock.return_value = True |
| args.jdbc_db = "incorrect db" |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("Unsupported database name incorrect db. Please see help for more information.", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test getAmbariProperties succeeded |
| args.jdbc_db = "mssql" |
| get_ambari_properties_mock.return_value = -1 |
| fail = False |
| |
| try: |
| proceedJDBCProperties(args) |
| except FatalException as e: |
| self.assertEquals("Error getting ambari properties", e.reason) |
| fail = True |
| self.assertFalse(fail) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("__builtin__.open") |
| @patch("os.path.isfile") |
| @patch("os.path.lexists") |
| @patch("os.path.exists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch.object(Properties, "store") |
| @patch("ambari_server.serverUpgrade.adjust_directory_permissions") |
| @patch("ambari_server.serverUpgrade.print_warning_msg") |
| @patch("ambari_server.serverUpgrade.read_ambari_user") |
| @patch("ambari_server.serverUpgrade.run_schema_upgrade") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| @patch("ambari_server.serverUpgrade.update_ambari_properties") |
| @patch("ambari_server.serverUpgrade.is_root") |
| @patch("ambari_server.serverConfiguration.write_property") |
| @patch("ambari_server.serverConfiguration.get_ambari_version") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.move_user_custom_actions") |
| @patch("ambari_server.serverUpgrade.update_krb_jaas_login_properties") |
| @patch("ambari_server.serverUpgrade.update_ambari_env") |
| @patch("ambari_server.setupMpacks.get_replay_log_file") |
| @patch("ambari_server.serverUpgrade.logger") |
| @patch.object(PGConfig, "_change_db_files_owner", return_value=0) |
| def test_upgrade_from_161(self, change_db_files_owner_mock, logger_mock, get_replay_log_file_mock, update_ambari_env_mock, update_krb_jaas_login_properties_mock, move_user_custom_actions_mock, get_ambari_properties_mock, |
| get_ambari_properties_2_mock, get_ambari_properties_3_mock, get_ambari_version_mock, write_property_mock, |
| is_root_mock, update_ambari_properties_mock, find_properties_file_mock, run_os_command_mock, |
| run_schema_upgrade_mock, read_ambari_user_mock, print_warning_msg_mock, |
| adjust_directory_permissions_mock, properties_store_mock, |
| os_symlink_mock, os_remove_mock, exists_mock, lexists_mock, isfile_mock, open_mock): |
| |
| def reset_mocks(): |
| run_os_command_mock.reset_mock() |
| write_property_mock.reset_mock() |
| isfile_mock.reset_mock() |
| lexists_mock.reeset_mock() |
| os_symlink_mock.reset_mock() |
| |
| lexists_mock.return_value = False |
| |
| args = MagicMock() |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.database_windows_auth |
| del args.default_database_host |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| del args.must_set_database_options |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| args.jdbc_driver= None |
| args.jdbc_db = None |
| |
| args.silent = False |
| |
| return args |
| |
| args = reset_mocks() |
| args.dbms = "postgres" |
| |
| is_root_mock.return_value = True |
| update_ambari_properties_mock.return_value = 0 |
| update_ambari_env_mock.return_value = 0 |
| get_ambari_version_mock.return_value = "1.7.0" |
| move_user_custom_actions_mock.return_value = None |
| update_krb_jaas_login_properties_mock.return_value = -2 |
| |
| # Local Postgres |
| # In Ambari 1.6.1 for an embedded postgres database, the "server.jdbc.database" property stored the DB name, |
| # and the DB type was assumed to be "postgres" if the "server.persistence.type" property was "local" |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "local") |
| properties.process_pair(JDBC_DATABASE_PROPERTY, "ambari") |
| properties.process_pair(RESOURCES_DIR_PROPERTY, "/tmp") |
| get_ambari_properties_mock.return_value = properties |
| |
| properties2 = Properties() |
| properties2.process_pair(PERSISTENCE_TYPE_PROPERTY, "local") |
| properties2.process_pair(JDBC_DATABASE_NAME_PROPERTY, "ambari") |
| properties2.process_pair(JDBC_DATABASE_PROPERTY, "postgres") |
| get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] |
| get_replay_log_file_mock.return_value = "/invalid_path/mpacks_replay.log" |
| |
| run_schema_upgrade_mock.return_value = 0 |
| read_ambari_user_mock.return_value = "custom_user" |
| |
| run_os_command_mock.return_value = (0, "", "") |
| isfile_mock.return_value = False |
| |
| try: |
| upgrade(args) |
| except FatalException as fe: |
| self.fail("Did not expect failure: " + str(fe)) |
| else: |
| self.assertTrue(write_property_mock.called) |
| self.assertEquals(write_property_mock.call_args_list[0][0][0], JDBC_DATABASE_NAME_PROPERTY) |
| self.assertEquals(write_property_mock.call_args_list[0][0][1], "ambari") |
| self.assertEquals(write_property_mock.call_args_list[1][0][0], JDBC_DATABASE_PROPERTY) |
| self.assertEquals(write_property_mock.call_args_list[1][0][1], "postgres") |
| self.assertFalse(move_user_custom_actions_mock.called) |
| |
| args = reset_mocks() |
| |
| # External Postgres |
| # In Ambari 1.6.1 for an external postgres database, the "server.jdbc.database" property stored the |
| # DB type ("postgres"), and the "server.jdbc.schema" property stored the DB name. |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties.process_pair(JDBC_DATABASE_PROPERTY, "postgres") |
| properties.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties.process_pair(JDBC_URL_PROPERTY, "jdbc:postgresql://c6410.ambari.apache.org:5432/ambari") |
| |
| properties2 = Properties() |
| properties2.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties2.process_pair(JDBC_DATABASE_NAME_PROPERTY, "ambari") |
| properties2.process_pair(JDBC_DATABASE_PROPERTY, "postgres") |
| properties2.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties2.process_pair(JDBC_URL_PROPERTY, "jdbc:postgresql://c6410.ambari.apache.org:5432/ambari") |
| |
| get_ambari_properties_mock.return_value = properties |
| get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] |
| |
| exists_mock.return_value = True |
| |
| try: |
| upgrade(args) |
| except FatalException as fe: |
| self.fail("Did not expect failure: " + str(fe)) |
| else: |
| self.assertTrue(write_property_mock.called) |
| self.assertFalse(run_os_command_mock.called) |
| self.assertFalse(move_user_custom_actions_mock.called) |
| |
| args = reset_mocks() |
| |
| # External Postgres missing DB type, so it should be set based on the JDBC URL. |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties.process_pair(JDBC_URL_PROPERTY, "jdbc:postgresql://c6410.ambari.apache.org:5432/ambari") |
| |
| get_ambari_properties_mock.return_value = properties |
| get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] |
| |
| try: |
| upgrade(args) |
| except FatalException as fe: |
| self.fail("Did not expect failure: " + str(fe)) |
| else: |
| self.assertTrue(write_property_mock.call_count == 2) |
| self.assertFalse(move_user_custom_actions_mock.called) |
| |
| args = reset_mocks() |
| |
| # External MySQL |
| # In Ambari 1.6.1 for an external MySQL database, the "server.jdbc.database" property stored the DB type ("mysql"), |
| # And the "server.jdbc.schema" property stored the DB name. |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties.process_pair(JDBC_DATABASE_PROPERTY, "mysql") |
| properties.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties.process_pair(JDBC_URL_PROPERTY, "jdbc:mysql://c6409.ambari.apache.org:3306/ambari") |
| |
| properties2 = Properties() |
| properties2.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties2.process_pair(JDBC_DATABASE_PROPERTY, "mysql") |
| properties2.process_pair(JDBC_DATABASE_NAME_PROPERTY, "ambari") |
| properties2.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties2.process_pair(JDBC_URL_PROPERTY, "jdbc:mysql://c6409.ambari.apache.org:3306/ambari") |
| |
| get_ambari_properties_mock.return_value = properties |
| get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] |
| |
| isfile_mock.side_effect = [False, True, False, False, False] |
| |
| try: |
| upgrade(args) |
| except FatalException as fe: |
| self.fail("Did not expect failure: " + str(fe)) |
| else: |
| self.assertTrue(write_property_mock.called) |
| self.assertFalse(move_user_custom_actions_mock.called) |
| self.assertTrue(os_symlink_mock.called) |
| self.assertTrue(os_symlink_mock.call_args_list[0][0][0] == "/var/lib/ambari-server/resources/mysql-connector-java.jar") |
| self.assertTrue(os_symlink_mock.call_args_list[0][0][1] == "/var/lib/ambari-server/resources/mysql-jdbc-driver.jar") |
| |
| args = reset_mocks() |
| |
| # External MySQL missing DB type, so it should be set based on the JDBC URL. |
| properties = Properties() |
| properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote") |
| properties.process_pair(JDBC_RCA_SCHEMA_PROPERTY, "ambari") |
| properties.process_pair(JDBC_URL_PROPERTY, "jdbc:mysql://c6409.ambari.apache.org:3306/ambari") |
| |
| get_ambari_properties_mock.return_value = properties |
| get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2] |
| |
| isfile_mock.side_effect = None |
| |
| try: |
| upgrade(args) |
| except FatalException as fe: |
| self.fail("Did not expect failure: " + str(fe)) |
| else: |
| self.assertTrue(write_property_mock.call_count == 2) |
| self.assertFalse(move_user_custom_actions_mock.called) |
| pass |
| |
| |
| @patch("shutil.copytree") |
| @patch("os.makedirs") |
| @patch("os.path.islink") |
| @patch("os.path.exists") |
| @patch("os.path.getctime") |
| @patch("re.compile") |
| @patch("os.path.join") |
| @patch("os.path.basename") |
| @patch("os.path.isdir") |
| @patch("glob.glob") |
| def test_find_and_copy_custom_services(self, glob_mock, isdir_mock, basename_mock, join_mock, re_compile_mock, |
| getctime_mock, exists_mock, islink_mock, makedirs_mock, copytree_mock): |
| # service/version dir is not link |
| glob_mock.return_value = [""] |
| isdir_mock.side_effect = [False, True, True] |
| islink_mock.return_value = False |
| exists_mock.side_effect = [True, False] |
| find_and_copy_custom_services("", "", "", "", "", "/common-services/") |
| |
| self.assertTrue(makedirs_mock.called) |
| self.assertTrue(copytree_mock.called) |
| |
| |
| # service/version dir is link |
| makedirs_mock.reset_mock() |
| copytree_mock.reset_mock() |
| islink_mock.side_effect = [False, True] |
| |
| self.assertFalse(makedirs_mock.called) |
| self.assertFalse(copytree_mock.called) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("__builtin__.open") |
| @patch("os.path.isfile") |
| @patch("os.path.exists") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch.object(Properties, "store") |
| @patch.object(PGConfig, "_change_db_files_owner") |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| @patch("ambari_server.serverUpgrade.adjust_directory_permissions") |
| @patch("ambari_server.serverUpgrade.print_warning_msg") |
| @patch("ambari_server.serverUpgrade.read_ambari_user") |
| @patch("ambari_server.serverUpgrade.run_schema_upgrade") |
| @patch("ambari_server.serverUpgrade.update_ambari_properties") |
| @patch("ambari_server.serverUpgrade.parse_properties_file") |
| @patch("ambari_server.serverUpgrade.get_ambari_version") |
| @patch("ambari_server.serverConfiguration.get_ambari_version") |
| @patch("ambari_server.serverUpgrade.is_root") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.move_user_custom_actions") |
| @patch("ambari_server.serverUpgrade.update_krb_jaas_login_properties") |
| @patch("ambari_server.serverUpgrade.update_ambari_env") |
| def test_upgrade(self, update_ambari_env_mock, update_krb_jaas_login_properties_mock, move_user_custom_actions, |
| get_ambari_properties_mock, get_ambari_properties_2_mock, get_ambari_properties_3_mock, |
| is_root_mock, get_ambari_version_mock, get_ambari_version_2_mock, |
| parse_properties_file_mock, |
| update_ambari_properties_mock, run_schema_upgrade_mock, |
| read_ambari_user_mock, print_warning_msg_mock, |
| adjust_directory_permissions_mock, |
| find_properties_file_mock, change_db_files_owner_mock, properties_store_mock, |
| os_symlink_mock, os_remove_mock, lexists_mock, exists_mock, isfile_mock, open_mock): |
| |
| def reset_mocks(): |
| isfile_mock.reset_mock() |
| |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| args.must_set_database_options = True |
| |
| return args |
| |
| args = reset_mocks() |
| |
| properties = Properties() |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = properties |
| update_ambari_properties_mock.return_value = 0 |
| update_ambari_env_mock.return_value = 0 |
| run_schema_upgrade_mock.return_value = 0 |
| isfile_mock.return_value = False |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = CURR_AMBARI_VERSION |
| move_user_custom_actions.return_value = None |
| update_krb_jaas_login_properties_mock.return_value = -2 |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| upgrade(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("root-level" in fe.reason) |
| pass |
| |
| args = reset_mocks() |
| |
| # Testing calls under root |
| is_root_mock.return_value = True |
| |
| # Testing with undefined custom user |
| read_ambari_user_mock.return_value = None |
| run_schema_upgrade_mock.return_value = 0 |
| change_db_files_owner_mock.return_value = 0 |
| exists_mock.return_value = True |
| upgrade(args) |
| self.assertTrue(print_warning_msg_mock.called) |
| warning_args = print_warning_msg_mock.call_args[0][0] |
| self.assertTrue("custom ambari user" in warning_args) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| args = reset_mocks() |
| |
| # Testing with defined custom user |
| read_ambari_user_mock.return_value = "ambari-custom-user" |
| upgrade(args) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| |
| args = reset_mocks() |
| |
| run_schema_upgrade_mock.return_value = 0 |
| parse_properties_file_mock.called = False |
| move_user_custom_actions.called = False |
| retcode = upgrade(args) |
| self.assertTrue(get_ambari_properties_mock.called) |
| self.assertTrue(get_ambari_properties_2_mock.called) |
| |
| self.assertNotEqual(-1, retcode) |
| self.assertTrue(parse_properties_file_mock.called) |
| self.assertTrue(run_schema_upgrade_mock.called) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| # Assert that move_user_custom_actions is called on upgrade to Ambari == 2.0.0 |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = '2.0.0' |
| move_user_custom_actions.called = False |
| upgrade(args) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| # Assert that move_user_custom_actions is not called on upgrade to Ambari < 2.0.0 |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = '1.6.0' |
| move_user_custom_actions.called = False |
| upgrade(args) |
| self.assertFalse(move_user_custom_actions.called) |
| |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = CURR_AMBARI_VERSION |
| |
| # test getAmbariProperties failed |
| args = reset_mocks() |
| |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = -1 |
| fail = False |
| |
| try: |
| upgrade(args) |
| except FatalException as e: |
| self.assertEquals("Error getting ambari properties", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test get resource dir param failed |
| args = reset_mocks() |
| |
| p = MagicMock() |
| get_ambari_properties_mock.reset_mock() |
| get_ambari_properties_2_mock.reset_mock() |
| get_ambari_properties_3_mock.reset_mock() |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = p |
| p.__getitem__.side_effect = ["something", "something", "something", "something", KeyError("test exception")] |
| exists_mock.return_value = False |
| fail = False |
| |
| try: |
| upgrade(args) |
| except FatalException as e: |
| fail = True |
| self.assertTrue(fail) |
| |
| # test if some drivers are available in resources, and symlink available too |
| args = reset_mocks() |
| |
| props = Properties() |
| props.process_pair(JDBC_DATABASE_NAME_PROPERTY, "something") |
| props.process_pair(RESOURCES_DIR_PROPERTY, "resources") |
| |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = props |
| exists_mock.return_value = True |
| lexists_mock.return_value = True |
| isfile_mock.side_effect = [True, False, False] |
| |
| upgrade(args) |
| self.assertTrue(os_remove_mock.called) |
| self.assertEquals(os_remove_mock.call_count, 1) |
| self.assertEquals(os_remove_mock.call_args[0][0], os.path.join("resources", "oracle-jdbc-driver.jar")) |
| self.assertEquals(os_symlink_mock.call_count, 1) |
| self.assertEquals(os_symlink_mock.call_args[0][0], os.path.join("resources", "ojdbc6.jar")) |
| self.assertEquals(os_symlink_mock.call_args[0][1], os.path.join("resources", "oracle-jdbc-driver.jar")) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("__builtin__.open") |
| @patch("os.path.isfile") |
| @patch("os.path.exists") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch.object(Properties, "store") |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| @patch("ambari_server.serverUpgrade.adjust_directory_permissions") |
| @patch("ambari_server.serverUpgrade.print_warning_msg") |
| @patch("ambari_server.serverUpgrade.read_ambari_user") |
| @patch("ambari_server.serverUpgrade.run_schema_upgrade") |
| @patch("ambari_server.serverUpgrade.update_ambari_properties") |
| @patch("ambari_server.serverUpgrade.parse_properties_file") |
| @patch("ambari_server.serverUpgrade.get_ambari_version") |
| @patch("ambari_server.serverConfiguration.get_ambari_version") |
| @patch("ambari_server.serverUpgrade.is_root") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.get_ambari_properties") |
| @patch("ambari_server.serverUpgrade.move_user_custom_actions") |
| @patch("ambari_server.serverUpgrade.update_krb_jaas_login_properties") |
| def test_upgrade(self, update_krb_jaas_login_properties_mock, move_user_custom_actions, |
| get_ambari_properties_mock, get_ambari_properties_2_mock, get_ambari_properties_3_mock, |
| is_root_mock, get_ambari_version_mock, get_ambari_version_2_mock, |
| parse_properties_file_mock, |
| update_ambari_properties_mock, run_schema_upgrade_mock, |
| read_ambari_user_mock, print_warning_msg_mock, |
| adjust_directory_permissions_mock, |
| find_properties_file_mock, properties_store_mock, |
| os_symlink_mock, os_remove_mock, lexists_mock, exists_mock, isfile_mock, open_mock): |
| |
| def reset_mocks(): |
| isfile_mock.reset_mock() |
| |
| args = MagicMock() |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.default_database_host |
| del args.persistence_type |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| args.must_set_database_options = True |
| |
| return args |
| |
| args = reset_mocks() |
| |
| properties = Properties() |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = properties |
| update_ambari_properties_mock.return_value = 0 |
| run_schema_upgrade_mock.return_value = 0 |
| isfile_mock.return_value = False |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = CURR_AMBARI_VERSION |
| move_user_custom_actions.return_value = None |
| update_krb_jaas_login_properties_mock.return_value = -2 |
| |
| # Testing call under non-root |
| is_root_mock.return_value = False |
| try: |
| upgrade(args) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("administrator-level" in fe.reason) |
| pass |
| |
| args = reset_mocks() |
| |
| # Testing calls under root |
| is_root_mock.return_value = True |
| |
| # Testing with undefined custom user |
| read_ambari_user_mock.return_value = None |
| run_schema_upgrade_mock.return_value = 0 |
| exists_mock.return_value = True |
| upgrade(args) |
| self.assertTrue(print_warning_msg_mock.called) |
| warning_args = print_warning_msg_mock.call_args[0][0] |
| self.assertTrue("custom ambari user" in warning_args) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| args = reset_mocks() |
| |
| # Testing with defined custom user |
| read_ambari_user_mock.return_value = "ambari-custom-user" |
| upgrade(args) |
| self.assertTrue(adjust_directory_permissions_mock.called) |
| |
| args = reset_mocks() |
| |
| run_schema_upgrade_mock.return_value = 0 |
| parse_properties_file_mock.called = False |
| move_user_custom_actions.called = False |
| retcode = upgrade(args) |
| self.assertTrue(get_ambari_properties_mock.called) |
| self.assertTrue(get_ambari_properties_2_mock.called) |
| |
| self.assertNotEqual(-1, retcode) |
| self.assertTrue(parse_properties_file_mock.called) |
| self.assertTrue(run_schema_upgrade_mock.called) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| # Assert that move_user_custom_actions is called on upgrade to Ambari == 2.0.0 |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = '2.0.0' |
| move_user_custom_actions.called = False |
| upgrade(args) |
| self.assertTrue(move_user_custom_actions.called) |
| |
| # Assert that move_user_custom_actions is not called on upgrade to Ambari < 2.0.0 |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = '1.6.0' |
| move_user_custom_actions.called = False |
| upgrade(args) |
| self.assertFalse(move_user_custom_actions.called) |
| |
| get_ambari_version_2_mock.return_value = get_ambari_version_mock.return_value = CURR_AMBARI_VERSION |
| |
| # test getAmbariProperties failed |
| args = reset_mocks() |
| |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = -1 |
| fail = False |
| |
| try: |
| upgrade(args) |
| except FatalException as e: |
| self.assertEquals("Error getting ambari properties", e.reason) |
| fail = True |
| self.assertTrue(fail) |
| |
| # test get resource dir param failed |
| args = reset_mocks() |
| |
| p = MagicMock() |
| get_ambari_properties_mock.reset_mock() |
| get_ambari_properties_2_mock.reset_mock() |
| get_ambari_properties_3_mock.reset_mock() |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = p |
| p.__getitem__.side_effect = ["something", "something", "something", "something", KeyError("test exception")] |
| exists_mock.return_value = False |
| fail = False |
| |
| try: |
| upgrade(args) |
| except FatalException as e: |
| fail = True |
| self.assertTrue(fail) |
| |
| # test if some drivers are available in resources, and symlink available too |
| args = reset_mocks() |
| |
| props = Properties() |
| props.process_pair(JDBC_DATABASE_NAME_PROPERTY, "something") |
| props.process_pair(RESOURCES_DIR_PROPERTY, "resources") |
| |
| get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \ |
| get_ambari_properties_mock.return_value = props |
| exists_mock.return_value = True |
| lexists_mock.return_value = True |
| isfile_mock.side_effect = [True, False, False] |
| pass |
| |
| |
| def test_print_info_msg(self): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| set_verbose(True) |
| print_info_msg("msg") |
| self.assertNotEqual("", out.getvalue()) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| def test_print_error_msg(self): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| set_verbose(True) |
| print_error_msg("msg") |
| self.assertNotEqual("", out.getvalue()) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| def test_print_warning_msg(self): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| set_verbose(True) |
| print_warning_msg("msg") |
| self.assertNotEqual("", out.getvalue()) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| @patch("ambari_server.userInput.get_choice_string_input") |
| def test_get_YN_input(self, get_choice_string_input_mock): |
| |
| get_YN_input("prompt", "default") |
| self.assertTrue(get_choice_string_input_mock.called) |
| self.assertEqual(5, len(get_choice_string_input_mock.call_args_list[0][0])) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| def test_main_db_options(self, setup_mock): |
| base_args = ["ambari-server.py", "setup"] |
| db_args = ["--database", "postgres", "--databasehost", "somehost.net", "--databaseport", "12345", |
| "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"] |
| |
| #test no args |
| failed = False |
| sys.argv = list(base_args) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(failed) |
| self.assertTrue(setup_mock.called) |
| self.assertTrue(setup_mock.call_args_list[0][0][0].must_set_database_options) |
| |
| setup_mock.reset_mock() |
| |
| # test embedded option |
| failed = False |
| sys.argv = list(base_args) |
| sys.argv.extend(db_args[-10:]) |
| sys.argv.extend(["--database", "embedded"]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(failed) |
| self.assertTrue(setup_mock.called) |
| |
| setup_mock.reset_mock() |
| |
| #test full args |
| sys.argv = list(base_args) |
| sys.argv.extend(db_args) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(failed) |
| self.assertTrue(setup_mock.called) |
| self.assertFalse(setup_mock.call_args_list[0][0][0].must_set_database_options) |
| |
| setup_mock.reset_mock() |
| |
| #test not full args |
| sys.argv = list(base_args) |
| sys.argv.extend(["--database", "postgres"]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(setup_mock.called) |
| self.assertTrue(failed) |
| |
| setup_mock.reset_mock() |
| |
| #test wrong database |
| failed = False |
| sys.argv = list(base_args) |
| sys.argv.extend(["--database", "unknown"]) |
| sys.argv.extend(db_args[2:]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertTrue(failed) |
| self.assertFalse(setup_mock.called) |
| |
| setup_mock.reset_mock() |
| |
| #test wrong port check |
| failed = False |
| sys.argv = list(base_args) |
| sys.argv.extend(["--databaseport", "unknown"]) |
| sys.argv.extend(db_args[:4]) |
| sys.argv.extend(db_args[6:]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertTrue(failed) |
| self.assertFalse(setup_mock.called) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "setup") |
| def test_main_db_options(self, setup_mock): |
| base_args = ["ambari-server.py", "setup"] |
| db_args = ["--databasehost", "somehost.net", "--databaseport", "12345", |
| "--databasename", "ambari", "--databaseusername", "ambari", "--databasepassword", "bigdata"] |
| |
| #test no args |
| failed = False |
| sys.argv = list(base_args) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(failed) |
| self.assertTrue(setup_mock.called) |
| self.assertTrue(setup_mock.call_args_list[0][0][0].must_set_database_options) |
| |
| setup_mock.reset_mock() |
| |
| #test full args |
| sys.argv = list(base_args) |
| sys.argv.extend(db_args) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(failed) |
| self.assertTrue(setup_mock.called) |
| self.assertFalse(setup_mock.call_args_list[0][0][0].must_set_database_options) |
| |
| setup_mock.reset_mock() |
| |
| #test not full args |
| sys.argv = list(base_args) |
| sys.argv.extend(["--databasehost", "somehost.net"]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertFalse(setup_mock.called) |
| self.assertTrue(failed) |
| |
| setup_mock.reset_mock() |
| |
| #test wrong port check |
| failed = False |
| sys.argv = list(base_args) |
| sys.argv.extend(["--databaseport", "unknown"]) |
| sys.argv.extend(db_args[:2]) |
| sys.argv.extend(db_args[6:]) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit: |
| failed = True |
| pass |
| |
| self.assertTrue(failed) |
| self.assertFalse(setup_mock.called) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration_linux.print_info_msg") |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| def test_prompt_db_properties(self, get_ambari_properties_mock, print_info_msg_mock, |
| get_validated_string_input_mock, get_YN_input_mock): |
| def reset_mocks(): |
| get_validated_string_input_mock.reset_mock() |
| get_YN_input_mock.reset_mock() |
| |
| args = MagicMock() |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| |
| return args |
| |
| args = reset_mocks() |
| get_ambari_properties_mock.return_value = Properties() |
| |
| set_silent(False) |
| |
| #test not prompt |
| args.must_set_database_options = False |
| prompt_db_properties(args) |
| |
| self.assertFalse(get_validated_string_input_mock.called) |
| self.assertFalse(get_YN_input_mock.called) |
| |
| args = reset_mocks() |
| |
| #test prompt |
| args.must_set_database_options = True |
| get_YN_input_mock.return_value = False |
| |
| prompt_db_properties(args) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertFalse(get_validated_string_input_mock.called) |
| |
| args = reset_mocks() |
| |
| #test prompt advanced |
| args.must_set_database_options = True |
| get_YN_input_mock.return_value = True |
| get_validated_string_input_mock.return_value = "4" |
| |
| prompt_db_properties(args) |
| self.assertTrue(get_YN_input_mock.called) |
| self.assertTrue(get_validated_string_input_mock.called) |
| |
| self.assertEquals(args.database_index, 3) |
| pass |
| |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| def _test_update_ambari_properties(self, get_conf_dir_mock): |
| from ambari_server import serverConfiguration # need to modify constants inside the module |
| |
| properties = ["server.jdbc.user.name=ambari-server\n", |
| "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n", |
| "java.home=/usr/jdk64/jdk1.6.0_31\n", |
| "server.jdbc.database_name=ambari\n", |
| "ambari-server.user=ambari\n", |
| "agent.fqdn.service.url=URL\n", |
| "java.releases=jdk1.7,jdk1.6\n"] |
| |
| NEW_PROPERTY = 'some_new_property=some_value\n' |
| JAVA_RELEASES_NEW_PROPERTY = 'java.releases=jdk1.8,jdk1.7\n' |
| CHANGED_VALUE_PROPERTY = 'server.jdbc.database_name=should_not_overwrite_value\n' |
| |
| get_conf_dir_mock.return_value = '/etc/ambari-server/conf' |
| |
| (tf1, fn1) = tempfile.mkstemp() |
| (tf2, fn2) = tempfile.mkstemp() |
| configDefaults.AMBARI_PROPERTIES_BACKUP_FILE = fn1 |
| os.close(tf1) |
| serverConfiguration.AMBARI_PROPERTIES_FILE = fn2 |
| os.close(tf2) |
| |
| with open(serverConfiguration.AMBARI_PROPERTIES_FILE, "w") as f: |
| f.write(NEW_PROPERTY) |
| f.write(CHANGED_VALUE_PROPERTY) |
| f.write(JAVA_RELEASES_NEW_PROPERTY) |
| f.close() |
| |
| with open(configDefaults.AMBARI_PROPERTIES_BACKUP_FILE, 'w') as f: |
| for line in properties: |
| f.write(line) |
| f.close() |
| |
| #Call tested method |
| update_ambari_properties() |
| |
| timestamp = datetime.datetime.now() |
| #RPMSAVE_FILE wasn't found |
| self.assertFalse(os.path.exists(configDefaults.AMBARI_PROPERTIES_BACKUP_FILE)) |
| #Renamed RPMSAVE_FILE exists |
| self.assertTrue(os.path.exists(configDefaults.AMBARI_PROPERTIES_BACKUP_FILE |
| + '.' + timestamp.strftime('%Y%m%d%H%M%S'))) |
| |
| with open(serverConfiguration.AMBARI_PROPERTIES_FILE, 'r') as f: |
| ambari_properties_content = f.readlines() |
| |
| for line in properties: |
| if (line == "agent.fqdn.service.url=URL\n"): |
| if (not GET_FQDN_SERVICE_URL + "=URL\n" in ambari_properties_content) and ( |
| line in ambari_properties_content): |
| self.fail() |
| elif line == "java.releases=jdk1.7,jdk1.6\n": |
| if not "java.releases=jdk1.8,jdk1.7\n" in ambari_properties_content: |
| self.fail() |
| else: |
| if not line in ambari_properties_content: |
| self.fail() |
| |
| if not NEW_PROPERTY in ambari_properties_content: |
| self.fail() |
| |
| if CHANGED_VALUE_PROPERTY in ambari_properties_content: |
| self.fail() |
| |
| # Command should not fail if *.rpmsave file is missing |
| result = update_ambari_properties() |
| self.assertEquals(result, 0) |
| |
| os.unlink(fn2) |
| |
| #if ambari.properties file is absent then "ambari-server upgrade" should |
| # fail |
| (tf, fn) = tempfile.mkstemp() |
| configDefaults.AMBARI_PROPERTIES_BACKUP_FILE = fn |
| |
| result = update_ambari_properties() |
| self.assertNotEquals(result, 0) |
| pass |
| |
| @patch("ambari_server.properties.Properties.__init__") |
| @patch("ambari_server.serverConfiguration.search_file") |
| def test_update_ambari_properties_negative_case(self, search_file_mock, properties_mock): |
| search_file_mock.return_value = None |
| #Call tested method |
| self.assertEquals(0, update_ambari_properties()) |
| self.assertFalse(properties_mock.called) |
| |
| search_file_mock.return_value = False |
| #Call tested method |
| self.assertEquals(0, update_ambari_properties()) |
| self.assertFalse(properties_mock.called) |
| |
| search_file_mock.return_value = '' |
| #Call tested method |
| self.assertEquals(0, update_ambari_properties()) |
| self.assertFalse(properties_mock.called) |
| pass |
| |
| |
| @patch("ambari_server.serverConfiguration.get_conf_dir") |
| def _test_update_ambari_properties_without_some_properties(self, get_conf_dir_mock): |
| ''' |
| Checks: update_ambari_properties call should add ambari-server.user property if |
| it's absent |
| ''' |
| from ambari_server import serverConfiguration # need to modify constants inside the module |
| |
| properties = ["server.jdbc.user.name=ambari-server\n", |
| "server.jdbc.user.passwd=/etc/ambari-server/conf/password.dat\n", |
| "java.home=/usr/jdk64/jdk1.6.0_31\n", |
| "server.os_type=redhat6\n"] |
| |
| get_conf_dir_mock.return_value = '/etc/ambari-server/conf' |
| |
| (tf1, fn1) = tempfile.mkstemp() |
| os.close(tf1) |
| (tf2, fn2) = tempfile.mkstemp() |
| os.close(tf2) |
| serverConfiguration.AMBARI_PROPERTIES_RPMSAVE_FILE = fn1 |
| serverConfiguration.AMBARI_PROPERTIES_FILE = fn2 |
| |
| with open(serverConfiguration.AMBARI_PROPERTIES_RPMSAVE_FILE, 'w') as f: |
| for line in properties: |
| f.write(line) |
| |
| #Call tested method |
| update_ambari_properties() |
| |
| ambari_properties = Properties() |
| ambari_properties.load(open(fn2)) |
| |
| self.assertTrue(NR_USER_PROPERTY in ambari_properties.keys()) |
| value = ambari_properties[NR_USER_PROPERTY] |
| self.assertEqual(value, "root") |
| self.assertTrue(OS_FAMILY_PROPERTY in ambari_properties.keys()) |
| |
| os.unlink(fn2) |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("resource_management.core.shell.call") |
| @patch("ambari_server.serverSetup.verify_setup_allowed") |
| @patch("sys.exit") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration_linux.get_YN_input") |
| @patch("ambari_server.dbConfiguration_linux.get_validated_string_input") |
| @patch("ambari_server.dbConfiguration_linux.PGConfig._store_remote_properties") |
| @patch("ambari_server.dbConfiguration_linux.LinuxDBMSConfig.ensure_jdbc_driver_installed") |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch("ambari_server.serverSetup.download_and_install_jdk") |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch('__builtin__.raw_input') |
| @patch("ambari_server.serverSetup.disable_security_enhancements") |
| @patch("ambari_server.serverSetup.expand_jce_zip_file") |
| @patch("ambari_server.serverSetup.logger") |
| def test_setup_remote_db_wo_client(self, logger_mock, expand_jce_zip_file_mock, check_selinux_mock, raw_input, configure_os_settings_mock, |
| download_jdk_mock, check_ambari_user_mock, is_root_mock, check_jdbc_drivers_mock, |
| read_password_mock, ensure_jdbc_driver_installed_mock, store_remote_properties_mock, |
| get_validated_string_input_0_mock, get_YN_input_0_mock, |
| get_validated_string_input_mock, get_YN_input, |
| exit_mock, verify_setup_allowed_method, |
| run_os_command_mock): |
| args = MagicMock() |
| |
| args.jdbc_driver = None |
| args.jdbc_db = None |
| args.silent = False |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.persistence_type |
| |
| raw_input.return_value = "" |
| is_root_mock.return_value = True |
| check_selinux_mock.return_value = (0, "") |
| run_os_command_mock.return_value = 3,"","" |
| store_remote_properties_mock.return_value = 0 |
| get_YN_input.return_value = True |
| get_validated_string_input_mock.side_effect = ["4"] |
| get_validated_string_input_0_mock.side_effect = ["localhost", "5432", "ambari", "ambari", "admin"] |
| get_YN_input_0_mock.return_value = False |
| read_password_mock.return_value = "encrypted_bigdata" |
| ensure_jdbc_driver_installed_mock.return_value = True |
| check_jdbc_drivers_mock.return_value = 0 |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| download_jdk_mock.return_value = 0 |
| configure_os_settings_mock.return_value = 0 |
| verify_setup_allowed_method.return_value = 0 |
| expand_jce_zip_file_mock.return_value = 0 |
| |
| try: |
| setup(args) |
| self.fail("Should throw exception") |
| except NonFatalException as fe: |
| # Expected |
| self.assertTrue("Remote database setup aborted." in fe.reason) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("resource_management.core.shell.call") |
| @patch("sys.exit") |
| @patch("ambari_server.userInput.get_YN_input") |
| @patch("ambari_commons.os_utils.is_root") |
| @patch("ambari_server.dbConfiguration_linux.store_password_file") |
| @patch("__builtin__.raw_input") |
| def test_store_remote_properties(self, raw_input_mock, store_password_file_mock, |
| is_root_mock, get_YN_input, exit_mock, |
| run_os_command_mock |
| ): |
| raw_input_mock.return_value = "" |
| is_root_mock.return_value = True |
| get_YN_input.return_value = False |
| run_os_command_mock.return_value = 3,"","" |
| store_password_file_mock.return_value = "encrypted_bigdata" |
| |
| import optparse |
| |
| args = optparse.Values() |
| args.dbms = "oracle" |
| args.database_host = "localhost" |
| args.database_port = "1234" |
| args.database_name = "ambari" |
| args.postgres_schema = "ambari" |
| args.sid_or_sname = "foo" |
| args.database_username = "foo" |
| args.database_password = "foo" |
| |
| properties0 = Properties() |
| properties = Properties() |
| |
| factory = DBMSConfigFactory() |
| dbConfig = factory.create(args, properties0) |
| |
| dbConfig._store_remote_properties(properties, None) |
| |
| found = False |
| for n in properties.propertyNames(): |
| if not found and n.startswith("server.jdbc.properties"): |
| found = True |
| |
| self.assertTrue(found) |
| |
| # verify that some properties exist |
| self.assertEquals("internal", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) |
| |
| # now try with MySQL instead of Oracle to verify that the properties are different |
| args.dbms = "mysql" |
| args.database_index = 2 |
| |
| properties0 = Properties() |
| properties = Properties() |
| |
| factory = DBMSConfigFactory() |
| dbConfig = factory.create(args, properties0) |
| dbConfig._store_remote_properties(properties, args) |
| |
| # verify MySQL properties |
| self.assertEquals("c3p0", properties.get_property(JDBC_CONNECTION_POOL_TYPE)) |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| def test_get_ambari_properties(self, find_properties_file_mock): |
| |
| find_properties_file_mock.return_value = None |
| rcode = get_ambari_properties() |
| self.assertEqual(rcode, -1) |
| |
| tf1 = tempfile.NamedTemporaryFile() |
| find_properties_file_mock.return_value = tf1.name |
| prop_name = 'name' |
| prop_value = 'val' |
| |
| with open(tf1.name, 'w') as fout: |
| fout.write(prop_name + '=' + prop_value) |
| fout.close() |
| |
| properties = get_ambari_properties() |
| |
| self.assertEqual(properties[prop_name], prop_value) |
| pass |
| |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| def test_get_ambari_properties(self, find_properties_file): |
| |
| find_properties_file.return_value = None |
| rcode = get_ambari_properties() |
| self.assertEqual(rcode, -1) |
| |
| tf1 = tempfile.NamedTemporaryFile(delete=False) |
| find_properties_file.return_value = tf1.name |
| tf1.close() |
| prop_name = 'name' |
| prop_value = 'val' |
| |
| with open(tf1.name, 'w') as fout: |
| fout.write(prop_name + '=' + prop_value) |
| |
| properties = get_ambari_properties() |
| |
| self.assertEqual(properties[prop_name], prop_value) |
| self.assertEqual(properties.fileName, os.path.abspath(tf1.name)) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| @patch("os.path.exists") |
| @patch("os.remove") |
| @patch("ambari_commons.os_utils.print_warning_msg") |
| def test_remove_file(self, printWarningMsgMock, removeMock, pathExistsMock): |
| def side_effect(): |
| raise Exception(-1, "Failed to delete!") |
| |
| removeMock.side_effect = side_effect |
| pathExistsMock.return_value = 1 |
| |
| res = remove_file("/someNonExsistantDir/filename") |
| self.assertEquals(res, 1) |
| |
| removeMock.side_effect = None |
| res = remove_file("/someExsistantDir/filename") |
| self.assertEquals(res, 0) |
| |
| @patch("shutil.copyfile") |
| def test_copy_file(self, shutilCopyfileMock): |
| def side_effect(): |
| raise Exception(-1, "Failed to copy!") |
| |
| shutilCopyfileMock.side_effect = side_effect |
| |
| try: |
| copy_file("/tmp/psswd", "/someNonExsistantDir/filename") |
| self.fail("Exception on file not copied has not been thrown!") |
| except FatalException: |
| # Expected |
| pass |
| |
| self.assertTrue(shutilCopyfileMock.called) |
| |
| shutilCopyfileMock.side_effect = None |
| try: |
| copy_file("/tmp/psswd", "/root/psswd") |
| except FatalException: |
| self.fail("Exception on file copied should not be thrown!") |
| |
| self.assertTrue(shutilCopyfileMock.called) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("ambari_server.dbConfiguration_linux.get_ambari_properties") |
| @patch("ambari_server.dbConfiguration_linux.print_error_msg") |
| @patch("ambari_server.dbConfiguration.print_error_msg") |
| @patch("ambari_server.dbConfiguration_linux.print_warning_msg") |
| @patch("__builtin__.raw_input") |
| @patch("glob.glob") |
| @patch("os.path.isdir") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| @patch("shutil.copy") |
| @patch("os.path.isfile") |
| @patch("ambari_server.dbConfiguration.get_YN_input") |
| @patch("ambari_server.dbConfiguration.update_properties") |
| @patch("ambari_server.dbConfiguration.get_validated_string_input") |
| def test_ensure_jdbc_drivers_installed(self, get_valid_str_in_mock, update_properties_mock, getYN_mock, isfile_mock, shutil_copy_mock, |
| os_symlink_mock, os_remove_mock, lexists_mock, isdir_mock, glob_mock, |
| raw_input_mock, print_warning_msg, print_error_msg_mock, print_error_msg_2_mock, |
| get_ambari_properties_mock, get_ambari_properties_2_mock): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| def reset_mocks(): |
| get_ambari_properties_mock.reset_mock() |
| get_ambari_properties_2_mock.reset_mock() |
| shutil_copy_mock.reset_mock() |
| print_error_msg_mock.reset_mock() |
| print_warning_msg.reset_mock() |
| raw_input_mock.reset_mock() |
| isfile_mock.reset_mock() |
| os_remove_mock.reset_mock |
| getYN_mock.reset_mock() |
| get_valid_str_in_mock.reset_mock() |
| update_properties_mock.reset_mock() |
| args = MagicMock() |
| |
| del args.database_index |
| del args.persistence_type |
| del args.silent |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| args.dbms = "oracle" |
| |
| return args |
| |
| # Check scenario when default jdbc was found and used |
| drivers_list = [os.path.join(os.sep,'usr','share','java','ojdbc6.jar')] |
| resources_dir = os.sep + 'tmp' |
| |
| props = Properties() |
| props.process_pair(RESOURCES_DIR_PROPERTY, resources_dir) |
| props.process_pair(JDBC_DRIVER_PATH_PROPERTY, "/some/test/path/to/oracle.-jdbc.jar") |
| get_ambari_properties_2_mock.return_value = get_ambari_properties_mock.return_value = props |
| |
| factory = DBMSConfigFactory() |
| |
| args = reset_mocks() |
| glob_mock.return_value = drivers_list |
| isdir_mock.return_value = True |
| |
| lexists_mock.return_value = True |
| isfile_mock.return_value = True |
| getYN_mock.return_value = True |
| |
| dbms = factory.create(args, props) |
| rcode = dbms.ensure_jdbc_driver_installed(props) |
| |
| self.assertEquals(update_properties_mock.call_count, 0) |
| self.assertTrue(rcode) |
| |
| args = reset_mocks() |
| isfile_mock.side_effect = [False, True] |
| getYN_mock.return_value = True |
| |
| dbms = factory.create(args, props) |
| rcode = dbms.ensure_jdbc_driver_installed(props) |
| |
| self.assertEquals(update_properties_mock.call_count, 1) |
| self.assertEquals(getYN_mock.call_count, 1) |
| self.assertTrue(rcode) |
| |
| # check scenario when user entered valid jdbc full path |
| args = reset_mocks() |
| isfile_mock.side_effect = [False, False, True, True] |
| get_valid_str_in_mock.return_value = '/test/full/path/to/oracle_jdbc.jar' |
| |
| rcode = dbms.ensure_jdbc_driver_installed(props) |
| |
| self.assertEquals(update_properties_mock.call_count, 1) |
| self.assertTrue(rcode) |
| self.assertEquals(props['server.jdbc.driver.path'], '/test/full/path/to/oracle_jdbc.jar') |
| self.assertEquals(shutil_copy_mock.call_count, 1) |
| self.assertEquals(shutil_copy_mock.call_count, 1) |
| self.assertEquals(os_remove_mock.call_count, 1) |
| |
| # check scenario when no default jdbc and user entered incorrect full jdbc path |
| args = reset_mocks() |
| isfile_mock.side_effect = [False, False, False, False] |
| |
| rcode = dbms.ensure_jdbc_driver_installed(props) |
| |
| self.assertFalse(rcode) |
| print_error_msg_mock.assert_called_once_with("Custom jdbc connector path is unavailable. Please put correct path to jdbc connector.") |
| |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.dbConfiguration.get_ambari_properties") |
| @patch("os.path.isdir") |
| @patch("os.path.isfile") |
| @patch("os.path.lexists") |
| @patch("os.remove") |
| @patch("os.symlink") |
| def test_check_jdbc_drivers(self, os_symlink_mock, os_remove_mock, lexists_mock, isfile_mock, isdir_mock, |
| get_ambari_properties_mock): |
| args = MagicMock() |
| |
| # Check positive scenario |
| drivers_list = [os.path.join(os.sep,'usr','share','java','ojdbc6.jar')] |
| resources_dir = os.sep + 'tmp' |
| |
| props = Properties() |
| props.process_pair(RESOURCES_DIR_PROPERTY, resources_dir) |
| get_ambari_properties_mock.return_value = props |
| |
| isdir_mock.return_value = True |
| |
| isfile_mock.side_effect = [True, False, False, False, False] |
| |
| del args.database_index |
| del args.persistence_type |
| del args.silent |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| lexists_mock.return_value = True |
| |
| check_jdbc_drivers(args) |
| |
| self.assertEquals(os_symlink_mock.call_count, 1) |
| self.assertEquals(os_symlink_mock.call_args_list[0][0][0], os.path.join(os.sep,'tmp','ojdbc6.jar')) |
| self.assertEquals(os_symlink_mock.call_args_list[0][0][1], os.path.join(os.sep,'tmp','oracle-jdbc-driver.jar')) |
| |
| # Check negative scenarios |
| |
| # No drivers deployed |
| get_ambari_properties_mock.reset_mock() |
| os_symlink_mock.reset_mock() |
| |
| isfile_mock.side_effect = [False, False, False, False, False] |
| |
| check_jdbc_drivers(args) |
| |
| self.assertFalse(os_symlink_mock.called) |
| |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| def test_get_ambari_properties(self, find_properties_file_mock): |
| |
| find_properties_file_mock.return_value = None |
| rcode = get_ambari_properties() |
| self.assertEqual(rcode, -1) |
| |
| tf1 = tempfile.NamedTemporaryFile() |
| find_properties_file_mock.return_value = tf1.name |
| prop_name = 'name' |
| prop_value = 'val' |
| |
| with open(tf1.name, 'w') as fout: |
| fout.write(prop_name + '=' + prop_value) |
| fout.close() |
| |
| properties = get_ambari_properties() |
| |
| self.assertEqual(properties[prop_name], prop_value) |
| self.assertEqual(properties.fileName, os.path.abspath(tf1.name)) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| def test_get_ambari_properties(self, find_properties_file_mock): |
| |
| find_properties_file_mock.return_value = None |
| rcode = get_ambari_properties() |
| self.assertEqual(rcode, -1) |
| |
| tf1 = tempfile.NamedTemporaryFile(delete=False) |
| find_properties_file_mock.return_value = tf1.name |
| prop_name = 'name' |
| prop_value = 'val' |
| tf1.close() |
| |
| with open(tf1.name, 'w') as fout: |
| fout.write(prop_name + '=' + prop_value) |
| fout.close() |
| |
| properties = get_ambari_properties() |
| |
| self.assertEqual(properties[prop_name], prop_value) |
| self.assertEqual(properties.fileName, os.path.abspath(tf1.name)) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.check_database_name_property") |
| @patch("ambari_server.serverConfiguration.find_properties_file") |
| def test_parse_properties_file(self, find_properties_file_mock, check_database_name_property_mock): |
| |
| check_database_name_property_mock.return_value = 1 |
| |
| tf1 = tempfile.NamedTemporaryFile(mode='r') |
| find_properties_file_mock.return_value = tf1.name |
| |
| args = MagicMock() |
| parse_properties_file(args) |
| self.assertEquals(args.persistence_type, "local") |
| |
| with open(tf1.name, 'w') as fout: |
| fout.write("\n") |
| fout.write(PERSISTENCE_TYPE_PROPERTY + "=remote") |
| |
| args = MagicMock() |
| |
| parse_properties_file(args) |
| self.assertEquals(args.persistence_type, "remote") |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("os.path.isabs") |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.dbConfiguration_linux.get_ambari_properties") |
| def test_configure_database_username_password_masterkey_persisted(self, |
| get_ambari_properties_method, |
| decrypt_password_for_alias_method, |
| path_isabs_method): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| properties = Properties() |
| properties.process_pair(JDBC_USER_NAME_PROPERTY, "fakeuser") |
| properties.process_pair(JDBC_PASSWORD_PROPERTY, "${alias=somealias}") |
| properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, "fakedbname") |
| properties.process_pair(SECURITY_KEY_IS_PERSISTED, "True") |
| |
| get_ambari_properties_method.return_value = properties |
| decrypt_password_for_alias_method.return_value = "falepasswd" |
| |
| args = MagicMock() |
| args.master_key = None |
| |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.sid_or_sname |
| del args.jdbc_url |
| |
| dbms = OracleConfig(args, properties, "local") |
| |
| self.assertTrue(decrypt_password_for_alias_method.called) |
| self.assertEquals("fakeuser", dbms.database_username) |
| self.assertEquals("falepasswd", dbms.database_password) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration_linux.read_password") |
| def test_configure_database_password(self, read_password_method): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| read_password_method.return_value = "fakepasswd" |
| |
| result = LinuxDBMSConfig._configure_database_password(True) |
| self.assertTrue(read_password_method.called) |
| self.assertEquals("fakepasswd", result) |
| |
| result = LinuxDBMSConfig._configure_database_password(True) |
| self.assertEquals("fakepasswd", result) |
| |
| result = LinuxDBMSConfig._configure_database_password(True) |
| self.assertEquals("fakepasswd", result) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| def test_configure_database_password_silent(self): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| set_silent(True) |
| result = LinuxDBMSConfig._configure_database_password(True, "CustomDefaultPasswd") |
| self.assertEquals("CustomDefaultPasswd", result) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch("ambari_server.setupSecurity.get_is_persisted") |
| @patch("ambari_server.setupSecurity.remove_password_file") |
| @patch("ambari_server.setupSecurity.save_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.read_master_key") |
| @patch("ambari_server.setupSecurity.read_ambari_user") |
| @patch("ambari_server.setupSecurity.get_master_key_location") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.save_master_key") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_root") |
| def test_setup_master_key_not_persist(self, is_root_method, |
| get_ambari_properties_method, search_file_message, |
| get_YN_input_method, save_master_key_method, |
| update_properties_method, get_master_key_location_method, |
| read_ambari_user_method, read_master_key_method, |
| save_passwd_for_alias_method, remove_password_file_method, |
| get_is_persisted_method, get_is_secure_method, exists_mock): |
| |
| is_root_method.return_value = True |
| |
| p = Properties() |
| FAKE_PWD_STRING = "fakepasswd" |
| p.process_pair(JDBC_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(LDAP_MGR_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(SSL_TRUSTSTORE_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(JDBC_RCA_PASSWORD_FILE_PROPERTY, FAKE_PWD_STRING) |
| get_ambari_properties_method.return_value = p |
| |
| read_master_key_method.return_value = "aaa" |
| get_YN_input_method.return_value = False |
| read_ambari_user_method.return_value = None |
| save_passwd_for_alias_method.return_value = 0 |
| get_is_persisted_method.return_value = (True, "filepath") |
| get_is_secure_method.return_value = False |
| exists_mock.return_value = False |
| |
| options = self._create_empty_options_mock() |
| setup_master_key(options) |
| |
| self.assertTrue(get_YN_input_method.called) |
| self.assertTrue(read_master_key_method.called) |
| self.assertTrue(read_ambari_user_method.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertFalse(save_master_key_method.called) |
| self.assertTrue(save_passwd_for_alias_method.called) |
| self.assertEquals(3, save_passwd_for_alias_method.call_count) |
| self.assertTrue(remove_password_file_method.called) |
| |
| result_expected = {JDBC_PASSWORD_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| JDBC_RCA_PASSWORD_FILE_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| LDAP_MGR_PASSWORD_PROPERTY: |
| get_alias_string(LDAP_MGR_PASSWORD_ALIAS), |
| SSL_TRUSTSTORE_PASSWORD_PROPERTY: |
| get_alias_string(SSL_TRUSTSTORE_PASSWORD_ALIAS), |
| SECURITY_IS_ENCRYPTION_ENABLED: 'true'} |
| |
| sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) |
| sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), |
| key=operator.itemgetter(0)) |
| self.assertEquals(sorted_x, sorted_y) |
| pass |
| |
| |
| @patch("ambari_server.setupSecurity.save_passwd_for_alias") |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch("ambari_server.setupSecurity.get_is_persisted") |
| @patch("ambari_server.setupSecurity.read_master_key") |
| @patch("ambari_server.setupSecurity.read_ambari_user") |
| @patch("ambari_server.setupSecurity.get_master_key_location") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.save_master_key") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_root") |
| def test_setup_master_key_persist(self, is_root_method, |
| get_ambari_properties_method, search_file_message, |
| get_YN_input_method, save_master_key_method, |
| update_properties_method, get_master_key_location_method, |
| read_ambari_user_method, read_master_key_method, |
| get_is_persisted_method, get_is_secure_method, exists_mock, |
| save_passwd_for_alias_method): |
| is_root_method.return_value = True |
| |
| p = Properties() |
| FAKE_PWD_STRING = "fakepasswd" |
| p.process_pair(JDBC_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| get_ambari_properties_method.return_value = p |
| |
| search_file_message.return_value = "propertiesfile" |
| |
| read_master_key_method.return_value = "aaa" |
| get_YN_input_method.side_effect = [True, False] |
| read_ambari_user_method.return_value = None |
| get_is_persisted_method.return_value = (True, "filepath") |
| get_is_secure_method.return_value = False |
| exists_mock.return_value = False |
| save_passwd_for_alias_method.return_value = 0 |
| |
| options = self._create_empty_options_mock() |
| setup_master_key(options) |
| |
| self.assertTrue(get_YN_input_method.called) |
| self.assertTrue(read_master_key_method.called) |
| self.assertTrue(read_ambari_user_method.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(save_master_key_method.called) |
| |
| result_expected = {JDBC_PASSWORD_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| SECURITY_IS_ENCRYPTION_ENABLED: 'true'} |
| |
| sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) |
| sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), |
| key=operator.itemgetter(0)) |
| self.assertEquals(sorted_x, sorted_y) |
| pass |
| |
| |
| @patch("ambari_server.setupSecurity.read_master_key") |
| @patch("ambari_server.setupSecurity.remove_password_file") |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.read_ambari_user") |
| @patch("ambari_server.setupSecurity.get_master_key_location") |
| @patch("ambari_server.setupSecurity.save_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.read_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.save_master_key") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_root") |
| def test_reset_master_key_persisted(self, is_root_method, |
| get_ambari_properties_method, search_file_message, |
| get_YN_input_method, get_validated_string_input_method, |
| save_master_key_method, update_properties_method, |
| read_passwd_for_alias_method, save_passwd_for_alias_method, |
| get_master_key_location_method, |
| read_ambari_user_method, exists_mock, |
| remove_password_file_method, read_master_key_method): |
| |
| # Testing call under root |
| is_root_method.return_value = True |
| |
| search_file_message.return_value = "filepath" |
| read_ambari_user_method.return_value = None |
| |
| p = Properties() |
| FAKE_PWD_STRING = '${alias=fakealias}' |
| p.process_pair(JDBC_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(LDAP_MGR_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(SSL_TRUSTSTORE_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(JDBC_RCA_PASSWORD_FILE_PROPERTY, FAKE_PWD_STRING) |
| get_ambari_properties_method.return_value = p |
| |
| get_YN_input_method.side_effect = [True, True] |
| read_master_key_method.return_value = "aaa" |
| read_passwd_for_alias_method.return_value = "fakepassword" |
| save_passwd_for_alias_method.return_value = 0 |
| exists_mock.return_value = False |
| |
| |
| options = self._create_empty_options_mock() |
| setup_master_key(options) |
| |
| self.assertTrue(save_master_key_method.called) |
| self.assertTrue(get_YN_input_method.called) |
| self.assertTrue(read_master_key_method.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(read_passwd_for_alias_method.called) |
| self.assertTrue(3, read_passwd_for_alias_method.call_count) |
| self.assertTrue(3, save_passwd_for_alias_method.call_count) |
| |
| result_expected = {JDBC_PASSWORD_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| JDBC_RCA_PASSWORD_FILE_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| LDAP_MGR_PASSWORD_PROPERTY: |
| get_alias_string(LDAP_MGR_PASSWORD_ALIAS), |
| SSL_TRUSTSTORE_PASSWORD_PROPERTY: |
| get_alias_string(SSL_TRUSTSTORE_PASSWORD_ALIAS), |
| SECURITY_IS_ENCRYPTION_ENABLED: 'true'} |
| |
| sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) |
| sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), |
| key=operator.itemgetter(0)) |
| self.assertEquals(sorted_x, sorted_y) |
| pass |
| |
| @patch("os.path.isdir", new = MagicMock(return_value=True)) |
| @patch("os.access", new = MagicMock(return_value=True)) |
| @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", new = MagicMock(return_value = 'test' + os.pathsep + 'path12')) |
| @patch("ambari_server.serverUtils.is_server_runing") |
| @patch("ambari_commons.os_utils.run_os_command") |
| @patch("ambari_server.setupSecurity.generate_env") |
| @patch("ambari_server.setupSecurity.ensure_can_start_under_current_user") |
| @patch("ambari_server.serverConfiguration.read_ambari_user") |
| @patch("ambari_server.dbConfiguration.ensure_jdbc_driver_is_installed") |
| @patch("ambari_server.serverConfiguration.parse_properties_file") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_java_exe_path") |
| @patch("sys.exit") |
| def test_check_database(self, exitMock, getJavaExePathMock, |
| getAmbariPropertiesMock, parsePropertiesFileMock, ensureDriverInstalledMock, readAmbariUserMock, |
| ensureCanStartUnderCurrentUserMock, generateEnvMock, runOSCommandMock, isServerRunningMock): |
| properties = Properties() |
| properties.process_pair("server.jdbc.database", "embedded") |
| |
| getJavaExePathMock.return_value = "/path/to/java" |
| getAmbariPropertiesMock.return_value = properties |
| readAmbariUserMock.return_value = "test_user" |
| ensureCanStartUnderCurrentUserMock.return_value = "test_user" |
| generateEnvMock.return_value = {} |
| runOSCommandMock.return_value = (0, "", "") |
| isServerRunningMock.return_value = (False, 1) |
| |
| check_database(properties) |
| |
| self.assertTrue(getJavaExePathMock.called) |
| self.assertTrue(readAmbariUserMock.called) |
| self.assertTrue(ensureCanStartUnderCurrentUserMock.called) |
| self.assertTrue(generateEnvMock.called) |
| |
| self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 org.apache.ambari.server.checks.DatabaseConsistencyChecker') |
| |
| pass |
| |
| @patch("ambari_server.setupSecurity.get_is_persisted") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch("ambari_server.setupSecurity.remove_password_file") |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.read_ambari_user") |
| @patch("ambari_server.setupSecurity.get_master_key_location") |
| @patch("ambari_server.setupSecurity.save_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.read_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.save_master_key") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_root") |
| def test_reset_master_key_not_persisted(self, is_root_method, |
| get_ambari_properties_method, |
| search_file_message, get_YN_input_method, |
| get_validated_string_input_method, save_master_key_method, |
| update_properties_method, read_passwd_for_alias_method, |
| save_passwd_for_alias_method, |
| get_master_key_location_method, read_ambari_user_method, |
| exists_mock, remove_password_file_method, get_is_secure_method, |
| get_is_persisted_method): |
| |
| is_root_method.return_value = True |
| search_file_message.return_value = False |
| read_ambari_user_method.return_value = None |
| |
| p = Properties() |
| FAKE_PWD_STRING = '${alias=fakealias}' |
| p.process_pair(JDBC_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(LDAP_MGR_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(SSL_TRUSTSTORE_PASSWORD_PROPERTY, FAKE_PWD_STRING) |
| p.process_pair(JDBC_RCA_PASSWORD_FILE_PROPERTY, FAKE_PWD_STRING) |
| get_ambari_properties_method.return_value = p |
| |
| get_YN_input_method.side_effect = [True, False] |
| get_validated_string_input_method.return_value = "aaa" |
| read_passwd_for_alias_method.return_value = "fakepassword" |
| save_passwd_for_alias_method.return_value = 0 |
| exists_mock.return_value = False |
| get_is_secure_method.return_value = True |
| get_is_persisted_method.return_value = (True, "filePath") |
| |
| options = self._create_empty_options_mock() |
| setup_master_key(options) |
| |
| self.assertFalse(save_master_key_method.called) |
| self.assertTrue(get_YN_input_method.called) |
| self.assertTrue(get_validated_string_input_method.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(read_passwd_for_alias_method.called) |
| self.assertTrue(3, read_passwd_for_alias_method.call_count) |
| self.assertTrue(3, save_passwd_for_alias_method.call_count) |
| self.assertFalse(save_master_key_method.called) |
| |
| result_expected = {JDBC_PASSWORD_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| JDBC_RCA_PASSWORD_FILE_PROPERTY: |
| get_alias_string(JDBC_RCA_PASSWORD_ALIAS), |
| LDAP_MGR_PASSWORD_PROPERTY: |
| get_alias_string(LDAP_MGR_PASSWORD_ALIAS), |
| SSL_TRUSTSTORE_PASSWORD_PROPERTY: |
| get_alias_string(SSL_TRUSTSTORE_PASSWORD_ALIAS), |
| SECURITY_IS_ENCRYPTION_ENABLED: 'true'} |
| |
| sorted_x = sorted(result_expected.iteritems(), key=operator.itemgetter(0)) |
| sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), |
| key=operator.itemgetter(0)) |
| self.assertEquals(sorted_x, sorted_y) |
| pass |
| |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) |
| def _init_test_ldap_properties_map_invalid_input_1(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "a", |
| "ambari.ldap.connectivity.server.port" : "3", |
| "ambari.ldap.connectivity.secondary.server.host": "b", |
| "ambari.ldap.connectivity.secondary.server.port" : "2", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.name_attr": "user", |
| "ambari.ldap.attributes.user.search_base": "uid", |
| "ambari.ldap.connectivity.anonymous_bind": "true", |
| "ambari.ldap.advanced.referrals": "follow", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) |
| def _init_test_ldap_properties_map_invalid_input_1(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "a", |
| "ambari.ldap.connectivity.server.port" : "3", |
| "ambari.ldap.connectivity.secondary.server.host": "b", |
| "ambari.ldap.connectivity.secondary.server.port" : "2", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.object_class": "user", |
| "ambari.ldap.attributes.user.name_attr": "uid", |
| "ambari.ldap.attributes.group.object_class": "group", |
| "ambari.ldap.attributes.group.name_attr": "cn", |
| "ambari.ldap.attributes.group.member_attr": "member", |
| "ambari.ldap.attributes.dn_attr": "dn", |
| "ambari.ldap.attributes.user.search_base": "base", |
| "ambari.ldap.advanced.referrals": "follow", |
| "ambari.ldap.connectivity.anonymous_bind": "true", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.advanced.force_lowercase_usernames": "false", |
| "ambari.ldap.advanced.pagination_enabled": "false", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) |
| def _init_test_ldap_properties_map_invalid_input_2(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "a", |
| "ambari.ldap.connectivity.server.port" : "3", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.name_attr": "user", |
| "ambari.ldap.attributes.user.search_base": "uid", |
| "ambari.ldap.connectivity.anonymous_bind": "true", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.advanced.force_lowercase_usernames": "false", |
| "ambari.ldap.advanced.pagination_enabled": "false", |
| "ambari.ldap.advanced.referrals": "follow", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) |
| def _init_test_ldap_properties_map_invalid_input_2(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "a", |
| "ambari.ldap.connectivity.server.port" : "3", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.object_class": "user", |
| "ambari.ldap.attributes.user.name_attr": "uid", |
| "ambari.ldap.attributes.group.object_class": "group", |
| "ambari.ldap.attributes.group.name_attr": "cn", |
| "ambari.ldap.attributes.group.member_attr": "member", |
| "ambari.ldap.attributes.dn_attr": "dn", |
| "ambari.ldap.attributes.user.search_base": "base", |
| "ambari.ldap.advanced.referrals": "follow", |
| "ambari.ldap.connectivity.anonymous_bind": "true", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.advanced.force_lowercase_usernames": "false", |
| "ambari.ldap.advanced.pagination_enabled": "false", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("urllib2.urlopen") |
| @patch("__builtin__.raw_input") |
| @patch("ambari_server.userInput.get_password") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.logger") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") |
| def test_setup_ldap_invalid_input(self, get_ldap_properties_from_db_method, is_server_runing_method, logger_mock, get_ambari_properties_method, |
| search_file_message, |
| update_properties_method, |
| get_YN_input_method, |
| get_is_secure_method, |
| get_password_mock, raw_input_mock, urlopen_mock): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| is_server_runing_method.return_value = (True, 0) |
| search_file_message.return_value = "filepath" |
| get_ldap_properties_from_db_method.return_value = None |
| |
| properties = Properties(); |
| properties.process_pair(SECURITY_MASTER_KEY_LOCATION, "filepath") |
| properties.process_pair(SECURITY_KEYS_DIR, tempfile.gettempdir()) |
| properties.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, "true") |
| properties.process_pair(CLIENT_API_PORT_PROPERTY, '8080') |
| |
| get_ambari_properties_method.return_value = properties |
| raw_input_mock.side_effect = [LDAP_GENERIC, 'a', '3', 'b', 'b', 'hody', 'b', '2', 'false', 'user', 'uid', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] |
| get_password_mock.side_effect = ['admin'] |
| set_silent(False) |
| get_YN_input_method.return_value = True |
| |
| response = MagicMock() |
| response.getcode.return_value = 200 |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_type = LDAP_GENERIC |
| setup_ldap(options) |
| |
| requestCall = urlopen_mock.call_args_list[0] |
| args, kwargs = requestCall |
| request = args[0] |
| requestData = json.loads(request.data) |
| self.assertTrue(isinstance(requestData, dict)) |
| ldapProperties = requestData['Configuration']['properties']; |
| properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_1().iteritems(), key=operator.itemgetter(0)) |
| self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) |
| |
| properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) |
| self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) |
| |
| self.assertTrue(urlopen_mock.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(get_YN_input_method.called) |
| self.assertEquals(21, raw_input_mock.call_count) |
| self.assertEqual(1, get_password_mock.call_count) |
| |
| raw_input_mock.reset_mock() |
| raw_input_mock.side_effect = [LDAP_GENERIC, 'a', '3', '', '', 'b', '2', 'false', 'user', 'uid', 'group', 'cn', 'member', 'dn', 'base', 'follow', 'true', 'skip', 'false', 'false', 'admin'] |
| get_password_mock.reset_mock() |
| get_password_mock.side_effect = ['admin'] |
| |
| urlopen_mock.reset_mock() |
| urlopen_mock.return_value = response |
| |
| setup_ldap(options) |
| |
| requestCall = urlopen_mock.call_args_list[0] |
| args, kwargs = requestCall |
| request = args[0] |
| requestData = json.loads(request.data) |
| self.assertTrue(isinstance(requestData, dict)) |
| ldapProperties = requestData['Configuration']['properties']; |
| properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map_invalid_input_2().iteritems(), key=operator.itemgetter(0)) |
| self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) |
| |
| properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) |
| self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) |
| |
| self.assertTrue(urlopen_mock.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(get_YN_input_method.called) |
| self.assertEquals(20, raw_input_mock.call_count) |
| self.assertEqual(1, get_password_mock.call_count) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| def test_setup_ldap_should_fail_if_ambari_server_is_not_running(self, is_server_runing_mock): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| is_server_runing_mock.return_value = (False, 0) |
| try: |
| setup_ldap(self._create_empty_options_mock()) |
| self.fail("Should throw exception") |
| except FatalException as fe: |
| self.assertTrue("Ambari Server is not running." == fe.reason) |
| pass |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY) |
| def _init_test_ldap_properties_map(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "test", |
| "ambari.ldap.connectivity.server.port" : "1", |
| "ambari.ldap.connectivity.secondary.server.host": "test", |
| "ambari.ldap.connectivity.secondary.server.port" : "2", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.name_attr": "test", |
| "ambari.ldap.attributes.user.search_base": "test", |
| "ambari.ldap.connectivity.anonymous_bind": "false", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.advanced.force_lowercase_usernames": "false", |
| "ambari.ldap.advanced.pagination_enabled": "false", |
| "ambari.ldap.connectivity.bind_dn": "test", |
| "ambari.ldap.advanced.referrals": "test", |
| "client.security": "ldap", |
| LDAP_MGR_PASSWORD_PROPERTY: "ldap-password.dat", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @staticmethod |
| @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT) |
| def _init_test_ldap_properties_map(): |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "test", |
| "ambari.ldap.connectivity.server.port" : "1", |
| "ambari.ldap.connectivity.secondary.server.host": "test", |
| "ambari.ldap.connectivity.secondary.server.port" : "1", |
| "ambari.ldap.connectivity.use_ssl": "false", |
| "ambari.ldap.attributes.user.object_class": "test", |
| "ambari.ldap.attributes.user.name_attr": "test", |
| "ambari.ldap.attributes.user.search_base": "test", |
| "ambari.ldap.connectivity.anonymous_bind": "false", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.advanced.force_lowercase_usernames": "false", |
| "ambari.ldap.advanced.pagination_enabled": "false", |
| "ambari.ldap.connectivity.bind_dn": "test", |
| "ambari.ldap.attributes.group.object_class": "test", |
| "ambari.ldap.attributes.group.member_attr": "test", |
| "ambari.ldap.attributes.group.name_attr": "test", |
| "ambari.ldap.attributes.dn_attr": "test", |
| "ambari.ldap.advanced.referrals": "test", |
| LDAP_MGR_PASSWORD_PROPERTY: "ldap-password.dat", |
| "ambari.ldap.authentication.enabled": "true" |
| } |
| return ldap_properties_map |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_is_secure") |
| @patch("ambari_server.setupSecurity.encrypt_password") |
| @patch("ambari_server.setupSecurity.save_passwd_for_alias") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.update_properties_2") |
| @patch("ambari_server.setupSecurity.configure_ldap_password") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.read_password") |
| @patch("os.path.exists") |
| @patch("ambari_server.setupSecurity.logger") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.query_ldap_type") |
| @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") |
| def test_setup_ldap(self, get_ldap_properties_from_db_method, query_ldap_type_method, is_server_runing_method, logger_mock, exists_method, read_password_method, get_ambari_properties_method, |
| search_file_message, |
| get_validated_string_input_method, |
| configure_ldap_password_method, update_properties_method, |
| get_YN_input_method, save_passwd_for_alias_method, |
| encrypt_password_method, get_is_secure_method, urlopen_mock): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| options = self._create_empty_options_mock() |
| options.ambari_admin_username = 'admin' |
| options.ambari_admin_password = 'admin' |
| is_server_runing_method.return_value = (True, 0) |
| |
| get_ldap_properties_from_db_method.return_value = None |
| query_ldap_type_method.return_value = LDAP_GENERIC |
| |
| search_file_message.return_value = "filepath" |
| |
| properties = Properties(); |
| properties.process_pair(SECURITY_MASTER_KEY_LOCATION, "filepath") |
| properties.process_pair(SECURITY_KEYS_DIR, tempfile.gettempdir()) |
| properties.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, "true") |
| properties.process_pair(CLIENT_API_PORT_PROPERTY, '8080') |
| |
| get_ambari_properties_method.return_value = properties |
| configure_ldap_password_method.return_value = "password" |
| save_passwd_for_alias_method.return_value = 0 |
| encrypt_password_method.return_value = get_alias_string(LDAP_MGR_PASSWORD_ALIAS) |
| |
| def yn_input_side_effect(*args, **kwargs): |
| if 'TrustStore' in args[0]: |
| return False |
| else: |
| return True |
| |
| get_YN_input_method.side_effect = yn_input_side_effect |
| |
| def valid_input_side_effect(*args, **kwargs): |
| if 'Bind anonymously' in args[0] or 'lower-case' in args[0] or 'paginated' in args[0]: |
| return 'false' |
| if 'username collisions' in args[0]: |
| return 'skip' |
| if 'LDAP Port' in args[0]: |
| return '1' |
| if 'Use SSL' in args[0]: |
| return 'false' |
| if args[1] == "true" or args[1] == "false": |
| return args[1] |
| else: |
| return "test" |
| |
| get_validated_string_input_method.side_effect = valid_input_side_effect |
| |
| response = MagicMock() |
| response.getcode.return_value = 200 |
| urlopen_mock.return_value = response |
| |
| setup_ldap(options) |
| |
| requestCall = urlopen_mock.call_args_list[0] |
| args, kwargs = requestCall |
| request = args[0] |
| requestData = json.loads(request.data) |
| self.assertTrue(isinstance(requestData, dict)) |
| ldapProperties = requestData['Configuration']['properties']; |
| properties_updated_in_ambari_db = sorted(ldapProperties.iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_db = sorted(TestAmbariServer._init_test_ldap_properties_map().iteritems(), key=operator.itemgetter(0)) |
| self.assertEqual(properties_should_be_updated_in_ambari_db, properties_updated_in_ambari_db) |
| |
| properties_updated_in_ambari_dot_properties = sorted(update_properties_method.call_args[0][1].iteritems(), key=operator.itemgetter(0)) |
| properties_should_be_updated_in_ambari_dot_properties = sorted({"client.security": "ldap"}.iteritems(), key=operator.itemgetter(0)) |
| self.assertEquals(properties_should_be_updated_in_ambari_dot_properties, properties_updated_in_ambari_dot_properties) |
| |
| self.assertTrue(urlopen_mock.called) |
| self.assertTrue(update_properties_method.called) |
| self.assertTrue(configure_ldap_password_method.called) |
| self.assertTrue(get_validated_string_input_method.called) |
| self.assertTrue(get_YN_input_method.called) |
| |
| # truststore not found case |
| |
| def os_path_exists(*args, **kwargs): |
| if "bogus" in args[0]: |
| return False |
| else: |
| return True |
| pass |
| |
| def input_enable_ssl(*args, **kwargs): |
| if 'Bind anonymously' in args[0]: |
| return 'false' |
| if "SSL" in args[0]: |
| return "true" |
| if "Path to TrustStore file" in args[0]: |
| if input_enable_ssl.path_counter < 2: |
| input_enable_ssl.path_counter += 1 |
| return "bogus" |
| else: |
| return "valid" |
| if 'LDAP Port' in args[0]: |
| return '1' |
| if args[1] == "true" or args[1] == "false": |
| return args[1] |
| else: |
| return "test" |
| pass |
| |
| input_enable_ssl.path_counter = 0 |
| |
| exists_method.side_effect = os_path_exists |
| get_validated_string_input_method.side_effect = input_enable_ssl |
| read_password_method.return_value = "password" |
| get_YN_input_method.reset_mock() |
| get_YN_input_method.side_effect = [True, True, True] |
| update_properties_method.reset_mock() |
| |
| options.ldap_primary_host = None |
| options.ldap_primary_port = None |
| options.ldap_member_attr = None |
| setup_ldap(options) |
| |
| self.assertTrue(read_password_method.called) |
| |
| ldap_properties_map = \ |
| { |
| "ambari.ldap.connectivity.server.host": "a", |
| "ambari.ldap.connectivity.server.port" : "3", |
| "ambari.ldap.connectivity.secondary.server.host": "b", |
| "ambari.ldap.connectivity.secondary.server.port" : "2", |
| "ambari.ldap.connectivity.use_ssl": "true", |
| "ambari.ldap.attributes.user.name_attr": "test", |
| "ambari.ldap.attributes.user.search_base": "test", |
| "ambari.ldap.attributes.dn_attr": "test", |
| "ambari.ldap.connectivity.anonymous_bind": "false", |
| "ambari.ldap.advanced.collision_behavior": "skip", |
| "ambari.ldap.connectivity.bind_dn": "test", |
| "client.security": "ldap", |
| "ssl.trustStore.type": "test", |
| "ssl.trustStore.path": "valid", |
| "ssl.trustStore.password": "password", |
| LDAP_MGR_PASSWORD_PROPERTY: get_alias_string(LDAP_MGR_PASSWORD_ALIAS) |
| } |
| |
| sorted_x = sorted(ldap_properties_map.iteritems(), key=operator.itemgetter(0)) |
| sorted_y = sorted(update_properties_method.call_args[0][1].iteritems(), |
| key=operator.itemgetter(0)) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.read_password") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") |
| def test_setup_ldap_primary_host_and_port_with_ldap_url_option(self, get_ldap_properties_from_db_method, is_server_runing_method, get_ambari_properties_method, |
| get_validated_string_input_method, read_password_method, get_YN_input_method, urlopen_method): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| is_server_runing_method.return_value = (True, 0) |
| get_ldap_properties_from_db_method.return_value = None |
| |
| def yn_input_side_effect(*args, **kwargs): |
| if 'TrustStore' in args[0]: |
| return False |
| else: |
| return True |
| |
| get_YN_input_method.side_effect = yn_input_side_effect |
| get_ambari_properties_method.return_value = Properties() |
| read_password_method.return_value = 'password' |
| |
| def valid_input_side_effect(*args, **kwargs): |
| if 'Bind anonymously' in args[0] or 'lower-case' in args[0] or 'paginated' in args[0]: |
| return 'false' |
| if 'username collisions' in args[0]: |
| return 'skip' |
| if 'LDAP Port' in args[0]: |
| return '1' |
| if 'LDAP Host' in args[0]: |
| return kwargs['answer'] |
| if args[1] == "true" or args[1] == "false": |
| return args[1] |
| else: |
| return "test" |
| |
| get_validated_string_input_method.side_effect = valid_input_side_effect |
| |
| response = MagicMock() |
| response.getcode.return_value = 200 |
| urlopen_method.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ambari_admin_username = 'admin' |
| options.ambari_admin_password = 'admin' |
| options.ldap_type = LDAP_GENERIC |
| options.ldap_url = "a:1" |
| |
| setup_ldap(options) |
| |
| requestCall = urlopen_method.call_args_list[0] |
| args, kwargs = requestCall |
| request = args[0] |
| requestData = json.loads(request.data) |
| self.assertTrue(isinstance(requestData, dict)) |
| ldapProperties = requestData['Configuration']['properties']; |
| self.assertTrue('ambari.ldap.connectivity.server.host' in ldapProperties) |
| self.assertTrue('ambari.ldap.connectivity.server.port' in ldapProperties) |
| self.assertEqual(ldapProperties['ambari.ldap.connectivity.server.host'], 'a') |
| self.assertEqual(ldapProperties['ambari.ldap.connectivity.server.port'], '1') |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") |
| def test_setup_ldap_with_ambari_admin_username_and_password_options(self, get_ldap_properties_from_db_method, is_server_runing_method, get_ambari_properties_method, |
| get_validated_string_input_method, get_YN_input_method, urlopen_method): |
| |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| is_server_runing_method.return_value = (True, 0) |
| get_ldap_properties_from_db_method.return_value = None |
| |
| def yn_input_side_effect(*args, **kwargs): |
| return False if 'TrustStore' in args[0] else True |
| |
| get_YN_input_method.side_effect = yn_input_side_effect |
| get_ambari_properties_method.return_value = Properties() |
| |
| def valid_input_side_effect(*args, **kwargs): |
| if 'lower-case' in args[0] or 'paginated' in args[0]: |
| return 'false' |
| if 'Bind anonymously' in args[0]: |
| return 'true' |
| if 'username collisions' in args[0]: |
| return 'skip' |
| if 'URL Port' in args[0]: |
| return '1' |
| if 'Ambari Admin' in args[0]: |
| raise Exception("ShouldNotBeInvoked") # no user name/password should be read by the mock |
| if 'Primary URL' in args[0]: |
| return kwargs['answer'] |
| if args[1] == "true" or args[1] == "false": |
| return args[1] |
| else: |
| return "test" |
| |
| get_validated_string_input_method.side_effect = valid_input_side_effect |
| |
| response = MagicMock() |
| response.getcode.return_value = 200 |
| urlopen_method.return_value = response |
| options = self._create_empty_options_mock() |
| options.ambari_admin_username = 'admin' |
| options.ambari_admin_password = 'admin' |
| options.ldap_type = LDAP_GENERIC |
| |
| setup_ldap(options) |
| |
| self.assertTrue(urlopen_method.called) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_YN_input") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.query_ldap_type") |
| @patch("ambari_server.setupSecurity.get_ldap_properties_from_db") |
| def test_setup_ldap_enforcement_cli_option(self, get_ldap_properties_from_db_method, query_ldap_type_method, is_server_runing_method, get_ambari_properties_method, |
| get_validated_string_input_method, get_YN_input_method, urlopen_method): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| is_server_runing_method.return_value = (True, 0) |
| query_ldap_type_method.return_value = LDAP_GENERIC |
| get_ldap_properties_from_db_method.return_value = None |
| |
| def yn_input_side_effect(*args, **kwargs): |
| if 'do you wish to use LDAP instead' in args[0]: |
| raise Exception("ShouldNotBeInvoked") # should not be asked |
| else: |
| return False if 'TrustStore' in args[0] else True |
| |
| get_YN_input_method.side_effect = yn_input_side_effect |
| get_ambari_properties_method.return_value = Properties() |
| |
| def valid_input_side_effect(*args, **kwargs): |
| if 'lower-case' in args[0] or 'paginated' in args[0]: |
| return 'false' |
| if 'Bind anonymously' in args[0]: |
| return 'true' |
| if 'username collisions' in args[0]: |
| return 'skip' |
| if 'URL Port' in args[0]: |
| return '1' |
| if 'Primary URL' in args[0]: |
| return kwargs['answer'] |
| if args[1] == "true" or args[1] == "false": |
| return args[1] |
| else: |
| return "test" |
| |
| get_validated_string_input_method.side_effect = valid_input_side_effect |
| |
| response = MagicMock() |
| response.getcode.return_value = 200 |
| urlopen_method.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ambari_admin_username = 'admin' |
| options.ambari_admin_password = 'admin' |
| options.ldap_force_setup = True |
| |
| setup_ldap(options) |
| |
| self.assertTrue(urlopen_method.called) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| def test_should_query_ldap_type_returns_false_if_no_prop_requires_ldap_type(self): |
| prop_template0 = MagicMock() |
| prop_template0.should_query_ldap_type.return_value = False |
| prop_template1 = MagicMock() |
| prop_template1.should_query_ldap_type.return_value = False |
| ldap_properties = [prop_template0, prop_template1] |
| self.assertFalse(should_query_ldap_type(ldap_properties)) |
| pass |
| |
| def test_should_query_ldap_type_returns_true_if_any_prop_requires_ldap_type(self): |
| prop_template0 = MagicMock() |
| prop_template0.should_query_ldap_type.return_value = False |
| prop_template1 = MagicMock() |
| prop_template1.should_query_ldap_type.return_value = True |
| ldap_properties = [prop_template0, prop_template1] |
| self.assertTrue(should_query_ldap_type(ldap_properties)) |
| pass |
| |
| def test_LdapPropTemplate_should_query_ldap_type_returns_false_if_empty_prompt_is_allowed(self): |
| prop_template = LdapPropTemplate(Properties(), None, "any.prop", "Any prop:", REGEX_ANYTHING, True) |
| self.assertFalse(prop_template.should_query_ldap_type()) |
| pass |
| |
| def test_LdapPropTemplate_should_query_ldap_type_returns_false_if_option_value_is_present(self): |
| prop_template = LdapPropTemplate(Properties(), 'value', "any.prop", "Any prop:", REGEX_ANYTHING, False) |
| self.assertFalse(prop_template.should_query_ldap_type()) |
| pass |
| |
| def test_LdapPropTemplate_should_query_ldap_type_returns_false_if_property_value_is_present(self): |
| properties = Properties() |
| properties.process_pair("a.prop", "value") |
| prop_template = LdapPropTemplate(properties, None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefaultMap({'key' : 'default_value'})) |
| self.assertFalse(prop_template.should_query_ldap_type()) |
| pass |
| |
| def test_LdapPropTemplate_should_query_ldap_type_returns_false_if_default_is_not_depend_on_ldap_type(self): |
| prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefault('default_value')) |
| self.assertFalse(prop_template.should_query_ldap_type()) |
| pass |
| |
| def test_LdapPropTemplate_should_query_ldap_type_returns_true_if_property_value_is_depends_on_ldap_type_and_no_option_and_property_is_given(self): |
| prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefaultMap({'key' : 'default_value'})) |
| self.assertTrue(prop_template.should_query_ldap_type()) |
| pass |
| |
| def test_LdapPropTemplate_get_default_value_returns_stored_property_value_if_presents(self): |
| properties = Properties() |
| properties.process_pair("a.prop", "value") |
| prop_template = LdapPropTemplate(properties, None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefaultMap('default_value')) |
| self.assertEquals(prop_template.get_default_value('any_type'), "value") |
| pass |
| |
| def test_LdapPropTemplate_get_default_value_returns_default_value_if_stored_property_value_not_exists(self): |
| prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False, LdapDefault('default_value')) |
| self.assertEquals(prop_template.get_default_value('any_type'), "default_value") |
| pass |
| |
| def test_LdapPropTemplate_get_default_value_returns_none_if_stored_property_value_not_exists_and_no_default_value_was_specified(self): |
| prop_template = LdapPropTemplate(Properties(), None, "a.prop", "Any prop:", REGEX_ANYTHING, False) |
| self.assertEquals(prop_template.get_default_value('any_type'), None) |
| pass |
| |
| def test_LdapDefaultMap_get_default_value_returns_none_if_default_map_is_none(self): |
| default_map = LdapDefaultMap(None) |
| self.assertEquals(default_map.get_default_value('any_type'), None) |
| pass |
| |
| def test_LdapDefaultMap_get_default_value_returns_none_if_key_not_present(self): |
| default_map = LdapDefaultMap({LDAP_GENERIC : 'value'}) |
| self.assertEquals(default_map.get_default_value('non_existent_type'), None) |
| pass |
| |
| def test_LdapDefaultMap_get_default_value_returns_key_value_if_key_presents(self): |
| default_map = LdapDefaultMap({LDAP_GENERIC : 'value'}) |
| self.assertEquals(default_map.get_default_value(LDAP_GENERIC), 'value') |
| pass |
| |
| |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_all(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, get_ambari_properties_mock, |
| get_validated_string_input_mock, urlopen_mock): |
| |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| properties = Properties() |
| properties.process_pair(CLIENT_API_PORT_PROPERTY, '8080') |
| get_ambari_properties_mock.return_value = properties |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = True |
| options.ldap_sync_existing = False |
| |
| sync_ldap(options) |
| |
| url = '{0}://{1}:{2!s}{3}'.format('http', '127.0.0.1', '8080', '/api/v1/ldap_sync_events') |
| request = urlopen_mock.call_args_list[0][0][0] |
| |
| self.assertEquals(url, str(request.get_full_url())) |
| self.assertEquals('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "all"}, {"principal_type": "groups", "sync_type": "all"}]}}]', request.data) |
| |
| self.assertTrue(response.getcode.called) |
| self.assertTrue(response.read.called) |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("os.path.exists") |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_users(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, get_ambari_properties_mock, |
| get_validated_string_input_mock, urlopen_mock, os_path_exists_mock, open_mock): |
| |
| os_path_exists_mock.return_value = 1 |
| f = MagicMock() |
| f.__enter__().read.return_value = "bob, tom" |
| |
| open_mock.return_value = f |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = False |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = 'users.txt' |
| options.ldap_sync_groups = None |
| |
| sync_ldap(options) |
| |
| request = urlopen_mock.call_args_list[0][0][0] |
| |
| self.assertEquals('[{"Event": {"specs": [{"principal_type": "users", "sync_type": "specific", "names": "bob, tom"}]}}]', request.data) |
| |
| self.assertTrue(response.getcode.called) |
| self.assertTrue(response.read.called) |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("os.path.exists") |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_groups(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, get_ambari_properties_mock, |
| get_validated_string_input_mock, urlopen_mock, os_path_exists_mock, open_mock): |
| |
| os_path_exists_mock.return_value = 1 |
| f = MagicMock() |
| f.__enter__().read.return_value = "group1, group2" |
| |
| open_mock.return_value = f |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = False |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = 'groups.txt' |
| |
| sync_ldap(options) |
| |
| request = urlopen_mock.call_args_list[0][0][0] |
| |
| self.assertEquals('[{"Event": {"specs": [{"principal_type": "groups", "sync_type": "specific", "names": "group1, group2"}]}}]', request.data) |
| |
| self.assertTrue(response.getcode.called) |
| self.assertTrue(response.read.called) |
| pass |
| |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_ssl(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, get_ambari_properties_mock, |
| get_validated_string_input_mock, urlopen_mock): |
| |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| properties = Properties() |
| properties.process_pair(SSL_API, 'true') |
| properties.process_pair(SSL_API_PORT, '8443') |
| get_ambari_properties_mock.return_value = properties |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "https://c6401.ambari.apache.org:8443/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = True |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = None |
| |
| sync_ldap(options) |
| |
| url = '{0}://{1}:{2!s}{3}'.format('https', socket.getfqdn(), '8443', '/api/v1/ldap_sync_events') |
| request = urlopen_mock.call_args_list[0][0][0] |
| |
| self.assertEquals(url, str(request.get_full_url())) |
| |
| self.assertTrue(response.getcode.called) |
| self.assertTrue(response.read.called) |
| pass |
| |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.get_ambari_properties") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_existing(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, get_ambari_properties_mock, |
| get_validated_string_input_mock, urlopen_mock): |
| |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_ambari_properties_mock.return_value = Properties() |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = False |
| options.ldap_sync_existing = True |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = None |
| |
| sync_ldap(options) |
| |
| self.assertTrue(response.getcode.called) |
| self.assertTrue(response.read.called) |
| pass |
| |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_no_sync_mode(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, |
| get_validated_string_input_mock, urlopen_mock): |
| |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "RUNNING","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}', |
| '{"Event":{"status" : "COMPLETE","summary" : {"groups" : {"created" : 1,"removed" : 0,"updated" : 0},"memberships" : {"created" : 5,"removed" : 0},"users" : {"created" : 5,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| del options.ldap_sync_all |
| del options.ldap_sync_existing |
| del options.ldap_sync_users |
| del options.ldap_sync_groups |
| |
| try: |
| sync_ldap(options) |
| self.fail("Should fail with exception") |
| except FatalException as e: |
| pass |
| pass |
| |
| @patch("urllib2.urlopen") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_ldap_sync_error_status(self, logger_mock, is_root_method, is_server_runing_mock, is_ldap_enabled_mock, |
| get_validated_string_input_mock, urlopen_mock): |
| |
| is_root_method.return_value = True |
| is_server_runing_mock.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_validated_string_input_mock.side_effect = ['admin', 'admin'] |
| |
| response = MagicMock() |
| response.getcode.side_effect = [201, 200] |
| response.read.side_effect = ['{"resources" : [{"href" : "http://c6401.ambari.apache.org:8080/api/v1/ldap_sync_events/16","Event" : {"id" : 16}}]}', |
| '{"Event":{"status" : "ERROR","status_detail" : "Error!!","summary" : {"groups" : {"created" : 0,"removed" : 0,"updated" : 0},"memberships" : {"created" : 0,"removed" : 0},"users" : {"created" : 0,"removed" : 0,"updated" : 0}}}}'] |
| |
| urlopen_mock.return_value = response |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = False |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = None |
| |
| try: |
| sync_ldap(options) |
| self.fail("Should fail with exception") |
| except FatalException as e: |
| pass |
| pass |
| |
| @patch("urllib2.urlopen") |
| @patch("urllib2.Request") |
| @patch("base64.encodestring") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_sync_ldap_forbidden(self, logger_mock, get_validated_string_input_method, is_ldap_enabled_mock, |
| is_server_runing_method, |
| encodestring_method, request_constructor, urlopen_method): |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = True |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = None |
| |
| is_server_runing_method.return_value = (True, 0) |
| is_ldap_enabled_mock.return_value = 'true' |
| get_validated_string_input_method.return_value = 'admin' |
| encodestring_method.return_value = 'qwe123' |
| |
| requestMocks = [MagicMock()] |
| request_constructor.side_effect = requestMocks |
| response = MagicMock() |
| response.getcode.return_value = 403 |
| urlopen_method.return_value = response |
| |
| try: |
| sync_ldap(options) |
| self.fail("Should throw exception if return code != 200") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("status code" in fe.reason) |
| pass |
| pass |
| |
| @patch("ambari_server.setupSecurity.is_root") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_sync_ldap_ambari_stopped(self, logger_mock, is_server_runing_method, is_root_method): |
| is_root_method.return_value = True |
| is_server_runing_method.return_value = (None, None) |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = True |
| options.ldap_sync_existing = False |
| options.ldap_sync_users = None |
| options.ldap_sync_groups = None |
| |
| try: |
| sync_ldap(options) |
| self.fail("Should throw exception if ambari is stopped") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("not running" in fe.reason) |
| pass |
| pass |
| |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| @patch("ambari_server.setupSecurity.is_server_runing") |
| @patch("ambari_server.setupSecurity.is_ldap_enabled") |
| @patch("ambari_server.setupSecurity.logger") |
| def test_sync_ldap_not_configured(self, logger_mock, is_ldap_enabled_mock, |
| is_server_runing_method, get_validated_string_input): |
| get_validated_string_input.return_value = 'admin' |
| is_server_runing_method.return_value = (True, None) |
| is_ldap_enabled_mock.return_value = 'false' |
| |
| options = self._create_empty_options_mock() |
| options.ldap_sync_all = True |
| del options.ldap_sync_existing |
| del options.ldap_sync_users |
| del options.ldap_sync_groups |
| |
| try: |
| sync_ldap(options) |
| self.fail("Should throw exception if ldap is not configured") |
| except FatalException as fe: |
| # Expected |
| self.assertTrue("not configured" in fe.reason) |
| pass |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("os.path.exists") |
| def test_get_ldap_event_spec_names(self, os_path_exists_mock, open_mock): |
| os_path_exists_mock.return_value = 1 |
| f = MagicMock() |
| f.__enter__().read.return_value = "\n\n\t some group, \tanother group, \n\t\tgrp, \ngroup*\n\n\n\n" |
| |
| open_mock.return_value = f |
| |
| bodies = [{"Event":{"specs":[]}}] |
| body = bodies[0] |
| events = body['Event'] |
| specs = events['specs'] |
| |
| new_specs = [{"principal_type":"groups","sync_type":"specific","names":""}] |
| |
| get_ldap_event_spec_names("groups.txt", specs, new_specs) |
| |
| self.assertEquals("[{'Event': {'specs': [{'principal_type': 'groups', 'sync_type': 'specific', 'names': ' some group, another group, grp, group*'}]}}]", str(bodies)) |
| pass |
| |
| @patch("ambari_server.setupSecurity.read_password") |
| def test_configure_ldap_password(self, read_password_method): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| read_password_method.return_value = "blah" |
| options = self._create_empty_options_mock() |
| configure_ldap_password(options) |
| |
| self.assertTrue(read_password_method.called) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| @patch("ambari_server.userInput.get_validated_string_input") |
| def test_read_password(self, get_validated_string_input_method): |
| out = StringIO.StringIO() |
| sys.stdout = out |
| |
| passwordDefault = "" |
| passwordPrompt = 'Enter Manager Password* : ' |
| passwordPattern = ".*" |
| passwordDescr = "Invalid characters in password." |
| |
| get_validated_string_input_method.side_effect = ['', 'aaa', 'aaa'] |
| password = read_password(passwordDefault, passwordPattern, |
| passwordPrompt, passwordDescr) |
| self.assertTrue(3, get_validated_string_input_method.call_count) |
| self.assertEquals('aaa', password) |
| |
| get_validated_string_input_method.reset_mock() |
| get_validated_string_input_method.side_effect = ['aaa', 'aaa'] |
| password = read_password(passwordDefault, passwordPattern, |
| passwordPrompt, passwordDescr) |
| self.assertTrue(2, get_validated_string_input_method.call_count) |
| self.assertEquals('aaa', password) |
| |
| get_validated_string_input_method.reset_mock() |
| get_validated_string_input_method.side_effect = ['aaa'] |
| password = read_password('aaa', passwordPattern, |
| passwordPrompt, passwordDescr) |
| self.assertTrue(1, get_validated_string_input_method.call_count) |
| self.assertEquals('aaa', password) |
| |
| sys.stdout = sys.__stdout__ |
| pass |
| |
| def test_generate_random_string(self): |
| random_str_len = 100 |
| str1 = generate_random_string(random_str_len) |
| self.assertTrue(len(str1) == random_str_len) |
| |
| str2 = generate_random_string(random_str_len) |
| self.assertTrue(str1 != str2) |
| pass |
| |
| @patch("__builtin__.open") |
| @patch("ambari_server.serverConfiguration.search_file") |
| @patch("ambari_server.serverConfiguration.backup_file_in_temp") |
| def test_update_properties_2(self, backup_file_in_temp_mock, search_file_mock, open_mock): |
| conf_file = "ambari.properties" |
| propertyMap = {"1": "1", "2": "2"} |
| properties = MagicMock() |
| f = MagicMock(name="file") |
| search_file_mock.return_value = conf_file |
| open_mock.return_value = f |
| |
| update_properties_2(properties, propertyMap) |
| |
| properties.store_ordered.assert_called_with(f.__enter__.return_value) |
| backup_file_in_temp_mock.assert_called_with(conf_file) |
| self.assertEquals(2, properties.removeOldProp.call_count) |
| self.assertEquals(2, properties.process_pair.call_count) |
| |
| properties = MagicMock() |
| backup_file_in_temp_mock.reset_mock() |
| open_mock.reset_mock() |
| |
| update_properties_2(properties, None) |
| properties.store_ordered.assert_called_with(f.__enter__.return_value) |
| backup_file_in_temp_mock.assert_called_with(conf_file) |
| self.assertFalse(properties.removeOldProp.called) |
| self.assertFalse(properties.process_pair.called) |
| |
| pass |
| |
| |
| def test_regexps(self): |
| res = re.search(REGEX_HOSTNAME_PORT, "") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_HOSTNAME_PORT, "ddd") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_HOSTNAME_PORT, "gg:ff") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_HOSTNAME_PORT, "gg:55444325") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_HOSTNAME_PORT, "gg:555") |
| self.assertTrue(res is not None) |
| |
| res = re.search(REGEX_TRUE_FALSE, "") |
| self.assertTrue(res is not None) |
| res = re.search(REGEX_TRUE_FALSE, "t") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_TRUE_FALSE, "trrrr") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_TRUE_FALSE, "true|false") |
| self.assertTrue(res is None) |
| res = re.search(REGEX_TRUE_FALSE, "true") |
| self.assertTrue(res is not None) |
| res = re.search(REGEX_TRUE_FALSE, "false") |
| self.assertTrue(res is not None) |
| |
| res = re.search(REGEX_ANYTHING, "") |
| self.assertTrue(res is not None) |
| res = re.search(REGEX_ANYTHING, "t") |
| self.assertTrue(res is not None) |
| res = re.search(REGEX_ANYTHING, "trrrr") |
| self.assertTrue(res is not None) |
| pass |
| |
| |
| def get_sample(self, sample): |
| """ |
| Returns sample file content as string with normalized line endings |
| """ |
| path = self.get_samples_dir(sample) |
| return self.get_file_string(path) |
| |
| def get_file_string(self, file): |
| """ |
| Returns file content as string with normalized line endings |
| """ |
| string = open(file, 'r').read() |
| return self.normalize(string) |
| |
| |
| def normalize(self, string): |
| """ |
| Normalizes line ending in string according to platform-default encoding |
| """ |
| return string.replace("\n", os.linesep) |
| |
| |
| def get_samples_dir(self, sample): |
| """ |
| Returns full file path by sample name |
| """ |
| testdir = os.path.dirname(__file__) |
| return os.path.dirname(testdir) + os.sep + "resources" + os.sep \ |
| + 'TestAmbaryServer.samples/' + sample |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.dbConfiguration_linux.get_ambari_properties") |
| def test_is_jdbc_user_changed(self, get_ambari_properties_mock): |
| previous_user = "previous_user" |
| new_user = "new_user" |
| |
| props = Properties() |
| props.process_pair(JDBC_USER_NAME_PROPERTY, previous_user) |
| get_ambari_properties_mock.return_value = props |
| |
| #check if users are different |
| result = PGConfig._is_jdbc_user_changed(new_user) |
| self.assertTrue(result) |
| |
| #check if users are equal |
| result = PGConfig._is_jdbc_user_changed(previous_user) |
| self.assertFalse(result) |
| |
| #check if one of users is None |
| result = PGConfig._is_jdbc_user_changed(None) |
| self.assertEqual(None, result) |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch("ambari_server.serverConfiguration.write_property") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_ambari_version") |
| def test_check_database_name_property(self, get_ambari_version_mock, get_ambari_properties_mock, write_property_mock): |
| # negative case |
| get_ambari_properties_mock.return_value = {JDBC_DATABASE_NAME_PROPERTY: ""} |
| try: |
| result = check_database_name_property() |
| self.fail("Should fail with exception") |
| except FatalException as e: |
| self.assertTrue('DB Name property not set in config file.' in e.reason) |
| |
| # positive case |
| dbname = "ambari" |
| get_ambari_properties_mock.reset_mock() |
| get_ambari_properties_mock.return_value = {JDBC_DATABASE_NAME_PROPERTY: dbname} |
| try: |
| result = check_database_name_property() |
| except FatalException: |
| self.fail("Setup should be successful") |
| |
| # Check upgrade. In Ambari < 1.7.1 "database" property contained db name for local db |
| dbname = "ambari" |
| database = "ambari" |
| persistence = "local" |
| get_ambari_properties_mock.reset_mock() |
| get_ambari_properties_mock.return_value = {JDBC_DATABASE_NAME_PROPERTY: dbname, |
| JDBC_DATABASE_PROPERTY: database, |
| PERSISTENCE_TYPE_PROPERTY: persistence} |
| try: |
| result = check_database_name_property(upgrade=True) |
| except FatalException: |
| self.fail("Setup should be successful") |
| self.assertTrue(write_property_mock.called) |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("resource_management.core.shell.call") |
| @patch("ambari_server.dbConfiguration_linux.PGConfig._is_jdbc_user_changed") |
| @patch("ambari_server.serverSetup.verify_setup_allowed") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch("ambari_server.serverSetup.download_and_install_jdk") |
| @patch.object(PGConfig, "_configure_postgres") |
| @patch.object(PGConfig, "_check_postgre_up") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.check_selinux") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch.object(PGConfig, "_setup_db") |
| @patch("ambari_server.serverSetup.get_is_secure") |
| @patch("ambari_server.dbConfiguration_linux.store_password_file") |
| @patch("ambari_server.serverSetup.extract_views") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| @patch("sys.exit") |
| @patch("__builtin__.raw_input") |
| @patch("ambari_server.serverSetup.expand_jce_zip_file") |
| def test_ambariServerSetupWithCustomDbName(self, expand_jce_zip_file_mock, raw_input, exit_mock, adjust_dirs_mock, |
| extract_views_mock, store_password_file_mock, |
| get_is_secure_mock, setup_db_mock, is_root_mock, #is_local_database_mock, |
| check_selinux_mock, check_jdbc_drivers_mock, check_ambari_user_mock, |
| check_postgre_up_mock, configure_postgres_mock, |
| download_jdk_mock, configure_os_settings_mock, get_YN_input, |
| verify_setup_allowed_method, is_jdbc_user_changed_mock, |
| run_os_command_mock): |
| |
| args = MagicMock() |
| |
| raw_input.return_value = "" |
| get_YN_input.return_value = False |
| verify_setup_allowed_method.return_value = 0 |
| is_root_mock.return_value = True |
| check_selinux_mock.return_value = 0 |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| check_jdbc_drivers_mock.return_value = 0 |
| check_postgre_up_mock.return_value = "running", 0, "", "" |
| configure_postgres_mock.return_value = 0, "", "" |
| download_jdk_mock.return_value = 0 |
| configure_os_settings_mock.return_value = 0 |
| is_jdbc_user_changed_mock.return_value = False |
| setup_db_mock.return_value = (0, None, None) |
| get_is_secure_mock.return_value = False |
| store_password_file_mock.return_value = "password" |
| extract_views_mock.return_value = 0 |
| run_os_command_mock.return_value = 3,"","" |
| |
| new_db = "newDBName" |
| args.dbms = "postgres" |
| args.database_name = new_db |
| args.postgres_schema = new_db |
| args.database_username = "user" |
| args.database_password = "password" |
| args.jdbc_driver= None |
| args.jdbc_db = None |
| args.must_set_database_options = True |
| |
| del args.database_index |
| del args.persistence_type |
| |
| tempdir = tempfile.gettempdir() |
| prop_file = os.path.join(tempdir, "ambari.properties") |
| with open(prop_file, "w") as f: |
| f.write("server.jdbc.database_name=oldDBName") |
| f.close() |
| |
| os.environ[AMBARI_CONF_VAR] = tempdir |
| |
| try: |
| result = setup(args) |
| except FatalException as ex: |
| self.fail("Setup should be successful") |
| |
| properties = get_ambari_properties() |
| |
| self.assertTrue(JDBC_DATABASE_NAME_PROPERTY in properties.keys()) |
| value = properties[JDBC_DATABASE_NAME_PROPERTY] |
| self.assertEqual(value, new_db) |
| |
| del os.environ[AMBARI_CONF_VAR] |
| os.remove(prop_file) |
| pass |
| |
| @only_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch("ambari_server.serverSetup.service_setup") |
| @patch("ambari_server.dbConfiguration_windows.MSSQLConfig._execute_db_script") |
| @patch("ambari_server.dbConfiguration_windows.store_password_file") |
| @patch("ambari_server.dbConfiguration_windows.MSSQLConfig._is_jdbc_driver_installed") |
| @patch("ambari_server.serverSetup.verify_setup_allowed") |
| @patch("ambari_server.serverSetup.get_YN_input") |
| @patch("ambari_server.serverSetup.configure_os_settings") |
| @patch("ambari_server.serverSetup.download_and_install_jdk") |
| @patch("ambari_server.serverSetup.check_firewall") |
| @patch("ambari_server.serverSetup.check_ambari_user") |
| @patch("ambari_server.serverSetup.check_jdbc_drivers") |
| @patch("ambari_server.serverSetup.is_root") |
| @patch("ambari_server.serverSetup.extract_views") |
| @patch("ambari_server.serverSetup.adjust_directory_permissions") |
| def test_ambariServerSetupWithCustomDbName(self, |
| adjust_dirs_mock, |
| extract_views_mock, |
| is_root_mock, |
| check_jdbc_drivers_mock, |
| check_ambari_user_mock, |
| check_firewall_mock, |
| download_jdk_mock, |
| configure_os_settings_mock, |
| get_YN_input, |
| verify_setup_allowed_method, |
| is_jdbc_driver_installed_mock, |
| store_password_file_mock, |
| execute_db_script_mock, |
| service_setup_mock): |
| args = MagicMock() |
| |
| get_YN_input.return_value = False |
| verify_setup_allowed_method.return_value = 0 |
| is_root_mock.return_value = True |
| check_ambari_user_mock.return_value = (0, False, 'user', None) |
| check_jdbc_drivers_mock.return_value = 0 |
| download_jdk_mock.return_value = 0 |
| configure_os_settings_mock.return_value = 0 |
| is_jdbc_driver_installed_mock.return_value = True |
| store_password_file_mock.return_value = "password.dat" |
| extract_views_mock.return_value = 0 |
| |
| new_db = "newDBName" |
| |
| del args.dbms |
| del args.database_index |
| del args.database_host |
| del args.database_port |
| args.database_name = new_db |
| args.database_username = "user" |
| args.database_password = "password" |
| del args.database_windows_auth |
| args.jdbc_driver= None |
| args.jdbc_db = None |
| args.must_set_database_options = True |
| del args.default_database_host |
| del args.persistence_type |
| del args.init_db_script_file |
| del args.cleanup_db_script_file |
| |
| tempdir = tempfile.gettempdir() |
| prop_file = os.path.join(tempdir, "ambari.properties") |
| with open(prop_file, "w") as f: |
| f.write("server.jdbc.database_name=oldDBName") |
| f.close() |
| |
| os.environ[AMBARI_CONF_VAR] = tempdir |
| |
| try: |
| result = setup(args) |
| except FatalException as ex: |
| self.fail("Setup should be successful") |
| |
| properties = get_ambari_properties() |
| |
| self.assertTrue(JDBC_DATABASE_NAME_PROPERTY in properties.keys()) |
| value = properties[JDBC_DATABASE_NAME_PROPERTY] |
| self.assertEqual(value, new_db) |
| |
| self.assertEqual(store_password_file_mock.call_count, 2) |
| self.assertEqual(execute_db_script_mock.call_count, 2) |
| |
| del os.environ[AMBARI_CONF_VAR] |
| os.remove(prop_file) |
| pass |
| |
| |
| def test_is_valid_filepath(self): |
| temp_dir = tempfile.gettempdir() |
| temp_file = tempfile.NamedTemporaryFile(mode='r') |
| |
| # Correct path to an existing file |
| self.assertTrue(temp_file) |
| # Correct path to an existing directory |
| self.assertFalse(is_valid_filepath(temp_dir), \ |
| 'is_valid_filepath(path) should return False is path is a directory') |
| # Incorrect path |
| self.assertFalse(is_valid_filepath('')) |
| pass |
| |
| @patch("ambari_server.setupSecurity.search_file") |
| @patch("ambari_server.setupSecurity.get_validated_string_input") |
| def test_setup_ambari_krb5_jaas_with_options(self, get_validated_string_input_mock, |
| search_file_mock): |
| options = self._create_empty_options_mock() |
| options.jaas_keytab = '/kerberos/admin.keytab' |
| |
| temp_file = tempfile.NamedTemporaryFile(mode='r') |
| search_file_mock.return_value = temp_file.name |
| get_validated_string_input_mock.side_effect = ['adm@EXAMPLE.COM', temp_file] |
| |
| self.assertEqual(None, setup_ambari_krb5_jaas(options)) |
| self.assertTrue(get_validated_string_input_mock.called) |
| self.assertEqual(get_validated_string_input_mock.call_count, 2) |
| get_validated_string_input_mock.assert_called_with("Enter keytab path for ambari server's kerberos principal: ", |
| '/etc/security/keytabs/ambari.keytab', '.*', False, False, |
| validatorFunction = is_valid_filepath, answer='/kerberos/admin.keytab') |
| pass |
| |
| @patch("os.path.exists") |
| @patch.object(ResourceFilesKeeper, "perform_housekeeping") |
| def test_refresh_stack_hash(self, |
| perform_housekeeping_mock, path_exists_mock): |
| |
| path_exists_mock.return_value = True |
| |
| properties = Properties() |
| refresh_stack_hash(properties) |
| |
| self.assertTrue(perform_housekeeping_mock.called) |
| pass |
| |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.dbConfiguration_linux.print_error_msg") |
| def test_change_tables_owner_no_tables(self, print_error_msg_mock, run_os_command_mock, |
| decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| properties.process_pair(JDBC_PASSWORD_PROPERTY, get_alias_string("mypwdalias")) |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| |
| run_os_command_mock.return_value = 0, "", "" |
| |
| dbms = PGConfig(args, properties, "local") |
| result = dbms._change_tables_owner() |
| self.assertFalse(result) |
| self.assertEquals(print_error_msg_mock.call_args_list[0][0][0], 'Failed to get list of ambari tables') |
| |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.dbConfiguration_linux.print_error_msg") |
| def test_change_tables_owner_fatal_psql(self, print_error_msg_mock, run_os_command_mock, |
| decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| properties.process_pair(JDBC_PASSWORD_PROPERTY, get_alias_string("mypwdalias")) |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| |
| run_os_command_mock.return_value = 0, "", "psql: could not connect to server: No such file or directory" |
| |
| dbms = PGConfig(args, properties, "local") |
| result = dbms._change_tables_owner() |
| self.assertFalse(result) |
| self.assertEquals(print_error_msg_mock.call_args_list[0][0][0], """Failed to get list of ambari tables. Message from psql: |
| stdout: |
| stderr:psql: could not connect to server: No such file or directory |
| """) |
| |
| @patch("ambari_server.dbConfiguration.decrypt_password_for_alias") |
| @patch("ambari_server.dbConfiguration_linux.run_os_command") |
| @patch("ambari_server.dbConfiguration_linux.print_error_msg") |
| def test_change_tables_owner(self, print_error_msg_mock, run_os_command_mock, |
| decrypt_password_for_alias_mock): |
| args = MagicMock() |
| del args.database_index |
| del args.dbms |
| del args.database_host |
| del args.database_port |
| del args.database_name |
| del args.database_username |
| del args.database_password |
| del args.init_script_file |
| del args.drop_script_file |
| |
| properties = Properties() |
| properties.process_pair(JDBC_PASSWORD_PROPERTY, get_alias_string("mypwdalias")) |
| |
| decrypt_password_for_alias_mock.return_value = "password" |
| |
| run_os_command_mock.side_effect = [(0, "tbl1\n,tbl2", ""), |
| (0, "", ""), |
| (0, "", ""), |
| (0, "postgres", ""), |
| (0, "ALTER TABLE", ""), |
| (0, "postgres", ""), |
| (0, "ALTER TABLE", "")] |
| |
| dbms = PGConfig(args, properties, "local") |
| result = dbms._change_tables_owner() |
| self.assertTrue(result) |
| self.assertEquals(run_os_command_mock.call_count, 7) |
| |
| @patch("os.path.isdir", new = MagicMock(return_value=True)) |
| @patch("os.access", new = MagicMock(return_value=True)) |
| @patch.object(ServerClassPath, "get_full_ambari_classpath_escaped_for_shell", new = MagicMock(return_value = 'test' + os.pathsep + 'path12')) |
| @patch("ambari_server.serverUtils.is_server_runing") |
| @patch("ambari_commons.os_utils.run_os_command") |
| @patch("ambari_server.setupSecurity.generate_env") |
| @patch("ambari_server.setupSecurity.ensure_can_start_under_current_user") |
| @patch("ambari_server.serverConfiguration.read_ambari_user") |
| @patch("ambari_server.dbConfiguration.ensure_jdbc_driver_is_installed") |
| @patch("ambari_server.serverConfiguration.parse_properties_file") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch("ambari_server.serverConfiguration.get_java_exe_path") |
| @patch("os.path.isfile") |
| @patch("sys.exit") |
| @patch("ambari_server.userInput.get_YN_input") |
| @patch("ambari_server.hostUpdate.logger") |
| def test_update_host_names(self, logger_mock, getYNInput_mock, sysExitMock, isFileMock, getJavaExePathMock, |
| getAmbariPropertiesMock, parsePropertiesFileMock, ensureDriverInstalledMock, readAmbariUserMock, |
| ensureCanStartUnderCurrentUserMock, generateEnvMock, runOSCommandMock, isServerRunningMock): |
| properties = Properties() |
| properties.process_pair("server.jdbc.database", "embedded") |
| |
| getYNInput_mock.return_value = False |
| isFileMock.return_value = True |
| getJavaExePathMock.return_value = "/path/to/java" |
| getAmbariPropertiesMock.return_value = properties |
| readAmbariUserMock.return_value = "test_user" |
| ensureCanStartUnderCurrentUserMock.return_value = "test_user" |
| generateEnvMock.return_value = {} |
| runOSCommandMock.return_value = (0, "", "") |
| isServerRunningMock.return_value = (False, 1) |
| |
| update_host_names(["update-host-names", "/testFileWithChanges"], properties) |
| |
| self.assertEquals(len(sysExitMock.call_args_list), 3) |
| self.assertTrue(isFileMock.called) |
| self.assertTrue(getJavaExePathMock.called) |
| self.assertTrue(readAmbariUserMock.called) |
| self.assertTrue(ensureCanStartUnderCurrentUserMock.called) |
| self.assertTrue(generateEnvMock.called) |
| |
| self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 ' |
| 'org.apache.ambari.server.update.HostUpdateHelper /testFileWithChanges > ' |
| '/var/log/ambari-server/ambari-server.out 2>&1') |
| |
| pass |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "is_server_runing") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_status_running(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, is_server_runing_method): |
| |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "status"] |
| |
| is_server_runing_method.return_value = (True, 100) |
| |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit as e: |
| self.assertTrue(e.code == 0) |
| |
| self.assertTrue(is_server_runing_method.called) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "is_server_runing") |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_main_test_status_not_running(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock, is_server_runing_method): |
| |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "status"] |
| |
| is_server_runing_method.return_value = (False, None) |
| |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit as e: |
| self.assertTrue(e.code == 3) |
| |
| self.assertTrue(is_server_runing_method.called) |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| @not_for_platform(PLATFORM_WINDOWS) |
| @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value)) |
| @patch.object(_ambari_server_, "logger") |
| @patch("ambari_server.serverConfiguration.get_ambari_properties") |
| @patch.object(_ambari_server_, "setup_logging") |
| @patch.object(_ambari_server_, "init_logging") |
| def test_status_extra_option(self, init_logging_mock, setup_logging_mock, get_ambari_properties_mock, |
| logger_mock): |
| |
| import sys |
| tmp_argv = sys.argv |
| try: |
| sys.argv = ['ambari-server', "status", '--skip-database-check'] |
| flag = False |
| try: |
| _ambari_server_.mainBody() |
| except SystemExit as e: |
| self.assertEquals(e.code, 2) |
| flag = True |
| |
| self.assertTrue(flag) |
| |
| pass |
| finally: |
| sys.argv = tmp_argv |
| |
| def test_web_server_startup_timeout(self): |
| from ambari_server.serverConfiguration import get_web_server_startup_timeout |
| from ambari_server.serverConfiguration import WEB_SERVER_STARTUP_TIMEOUT |
| |
| properties = Properties() |
| timeout = get_web_server_startup_timeout(properties) |
| self.assertEquals(90, timeout) |
| |
| properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "") |
| timeout = get_web_server_startup_timeout(properties) |
| self.assertEquals(90, timeout) |
| |
| properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "120") |
| timeout = get_web_server_startup_timeout(properties) |
| self.assertEquals(120, timeout) |
| |
| properties.process_pair(WEB_SERVER_STARTUP_TIMEOUT, "120 ") |
| timeout = get_web_server_startup_timeout(properties) |
| self.assertEquals(120, timeout) |
| |
| |
| def _create_empty_options_mock(self): |
| options = MagicMock() |
| options.ldap_url = None |
| options.ldap_primary_host = None |
| options.ldap_primary_port = None |
| options.ldap_secondary_url = None |
| options.ldap_secondary_host = None |
| options.ldap_secondary_port = None |
| options.ldap_ssl = None |
| options.ldap_user_class = None |
| options.ldap_user_attr = None |
| options.ldap_group_class = None |
| options.ldap_group_attr = None |
| options.ldap_member_attr = None |
| options.ldap_dn = None |
| options.ldap_base_dn = None |
| options.ldap_manager_dn = None |
| options.ldap_manager_password = None |
| options.ldap_save_settings = None |
| options.ldap_referral = None |
| options.ldap_bind_anonym = None |
| options.ldap_force_setup = None |
| options.ambari_admin_username = None |
| options.ambari_admin_password = None |
| options.ldap_sync_admin_name = None |
| options.ldap_sync_username_collisions_behavior = None |
| options.ldap_sync_disable_endpoint_identification = None |
| options.ldap_force_lowercase_usernames = None |
| options.ldap_pagination_enabled = None |
| options.ldap_sync_admin_password = None |
| options.custom_trust_store = None |
| options.trust_store_type = None |
| options.trust_store_path = None |
| options.trust_store_password = None |
| options.security_option = None |
| options.api_ssl = None |
| options.api_ssl_port = None |
| options.import_cert_path = None |
| options.import_cert_alias = None |
| options.pem_password = None |
| options.import_key_path = None |
| options.master_key = None |
| options.master_key_persist = None |
| options.jaas_principal = None |
| options.jaas_keytab = None |
| return options |
| |
| |
| |