Updated Branches: refs/heads/trunk f26e64c9e -> c05f22cda
AMBARI-3114. Check if dbname property exists in ambari.properties file. (Artem Baranchuk via odiachenko) Project: http://git-wip-us.apache.org/repos/asf/incubator-ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ambari/commit/c05f22cd Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/c05f22cd Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/c05f22cd Branch: refs/heads/trunk Commit: c05f22cda8bac07a88c4ac9f959ad7670dc8f834 Parents: f26e64c Author: Oleksandr Diachenko <[email protected]> Authored: Thu Sep 5 21:31:53 2013 +0300 Committer: Oleksandr Diachenko <[email protected]> Committed: Thu Sep 5 21:32:08 2013 +0300 ---------------------------------------------------------------------- .../server/configuration/Configuration.java | 4 + ambari-server/src/main/python/ambari-server.py | 40 +++++- .../server/configuration/ConfigurationTest.java | 15 +++ .../src/test/python/TestAmbaryServer.py | 123 ++++++++++++++++++- 4 files changed, 172 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/c05f22cd/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java index 2df5f11..4f9955d 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/configuration/Configuration.java @@ -576,6 +576,10 @@ public class Configuration { } public String getLocalDatabaseUrl() { + String dbName = properties.getProperty(SERVER_DB_NAME_KEY); + if(dbName == null || dbName.isEmpty()) + throw new RuntimeException("Server DB Name is not configured!"); + return JDBC_LOCAL_URL + properties.getProperty(SERVER_DB_NAME_KEY); } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/c05f22cd/ambari-server/src/main/python/ambari-server.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py index 820a405..8986f84 100755 --- a/ambari-server/src/main/python/ambari-server.py +++ b/ambari-server/src/main/python/ambari-server.py @@ -219,7 +219,7 @@ SETUP_DB_CONNECT_ATTEMPTS = 3 SETUP_DB_CMD = ['su', '-', 'postgres', '--command=psql -f {0} -v username=\'"{1}"\' -v password="\'{2}\'" -v dbname="{3}"'] UPGRADE_STACK_CMD = ['su', 'postgres', - '--command=psql -f {0} -v stack_name="\'{1}\'" -v stack_version="\'{2}\'" -v dbname="{3}'] + '--command=psql -f {0} -v stack_name="\'{1}\'" -v stack_version="\'{2}\'" -v dbname="{3}"'] UPDATE_METAINFO_CMD = 'curl -X PUT "http://{0}:{1}/api/v1/stacks2" -u "{2}":"{3}"' PG_ST_CMD = "/sbin/service postgresql status" PG_INITDB_CMD = "/sbin/service postgresql initdb" @@ -344,6 +344,8 @@ JCE_POLICY_FILENAME = "jce_policy-6.zip" JCE_DOWNLOAD_CMD = "curl -o {0} {1}" JCE_MIN_FILESIZE = 5000 +DEFAULT_DB_NAME = "ambari" + #Apache License Header ASF_LICENSE_HEADER = ''' # Copyright 2011 The Apache Software Foundation @@ -1062,7 +1064,7 @@ def load_default_db_properties(args): args.database=DATABASE_NAMES[DATABASE_INDEX] args.database_host = "localhost" args.database_port = DATABASE_PORTS[DATABASE_INDEX] - args.database_name = "ambari" + args.database_name = DEFAULT_DB_NAME args.database_username = "ambari" args.database_password = "bigdata" args.sid_or_sname = "sname" @@ -1315,6 +1317,17 @@ def configure_database_password(showDefault=True): return password +def check_database_name_property(): + properties = get_ambari_properties() + if properties == -1: + print_error_msg ("Error getting ambari properties") + return -1 + + dbname = properties[JDBC_DATABASE_PROPERTY] + if dbname is None or dbname == "": + raise FatalException(-1, 'DB Name property not set in config file. '\ + 'If you recently upgraded, ensure that you ran "ambari-server upgrade". '\ + 'Otherwise, if it is a new installation, please run "ambari-server setup" first.') def configure_database_username_password(args): properties = get_ambari_properties() @@ -1324,10 +1337,12 @@ def configure_database_username_password(args): username = properties[JDBC_USER_NAME_PROPERTY] passwordProp = properties[JDBC_PASSWORD_PROPERTY] + dbname = properties[JDBC_DATABASE_PROPERTY] - if username and passwordProp: + if username and passwordProp and dbname: print_info_msg("Database username + password already configured") args.database_username=username + args.database_name = dbname if is_alias_string(passwordProp): args.database_password = decrypt_password_for_alias(JDBC_RCA_PASSWORD_ALIAS) else: @@ -1373,7 +1388,6 @@ def store_local_properties(args): properties.removeOldProp(JDBC_PORT_PROPERTY) properties.removeOldProp(JDBC_DRIVER_PROPERTY) properties.removeOldProp(JDBC_URL_PROPERTY) - #properties.removeOldProp(JDBC_DATABASE_PROPERTY) properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "local") properties.process_pair(JDBC_DATABASE_PROPERTY, args.database_name) properties.process_pair(JDBC_USER_NAME_PROPERTY, args.database_username) @@ -2048,6 +2062,7 @@ def reset(args): print "Resetting the Server database..." + check_database_name_property() parse_properties_file(args) # configure_database_username_password(args) @@ -2126,6 +2141,7 @@ def start(args): "command as root, as sudo or as user \"{1}\"".format(current_user, ambari_user) raise FatalException(1, err) + check_database_name_property() parse_properties_file(args) if os.path.exists(PID_DIR + os.sep + PID_NAME): f = open(PID_DIR + os.sep + PID_NAME, "r") @@ -2263,6 +2279,7 @@ def upgrade_stack(args, stack_id): err = 'Ambari-server upgradestack should be run with ' \ 'root-level privileges' raise FatalException(4, err) + check_database_name_property() #password access to ambari-server and mapred configure_database_username_password(args) dbname = args.database_name @@ -2291,6 +2308,21 @@ def upgrade(args): err = AMBARI_PROPERTIES_FILE + ' file can\'t be updated. Exiting' raise FatalException(retcode, err) + try: + check_database_name_property() + except FatalException: + properties = get_ambari_properties() + if properties == -1: + print_error_msg ("Error getting ambari properties") + return -1 + properties.process_pair(JDBC_DATABASE_PROPERTY, DEFAULT_DB_NAME) + conf_file = find_properties_file() + try: + properties.store(open(conf_file, "w")) + except Exception, e: + print_error_msg('Could not write ambari config file "%s": %s' % (conf_file, e)) + return -1 + parse_properties_file(args) if args.persistence_type == "remote": pass http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/c05f22cd/ambari-server/src/test/java/org/apache/ambari/server/configuration/ConfigurationTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/configuration/ConfigurationTest.java b/ambari-server/src/test/java/org/apache/ambari/server/configuration/ConfigurationTest.java index a46ec25..466cd30 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/configuration/ConfigurationTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/configuration/ConfigurationTest.java @@ -28,7 +28,10 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.lang.RandomStringUtils; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.ExpectedException; + import static org.mockito.Mockito.*; import static org.mockito.Matchers.*; @@ -192,4 +195,16 @@ public class ConfigurationTest { Assert.assertEquals(conf.getLocalDatabaseUrl(), Configuration.JDBC_LOCAL_URL.concat("ambaritestdatabase")); } + @Rule + public ExpectedException exception = ExpectedException.none(); + + @Test() + public void testGetLocalDatabaseUrlThrowException() { + Properties ambariProperties = new Properties(); + Configuration conf = new Configuration(ambariProperties); + exception.expect(RuntimeException.class); + exception.expectMessage("Server DB Name is not configured!"); + conf.getLocalDatabaseUrl(); + } + } http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/c05f22cd/ambari-server/src/test/python/TestAmbaryServer.py ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/python/TestAmbaryServer.py b/ambari-server/src/test/python/TestAmbaryServer.py index c619c18..28241df 100644 --- a/ambari-server/src/test/python/TestAmbaryServer.py +++ b/ambari-server/src/test/python/TestAmbaryServer.py @@ -1990,7 +1990,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(ambari_server, "parse_properties_file") @patch.object(ambari_server, "execute_remote_script") @patch.object(ambari_server, "is_root") - def test_reset(self, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock, + @patch.object(ambari_server, "check_database_name_property") + def test_reset(self, check_database_name_property_mock, is_root_mock, execute_remote_script_mock, parse_properties_file_mock, configure_database_username_password_mock, run_os_command_mock, print_info_msg_mock, setup_db_mock, get_YN_inputMock): @@ -2045,7 +2046,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(ambari_server, "run_os_command") @patch.object(ambari_server, "parse_properties_file") @patch.object(ambari_server, "is_root") - def test_silent_reset(self, is_root_mock, parse_properties_file_mock, + @patch.object(ambari_server, "check_database_name_property") + def test_silent_reset(self, check_database_name_property_mock, is_root_mock, parse_properties_file_mock, run_os_command_mock, print_info_msg_mock, setup_db_mock): is_root_mock.return_value = True @@ -2342,7 +2344,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(ambari_server, "configure_database_username_password") @patch.object(ambari_server, "run_os_command") @patch.object(ambari_server, "is_root") - def test_upgrade_stack(self, is_root_mock, run_os_command_mock, + @patch.object(ambari_server, "check_database_name_property") + def test_upgrade_stack(self, check_database_name_property_mock, is_root_mock, run_os_command_mock, configure_postgres_username_password_mock): args = MagicMock() @@ -2359,6 +2362,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV # Testing calls under root is_root_mock.return_value = True run_os_command_mock.return_value = (0, '', '') + check_database_name_property_mock.return_value = 1 ambari_server.upgrade_stack(args, 'HDP-2.0') self.assertTrue(configure_postgres_username_password_mock.called) @@ -2374,12 +2378,15 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(ambari_server, "update_ambari_properties") @patch.object(ambari_server, "parse_properties_file") @patch.object(ambari_server, "is_root") - def test_upgrade(self, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock, + @patch.object(ambari_server, "get_ambari_properties") + def test_upgrade(self, get_ambari_properties_mock, is_root_mock, parse_properties_file_mock, update_ambari_properties_mock, check_postgre_up_mock, execute_db_script_mock, check_db_consistency_mock, read_ambari_user_mock, print_warning_msg_mock, adjust_directory_permissions_mock): args = MagicMock() + check_database_name_property_mock = MagicMock() + args.upgrade_script_file = "/var/lib/"\ "ambari-server/resources/upgrade/ddl/"\ "Ambari-DDL-Postgres-UPGRADE-1.3.0.sql" @@ -2413,6 +2420,12 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV ambari_server.upgrade(args) self.assertTrue(adjust_directory_permissions_mock.called) + # Test if check_database_name_property raise exception + def effect(): + raise FatalException() + check_database_name_property_mock.side_effect = effect + ambari_server.upgrade(args) + self.assertTrue(get_ambari_properties_mock.called) def test_print_info_msg(self): out = StringIO.StringIO() @@ -2929,7 +2942,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV @patch.object(ambari_server, "setup_db") @patch.object(ambari_server, "run_os_command") @patch.object(ambari_server, "is_root") - def test_reset_remote_db_wo_client(self, is_root_mock, run_os_command_mock, setup_db_mock, + @patch.object(ambari_server, "check_database_name_property") + def test_reset_remote_db_wo_client(self, check_database_name_property_mock, is_root_mock, run_os_command_mock, setup_db_mock, get_YN_inputMock, print_error_msg_mock, get_db_cli_tool_mock, parse_properties_file_mock): args = MagicMock() get_YN_inputMock.return_value = True @@ -3262,8 +3276,11 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV sys.stdout = sys.__stdout__ + @patch.object(ambari_server, "check_database_name_property") @patch.object(ambari_server, "find_properties_file") - def test_parse_properties_file(self, find_properties_file_mock): + 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 @@ -3295,6 +3312,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV configs = {ambari_server.JDBC_USER_NAME_PROPERTY: "fakeuser", ambari_server.JDBC_PASSWORD_PROPERTY: "${alias=somealias}", + ambari_server.JDBC_DATABASE_PROPERTY: "fakedbname", ambari_server.SECURITY_KEY_IS_PERSISTED: "True" } get_ambari_properties_method.return_value = configs @@ -3995,3 +4013,96 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV self.assertEqual(None, args.database_username) self.assertEqual(None, result) + @patch.object(ambari_server, "get_ambari_properties") + def test_check_database_name_property(self, get_ambari_properties_mock): + # negative case + get_ambari_properties_mock.return_value = {ambari_server.JDBC_DATABASE_PROPERTY : ""} + try: + result = ambari_server.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 = {ambari_server.JDBC_DATABASE_PROPERTY : dbname} + try: + result = ambari_server.check_database_name_property() + except FatalException: + self.fail("Setup should be successful") + + @patch.object(ambari_server, "is_jdbc_user_changed") + @patch.object(ambari_server, 'verify_setup_allowed') + @patch.object(ambari_server, "get_YN_input") + @patch.object(ambari_server, "configure_os_settings") + @patch.object(ambari_server, "download_jdk") + @patch.object(ambari_server, "configure_postgres") + @patch.object(ambari_server, "check_postgre_up") + @patch.object(ambari_server, "check_iptables") + @patch.object(ambari_server, "check_ambari_user") + @patch.object(ambari_server, "check_jdbc_drivers") + @patch.object(ambari_server, "check_selinux") + @patch.object(ambari_server, "is_local_database") + @patch.object(ambari_server, "is_root") + @patch.object(ambari_server, "setup_db") + @patch.object(ambari_server, "get_is_secure") + @patch.object(ambari_server, "store_password_file") + @patch("sys.exit") + @patch('__builtin__.raw_input') + def test_ambariServerSetupWithCustomDbName(self, raw_input, exit_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_iptables_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): + + 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 + check_jdbc_drivers_mock.return_value = 0 + check_iptables_mock.return_value = (0, "other") + check_postgre_up_mock.return_value = 0 + is_local_database_mock.return_value = True + 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 + get_is_secure_mock.return_value = False + store_password_file_mock.return_value = "password" + + new_db = "newDBName" + args.database_name = new_db + args.database_username = "user" + args.database_password = "password" + + tempdir = tempfile.gettempdir() + prop_file = os.path.join(tempdir, "ambari.properties") + with open(prop_file, "w") as f: + f.write("server.jdbc.database=oldDBName") + f.close() + + with open(ambari_server.AMBARI_PROPERTIES_FILE, "w") as f: + f.write("server.jdbc.database=oldDBName") + f.close() + + os.environ[ambari_server.AMBARI_CONF_VAR] = tempdir + + try: + result = ambari_server.setup(args) + except FatalException: + self.fail("Setup should be successful") + + properties = ambari_server.get_ambari_properties() + + self.assertTrue(ambari_server.JDBC_DATABASE_PROPERTY in properties.keys()) + value = properties[ambari_server.JDBC_DATABASE_PROPERTY] + self.assertEqual(value, new_db) + + del os.environ[ambari_server.AMBARI_CONF_VAR] + os.remove(prop_file)
