Browse Source

AMBARI-2331. Ambari Database setup process needs cleanup. (Myroslav Papirkovskyy via mahadev)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/trunk@1491056 13f79535-47bb-0310-9956-ffa450edef68
Mahadev Konar 12 years ago
parent
commit
3f9e1c34ba

+ 0 - 1
ambari-server/conf/unix/ambari.properties

@@ -26,6 +26,5 @@ webapp.dir=/usr/lib/ambari-server/web
 bootstrap.dir=/var/run/ambari-server/bootstrap
 bootstrap.dir=/var/run/ambari-server/bootstrap
 bootstrap.script=/usr/lib/python2.6/site-packages/ambari_server/bootstrap.py
 bootstrap.script=/usr/lib/python2.6/site-packages/ambari_server/bootstrap.py
 bootstrap.setup_agent.script=/usr/lib/python2.6/site-packages/ambari_server/setupAgent.py
 bootstrap.setup_agent.script=/usr/lib/python2.6/site-packages/ambari_server/setupAgent.py
-server.persistence.inMemory=false
 api.authenticate=true
 api.authenticate=true
 server.connection.max.idle.millis=900000
 server.connection.max.idle.millis=900000

+ 21 - 0
ambari-server/pom.xml

@@ -313,6 +313,27 @@
                 <source>
                 <source>
                   <location>src/main/resources/Ambari-DDL-Postgres-DROP.sql</location>
                   <location>src/main/resources/Ambari-DDL-Postgres-DROP.sql</location>
                 </source>
                 </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql</location>
+                  <filter>true</filter>
+                </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-Postgres-REMOTE-DROP.sql</location>
+                </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-Oracle-CREATE.sql</location>
+                  <filter>true</filter>
+                </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-MySQL-CREATE.sql</location>
+                  <filter>true</filter>
+                </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-Oracle-DROP.sql</location>
+                </source>
+                <source>
+                  <location>src/main/resources/Ambari-DDL-MySQL-DROP.sql</location>
+                </source>
               </sources>
               </sources>
             </mapping>
             </mapping>
             <mapping>
             <mapping>

+ 0 - 7
ambari-server/sbin/ambari-server

@@ -86,13 +86,6 @@ case "$1" in
         $PYTHON /usr/sbin/ambari-server.py $@
         $PYTHON /usr/sbin/ambari-server.py $@
         ;;
         ;;
   setup)
   setup)
-        echo -e "Run postgresql initdb"
-        initdb_res=`/sbin/service postgresql initdb`
-        if [ "0" == "$?" ]; then
-          echo -e "${initdb_res}"
-        fi
-        echo -e "Run postgresql start"
-        /sbin/service postgresql start
         echo -e "Setup ambari-server"
         echo -e "Setup ambari-server"
         $PYTHON /usr/sbin/ambari-server.py $@
         $PYTHON /usr/sbin/ambari-server.py $@
         ;;
         ;;

+ 460 - 188
ambari-server/src/main/python/ambari-server.py

@@ -39,7 +39,6 @@ import datetime
 # debug settings
 # debug settings
 VERBOSE = False
 VERBOSE = False
 SILENT = False
 SILENT = False
-REMOTE_DATABASE = False
 SERVER_START_DEBUG = False
 SERVER_START_DEBUG = False
 
 
 # action commands
 # action commands
@@ -108,6 +107,7 @@ SETUP_DB_CMD = ['su', '-', 'postgres',
 UPGRADE_STACK_CMD = ['su', 'postgres',
 UPGRADE_STACK_CMD = ['su', 'postgres',
         '--command=psql -f {0} -v stack_name="\'{1}\'"  -v stack_version="\'{2}\'"']
         '--command=psql -f {0} -v stack_name="\'{1}\'"  -v stack_version="\'{2}\'"']
 PG_ST_CMD = "/sbin/service postgresql status"
 PG_ST_CMD = "/sbin/service postgresql status"
+PG_INITDB_CMD = "/sbin/service postgresql initdb"
 PG_START_CMD = "/sbin/service postgresql start"
 PG_START_CMD = "/sbin/service postgresql start"
 PG_RESTART_CMD = "/sbin/service postgresql restart"
 PG_RESTART_CMD = "/sbin/service postgresql restart"
 PG_STATUS_RUNNING = "running"
 PG_STATUS_RUNNING = "running"
@@ -117,6 +117,12 @@ PG_HBA_CONF_FILE_BACKUP = PG_HBA_DIR + "pg_hba_bak.conf.old"
 POSTGRESQL_CONF_FILE = PG_HBA_DIR + "postgresql.conf"
 POSTGRESQL_CONF_FILE = PG_HBA_DIR + "postgresql.conf"
 PG_HBA_RELOAD_CMD = "su postgres --command='pg_ctl -D {0} reload'"
 PG_HBA_RELOAD_CMD = "su postgres --command='pg_ctl -D {0} reload'"
 PG_DEFAULT_PASSWORD = "bigdata"
 PG_DEFAULT_PASSWORD = "bigdata"
+
+JDBC_DATABASE_PROPERTY = "server.jdbc.database"
+JDBC_HOSTNAME_PROPERTY = "server.jdbc.hostname"
+JDBC_PORT_PROPERTY = "server.jdbc.port"
+JDBC_SCHEMA_PROPERTY = "server.jdbc.schema"
+
 JDBC_USER_NAME_PROPERTY = "server.jdbc.user.name"
 JDBC_USER_NAME_PROPERTY = "server.jdbc.user.name"
 JDBC_PASSWORD_FILE_PROPERTY = "server.jdbc.user.passwd"
 JDBC_PASSWORD_FILE_PROPERTY = "server.jdbc.user.passwd"
 JDBC_PASSWORD_FILENAME = "password.dat"
 JDBC_PASSWORD_FILENAME = "password.dat"
@@ -126,13 +132,45 @@ PERSISTENCE_TYPE_PROPERTY = "server.persistence.type"
 JDBC_DRIVER_PROPERTY = "server.jdbc.driver"
 JDBC_DRIVER_PROPERTY = "server.jdbc.driver"
 JDBC_URL_PROPERTY = "server.jdbc.url"
 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_DRIVER_PROPERTY = "server.jdbc.rca.driver"
 JDBC_RCA_URL_PROPERTY = "server.jdbc.rca.url"
 JDBC_RCA_URL_PROPERTY = "server.jdbc.rca.url"
 JDBC_RCA_USER_NAME_PROPERTY = "server.jdbc.rca.user.name"
 JDBC_RCA_USER_NAME_PROPERTY = "server.jdbc.rca.user.name"
 JDBC_RCA_PASSWORD_FILE_PROPERTY = "server.jdbc.rca.user.passwd"
 JDBC_RCA_PASSWORD_FILE_PROPERTY = "server.jdbc.rca.user.passwd"
 
 
-DRIVER_NAMES = ["org.postgresql.Driver", "oracle.jdbc.driver.OracleDriver", "com.mysql.jdbc.Driver"]
-CONNECTION_STRINGS = ["jdbc:postgresql://{0}:{1}/{2}", "jdbc:oracle:thin:@{0}:{1}/{2}", "jdbc:mysql://{0}:{1}/{2}"]
+CHECK_COMMAND_EXIST_CMD = "type {0}"
+
+DATABASE_INDEX = 0
+PROMPT_DATABASE_OPTIONS = False
+USERNAME_PATTERN = "^[a-zA-Z_][a-zA-Z0-9_\-]*$"
+PASSWORD_PATTERN = "^[a-zA-Z0-9_-]*$"
+DATABASE_NAMES =["postgres", "oracle", "mysql"]
+DATABASE_STORAGE_NAMES =["database","service","schema"]
+DATABASE_PORTS =["5432", "1521", "3306"]
+DATABASE_DRIVER_NAMES = ["org.postgresql.Driver", "oracle.jdbc.driver.OracleDriver", "com.mysql.jdbc.Driver"]
+DATABASE_CONNECTION_STRINGS = ["jdbc:postgresql://{0}:{1}/{2}", "jdbc:oracle:thin:@{0}:{1}/{2}", "jdbc:mysql://{0}:{1}/{2}"]
+DATABASE_CLI_TOOLS = [["psql"], ["sqlplus", "sqlplus64"], ["mysql"]]
+DATABASE_INIT_SCRIPTS = ['/var/lib/ambari-server/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql',
+                         '/var/lib/ambari-server/resources/Ambari-DDL-Oracle-CREATE.sql',
+                         '/var/lib/ambari-server/resources/Ambari-DDL-MySQL-CREATE.sql']
+DATABASE_DROP_SCRIPTS = ['/var/lib/ambari-server/resources/Ambari-DDL-Postgres-REMOTE-DROP.sql',
+                         '/var/lib/ambari-server/resources/Ambari-DDL-Oracle-DROP.sql',
+                         '/var/lib/ambari-server/resources/Ambari-DDL-MySQL-DROP.sql']
+DATABASE_URL_REGEX = ["jdbc:postgresql://([a-zA-Z0-9._]+):(\d+)/(.+)",
+                     "jdbc:oracle:thin:@([a-zA-Z0-9._]+):(\d+)/(.+)",
+                     "jdbc:mysql://([a-zA-Z0-9._]+):(\d*)/(.+)"]
+
+REGEX_IP_ADDRESS = "^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$"
+REGEX_HOSTNAME = "^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$"
+
+POSTGRES_EXEC_ARGS = "-h {0} -p {1} -d {2} -U {3} -f {4} -v username='\"{3}\"'"
+ORACLE_EXEC_ARGS = "-S '{0}/{1}@(description=(address=(protocol=TCP)(host={2})(port={3}))(connect_data=(sid={4})))' @{5} {0}"
+MYSQL_EXEC_ARGS = "--host={0} --port={1} --user={2} --password={3} {4} " \
+                 "-e\"set @schema=\'{4}\'; set @username=\'{2}\'; source {5};\""
 
 
 
 
 # jdk commands
 # jdk commands
@@ -175,17 +213,17 @@ ASF_LICENSE_HEADER = '''
 
 
 def configure_pg_hba_ambaridb_users():
 def configure_pg_hba_ambaridb_users():
   args = optparse.Values()
   args = optparse.Values()
-  configure_postgres_username_password(args)
+  configure_database_username_password(args)
 
 
   with open(PG_HBA_CONF_FILE, "a") as pgHbaConf:
   with open(PG_HBA_CONF_FILE, "a") as pgHbaConf:
     pgHbaConf.write("\n")
     pgHbaConf.write("\n")
-    pgHbaConf.write("local  all  " + args.postgres_username +
+    pgHbaConf.write("local  all  " + args.database_username +
                     ",mapred md5")
                     ",mapred md5")
     pgHbaConf.write("\n")
     pgHbaConf.write("\n")
-    pgHbaConf.write("host  all   " + args.postgres_username +
+    pgHbaConf.write("host  all   " + args.database_username +
                     ",mapred 0.0.0.0/0  md5")
                     ",mapred 0.0.0.0/0  md5")
     pgHbaConf.write("\n")
     pgHbaConf.write("\n")
-    pgHbaConf.write("host  all   " + args.postgres_username +
+    pgHbaConf.write("host  all   " + args.database_username +
                     ",mapred ::/0 md5")
                     ",mapred ::/0 md5")
     pgHbaConf.write("\n")
     pgHbaConf.write("\n")
   command = PG_HBA_RELOAD_CMD.format(PG_HBA_DIR)
   command = PG_HBA_RELOAD_CMD.format(PG_HBA_DIR)
@@ -281,39 +319,19 @@ def write_property(key, value):
 
 
 def setup_db(args):
 def setup_db(args):
   #password access to ambari-server and mapred
   #password access to ambari-server and mapred
-  configure_postgres_username_password(args)
-  dbname = args.postgredbname
-  file = args.init_script_file
-  username = args.postgres_username
-  password = args.postgres_password
+  configure_database_username_password(args)
+  dbname = args.database_name
+  scriptFile = args.init_script_file
+  username = args.database_username
+  password = args.database_password
   command = SETUP_DB_CMD[:]
   command = SETUP_DB_CMD[:]
-  command[-1] = command[-1].format(file, username, password)
+  command[-1] = command[-1].format(scriptFile, username, password)
   retcode, outdata, errdata = run_os_command(command)
   retcode, outdata, errdata = run_os_command(command)
   if not retcode == 0:
   if not retcode == 0:
     print errdata
     print errdata
   return retcode
   return retcode
 
 
-def setup_remote_db(args):
-  print "WARNING! To use MySQL/Oracle database place JDBC driver to "+ get_ambari_jars()
-  print "Table structure in remote database should be created manually in this mode."
-  (driver_name, conn_url, username, password) = get_connection_properties()
-
-  write_property(PERSISTENCE_TYPE_PROPERTY, "remote")
-  write_property(JDBC_DRIVER_PROPERTY, driver_name)
-  write_property(JDBC_URL_PROPERTY, conn_url)
-  write_property(JDBC_USER_NAME_PROPERTY, username)
-  write_property(JDBC_PASSWORD_FILE_PROPERTY, store_password_file(password, JDBC_PASSWORD_FILENAME))
-
-  ok = get_YN_input("Enter separate configuration for RCA database [y/n] (n)? ", False)
-  if ok:
-    (driver_name, conn_url, username, password) = get_connection_properties()
 
 
-  write_property(JDBC_RCA_DRIVER_PROPERTY, driver_name)
-  write_property(JDBC_RCA_URL_PROPERTY, conn_url)
-  write_property(JDBC_RCA_USER_NAME_PROPERTY, username)
-  write_property(JDBC_RCA_PASSWORD_FILE_PROPERTY, store_password_file(password, JDBC_RCA_PASSWORD_FILENAME))
-
-  return 0
 
 
 def store_password_file(password, filename):
 def store_password_file(password, filename):
   conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
   conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
@@ -327,68 +345,12 @@ def store_password_file(password, filename):
 
 
   return passFilePath
   return passFilePath
 
 
-def get_connection_properties():
-  default_db_num="1"
-  default_host = "localhost"
-  default_schema = "ambari"
-
-  database_num = get_validated_string_input("Select database:\n1 - Postgres\n2 - Oracle\n3 - MySQL) \n["+str(default_db_num)+"]:",
-    default_db_num,
-    "^[123]$",
-    "Invalid number.",
-    False
-  )
-
-  db_host = get_validated_string_input("Hostname ["+default_host+"]:",
-    default_host,
-    "^[a-zA-Z0-9.\-]*$",
-    "Invalid hostname.",
-    False
-  )
-
-  default_port = None
-  if database_num == "1":
-    default_port = "5432"
-  elif database_num == "2":
-    default_port = "1521"
-  elif database_num == "3":
-    default_port = "3306"
-
-  db_port = get_validated_string_input("Port ["+ str(default_port) + "]:",
-    default_port,
-    "^[0-9]{1,5}$",
-    "Invalid port.",
-    False
-  )
-
-  if database_num == "2":
-    default_schema = "xe"
-
-  db_schema = get_validated_string_input("Database/schema/service name ["+ str(default_schema) + "]:",
-    default_schema,
-    "^[a-zA-z\-\"]+$",
-    "Invalid schema name.",
-    False
-  )
-
-  usernameDefault = 'ambari'
-  usernamePrompt = 'Username [' + usernameDefault + ']: '
-  usernamePattern = "^[a-zA-Z_][a-zA-Z0-9_\-]*$"
-  usernameDescr = "Invalid characters in username. Start with _ or alpha "\
-                  "followed by alphanumeric or _ or - characters"
-
-  username = get_validated_string_input(usernamePrompt, usernameDefault,
-    usernamePattern, usernameDescr, False)
-  password = configure_postgres_password()
-
-  return DRIVER_NAMES[int(database_num)-1], CONNECTION_STRINGS[int(database_num)-1].format(db_host, db_port, db_schema), username, password
-
 def execute_db_script(args, file):
 def execute_db_script(args, file):
   #password access to ambari-server and mapred
   #password access to ambari-server and mapred
-  configure_postgres_username_password(args)
-  dbname = args.postgredbname
-  username = args.postgres_username
-  password = args.postgres_password
+  configure_database_username_password(args)
+  dbname = args.database_name
+  username = args.database_username
+  password = args.database_password
   command = SETUP_DB_CMD[:]
   command = SETUP_DB_CMD[:]
   command[-1] = command[-1].format(file, username, password)
   command[-1] = command[-1].format(file, username, password)
   retcode, outdata, errdata = run_os_command(command)
   retcode, outdata, errdata = run_os_command(command)
@@ -399,10 +361,10 @@ def execute_db_script(args, file):
 
 
 def check_db_consistency(args, file):
 def check_db_consistency(args, file):
   #password access to ambari-server and mapred
   #password access to ambari-server and mapred
-  configure_postgres_username_password(args)
-  dbname = args.postgredbname
-  username = args.postgres_username
-  password = args.postgres_password
+  configure_database_username_password(args)
+  dbname = args.database_name
+  username = args.database_username
+  password = args.database_password
   command = SETUP_DB_CMD[:]
   command = SETUP_DB_CMD[:]
   command[-1] = command[-1].format(file, username, password)
   command[-1] = command[-1].format(file, username, password)
   retcode, outdata, errdata = run_os_command(command)
   retcode, outdata, errdata = run_os_command(command)
@@ -420,8 +382,8 @@ def check_db_consistency(args, file):
 
 
 def upgrade_stack(args, stack_id):
 def upgrade_stack(args, stack_id):
   #password access to ambari-server and mapred
   #password access to ambari-server and mapred
-  configure_postgres_username_password(args)
-  dbname = args.postgredbname
+  configure_database_username_password(args)
+  dbname = args.database_name
   file = args.upgrade_stack_script_file
   file = args.upgrade_stack_script_file
   stack_name, stack_version = stack_id.split(STACK_NAME_VER_SEP)
   stack_name, stack_version = stack_id.split(STACK_NAME_VER_SEP)
   command = UPGRADE_STACK_CMD[:]
   command = UPGRADE_STACK_CMD[:]
@@ -788,6 +750,10 @@ def check_postgre_up():
     print_info_msg ("PostgreSQL is running")
     print_info_msg ("PostgreSQL is running")
     return 0
     return 0
   else:
   else:
+    print "Run initdb"
+    retcode, out, err = run_os_command(PG_INITDB_CMD)
+    if retcode == 0:
+      print out
     print "About to start PostgreSQL"
     print "About to start PostgreSQL"
     retcode, out, err = run_os_command(PG_START_CMD)
     retcode, out, err = run_os_command(PG_START_CMD)
     return retcode
     return retcode
@@ -904,6 +870,16 @@ def find_jdk():
   print "Selected JDK {0}".format(jdkPath)
   print "Selected JDK {0}".format(jdkPath)
   return jdkPath
   return jdkPath
 
 
+#
+# Checks if options determine local DB configuration
+#
+def is_local_database(options):
+  if options.database == DATABASE_NAMES[0] \
+    and options.database_host == "localhost" \
+    and options.database_port == DATABASE_PORTS[0] \
+    and options.database_name == "ambari":
+    return True
+  return False
 
 
 #
 #
 # Setup the Ambari Server.
 # Setup the Ambari Server.
@@ -922,7 +898,12 @@ def setup(args):
     print_error_msg ('Failed to stop iptables. Exiting.')
     print_error_msg ('Failed to stop iptables. Exiting.')
     sys.exit(retcode)
     sys.exit(retcode)
 
 
-  if not REMOTE_DATABASE:
+  print 'Configuring database...'
+  prompt_db_properties(args)
+
+  if is_local_database(args):
+    print 'Default properties detected. Using built-in database.'
+    store_local_properties(args)
 
 
     print 'Checking PostgreSQL...'
     print 'Checking PostgreSQL...'
     retcode = check_postgre_up()
     retcode = check_postgre_up()
@@ -943,12 +924,21 @@ def setup(args):
       sys.exit(retcode)
       sys.exit(retcode)
 
 
   else:
   else:
-    print 'Configuring remote database connection properties'
+    retcode = store_remote_properties(args)
+    if retcode != 0:
+      print_error_msg('Unable to save config file')
+      sys.exit(retcode)
+
+    print_warning_msg('Before starting server JDBC driver for {0} should be placed to {1}.'.format(args.database, JAVA_SHARE_PATH))
+
+    print 'Configuring remote database connection properties...'
     retcode = setup_remote_db(args)
     retcode = setup_remote_db(args)
     if not retcode == 0:
     if not retcode == 0:
       print_error_msg ('Error while configuring connection properties. Exiting')
       print_error_msg ('Error while configuring connection properties. Exiting')
       sys.exit(retcode)
       sys.exit(retcode)
-  
+
+
+
   print 'Checking JDK...'
   print 'Checking JDK...'
   retcode = download_jdk(args)
   retcode = download_jdk(args)
   if not retcode == 0:
   if not retcode == 0:
@@ -962,7 +952,12 @@ def setup(args):
                    'ambari.properties failed. Exiting.')
                    'ambari.properties failed. Exiting.')
     sys.exit(retcode)
     sys.exit(retcode)
 
 
-  print "Ambari Server 'setup' finished successfully"
+  if args.warnings:
+    print "Ambari Server 'setup' finished with warnings:"
+    for warning in args.warnings:
+      print warning
+  else:
+    print "Ambari Server 'setup' finished successfully"
 
 
 
 
 
 
@@ -994,20 +989,39 @@ def reset(args):
 
 
   print "Reseting the Server database..."
   print "Reseting the Server database..."
 
 
-  configure_postgres_username_password(args)
-  dbname = args.postgredbname
-  filename = args.drop_script_file
-  username = args.postgres_username
-  password = args.postgres_password
-  command = SETUP_DB_CMD[:]
-  command[-1] = command[-1].format(filename, username, password)
-  retcode, outdata, errdata = run_os_command(command)
-  if not retcode == 0:
-    print errdata
-    return retcode
+  parse_properties(args)
 
 
-  print_info_msg ("About to run database setup")
-  setup_db(args)
+  # configure_database_username_password(args)
+  if args.persistence_type=="remote":
+    if get_db_cli_tool(args) != -1:
+      retcode, out, err = execute_remote_script(args, DATABASE_DROP_SCRIPTS[DATABASE_INDEX])
+      if not retcode == 0:
+        print err
+        return retcode
+
+      retcode, out, err = execute_remote_script(args, DATABASE_INIT_SCRIPTS[DATABASE_INDEX])
+      if not retcode == 0:
+        print err
+        return retcode
+
+    else:
+      print_error_msg(DATABASE_CLI_TOOLS[DATABASE_INDEX] + " not found. Unable to perform automatic reset.")
+      return -1
+
+  else:
+    dbname = args.database_name
+    filename = args.drop_script_file
+    username = args.database_username
+    password = args.database_password
+    command = SETUP_DB_CMD[:]
+    command[-1] = command[-1].format(filename, username, password)
+    retcode, outdata, errdata = run_os_command(command)
+    if not retcode == 0:
+      print errdata
+      return retcode
+
+    print_info_msg ("About to run database setup")
+    setup_db(args)
 
 
   print "Ambari Server 'reset' complete"
   print "Ambari Server 'reset' complete"
 
 
@@ -1080,40 +1094,47 @@ def stop(args):
 # Upgrades the Ambari Server.
 # Upgrades the Ambari Server.
 #
 #
 def upgrade(args):
 def upgrade(args):
-
   print 'Updating properties in ' + AMBARI_PROPERTIES_FILE + ' ...'
   print 'Updating properties in ' + AMBARI_PROPERTIES_FILE + ' ...'
   retcode = update_ambari_properties()
   retcode = update_ambari_properties()
   if not retcode == 0:
   if not retcode == 0:
-    printErrorMsg(AMBARI_PROPERTIES_FILE + ' file can\'t be updated. Exiting')
+    print_error_msg(AMBARI_PROPERTIES_FILE + ' file can\'t be updated. Exiting')
     sys.exit(retcode)
     sys.exit(retcode)
 
 
-  print 'Checking PostgreSQL...'
-  retcode = check_postgre_up()
-  if not retcode == 0:
-    printErrorMsg('PostgreSQL server not running. Exiting')
-    sys.exit(retcode)
-
-  file = args.upgrade_script_file
-  print 'Upgrading database...'
-  retcode = execute_db_script(args, file)
-  if not retcode == 0:
-    printErrorMsg('Database upgrade script has failed. Exiting.')
-    sys.exit(retcode)
+  parse_properties(args)
+  if args.persistence_type == "remote":
 
 
-  print 'Checking database integrity...'
-  check_file = file[:-3] + "Check" + file[-4:]
-  retcode = check_db_consistency(args, check_file)
 
 
-  if not retcode == 0:
-    print 'Found inconsistency. Trying to fix...'
-    fix_file = file[:-3] + "Fix" + file[-4:]
-    retcode = execute_db_script(args, fix_file)
+    pass
+  else:
+    print 'Checking PostgreSQL...'
+    retcode = check_postgre_up()
+    if not retcode == 0:
+      print_error_msg('PostgreSQL server not running. Exiting')
+      sys.exit(retcode)
 
 
+    file = args.upgrade_script_file
+    print 'Upgrading database...'
+    retcode = execute_db_script(args, file)
     if not retcode == 0:
     if not retcode == 0:
-      printErrorMsg('Database cannot be fixed. Exiting.')
+      print_error_msg('Database upgrade script has failed. Exiting.')
       sys.exit(retcode)
       sys.exit(retcode)
-  else:
-    print 'Database is consistent.'
+
+    print 'Checking database integrity...'
+    check_file = file[:-3] + "Check" + file[-4:]
+    retcode = check_db_consistency(args, check_file)
+
+    if not retcode == 0:
+      print 'Found inconsistency. Trying to fix...'
+      fix_file = file[:-3] + "Fix" + file[-4:]
+      retcode = execute_db_script(args, fix_file)
+
+      if not retcode == 0:
+        print_error_msg('Database cannot be fixed. Exiting.')
+        sys.exit(retcode)
+    else:
+      print 'Database is consistent.'
+
+
   print "Ambari Server 'upgrade' finished successfully"
   print "Ambari Server 'upgrade' finished successfully"
 
 
 
 
@@ -1212,11 +1233,10 @@ def get_validated_string_input(prompt, default, pattern, description, is_pass):
 
 
 
 
 
 
-def configure_postgres_password():
+def read_password(passwordDefault = PG_DEFAULT_PASSWORD):
   # setup password
   # setup password
-  passwordDefault = PG_DEFAULT_PASSWORD
   passwordPrompt = 'Password [' + passwordDefault + ']: '
   passwordPrompt = 'Password [' + passwordDefault + ']: '
-  passwordPattern = "^[a-zA-Z0-9_-]*$"
+  passwordPattern = PASSWORD_PATTERN
   passwordDescr = "Invalid characters in password. Use only alphanumeric or " \
   passwordDescr = "Invalid characters in password. Use only alphanumeric or " \
                   "_ or - characters"
                   "_ or - characters"
 
 
@@ -1227,7 +1247,7 @@ def configure_postgres_password():
       passwordDefault, passwordPattern, passwordDescr, True)
       passwordDefault, passwordPattern, passwordDescr, True)
     if password != password1:
     if password != password1:
       print "Passwords do not match"
       print "Passwords do not match"
-      password = configure_postgres_password()
+      password = read_password()
 
 
   return password
   return password
 
 
@@ -1238,8 +1258,200 @@ def get_pass_file_path(conf_file):
     JDBC_PASSWORD_FILENAME)
     JDBC_PASSWORD_FILENAME)
 
 
 
 
+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_username = "ambari"
+  args.database_password = "bigdata"
+  pass
+
+def prompt_db_properties(args):
+  global DATABASE_INDEX
+
+  if PROMPT_DATABASE_OPTIONS:
+    load_default_db_properties(args)
+    ok = get_YN_input("Enter advanced database configuration [y/n] (n)? ", False)
+    if ok:
+
+      database_num = str(DATABASE_INDEX + 1)
+      database_num = get_validated_string_input(
+        "Select database:\n1 - Postgres\n2 - Oracle\n3 - MySQL \n[" + database_num + "]:",
+        database_num,
+        "^[123]$",
+        "Invalid number.",
+        False
+      )
+
+      DATABASE_INDEX = int(database_num) - 1
+      args.database = DATABASE_NAMES[DATABASE_INDEX]
+
+      args.database_host = get_validated_string_input(
+        "Hostname [" + args.database_host + "]:",
+        args.database_host,
+        "^[a-zA-Z0-9.\-]*$",
+        "Invalid hostname.",
+        False
+      )
+
+      args.database_port=DATABASE_PORTS[DATABASE_INDEX]
+      args.database_port = get_validated_string_input(
+        "Port [" + args.database_port + "]:",
+        args.database_port,
+        "^([0-9]{1,4}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$",
+        "Invalid port.",
+        False
+      )
+
+      args.database_name = get_validated_string_input(
+        DATABASE_STORAGE_NAMES[DATABASE_INDEX] + " name [" + args.database_name + "]:",
+        args.database_name,
+        "^[a-zA-z\-\"]+$",
+        "Invalid " + DATABASE_STORAGE_NAMES[DATABASE_INDEX] + " name.",
+        False
+      )
+
+      args.database_username = get_validated_string_input(
+        'Username [' + args.database_username + ']: ',
+        args.database_username,
+        USERNAME_PATTERN,
+        "Invalid characters in username. Start with _ or alpha "
+        "followed by alphanumeric or _ or - characters",
+        False
+      )
+
+      args.database_password =  read_password(args.database_password)
+
+
+  print_info_msg('Using database options: {database},{host},{port},{schema},{user},{password}'.format(
+    database=args.database,
+    host=args.database_host,
+    port=args.database_port,
+    schema=args.database_name,
+    user=args.database_username,
+    password=args.database_password
+  ))
+
+
+
+def store_remote_properties(args):
+  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
+  properties = Properties()
+
+  try:
+    properties.load(open(conf_file))
+  except Exception, e:
+    print 'Could not read ambari config file "%s": %s' % (conf_file, e)
+    return -1
 
 
-def configure_postgres_username_password(args):
+  properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "remote")
+
+  properties.process_pair(JDBC_DATABASE_PROPERTY, args.database)
+  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_DRIVER_PROPERTY, DATABASE_DRIVER_NAMES[DATABASE_INDEX])
+  properties.process_pair(JDBC_URL_PROPERTY, DATABASE_CONNECTION_STRINGS[DATABASE_INDEX].format(args.database_host, args.database_port, args.database_name))
+  properties.process_pair(JDBC_USER_NAME_PROPERTY, args.database_username)
+  properties.process_pair(JDBC_PASSWORD_FILE_PROPERTY, store_password_file(args.database_password, JDBC_PASSWORD_FILENAME))
+
+  properties.process_pair(JDBC_RCA_DRIVER_PROPERTY, DATABASE_DRIVER_NAMES[DATABASE_INDEX])
+  properties.process_pair(JDBC_RCA_URL_PROPERTY, DATABASE_CONNECTION_STRINGS[DATABASE_INDEX].format(args.database_host, args.database_port, args.database_name))
+  properties.process_pair(JDBC_RCA_USER_NAME_PROPERTY, args.database_username)
+  properties.process_pair(JDBC_RCA_PASSWORD_FILE_PROPERTY, store_password_file(args.database_password, JDBC_PASSWORD_FILENAME))
+
+  try:
+    properties.store(open(conf_file, "w"))
+  except Exception, e:
+    print 'Could not write ambari config file "%s": %s' % (conf_file, e)
+    return -1
+
+  return 0
+
+def setup_remote_db(args):
+
+  retcode, out, err = execute_remote_script(args, DATABASE_INIT_SCRIPTS[DATABASE_INDEX])
+  if retcode != 0:
+    print err
+    print_error_msg('Database bootstrap failed. Please, provide correct connection properties.')
+    return retcode
+  pass
+
+  return 0
+
+def get_db_cli_tool(args):
+  for tool in DATABASE_CLI_TOOLS[DATABASE_INDEX]:
+    cmd =CHECK_COMMAND_EXIST_CMD.format(tool)
+    ret, out, err = run_in_shell(cmd)
+    if ret == 0:
+      return get_exec_path(tool)
+
+  return None
+
+def get_exec_path(cmd):
+  cmd = 'which {0}'.format(cmd)
+  ret, out, err = run_in_shell(cmd)
+  if ret == 0:
+    return out.strip()
+  else:
+    return None
+
+def run_in_shell(cmd):
+  print_info_msg('about to run command: ' + str(cmd))
+  process = subprocess.Popen(cmd,
+                             stdout=subprocess.PIPE,
+                             stdin=subprocess.PIPE,
+                             stderr=subprocess.PIPE,
+                             shell=True
+  )
+  (stdoutdata, stderrdata) = process.communicate()
+  return process.returncode, stdoutdata, stderrdata
+
+
+def execute_remote_script(args, scriptPath):
+  tool = get_db_cli_tool(args)
+  if not tool:
+    args.warnings.append('{0} not found. Please, run DDL script manually'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
+    print_warning_msg('{0} not found'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
+    return -1
+
+  if args.database == "postgres":
+
+    os.environ["PGPASSWORD"] = args.database_password
+    retcode, out, err = run_in_shell('{0} {1}'.format(tool,  POSTGRES_EXEC_ARGS.format(
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      args.database_username,
+      scriptPath
+    )))
+    return retcode, out, err
+  elif args.database == "oracle":
+    retcode, out, err = run_in_shell('{0} {1}'.format(tool, ORACLE_EXEC_ARGS.format(
+      args.database_username,
+      args.database_password,
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      scriptPath
+    )))
+    return retcode, out, err
+  elif args.database=="mysql":
+    retcode, out, err = run_in_shell('{0} {1}'.format(tool, MYSQL_EXEC_ARGS.format(
+      args.database_host,
+      args.database_port,
+      args.database_username,
+      args.database_password,
+      args.database_name,
+      scriptPath
+    )))
+    return retcode, out, err
+
+  return -1, "Wrong database", "Wrong database"
+
+def configure_database_username_password(args):
   conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
   conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
   properties = Properties()
   properties = Properties()
 
 
@@ -1254,52 +1466,67 @@ def configure_postgres_username_password(args):
 
 
   if username and passFilePath:
   if username and passFilePath:
     print_info_msg("Database username + password already configured - skipping")
     print_info_msg("Database username + password already configured - skipping")
-    args.postgres_username=username
-    args.postgres_password = open(passFilePath).read()
+    args.database_username=username
+    args.database_password = open(passFilePath).read()
     return 1
     return 1
+  else:
+    print_error_msg("Connection properties not set in config file.")
 
 
-  # setup username
-  usernameDefault = 'ambari-server'
-  usernamePrompt = 'Username [' + usernameDefault + ']: '
-  usernamePattern = "^[a-zA-Z_][a-zA-Z0-9_\-]*$"
-  usernameDescr = "Invalid characters in username. Start with _ or alpha " \
-                  "followed by alphanumeric or _ or - characters"
-  username = usernameDefault
 
 
-  # setup password
-  password = PG_DEFAULT_PASSWORD
-
-  ok = get_YN_input("Enter advanced database configuration [y/n] (n)? ", False)
-  if ok:
-    username = get_validated_string_input(usernamePrompt, usernameDefault,
-        usernamePattern, usernameDescr, False)
-    print "Database username set to: " + username
-    password = configure_postgres_password()
-        
-  passFilePath = get_pass_file_path(conf_file)
-  
-  print_info_msg ("Database username set to: " + username)
-  print_info_msg ("Database password set to: " + password)
-    
-  with open(passFilePath, 'w+') as passFile:
-    passFile.write(password)
-    pass
-  os.chmod(passFilePath, stat.S_IREAD | stat.S_IWRITE)
+def store_local_properties(args):
+  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
+  properties = Properties()
+
+  try:
+    properties.load(open(conf_file))
+  except Exception, e:
+    print 'Could not read ambari config file "%s": %s' % (conf_file, e)
+    return -1
+
+  properties.process_pair(PERSISTENCE_TYPE_PROPERTY, "local")
+  properties.process_pair(JDBC_USER_NAME_PROPERTY, args.database_username)
+  properties.process_pair(JDBC_PASSWORD_FILE_PROPERTY, store_password_file(args.database_password, JDBC_PASSWORD_FILENAME))
 
 
-  write_property(JDBC_USER_NAME_PROPERTY, username)
-  write_property(JDBC_PASSWORD_FILE_PROPERTY,passFilePath)
-  args.postgres_username=username
-  args.postgres_password=password
 
 
+  try:
+    properties.store(open(conf_file, "w"))
+  except Exception, e:
+    print 'Could not write ambari config file "%s": %s' % (conf_file, e)
+    return -1
+
+  return 0
 
 
+def parse_properties(args):
+  conf_file = search_file(AMBARI_PROPERTIES_FILE, get_conf_dir())
+  properties = Properties()
+
+  try:
+    properties.load(open(conf_file))
+  except Exception, e:
+    print 'Could not read ambari config file "%s": %s' % (conf_file, e)
+    return -1
+
+  args.persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
+
+  if args.persistence_type == 'remote':
+    args.database = 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
+    DATABASE_INDEX = DATABASE_NAMES.index(args.database)
+
+  args.database_username = properties[JDBC_USER_NAME_PROPERTY]
+  args.database_password = open(properties[JDBC_PASSWORD_FILE_PROPERTY]).read()
+
+  return 0
 
 
 #
 #
 # Main.
 # Main.
 #
 #
 def main():
 def main():
   parser = optparse.OptionParser(usage="usage: %prog [options] action [stack_id]",)
   parser = optparse.OptionParser(usage="usage: %prog [options] action [stack_id]",)
-  parser.add_option('-d', '--postgredbname', default='ambari',
-                      help="Database name in postgresql")
+
   parser.add_option('-f', '--init-script-file',
   parser.add_option('-f', '--init-script-file',
                       default='/var/lib/ambari-server/'
                       default='/var/lib/ambari-server/'
                               'resources/Ambari-DDL-Postgres-CREATE.sql',
                               'resources/Ambari-DDL-Postgres-CREATE.sql',
@@ -1324,13 +1551,17 @@ def main():
   parser.add_option("-s", "--silent",
   parser.add_option("-s", "--silent",
                   action="store_true", dest="silent", default=False,
                   action="store_true", dest="silent", default=False,
                   help="Silently accepts default prompt values")
                   help="Silently accepts default prompt values")
-
-  parser.add_option("-b", "--remote-database",
-      action="store_true", dest="remote_database", default=False,
-      help="Set up remote database instead of local")
   parser.add_option('-g', '--debug', action="store_true", dest='debug', default=False,
   parser.add_option('-g', '--debug', action="store_true", dest='debug', default=False,
                   help="Start ambari-server in debug mode")
                   help="Start ambari-server in debug mode")
 
 
+
+  parser.add_option('--database', default=None, help ="Database to use postgres|oracle|mysql", dest="database")
+  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", dest="database_name")
+  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")
+
   (options, args) = parser.parse_args()
   (options, args) = parser.parse_args()
 
 
   # set verbose
   # set verbose
@@ -1341,16 +1572,58 @@ def main():
   global SILENT
   global SILENT
   SILENT = options.silent
   SILENT = options.silent
 
 
-  # skip local db setup
-  global REMOTE_DATABASE
-  REMOTE_DATABASE = options.remote_database
-
   # debug mode
   # debug mode
   global SERVER_DEBUG_MODE
   global SERVER_DEBUG_MODE
   SERVER_DEBUG_MODE = options.debug
   SERVER_DEBUG_MODE = options.debug
 
 
 
 
+  global DATABASE_INDEX
+  global PROMPT_DATABASE_OPTIONS
+  #perform checks
+
+  options.warnings = []
+
+  if options.database is None \
+    and options.database_host is None \
+    and options.database_port is None \
+    and options.database_name is None \
+    and options.database_username is None \
+    and options.database_password is None:
+
+    PROMPT_DATABASE_OPTIONS = True
+
+  elif not (options.database is not None
+    and options.database_host is not None
+    and options.database_port is not None
+    and options.database_name is not None
+    and options.database_username is not None
+    and options.database_password is not None):
 
 
+    parser.error('All database options should be set.')
+    pass
+
+  #correct database
+  if options.database is not None and options.database not in DATABASE_NAMES:
+    print "Incorrect database"
+    parser.print_help()
+    exit(-1)
+  elif options.database is not None:
+    options.database = options.database.lower()
+    DATABASE_INDEX = DATABASE_NAMES.index(options.database)
+
+  #correct port
+  if options.database_port is not None:
+    correct=False
+    try:
+      port = int(options.database_port)
+      if 65536 > port > 0:
+        correct = True
+    except ValueError:
+      pass
+    if not correct:
+      print "Incorrect database port " + options.database_port
+      parser.print_help()
+      exit(-1)
   
   
   if len(args) == 0:
   if len(args) == 0:
     print parser.print_help()
     print parser.print_help()
@@ -1387,7 +1660,6 @@ def main():
 
 
 
 
 
 
-
 # A Python replacement for java.util.Properties
 # A Python replacement for java.util.Properties
 # Based on http://code.activestate.com/recipes
 # Based on http://code.activestate.com/recipes
 # /496795-a-python-replacement-for-javautilproperties/
 # /496795-a-python-replacement-for-javautilproperties/

+ 4 - 6
ambari-server/src/main/resources/mysql-ddl.sql → ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql

@@ -20,11 +20,11 @@
 
 
 delimiter ;
 delimiter ;
 
 
-CREATE DATABASE `ambari` /*!40100 DEFAULT CHARACTER SET utf8 */;
+# CREATE DATABASE `ambari` /*!40100 DEFAULT CHARACTER SET utf8 */;
+#
+# CREATE USER 'ambari' IDENTIFIED BY 'bigdata';
 
 
-CREATE USER 'ambari' IDENTIFIED BY 'bigdata';
-
-USE ambari;
+# USE @schema;
 
 
 CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data LONGTEXT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
 CREATE TABLE clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data LONGTEXT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
@@ -180,8 +180,6 @@ CREATE TABLE clusterEvent (
   host TEXT, rack TEXT
   host TEXT, rack TEXT
 );
 );
 
 
-GRANT ALL ON ambari.* TO `ambari`;
-
 
 
 
 
 
 

+ 29 - 0
ambari-server/src/main/resources/Ambari-DDL-MySQL-DROP.sql

@@ -0,0 +1,29 @@
+--
+-- 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.
+--
+
+SET FOREIGN_KEY_CHECKS = 0;
+SET @tables = NULL;
+SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
+  FROM information_schema.tables
+  WHERE table_schema = @schema; -- specify DB name here.
+
+SET @tables = CONCAT('DROP TABLE ', @tables);
+PREPARE stmt FROM @tables;
+EXECUTE stmt;
+DEALLOCATE PREPARE stmt;
+SET FOREIGN_KEY_CHECKS = 1;

+ 0 - 51
ambari-server/src/main/resources/oracle-DDL.sql → ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql

@@ -15,15 +15,6 @@
 -- See the License for the specific language governing permissions and
 -- See the License for the specific language governing permissions and
 -- limitations under the License.
 -- limitations under the License.
 --
 --
--- PL/SQL script
-DROP USER &1 CASCADE;
-CREATE USER &1 IDENTIFIED BY &2 DEFAULT TABLESPACE "USERS" TEMPORARY TABLESPACE "TEMP";
-
-GRANT UNLIMITED TABLESPACE TO &1;
-GRANT CREATE SESSION TO &1;
-GRANT CREATE TABLE TO &1;
-
-ALTER SESSION SET CURRENT_SCHEMA= &1;
 
 
 CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255) NULL, cluster_name VARCHAR2(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR2(255) NULL, desired_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255) NULL, cluster_name VARCHAR2(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR2(255) NULL, desired_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (version_tag VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_data CLOB NOT NULL, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
 CREATE TABLE clusterconfig (version_tag VARCHAR2(255) NOT NULL, type_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_data CLOB NOT NULL, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (version_tag, type_name, cluster_id));
@@ -85,34 +76,6 @@ ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id
 ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_role_name FOREIGN KEY (role_name) REFERENCES roles (role_name);
 ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_role_name FOREIGN KEY (role_name) REFERENCES roles (role_name);
 
 
 
 
-GRANT ALL ON clusters TO &1;
-GRANT ALL ON clusterconfig TO &1;
-GRANT ALL ON clusterconfigmapping TO &1;
-GRANT ALL ON clusterservices TO &1;
-GRANT ALL ON clusterstate TO &1;
-GRANT ALL ON componentconfigmapping TO &1;
-GRANT ALL ON hostcomponentconfigmapping TO &1;
-GRANT ALL ON hcdesiredconfigmapping TO &1;
-GRANT ALL ON hostcomponentdesiredstate TO &1;
-GRANT ALL ON hostcomponentstate TO &1;
-GRANT ALL ON hosts TO &1;
-GRANT ALL ON hoststate TO &1;
-GRANT ALL ON servicecomponentdesiredstate TO &1;
-GRANT ALL ON serviceconfigmapping TO &1;
-GRANT ALL ON servicedesiredstate TO &1;
-GRANT ALL ON roles TO &1;
-GRANT ALL ON users TO &1;
-GRANT ALL ON execution_command TO &1;
-GRANT ALL ON host_role_command TO &1;
-GRANT ALL ON role_success_criteria TO &1;
-GRANT ALL ON stage TO &1;
-GRANT ALL ON ClusterHostMapping TO &1;
-GRANT ALL ON user_roles TO &1;
-GRANT ALL ON key_value_store TO &1;
-GRANT ALL ON hostconfigmapping TO &1;
-GRANT ALL ON ambari_sequences TO &1;
-GRANT ALL ON metainfo TO &1;
-
 
 
 INSERT INTO ambari_sequences(sequence_name, value) values ('host_role_command_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('host_role_command_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('user_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('user_id_seq', 1);
@@ -148,8 +111,6 @@ CREATE TABLE workflow (
   FOREIGN KEY (parentWorkflowId) REFERENCES workflow(workflowId)
   FOREIGN KEY (parentWorkflowId) REFERENCES workflow(workflowId)
 );
 );
 
 
-GRANT ALL ON workflow TO &1;
-
 CREATE TABLE job (
 CREATE TABLE job (
   jobId VARCHAR2(4000), workflowId VARCHAR2(4000), jobName VARCHAR2(4000), workflowEntityName VARCHAR2(4000),
   jobId VARCHAR2(4000), workflowId VARCHAR2(4000), jobName VARCHAR2(4000), workflowEntityName VARCHAR2(4000),
   userName VARCHAR2(4000), queue CLOB, acls CLOB, confPath CLOB, 
   userName VARCHAR2(4000), queue CLOB, acls CLOB, confPath CLOB, 
@@ -164,8 +125,6 @@ CREATE TABLE job (
   FOREIGN KEY(workflowId) REFERENCES workflow(workflowId)
   FOREIGN KEY(workflowId) REFERENCES workflow(workflowId)
 );
 );
 
 
-GRANT ALL ON job TO &1;
-
 CREATE TABLE task (
 CREATE TABLE task (
   taskId VARCHAR2(4000), jobId VARCHAR2(4000), taskType VARCHAR2(4000), splits VARCHAR2(4000), 
   taskId VARCHAR2(4000), jobId VARCHAR2(4000), taskType VARCHAR2(4000), splits VARCHAR2(4000), 
   startTime INTEGER, finishTime INTEGER, status VARCHAR2(4000), error CLOB, counters VARCHAR2(4000), 
   startTime INTEGER, finishTime INTEGER, status VARCHAR2(4000), error CLOB, counters VARCHAR2(4000), 
@@ -174,8 +133,6 @@ CREATE TABLE task (
   FOREIGN KEY(jobId) REFERENCES job(jobId)
   FOREIGN KEY(jobId) REFERENCES job(jobId)
 );
 );
 
 
-GRANT ALL ON task TO &1;
-
 CREATE TABLE taskAttempt (
 CREATE TABLE taskAttempt (
   taskAttemptId VARCHAR2(4000), taskId VARCHAR2(4000), jobId VARCHAR2(4000), taskType VARCHAR2(4000), taskTracker VARCHAR2(4000), 
   taskAttemptId VARCHAR2(4000), taskId VARCHAR2(4000), jobId VARCHAR2(4000), taskType VARCHAR2(4000), taskTracker VARCHAR2(4000), 
   startTime INTEGER, finishTime INTEGER, 
   startTime INTEGER, finishTime INTEGER, 
@@ -188,8 +145,6 @@ CREATE TABLE taskAttempt (
   FOREIGN KEY(taskId) REFERENCES task(taskId)
   FOREIGN KEY(taskId) REFERENCES task(taskId)
 ); 
 ); 
 
 
-GRANT ALL ON taskAttempt TO &1;
-
 CREATE TABLE hdfsEvent (
 CREATE TABLE hdfsEvent (
   timestamp INTEGER,
   timestamp INTEGER,
   userName VARCHAR2(4000),
   userName VARCHAR2(4000),
@@ -200,8 +155,6 @@ CREATE TABLE hdfsEvent (
   permissions VARCHAR2(4000)
   permissions VARCHAR2(4000)
 );
 );
 
 
-GRANT ALL ON hdfsEvent TO &1;
-
 CREATE TABLE mapreduceEvent (
 CREATE TABLE mapreduceEvent (
   timestamp INTEGER,
   timestamp INTEGER,
   userName VARCHAR2(4000),
   userName VARCHAR2(4000),
@@ -213,8 +166,6 @@ CREATE TABLE mapreduceEvent (
   permissions VARCHAR2(4000)
   permissions VARCHAR2(4000)
 );
 );
 
 
-GRANT ALL ON mapreduceEvent TO &1;
-
 CREATE TABLE clusterEvent (
 CREATE TABLE clusterEvent (
   timestamp INTEGER, 
   timestamp INTEGER, 
   service VARCHAR2(4000), status VARCHAR2(4000), 
   service VARCHAR2(4000), status VARCHAR2(4000), 
@@ -222,5 +173,3 @@ CREATE TABLE clusterEvent (
   host VARCHAR2(4000), rack VARCHAR2(4000)
   host VARCHAR2(4000), rack VARCHAR2(4000)
 );
 );
 
 
-GRANT ALL ON clusterEvent TO &1;
-

+ 58 - 0
ambari-server/src/main/resources/Ambari-DDL-Oracle-DROP.sql

@@ -0,0 +1,58 @@
+--
+-- 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.
+--
+
+BEGIN
+   FOR cur_rec IN (SELECT object_name, object_type
+                     FROM user_objects
+                    WHERE object_type IN
+                             ('TABLE',
+                              'VIEW',
+                              'PACKAGE',
+                              'PROCEDURE',
+                              'FUNCTION',
+                              'SEQUENCE'
+                             ))
+   LOOP
+      BEGIN
+         IF cur_rec.object_type = 'TABLE'
+         THEN
+            EXECUTE IMMEDIATE    'DROP '
+                              || cur_rec.object_type
+                              || ' "'
+                              || cur_rec.object_name
+                              || '" CASCADE CONSTRAINTS';
+         ELSE
+            EXECUTE IMMEDIATE    'DROP '
+                              || cur_rec.object_type
+                              || ' "'
+                              || cur_rec.object_name
+                              || '"';
+         END IF;
+      EXCEPTION
+         WHEN OTHERS
+         THEN
+            DBMS_OUTPUT.put_line (   'FAILED: DROP '
+                                  || cur_rec.object_type
+                                  || ' "'
+                                  || cur_rec.object_name
+                                  || '"'
+                                 );
+      END;
+   END LOOP;
+END;
+/

+ 178 - 0
ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-CREATE.sql

@@ -0,0 +1,178 @@
+--
+-- 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.
+--
+
+CREATE SCHEMA ambari AUTHORIZATION :username;
+ALTER ROLE :username SET search_path TO ambari;
+
+CREATE TABLE ambari.clusters (cluster_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE ambari.clusterconfig (version_tag VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data VARCHAR(32000) NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (cluster_id, type_name, version_tag));
+CREATE TABLE ambari.clusterconfigmapping (cluster_id bigint NOT NULL, type_name VARCHAR(255) NOT NULL, version_tag VARCHAR(255) NOT NULL, create_timestamp BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (cluster_id, type_name, create_timestamp));
+CREATE TABLE ambari.clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY (service_name, cluster_id));
+CREATE TABLE ambari.clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
+CREATE TABLE ambari.componentconfigmapping (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, config_type VARCHAR(255) NOT NULL, timestamp BIGINT NOT NULL, config_tag VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, service_name, config_type));
+CREATE TABLE ambari.hostcomponentconfigmapping (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, config_type VARCHAR(255) NOT NULL, timestamp BIGINT NOT NULL, config_tag VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name, config_type));
+CREATE TABLE ambari.hcdesiredconfigmapping (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, config_type VARCHAR(255) NOT NULL, timestamp BIGINT NOT NULL, config_tag VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name, config_type));
+CREATE TABLE ambari.hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
+CREATE TABLE ambari.hostcomponentstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, current_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
+CREATE TABLE ambari.hosts (host_name VARCHAR(255) NOT NULL, cpu_count INTEGER NOT NULL, ph_cpu_count INTEGER, cpu_info VARCHAR(255) NOT NULL, discovery_status VARCHAR(2000) NOT NULL, disks_info VARCHAR(10000) NOT NULL, host_attributes VARCHAR(20000) NOT NULL, ipv4 VARCHAR(255), ipv6 VARCHAR(255), public_host_name VARCHAR(255), last_registration_time BIGINT NOT NULL, os_arch VARCHAR(255) NOT NULL, os_info VARCHAR(1000) NOT NULL, os_type VARCHAR(255) NOT NULL, rack_info VARCHAR(255) NOT NULL, total_mem BIGINT NOT NULL, PRIMARY KEY (host_name));
+CREATE TABLE ambari.hoststate (agent_version VARCHAR(255) NOT NULL, available_mem BIGINT NOT NULL, current_state VARCHAR(255) NOT NULL, health_status VARCHAR(255), host_name VARCHAR(255) NOT NULL, time_in_state BIGINT NOT NULL,  PRIMARY KEY (host_name));
+CREATE TABLE ambari.servicecomponentdesiredstate (component_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (component_name, cluster_id, service_name));
+CREATE TABLE ambari.serviceconfigmapping (cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, config_type VARCHAR(255) NOT NULL, timestamp BIGINT NOT NULL, config_tag VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, service_name, config_type));
+CREATE TABLE ambari.servicedesiredstate (cluster_id BIGINT NOT NULL, desired_host_role_mapping INTEGER NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, service_name));
+CREATE TABLE ambari.roles (role_name VARCHAR(255) NOT NULL, PRIMARY KEY (role_name));
+CREATE TABLE ambari.users (user_id INTEGER, ldap_user INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL, create_time TIMESTAMP DEFAULT NOW(), user_password VARCHAR(255), PRIMARY KEY (user_id), UNIQUE (ldap_user, user_name));
+CREATE TABLE ambari.execution_command (command bytea, task_id BIGINT NOT NULL, PRIMARY KEY (task_id));
+CREATE TABLE ambari.host_role_command (task_id BIGINT NOT NULL, attempt_count SMALLINT NOT NULL, event VARCHAR(32000) NOT NULL, exitcode INTEGER NOT NULL, host_name VARCHAR(255) NOT NULL, last_attempt_time BIGINT NOT NULL, request_id BIGINT NOT NULL, role VARCHAR(255), stage_id BIGINT NOT NULL, start_time BIGINT NOT NULL, status VARCHAR(255), std_error bytea, std_out bytea, role_command VARCHAR(255), PRIMARY KEY (task_id));
+CREATE TABLE ambari.role_success_criteria (role VARCHAR(255) NOT NULL, request_id BIGINT NOT NULL, stage_id BIGINT NOT NULL, success_factor FLOAT NOT NULL, PRIMARY KEY (role, request_id, stage_id));
+CREATE TABLE ambari.stage (stage_id BIGINT NOT NULL, request_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, log_info VARCHAR(255) NOT NULL, request_context VARCHAR(255), PRIMARY KEY (stage_id, request_id));
+CREATE TABLE ambari.ClusterHostMapping (cluster_id BIGINT NOT NULL, host_name VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id, host_name));
+CREATE TABLE ambari.user_roles (role_name VARCHAR(255) NOT NULL, user_id INTEGER NOT NULL, PRIMARY KEY (role_name, user_id));
+CREATE TABLE ambari.key_value_store ("key" VARCHAR(255), "value" VARCHAR, PRIMARY KEY("key"));
+CREATE TABLE ambari.hostconfigmapping (cluster_id bigint NOT NULL, host_name VARCHAR(255) NOT NULL, type_name VARCHAR(255) NOT NULL, version_tag VARCHAR(255) NOT NULL, service_name VARCHAR(255), create_timestamp BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (cluster_id, host_name, type_name, create_timestamp));
+CREATE TABLE ambari.metainfo ("metainfo_key" VARCHAR(255), "metainfo_value" VARCHAR, PRIMARY KEY("metainfo_key"));
+CREATE TABLE ambari.ambari_sequences (sequence_name VARCHAR(255) PRIMARY KEY, "value" BIGINT NOT NULL);
+
+ALTER TABLE ambari.clusterconfig ADD CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.clusterservices ADD CONSTRAINT FK_clusterservices_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.clusterconfigmapping ADD CONSTRAINT FK_clusterconfigmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.clusterstate ADD CONSTRAINT FK_clusterstate_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.componentconfigmapping ADD CONSTRAINT FK_componentconfigmapping_config_tag FOREIGN KEY (config_tag, config_type, cluster_id) REFERENCES ambari.clusterconfig (version_tag, type_name, cluster_id);
+ALTER TABLE ambari.componentconfigmapping ADD CONSTRAINT FK_componentconfigmapping_component_name FOREIGN KEY (component_name, cluster_id, service_name) REFERENCES ambari.servicecomponentdesiredstate (component_name, cluster_id, service_name);
+ALTER TABLE ambari.hostcomponentconfigmapping ADD CONSTRAINT FK_hostcomponentconfigmapping_config_tag FOREIGN KEY (config_tag, config_type, cluster_id) REFERENCES ambari.clusterconfig (version_tag, type_name, cluster_id);
+ALTER TABLE ambari.hostcomponentconfigmapping ADD CONSTRAINT FK_hostcomponentconfigmapping_cluster_id FOREIGN KEY (cluster_id, component_name, host_name, service_name) REFERENCES ambari.hostcomponentstate (cluster_id, component_name, host_name, service_name);
+ALTER TABLE ambari.hcdesiredconfigmapping ADD CONSTRAINT FK_hostcomponentdesiredconfigmapping_config_tag FOREIGN KEY (config_tag, config_type, cluster_id) REFERENCES ambari.clusterconfig (version_tag, type_name, cluster_id);
+ALTER TABLE ambari.hcdesiredconfigmapping ADD CONSTRAINT FK_hostcomponentdesiredconfigmapping_cluster_id FOREIGN KEY (cluster_id, component_name, host_name, service_name) REFERENCES ambari.hostcomponentdesiredstate (cluster_id, component_name, host_name, service_name);
+ALTER TABLE ambari.hostcomponentdesiredstate ADD CONSTRAINT FK_hostcomponentdesiredstate_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+ALTER TABLE ambari.hostcomponentdesiredstate ADD CONSTRAINT FK_hostcomponentdesiredstate_component_name FOREIGN KEY (component_name, cluster_id, service_name) REFERENCES ambari.servicecomponentdesiredstate (component_name, cluster_id, service_name);
+ALTER TABLE ambari.hostcomponentstate ADD CONSTRAINT FK_hostcomponentstate_component_name FOREIGN KEY (component_name, cluster_id, service_name) REFERENCES ambari.servicecomponentdesiredstate (component_name, cluster_id, service_name);
+ALTER TABLE ambari.hostcomponentstate ADD CONSTRAINT FK_hostcomponentstate_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+ALTER TABLE ambari.hoststate ADD CONSTRAINT FK_hoststate_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+ALTER TABLE ambari.servicecomponentdesiredstate ADD CONSTRAINT FK_servicecomponentdesiredstate_service_name FOREIGN KEY (service_name, cluster_id) REFERENCES ambari.clusterservices (service_name, cluster_id);
+ALTER TABLE ambari.serviceconfigmapping ADD CONSTRAINT FK_serviceconfigmapping_config_tag FOREIGN KEY (config_tag, config_type, cluster_id) REFERENCES ambari.clusterconfig (version_tag, type_name, cluster_id);
+ALTER TABLE ambari.serviceconfigmapping ADD CONSTRAINT FK_serviceconfigmapping_service_name FOREIGN KEY (service_name, cluster_id) REFERENCES ambari.clusterservices (service_name, cluster_id);
+ALTER TABLE ambari.servicedesiredstate ADD CONSTRAINT FK_servicedesiredstate_service_name FOREIGN KEY (service_name, cluster_id) REFERENCES ambari.clusterservices (service_name, cluster_id);
+ALTER TABLE ambari.execution_command ADD CONSTRAINT FK_execution_command_task_id FOREIGN KEY (task_id) REFERENCES ambari.host_role_command (task_id);
+ALTER TABLE ambari.host_role_command ADD CONSTRAINT FK_host_role_command_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES ambari.stage (stage_id, request_id);
+ALTER TABLE ambari.host_role_command ADD CONSTRAINT FK_host_role_command_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+ALTER TABLE ambari.role_success_criteria ADD CONSTRAINT FK_role_success_criteria_stage_id FOREIGN KEY (stage_id, request_id) REFERENCES ambari.stage (stage_id, request_id);
+ALTER TABLE ambari.stage ADD CONSTRAINT FK_stage_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+ALTER TABLE ambari.ClusterHostMapping ADD CONSTRAINT FK_ClusterHostMapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id) REFERENCES ambari.users (user_id);
+ALTER TABLE ambari.user_roles ADD CONSTRAINT FK_user_roles_role_name FOREIGN KEY (role_name) REFERENCES ambari.roles (role_name);
+ALTER TABLE ambari.hostconfigmapping ADD CONSTRAINT FK_hostconfigmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES ambari.clusters (cluster_id);
+ALTER TABLE ambari.hostconfigmapping ADD CONSTRAINT FK_hostconfigmapping_host_name FOREIGN KEY (host_name) REFERENCES ambari.hosts (host_name);
+
+BEGIN;
+
+insert into ambari.ambari_sequences(sequence_name, "value")
+select 'cluster_id_seq', 1
+union all
+select 'user_id_seq', 2
+union all
+select 'host_role_command_id_seq', 1;
+
+insert into ambari.Roles(role_name)
+select 'admin'
+union all
+select 'user';
+
+insert into ambari.Users(user_id, user_name, user_password)
+select 1,'admin','538916f8943ec225d97a9a86a2c6ec0818c1cd400e09e03b660fdaaec4af29ddbb6f2b1033b81b00';
+
+insert into ambari.user_roles(role_name, user_id)
+select 'admin',1;
+
+insert into ambari.metainfo(metainfo_key, metainfo_value)
+select 'version','${ambariVersion}';
+
+COMMIT;
+
+CREATE TABLE workflow (
+  workflowId TEXT, workflowName TEXT,
+  parentWorkflowId TEXT,
+  workflowContext TEXT, userName TEXT,
+  startTime BIGINT, lastUpdateTime BIGINT,
+  numJobsTotal INTEGER, numJobsCompleted INTEGER,
+  inputBytes BIGINT, outputBytes BIGINT,
+  duration BIGINT,
+  PRIMARY KEY (workflowId),
+  FOREIGN KEY (parentWorkflowId) REFERENCES workflow(workflowId)
+);
+
+CREATE TABLE job (
+  jobId TEXT, workflowId TEXT, jobName TEXT, workflowEntityName TEXT,
+  userName TEXT, queue TEXT, acls TEXT, confPath TEXT,
+  submitTime BIGINT, launchTime BIGINT, finishTime BIGINT,
+  maps INTEGER, reduces INTEGER, status TEXT, priority TEXT,
+  finishedMaps INTEGER, finishedReduces INTEGER,
+  failedMaps INTEGER, failedReduces INTEGER,
+  mapsRuntime BIGINT, reducesRuntime BIGINT,
+  mapCounters TEXT, reduceCounters TEXT, jobCounters TEXT,
+  inputBytes BIGINT, outputBytes BIGINT,
+  PRIMARY KEY(jobId),
+  FOREIGN KEY(workflowId) REFERENCES workflow(workflowId)
+);
+
+CREATE TABLE task (
+  taskId TEXT, jobId TEXT, taskType TEXT, splits TEXT,
+  startTime BIGINT, finishTime BIGINT, status TEXT, error TEXT, counters TEXT,
+  failedAttempt TEXT,
+  PRIMARY KEY(taskId),
+  FOREIGN KEY(jobId) REFERENCES job(jobId)
+);
+
+CREATE TABLE taskAttempt (
+  taskAttemptId TEXT, taskId TEXT, jobId TEXT, taskType TEXT, taskTracker TEXT,
+  startTime BIGINT, finishTime BIGINT,
+  mapFinishTime BIGINT, shuffleFinishTime BIGINT, sortFinishTime BIGINT,
+  locality TEXT, avataar TEXT,
+  status TEXT, error TEXT, counters TEXT,
+  inputBytes BIGINT, outputBytes BIGINT,
+  PRIMARY KEY(taskAttemptId),
+  FOREIGN KEY(jobId) REFERENCES job(jobId),
+  FOREIGN KEY(taskId) REFERENCES task(taskId)
+);
+
+CREATE TABLE hdfsEvent (
+  timestamp BIGINT,
+  userName TEXT,
+  clientIP TEXT,
+  operation TEXT,
+  srcPath TEXT,
+  dstPath TEXT,
+  permissions TEXT
+);
+
+CREATE TABLE mapreduceEvent (
+  timestamp BIGINT,
+  userName TEXT,
+  clientIP TEXT,
+  operation TEXT,
+  target TEXT,
+  result TEXT,
+  description TEXT,
+  permissions TEXT
+);
+
+CREATE TABLE clusterEvent (
+  timestamp BIGINT,
+  service TEXT, status TEXT,
+  error TEXT, data TEXT ,
+  host TEXT, rack TEXT
+);

+ 19 - 0
ambari-server/src/main/resources/Ambari-DDL-Postgres-REMOTE-DROP.sql

@@ -0,0 +1,19 @@
+--
+-- 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.
+--
+
+DROP SCHEMA ambari CASCADE;

+ 22 - 166
ambari-server/src/test/python/TestAmbaryServer.py

@@ -31,23 +31,23 @@ ambari_server = __import__('ambari-server')
 
 
 class TestAmbariServer(TestCase):
 class TestAmbariServer(TestCase):
 
 
-  @patch.object(ambari_server, 'configure_postgres_username_password')
+  @patch.object(ambari_server, 'configure_database_username_password')
   @patch.object(ambari_server, 'run_os_command')
   @patch.object(ambari_server, 'run_os_command')
   @patch('optparse.Values')
   @patch('optparse.Values')
   def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
   def test_configure_pg_hba_ambaridb_users(self, OptParseValuesMock,
                                 run_os_command_method,
                                 run_os_command_method,
-                                configure_postgres_username_password_method):
+                                configure_database_username_password_method):
     # Prepare mocks
     # Prepare mocks
     run_os_command_method.return_value = (0, "", "")
     run_os_command_method.return_value = (0, "", "")
     opvm = OptParseValuesMock.return_value
     opvm = OptParseValuesMock.return_value
-    opvm.postgres_username = "ffdf"
+    opvm.database_username = "ffdf"
     tf1 = tempfile.NamedTemporaryFile()
     tf1 = tempfile.NamedTemporaryFile()
     ambari_server.PG_HBA_CONF_FILE = tf1.name
     ambari_server.PG_HBA_CONF_FILE = tf1.name
     # Run test
     # Run test
     ambari_server.configure_pg_hba_ambaridb_users()
     ambari_server.configure_pg_hba_ambaridb_users()
     # Check results
     # Check results
     self.assertTrue(run_os_command_method.called)
     self.assertTrue(run_os_command_method.called)
-    self.assertTrue(configure_postgres_username_password_method.called)
+    self.assertTrue(configure_database_username_password_method.called)
     string_expected = self.get_file_string(self
     string_expected = self.get_file_string(self
       .get_samples_dir("configure_pg_hba_ambaridb_users1"))
       .get_samples_dir("configure_pg_hba_ambaridb_users1"))
     string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
     string_actual = self.get_file_string(ambari_server.PG_HBA_CONF_FILE)
@@ -180,160 +180,6 @@ class TestAmbariServer(TestCase):
     pass
     pass
 
 
 
 
-  @patch('__builtin__.file')
-  @patch('__builtin__.open')
-  @patch.object(ambari_server, 'Properties')
-  @patch.object(ambari_server, 'search_file')
-  def test_configure_postgres_username_password_test_configured(self,
-                  search_file_message, properties_mock, open_method, file_obj):
-    """
-      Tests situation when database username + password are already configured
-    """
-
-    out = StringIO.StringIO()
-    sys.stdout = out
-
-    search_file_message.return_value = "blablabla-properties"
-    pm  = properties_mock.return_value
-    def tf(self, key):
-      return {
-               ambari_server.JDBC_USER_NAME_PROPERTY : "fake_username",
-               ambari_server.JDBC_PASSWORD_FILE_PROPERTY : "fake_passwd_file"
-             }[key]
-      pass
-    pm.__getitem__ = tf
-    options = MagicMock()
-    open_method.return_value = file_obj
-    file_obj.read.return_value = "fake_password"
-
-    ambari_server.configure_postgres_username_password(options)
-
-    self.assertTrue(pm.load.called)
-    self.assertTrue(file_obj.read.called)
-    self.assertEquals(options.postgres_username,
-      pm[ambari_server.JDBC_USER_NAME_PROPERTY])
-    self.assertEquals(options.postgres_password, file_obj.read.return_value)
-
-    sys.stdout = sys.__stdout__
-
-
-
-  @patch.object(ambari_server, 'get_pass_file_path', autospec=True)
-  @patch('os.chmod', autospec=True)
-  @patch.object(ambari_server, 'write_property', autospec=True)
-  @patch.object(ambari_server, 'configure_postgres_password')
-  @patch.object(ambari_server, 'get_validated_string_input')
-  @patch.object(ambari_server, 'get_YN_input')
-  @patch('__builtin__.file')
-  @patch('__builtin__.open')
-  @patch.object(ambari_server, 'Properties')
-  @patch.object(ambari_server, 'search_file')
-  def test_configure_postgres_username_password_test_full_setup(self,
-          search_file_message, properties_mock, open_method, file_obj,
-          get_YN_input_method, get_validated_string_input_method,
-          configure_postgres_password_method, write_property_method,
-          os_chmod_method, get_pass_file_path_method):
-    """
-      Tests situation when database username + password are not
-      already configured. Includes advanced DB configuration
-    """
-
-    out = StringIO.StringIO()
-    sys.stdout = out
-
-    search_file_message.return_value = "blablabla-properties"
-    pm  = properties_mock.return_value
-    def tf(self, key):
-      return {
-               ambari_server.JDBC_USER_NAME_PROPERTY : "fake_user",
-               ambari_server.JDBC_PASSWORD_FILE_PROPERTY : False
-             }[key]
-      pass
-    pm.__getitem__ = tf
-    options = MagicMock()
-    open_method.return_value = file_obj
-    file_obj.read.return_value = "fake_password"
-    file_obj.write.return_value = None
-    get_YN_input_method.return_value = False
-    get_validated_string_input_method.return_value = "blablabla-input"
-    get_pass_file_path_method.return_value = "blablabla-path"
-
-    ambari_server.configure_postgres_username_password(options)
-
-    self.assertTrue(get_YN_input_method.called)
-    self.assertEquals(write_property_method.call_args_list, [
-      ((ambari_server.JDBC_USER_NAME_PROPERTY,
-        'ambari-server'),),
-      ((ambari_server.JDBC_PASSWORD_FILE_PROPERTY,
-        get_pass_file_path_method.return_value),)
-    ])
-    get_pass_file_path_method.\
-        assert_called_once_with(search_file_message.return_value)
-    os_chmod_method.assert_called_once_with("blablabla-path", 384)
-    self.assertTrue(pm.load.called)
-    self.assertFalse(get_validated_string_input_method.called)
-    self.assertFalse(configure_postgres_password_method.called)
-
-    sys.stdout = sys.__stdout__
-
-
-  @patch.object(ambari_server, 'get_pass_file_path', autospec=True)
-  @patch('os.chmod', autospec=True)
-  @patch.object(ambari_server, 'write_property', autospec=True)
-  @patch.object(ambari_server, 'configure_postgres_password')
-  @patch.object(ambari_server, 'get_validated_string_input')
-  @patch.object(ambari_server, 'get_YN_input')
-  @patch('__builtin__.file')
-  @patch('__builtin__.open')
-  @patch.object(ambari_server, 'Properties')
-  @patch.object(ambari_server, 'search_file')
-  def test_configure_postgres_username_password_test_full_setup_advanced(self,
-          search_file_message, properties_mock, open_method, file_obj,
-          get_YN_input_method, get_validated_string_input_method,
-          configure_postgres_password_method, write_property_method,
-          os_chmod_method, get_pass_file_path_method):
-    """
-      Tests situation when database username + password are not
-      already configured. Includes advanced DB configuration
-    """
-
-    out = StringIO.StringIO()
-    sys.stdout = out
-
-    search_file_message.return_value = "blablabla-properties"
-    pm  = properties_mock.return_value
-    def tf(self, key):
-      return {
-               ambari_server.JDBC_USER_NAME_PROPERTY : "fake_user",
-               ambari_server.JDBC_PASSWORD_FILE_PROPERTY : False
-             }[key]
-      pass
-    pm.__getitem__ = tf
-    options = MagicMock()
-    open_method.return_value = file_obj
-    file_obj.read.return_value = "fake_password"
-    file_obj.write.return_value = None
-    get_YN_input_method.return_value = True
-    get_validated_string_input_method.return_value = "blablabla-input"
-    get_pass_file_path_method.return_value = "blablabla-path"
-
-    ambari_server.configure_postgres_username_password(options)
-
-    self.assertTrue(get_YN_input_method.called)
-    self.assertEquals(write_property_method.call_args_list, [
-      ((ambari_server.JDBC_USER_NAME_PROPERTY,
-        get_validated_string_input_method.return_value),),
-      ((ambari_server.JDBC_PASSWORD_FILE_PROPERTY,
-        get_pass_file_path_method.return_value),)
-    ])
-    get_pass_file_path_method.\
-        assert_called_once_with(search_file_message.return_value)
-    os_chmod_method.assert_called_once_with("blablabla-path", 384)
-    self.assertTrue(pm.load.called)
-    self.assertTrue(get_validated_string_input_method.called)
-    self.assertTrue(configure_postgres_password_method.called)
-
-    sys.stdout = sys.__stdout__
 
 
 
 
 
 
@@ -349,6 +195,7 @@ class TestAmbariServer(TestCase):
     args = ["setup"]
     args = ["setup"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
 
 
+    options.database=None
     ambari_server.main()
     ambari_server.main()
 
 
     self.assertTrue(setup_method.called)
     self.assertTrue(setup_method.called)
@@ -373,6 +220,7 @@ class TestAmbariServer(TestCase):
     args = ["setup"]
     args = ["setup"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
 
 
+    options.database=None
     ambari_server.main()
     ambari_server.main()
 
 
     self.assertTrue(setup_method.called)
     self.assertTrue(setup_method.called)
@@ -397,6 +245,8 @@ class TestAmbariServer(TestCase):
     args = ["start", "-g"]
     args = ["start", "-g"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
 
 
+    options.database=None
+
     ambari_server.main()
     ambari_server.main()
 
 
     self.assertFalse(setup_method.called)
     self.assertFalse(setup_method.called)
@@ -419,6 +269,7 @@ class TestAmbariServer(TestCase):
     options = MagicMock()
     options = MagicMock()
     args = ["start", "--debug"]
     args = ["start", "--debug"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
+    options.database=None
 
 
     ambari_server.main()
     ambari_server.main()
 
 
@@ -443,6 +294,8 @@ class TestAmbariServer(TestCase):
     args = ["stop"]
     args = ["stop"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
 
 
+    options.database = None
+
     ambari_server.main()
     ambari_server.main()
 
 
     self.assertFalse(setup_method.called)
     self.assertFalse(setup_method.called)
@@ -467,6 +320,7 @@ class TestAmbariServer(TestCase):
     options = MagicMock()
     options = MagicMock()
     args = ["reset"]
     args = ["reset"]
     opm.parse_args.return_value = (options, args)
     opm.parse_args.return_value = (options, args)
+    options.database=None
 
 
     ambari_server.main()
     ambari_server.main()
 
 
@@ -614,14 +468,14 @@ class TestAmbariServer(TestCase):
 
 
 
 
 
 
-  @patch.object(ambari_server, "configure_postgres_username_password")
+  @patch.object(ambari_server, "configure_database_username_password")
   @patch.object(ambari_server, "run_os_command")
   @patch.object(ambari_server, "run_os_command")
   def test_setup_db(self, run_os_command_mock,
   def test_setup_db(self, run_os_command_mock,
-                    configure_postgres_username_password_mock):
+                    configure_database_username_password_mock):
 
 
     run_os_command_mock.return_value = (0, None, None)
     run_os_command_mock.return_value = (0, None, None)
     result = ambari_server.setup_db(MagicMock())
     result = ambari_server.setup_db(MagicMock())
-    self.assertTrue(configure_postgres_username_password_mock.called)
+    self.assertTrue(configure_database_username_password_mock.called)
     self.assertEqual(0, result)
     self.assertEqual(0, result)
 
 
 
 
@@ -983,7 +837,8 @@ class TestAmbariServer(TestCase):
   @patch.object(ambari_server, "check_iptables")
   @patch.object(ambari_server, "check_iptables")
   @patch.object(ambari_server, "check_selinux")
   @patch.object(ambari_server, "check_selinux")
   @patch.object(ambari_server, "setup_remote_db")
   @patch.object(ambari_server, "setup_remote_db")
-  def test_setup(self, setup_remote_db_mock, check_selinux_mock, check_iptables_mock,
+  @patch.object(ambari_server, "store_remote_properties")
+  def test_setup(self, store_remote_properties_mock, setup_remote_db_mock, check_selinux_mock, check_iptables_mock,
                  check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
                  check_postgre_up_mock, setup_db_mock, configure_postgres_mock,
                  download_jdk_mock, configure_os_settings_mock, ):
                  download_jdk_mock, configure_os_settings_mock, ):
 
 
@@ -1000,6 +855,7 @@ class TestAmbariServer(TestCase):
     configure_postgres_mock.return_value = 0
     configure_postgres_mock.return_value = 0
     download_jdk_mock.return_value = 0
     download_jdk_mock.return_value = 0
     configure_os_settings_mock.return_value = 0
     configure_os_settings_mock.return_value = 0
+    store_remote_properties_mock.return_value = 0
     result = ambari_server.setup(args)
     result = ambari_server.setup(args)
     self.assertEqual(None, result)
     self.assertEqual(None, result)
 
 
@@ -1011,8 +867,8 @@ class TestAmbariServer(TestCase):
   @patch.object(ambari_server, "setup_db")
   @patch.object(ambari_server, "setup_db")
   @patch.object(ambari_server, "print_info_msg")
   @patch.object(ambari_server, "print_info_msg")
   @patch.object(ambari_server, "run_os_command")
   @patch.object(ambari_server, "run_os_command")
-  @patch.object(ambari_server, "configure_postgres_username_password")
-  def test_reset(self, configure_postgres_username_password_mock,
+  @patch.object(ambari_server, "configure_database_username_password")
+  def test_reset(self, configure_database_username_password_mock,
                  run_os_command_mock, print_info_msg_mock,
                  run_os_command_mock, print_info_msg_mock,
                  setup_db_mock, get_YN_inputMock):
                  setup_db_mock, get_YN_inputMock):
 
 
@@ -1041,8 +897,8 @@ class TestAmbariServer(TestCase):
   @patch.object(ambari_server, "setup_db")
   @patch.object(ambari_server, "setup_db")
   @patch.object(ambari_server, "print_info_msg")
   @patch.object(ambari_server, "print_info_msg")
   @patch.object(ambari_server, "run_os_command")
   @patch.object(ambari_server, "run_os_command")
-  @patch.object(ambari_server, "configure_postgres_username_password")
-  def test_silent_reset(self, configure_postgres_username_password_mock,
+  @patch.object(ambari_server, "parse_properties")
+  def test_silent_reset(self, parse_properties_mock,
                  run_os_command_mock, print_info_msg_mock,
                  run_os_command_mock, print_info_msg_mock,
                  setup_db_mock):
                  setup_db_mock):