Repository: ambari
Updated Branches:
  refs/heads/trunk 18340ef32 -> 3667b2b1b


AMBARI-6602. Error upgrading from 1.6.0 to 1.6.1 using external Postgres DB. 
(Alejandro Fernandez via swagle)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/3667b2b1
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/3667b2b1
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/3667b2b1

Branch: refs/heads/trunk
Commit: 3667b2b1b10e2ab7db6026db699176facc60d0ff
Parents: 18340ef
Author: Siddharth Wagle <swa...@hortonworks.com>
Authored: Thu Jul 31 13:55:43 2014 -0700
Committer: Siddharth Wagle <swa...@hortonworks.com>
Committed: Thu Jul 31 13:55:43 2014 -0700

----------------------------------------------------------------------
 .../server/configuration/Configuration.java     |   9 +-
 .../ambari/server/orm/DBAccessorImpl.java       |  39 ++++---
 .../server/upgrade/AbstractUpgradeCatalog.java  |  17 +--
 .../server/upgrade/UpgradeCatalog150.java       |   2 +-
 ambari-server/src/main/python/ambari-server.py  |  68 +++++++-----
 .../server/configuration/ConfigurationTest.java |   2 +-
 .../src/test/python/TestAmbariServer.py         | 107 ++++++++++++++++---
 ambari-server/src/test/python/TestOSCheck.py    |   2 +-
 ambari-server/src/test/python/ambari.properties |   2 +-
 ambari-web/app/utils/ajax/ajax.js               |   2 +-
 10 files changed, 182 insertions(+), 68 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/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 68df120..29f7a9b 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
@@ -106,9 +106,10 @@ public class Configuration {
   public static final String CLIENT_API_SSL_CRT_PASS_FILE_NAME_KEY = 
"client.api.ssl.cert_pass_file";
   public static final String CLIENT_API_SSL_CRT_PASS_KEY = 
"client.api.ssl.crt_pass";
   public static final String CLIENT_API_SSL_KEY_NAME_KEY = 
"client.api.ssl.key_name";
-  public static final String SERVER_DB_NAME_KEY = "server.jdbc.database";
+  public static final String SERVER_DB_TYPE_KEY = "server.jdbc.database";      
 // E.g., oracle|mysql|postgres
+  public static final String SERVER_DB_NAME_KEY = "server.jdbc.database_name";
   public static final String SERVER_DB_NAME_DEFAULT = "ambari";
-  public static final String SERVER_JDBC_SCHEMA_NAME = "server.jdbc.schema";
+  public static final String SERVER_JDBC_POSTGRES_SCHEMA_NAME = 
"server.jdbc.postgres.schema";
   public static final String POSTGRES_DB_NAME = "postgres";
   public static final String ORACLE_DB_NAME = "oracle";
   public static final String MYSQL_DB_NAME = "mysql";
@@ -1003,8 +1004,8 @@ public class Configuration {
     return properties.getProperty(RESOURCES_DIR_KEY, RESOURCES_DIR_DEFAULT);
   }
 
-  public String getServerJDBCSchemaName() {
-    return properties.getProperty(SERVER_JDBC_SCHEMA_NAME, 
SERVER_DB_NAME_DEFAULT);
+  public String getServerJDBCPostgresSchemaName() {
+    return properties.getProperty(SERVER_JDBC_POSTGRES_SCHEMA_NAME, "");
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
index b1fc234..92350be 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
@@ -30,6 +30,8 @@ import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.regex.Pattern;
+import java.util.regex.Matcher;
 
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.orm.helpers.ScriptRunner;
@@ -63,6 +65,8 @@ public class DBAccessorImpl implements DBAccessor {
   private final DbmsHelper dbmsHelper;
   private Configuration configuration;
   private DatabaseMetaData databaseMetaData;
+  private static final String dbURLPatternString = "jdbc:(.*?):.*";
+  private Pattern dbURLPattern = Pattern.compile(dbURLPatternString, 
Pattern.CASE_INSENSITIVE);
 
   @Inject
   public DBAccessorImpl(Configuration configuration) {
@@ -176,21 +180,30 @@ public class DBAccessorImpl implements DBAccessor {
 
   protected String getDbType() {
     String dbUrl = configuration.getDatabaseUrl();
-    String dbType;
-
-    if (dbUrl.contains(Configuration.POSTGRES_DB_NAME)) {
-      dbType = Configuration.POSTGRES_DB_NAME;
-    } else if (dbUrl.contains(Configuration.ORACLE_DB_NAME)) {
-      dbType = Configuration.ORACLE_DB_NAME;
-    } else if (dbUrl.contains(Configuration.MYSQL_DB_NAME)) {
-      dbType = Configuration.MYSQL_DB_NAME;
-    } else if (dbUrl.contains(Configuration.DERBY_DB_NAME)) {
-      dbType = Configuration.DERBY_DB_NAME;
-    } else {
-      throw new RuntimeException("Unable to determine database type.");
+
+    // dbUrl will have the following format
+    // jdbc:{0}://{1}:{2}/{3},  type, host, port, name
+    // Most importantly, type is one of: postgresql, oracle:thin, mysql
+
+    if (null != dbUrl && !dbUrl.equals("")) {
+      Matcher m = dbURLPattern.matcher(dbUrl.toLowerCase());
+
+      if (m.find() && m.groupCount() == 1) {
+        String type = m.group(1);
+
+        if (type.contains(Configuration.POSTGRES_DB_NAME)) {
+          return Configuration.POSTGRES_DB_NAME;
+        } else if (type.contains(Configuration.ORACLE_DB_NAME)) {
+          return Configuration.ORACLE_DB_NAME;
+        } else if (type.contains(Configuration.MYSQL_DB_NAME)) {
+          return Configuration.MYSQL_DB_NAME;
+        } else if (type.contains(Configuration.DERBY_DB_NAME)) {
+          return Configuration.DERBY_DB_NAME;
+        }
+      }
     }
 
-    return dbType;
+    throw new RuntimeException("Unable to determine database type.");
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
index e697fbd..8e3b8c5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
@@ -164,16 +164,17 @@ public abstract class AbstractUpgradeCatalog implements 
UpgradeCatalog {
 
   protected void changePostgresSearchPath() throws SQLException {
     String dbUser = configuration.getDatabaseUser();
-    String dbName = configuration.getServerDBName();
+    String schemaName = configuration.getServerJDBCPostgresSchemaName();
 
-    //wrap username with double quotes to accept old username "ambari-server"
-    if (!dbUser.contains("\"")) {
-      dbUser = String.format("\"%s\"", dbUser);
-    }
-
-    dbAccessor.executeQuery(String.format("ALTER SCHEMA %s OWNER TO %s;", 
dbName, dbUser));
+    if (null != dbUser && !dbUser.equals("") && null != schemaName && 
!schemaName.equals("")) {
+      // Wrap username with double quotes to accept old username 
"ambari-server"
+      if (!dbUser.contains("\"")) {
+        dbUser = String.format("\"%s\"", dbUser);
+      }
 
-    dbAccessor.executeQuery(String.format("ALTER ROLE %s SET search_path to 
'%s';", dbUser, dbName));
+      dbAccessor.executeQuery(String.format("ALTER SCHEMA %s OWNER TO %s;", 
schemaName, dbUser));
+      dbAccessor.executeQuery(String.format("ALTER ROLE %s SET search_path to 
'%s';", dbUser, schemaName));
+    }
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
index 451cd6d..29b0418 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog150.java
@@ -293,7 +293,7 @@ public class UpgradeCatalog150 extends 
AbstractUpgradeCatalog {
 
     //Move tables from ambarirca db to ambari db; drop ambarirca; Mysql
     if (dbType.equals(Configuration.MYSQL_DB_NAME)) {
-      String dbName = configuration.getServerJDBCSchemaName();
+      String dbName = configuration.getServerJDBCPostgresSchemaName();
       moveRCATableInMySQL("workflow", dbName);
       moveRCATableInMySQL("job", dbName);
       moveRCATableInMySQL("task", dbName);

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/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 b61e76e..ffb25bb 100755
--- a/ambari-server/src/main/python/ambari-server.py
+++ b/ambari-server/src/main/python/ambari-server.py
@@ -268,12 +268,11 @@ POSTGRESQL_CONF_FILE = os.path.join(PG_HBA_DIR, 
"postgresql.conf")
 
 SERVER_VERSION_FILE_PATH = "server.version.file"
 
-#TODO property used incorrectly in local case, it was meant to be dbms name, 
not postgres database name,
-# has workaround for now, as we don't need dbms name if persistence_type=local
-JDBC_DATABASE_PROPERTY = "server.jdbc.database"
+JDBC_DATABASE_PROPERTY = "server.jdbc.database"             # E.g., 
embedded|oracle|mysql|postgres
+JDBC_DATABASE_NAME_PROPERTY = "server.jdbc.database_name"   # E.g., ambari
 JDBC_HOSTNAME_PROPERTY = "server.jdbc.hostname"
 JDBC_PORT_PROPERTY = "server.jdbc.port"
-JDBC_SCHEMA_PROPERTY = "server.jdbc.schema"
+JDBC_POSTGRES_SCHEMA_PROPERTY = "server.jdbc.postgres.schema"   # Only for 
postgres, defaults to same value as DB name
 
 JDBC_USER_NAME_PROPERTY = "server.jdbc.user.name"
 JDBC_PASSWORD_PROPERTY = "server.jdbc.user.passwd"
@@ -293,11 +292,6 @@ PERSISTENCE_TYPE_PROPERTY = "server.persistence.type"
 JDBC_DRIVER_PROPERTY = "server.jdbc.driver"
 JDBC_URL_PROPERTY = "server.jdbc.url"
 
-JDBC_RCA_DATABASE_PROPERTY = "server.jdbc.database"
-JDBC_RCA_HOSTNAME_PROPERTY = "server.jdbc.hostname"
-JDBC_RCA_PORT_PROPERTY = "server.jdbc.port"
-JDBC_RCA_SCHEMA_PROPERTY = "server.jdbc.schema"
-
 JDBC_RCA_DRIVER_PROPERTY = "server.jdbc.rca.driver"
 JDBC_RCA_URL_PROPERTY = "server.jdbc.rca.url"
 JDBC_RCA_USER_NAME_PROPERTY = "server.jdbc.rca.user.name"
@@ -1128,6 +1122,14 @@ def get_validated_db_name(database_name):
         False
         )
 
+def get_validated_db_schema(postgres_schema):
+    return get_validated_string_input(
+        "Postgres schema (" + postgres_schema + "): ",
+        postgres_schema,
+        "^[a-zA-Z0-9_\-]*$",
+        "Invalid schema name.",
+        False, allowEmpty=True
+    )
 
 def get_validated_service_name(service_name, index):
   return get_validated_string_input(
@@ -1182,6 +1184,7 @@ def load_default_db_properties(args):
   args.database_host = "localhost"
   args.database_port = DATABASE_PORTS[DATABASE_INDEX]
   args.database_name = DEFAULT_DB_NAME
+  args.postgres_schema = DEFAULT_DB_NAME
   args.database_username = "ambari"
   args.database_password = "bigdata"
   args.sid_or_sname = "sname"
@@ -1272,6 +1275,8 @@ def prompt_db_properties(args):
         elif args.dbms in ["mysql", "postgres"]:
           args.database_name = get_validated_db_name(args.database_name)
 
+          if args.dbms in ["postgres", ]:
+              args.postgres_schema = 
get_validated_db_schema(args.postgres_schema)
         else:
           # other DB types
           pass
@@ -1281,7 +1286,8 @@ def prompt_db_properties(args):
         args.database_port = DATABASE_PORTS[DATABASE_INDEX]
 
         args.database_name = get_validated_db_name(args.database_name)
-        pass
+        if args.dbms in ["postgres", ]:
+            args.postgres_schema = 
get_validated_db_schema(args.postgres_schema)
 
       # Username is common for Oracle/MySQL/Postgres
       args.database_username = get_validated_string_input(
@@ -1294,11 +1300,12 @@ def prompt_db_properties(args):
       )
       args.database_password = configure_database_password(True)
 
-  print_info_msg('Using database options: 
{database},{host},{port},{schema},{user},{password}'.format(
+  print_info_msg('Using database options: 
{database},{host},{port},{name},{schema},{user},{password}'.format(
     database=args.dbms,
     host=args.database_host,
     port=args.database_port,
-    schema=args.database_name,
+    name=args.database_name,
+    schema=args.postgres_schema,
     user=args.database_username,
     password=args.database_password
   ))
@@ -1318,8 +1325,9 @@ def store_remote_properties(args):
   properties.process_pair(JDBC_DATABASE_PROPERTY, args.dbms)
   properties.process_pair(JDBC_HOSTNAME_PROPERTY, args.database_host)
   properties.process_pair(JDBC_PORT_PROPERTY, args.database_port)
-  properties.process_pair(JDBC_SCHEMA_PROPERTY, args.database_name)
-
+  properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, args.database_name)
+  if args.dbms == "postgres":
+    properties.process_pair(JDBC_POSTGRES_SCHEMA_PROPERTY, 
args.postgres_schema)
   properties.process_pair(JDBC_DRIVER_PROPERTY, 
DATABASE_DRIVER_NAMES[DATABASE_INDEX])
   # fully qualify the hostname to make sure all the other hosts can connect
   # to the jdbc hostname since its passed onto the agents for RCA
@@ -1477,7 +1485,7 @@ def check_database_name_property():
     print_error_msg("Error getting ambari properties")
     return -1
 
-  dbname = properties[JDBC_DATABASE_PROPERTY]
+  dbname = properties[JDBC_DATABASE_NAME_PROPERTY]
   if dbname is None or dbname == "":
     err = "DB Name property not set in config file.\n" + SETUP_OR_UPGRADE_MSG
     raise FatalException(-1, err)
@@ -1491,7 +1499,7 @@ def configure_database_username_password(args):
 
   username = properties[JDBC_USER_NAME_PROPERTY]
   passwordProp = properties[JDBC_PASSWORD_PROPERTY]
-  dbname = properties[JDBC_DATABASE_PROPERTY]
+  dbname = properties[JDBC_DATABASE_NAME_PROPERTY]
 
   if username and passwordProp and dbname:
     print_info_msg("Database username + password already configured")
@@ -1537,15 +1545,22 @@ def store_local_properties(args):
 
   isSecure = get_is_secure(properties)
 
-  properties.removeOldProp(JDBC_SCHEMA_PROPERTY)
+  properties.removeOldProp(JDBC_DATABASE_PROPERTY)
+  properties.removeOldProp(JDBC_DATABASE_NAME_PROPERTY)
+  properties.removeOldProp(JDBC_POSTGRES_SCHEMA_PROPERTY)
   properties.removeOldProp(JDBC_HOSTNAME_PROPERTY)
   properties.removeOldProp(JDBC_RCA_DRIVER_PROPERTY)
   properties.removeOldProp(JDBC_RCA_URL_PROPERTY)
   properties.removeOldProp(JDBC_PORT_PROPERTY)
   properties.removeOldProp(JDBC_DRIVER_PROPERTY)
   properties.removeOldProp(JDBC_URL_PROPERTY)
+
+  # Store the properties
   properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "local")
-  properties.process_pair(JDBC_DATABASE_PROPERTY, args.database_name)
+  properties.process_pair(JDBC_DATABASE_PROPERTY, args.dbms)
+  properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, args.database_name)
+  if args.dbms == "postgres":
+    properties.process_pair(JDBC_POSTGRES_SCHEMA_PROPERTY, 
args.postgres_schema)
   properties.process_pair(JDBC_USER_NAME_PROPERTY, args.database_username)
   properties.process_pair(JDBC_PASSWORD_PROPERTY,
       store_password_file(args.database_password, JDBC_PASSWORD_FILENAME))
@@ -1592,23 +1607,22 @@ def parse_properties_file(args):
   args.persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
   args.jdbc_url = properties[JDBC_URL_PROPERTY]
 
+  args.dbms = properties[JDBC_DATABASE_PROPERTY]
   if not args.persistence_type:
     args.persistence_type = "local"
 
   if args.persistence_type == 'remote':
-    args.dbms = properties[JDBC_DATABASE_PROPERTY]
     args.database_host = properties[JDBC_HOSTNAME_PROPERTY]
     args.database_port = properties[JDBC_PORT_PROPERTY]
-    args.database_name = properties[JDBC_SCHEMA_PROPERTY]
     global DATABASE_INDEX
     try:
       DATABASE_INDEX = DATABASE_NAMES.index(args.dbms)
     except ValueError:
       pass
-  else:
-    #TODO incorrect property used!! leads to bunch of troubles. Workaround for 
now
-    args.database_name = properties[JDBC_DATABASE_PROPERTY]
 
+  args.database_name = properties[JDBC_DATABASE_NAME_PROPERTY]
+  args.postgres_schema = properties[JDBC_POSTGRES_SCHEMA_PROPERTY] \
+      if JDBC_POSTGRES_SCHEMA_PROPERTY in properties.propertyNames() else None
   args.database_username = properties[JDBC_USER_NAME_PROPERTY]
   args.database_password_file = properties[JDBC_PASSWORD_PROPERTY]
   if args.database_password_file:
@@ -2791,9 +2805,9 @@ def upgrade(args):
     if properties == -1:
       print_error_msg("Error getting ambari properties")
       return -1
-    print_warning_msg(JDBC_DATABASE_PROPERTY + " property isn't set in " +
+    print_warning_msg(JDBC_DATABASE_NAME_PROPERTY + " property isn't set in " +
     AMBARI_PROPERTIES_FILE + ". Setting it to default value - " + 
DEFAULT_DB_NAME)
-    properties.process_pair(JDBC_DATABASE_PROPERTY, DEFAULT_DB_NAME)
+    properties.process_pair(JDBC_DATABASE_NAME_PROPERTY, DEFAULT_DB_NAME)
     conf_file = find_properties_file()
     try:
       properties.store(open(conf_file, "w"))
@@ -4158,8 +4172,10 @@ def main():
   parser.add_option('--database', default=None, help="Database to use 
embedded|oracle|mysql|postgres", dest="dbms")
   parser.add_option('--databasehost', default=None, help="Hostname of database 
server", dest="database_host")
   parser.add_option('--databaseport', default=None, help="Database port", 
dest="database_port")
-  parser.add_option('--databasename', default=None, 
help="Database/Schema/Service name or ServiceID",
+  parser.add_option('--databasename', default=None, help="Database/Service 
name or ServiceID",
                     dest="database_name")
+  parser.add_option('--postgresschema', default=None, help="Postgres database 
schema name",
+                    dest="postgres_schema")
   parser.add_option('--databaseusername', default=None, help="Database user 
login", dest="database_username")
   parser.add_option('--databasepassword', default=None, help="Database user 
password", dest="database_password")
   parser.add_option('--sidorsname', default="sname", help="Oracle database 
identifier type, Service ID/Service "

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/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 c47c7fb..79d44b0 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
@@ -210,7 +210,7 @@ public class ConfigurationTest {
   @Test
   public void testGetLocalDatabaseUrl() {
     Properties ambariProperties = new Properties();
-    ambariProperties.setProperty("server.jdbc.database", "ambaritestdatabase");
+    ambariProperties.setProperty("server.jdbc.database_name", 
"ambaritestdatabase");
     Configuration conf = new Configuration(ambariProperties);
     Assert.assertEquals(conf.getLocalDatabaseUrl(), 
Configuration.JDBC_LOCAL_URL.concat("ambaritestdatabase"));
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/test/python/TestAmbariServer.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestAmbariServer.py 
b/ambari-server/src/test/python/TestAmbariServer.py
index 4a5c21f..ea3e72b 100644
--- a/ambari-server/src/test/python/TestAmbariServer.py
+++ b/ambari-server/src/test/python/TestAmbariServer.py
@@ -20,9 +20,7 @@ import StringIO
 import re
 from unittest import TestCase
 import sys
-from mock.mock import patch
-from mock.mock import MagicMock
-from mock.mock import create_autospec
+from mock.mock import patch, MagicMock, create_autospec
 import os, errno, tempfile
 import signal
 import stat
@@ -2165,7 +2163,7 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   def test_prompt_db_properties_postgre_adv(self, gyni_mock, gvsi_mock, 
rp_mock, smk_mock):
     ambari_server.PROMPT_DATABASE_OPTIONS = True
     gyni_mock.return_value = True
-    list_of_return_values = ["ambari-server", "ambari", "1"]
+    list_of_return_values = ["ambari-server", "ambari", "ambari", "1"]
 
     def side_effect(*args, **kwargs):
       return list_of_return_values.pop()
@@ -2184,6 +2182,88 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     self.assertEqual(args.database_username, "ambari-server")
     self.assertEqual(args.sid_or_sname, "sname")
 
+  @patch.object(ambari_server, "setup_master_key")
+  @patch.object(ambari_server, "read_password")
+  @patch.object(ambari_server, "get_validated_string_input")
+  @patch.object(ambari_server, "get_YN_input")
+  def test_prompt_db_properties_for_each_database_type(self, gyni_mock, 
gvsi_mock, rp_mock, smk_mock):
+    """
+    :return: Validates that installation for each database type correctly 
stores the database type, database name,
+    and optionally the postgres schema name.
+    """
+    ambari_server.PROMPT_DATABASE_OPTIONS = True
+    gyni_mock.return_value = True
+    rp_mock.return_value = "password"
+    smk_mock.return_value = (None, False, True)
+
+    # Values to use while installing several database types
+    hostname = "localhost"
+    db_name = "db_ambari"
+    postgres_schema = "sc_ambari"
+    port = "1234"
+    oracle_service = "1"
+    oracle_service_name = "ambari"
+    user_name = "ambari"
+
+    # Input values
+    postgres_embedded_values = ["1", db_name, postgres_schema, hostname]
+    oracle_values = ["2", hostname, port, oracle_service, oracle_service_name, 
user_name]
+    mysql_values = ["3", hostname, port, db_name, user_name]
+    postgres_external_values = ["4", hostname, port, db_name, postgres_schema, 
user_name]
+
+    list_of_return_values = postgres_embedded_values + oracle_values + 
mysql_values + postgres_external_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_server.AMBARI_CONF_VAR in os.environ:
+      del os.environ[ambari_server.AMBARI_CONF_VAR]
+
+    tempdir = tempfile.gettempdir()
+    os.environ[ambari_server.AMBARI_CONF_VAR] = tempdir
+
+    for i in range(1, 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.
+        prop_file = os.path.join(tempdir, "ambari.properties")
+        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()
+        ambari_server.AMBARI_PROPERTIES_FILE = prop_file
+
+        args = MagicMock()
+        ambari_server.load_default_db_properties(args)
+        ambari_server.prompt_db_properties(args)
+
+        if i == 1:
+          ambari_server.store_local_properties(args)          # Embedded 
postgres is the only one that saves local properties
+        else:
+          ambari_server.store_remote_properties(args)
+
+        properties = ambari_server.get_ambari_properties()
+        if i == 1:
+          # Postgres Embedded
+          self.assertEqual(properties[ambari_server.JDBC_DATABASE_PROPERTY], 
"postgres")
+          
self.assertEqual(properties[ambari_server.JDBC_DATABASE_NAME_PROPERTY], db_name)
+          
self.assertEqual(properties[ambari_server.JDBC_POSTGRES_SCHEMA_PROPERTY], 
postgres_schema)
+        elif i == 2:
+          # Oracle
+          self.assertEqual(properties[ambari_server.JDBC_DATABASE_PROPERTY], 
"oracle")
+          self.assertFalse(ambari_server.JDBC_POSTGRES_SCHEMA_PROPERTY in 
properties.propertyNames())
+        elif i == 3:
+          # MySQL
+          self.assertEqual(properties[ambari_server.JDBC_DATABASE_PROPERTY], 
"mysql")
+          self.assertFalse(ambari_server.JDBC_POSTGRES_SCHEMA_PROPERTY in 
properties.propertyNames())
+        elif i == 4:
+          # Postgres External
+          self.assertEqual(properties[ambari_server.JDBC_DATABASE_PROPERTY], 
"postgres")
+          
self.assertEqual(properties[ambari_server.JDBC_DATABASE_NAME_PROPERTY], db_name)
+          
self.assertEqual(properties[ambari_server.JDBC_POSTGRES_SCHEMA_PROPERTY], 
postgres_schema)
+
   @patch.object(os.path, "exists")
   def test_validate_jdk(self, exists_mock):
     exists_mock.side_effect = [False]
@@ -3446,14 +3526,14 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     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=ambari\n",
+                  "server.jdbc.database_name=ambari\n",
                   "ambari-server.user=ambari\n",
                   "agent.fqdn.service.url=URL\n"]
 
     NEW_PROPERTY = 'some_new_property=some_value\n'
     JDK_NAME_PROPERTY = 'jdk.name=jdk-6u31-linux-x64.bin\n'
     JCE_NAME_PROPERTY = 'jce.name=jce_policy-6.zip\n'
-    CHANGED_VALUE_PROPERTY = 
'server.jdbc.database=should_not_overwrite_value\n'
+    CHANGED_VALUE_PROPERTY = 
'server.jdbc.database_name=should_not_overwrite_value\n'
 
     get_conf_dir_mock.return_value = '/etc/ambari-server/conf'
 
@@ -3651,6 +3731,7 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     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"
@@ -4041,7 +4122,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.JDBC_DATABASE_NAME_PROPERTY: "fakedbname",
                ambari_server.SECURITY_KEY_IS_PERSISTED: "True"}
 
     get_ambari_properties_method.return_value = configs
@@ -4740,7 +4821,7 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @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: ""}
+    get_ambari_properties_mock.return_value = 
{ambari_server.JDBC_DATABASE_NAME_PROPERTY: ""}
     try:
       result = ambari_server.check_database_name_property()
       self.fail("Should fail with exception")
@@ -4750,7 +4831,7 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     # positive case
     dbname = "ambari"
     get_ambari_properties_mock.reset_mock()
-    get_ambari_properties_mock.return_value = 
{ambari_server.JDBC_DATABASE_PROPERTY: dbname}
+    get_ambari_properties_mock.return_value = 
{ambari_server.JDBC_DATABASE_NAME_PROPERTY: dbname}
     try:
       result = ambari_server.check_database_name_property()
     except FatalException:
@@ -4802,7 +4883,9 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     store_password_file_mock.return_value = "password"
 
     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
@@ -4811,7 +4894,7 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     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.write("server.jdbc.database_name=oldDBName")
     f.close()
 
     os.environ[ambari_server.AMBARI_CONF_VAR] = tempdir
@@ -4823,8 +4906,8 @@ 
MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
 
     properties = ambari_server.get_ambari_properties()
 
-    self.assertTrue(ambari_server.JDBC_DATABASE_PROPERTY in properties.keys())
-    value = properties[ambari_server.JDBC_DATABASE_PROPERTY]
+    self.assertTrue(ambari_server.JDBC_DATABASE_NAME_PROPERTY in 
properties.keys())
+    value = properties[ambari_server.JDBC_DATABASE_NAME_PROPERTY]
     self.assertEqual(value, new_db)
 
     del os.environ[ambari_server.AMBARI_CONF_VAR]

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/test/python/TestOSCheck.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestOSCheck.py 
b/ambari-server/src/test/python/TestOSCheck.py
index 8985fdc..de4b1e6 100644
--- a/ambari-server/src/test/python/TestOSCheck.py
+++ b/ambari-server/src/test/python/TestOSCheck.py
@@ -187,7 +187,7 @@ class TestOSCheck(TestCase):
   def test_update_ambari_properties_os(self, get_conf_dir_mock):
 
     properties = ["server.jdbc.user.name=ambari-server\n",
-                  "server.jdbc.database=ambari\n",
+                  "server.jdbc.database_name=ambari\n",
                   "ambari-server.user=root\n",
                   "server.jdbc.user.name=ambari-server\n",
                   "jdk.name=jdk-6u31-linux-x64.bin\n",

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-server/src/test/python/ambari.properties
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/ambari.properties 
b/ambari-server/src/test/python/ambari.properties
index 737555e..ff9f4a4 100644
--- a/ambari-server/src/test/python/ambari.properties
+++ b/ambari-server/src/test/python/ambari.properties
@@ -16,4 +16,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-server.jdbc.database=oldDBName
\ No newline at end of file
+server.jdbc.database_name=oldDBName
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/3667b2b1/ambari-web/app/utils/ajax/ajax.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/utils/ajax/ajax.js 
b/ambari-web/app/utils/ajax/ajax.js
index 584ed7b..041db0c 100644
--- a/ambari-web/app/utils/ajax/ajax.js
+++ b/ambari-web/app/utils/ajax/ajax.js
@@ -352,7 +352,7 @@ var urls = {
     'mock': '/data/clusters/tags_and_groups.json'
   },
   'config.ambari.database.info': {
-    'real': 
'/services/AMBARI/components/AMBARI_SERVER?fields=hostComponents/RootServiceHostComponents/properties/server.jdbc.database,hostComponents/RootServiceHostComponents/properties/server.jdbc.url',
+    'real': 
'/services/AMBARI/components/AMBARI_SERVER?fields=hostComponents/RootServiceHostComponents/properties/server.jdbc.database_name,hostComponents/RootServiceHostComponents/properties/server.jdbc.url',
     'mock': ''
   },
   'config_groups.all_fields': {

Reply via email to