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)

Reply via email to