You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mp...@apache.org on 2014/01/30 21:03:19 UTC

git commit: AMBARI-4463. Need better instruction when ambari-server upgrade fails as sql client is not available. (mpapirkovskyy)

Updated Branches:
  refs/heads/branch-1.4.4 c41305586 -> bd1af437f


AMBARI-4463. Need better instruction when ambari-server upgrade fails as sql client is not available. (mpapirkovskyy)


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

Branch: refs/heads/branch-1.4.4
Commit: bd1af437f6638c86ec75da0e9b1fd01941f40b50
Parents: c413055
Author: Myroslav Papirkovskyy <mp...@hortonworks.com>
Authored: Thu Jan 30 19:28:53 2014 +0200
Committer: Myroslav Papirkovskyy <mp...@hortonworks.com>
Committed: Thu Jan 30 22:03:15 2014 +0200

----------------------------------------------------------------------
 ambari-server/src/main/python/ambari-server.py  | 165 +++++++++++++++++--
 .../src/test/python/TestAmbariServer.py         |  63 +++++++
 2 files changed, 216 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/bd1af437/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 e317a54..7cb6781 100755
--- a/ambari-server/src/main/python/ambari-server.py
+++ b/ambari-server/src/main/python/ambari-server.py
@@ -347,7 +347,7 @@ MYSQL_EXEC_ARGS_WITH_USER_VARS = "--host={0} --port={1} --user={2} --password={3
                  "-e\"set @schema=\'{4}\'; set @username=\'{2}\'; source {5};\""
 MYSQL_EXEC_ARGS_WO_USER_VARS = "--force --host={0} --port={1} --user={2} --password={3} --database={4} < {5} 2> /dev/null"
 
-ORACLE_UPGRADE_STACK_ARGS = "-S '{0}/{1}@(description=(address=(protocol=TCP)(host={2})(port={3}))(connect_data=({6}={4})))' @{5} {7} {8}"
+ORACLE_UPGRADE_STACK_ARGS = "-S -L '{0}/{1}@(description=(address=(protocol=TCP)(host={2})(port={3}))(connect_data=({6}={4})))' @{5} {7} {8}"
 
 JDBC_PATTERNS = {"oracle":"*ojdbc*.jar", "mysql":"*mysql*.jar"}
 DATABASE_FULL_NAMES = {"oracle":"Oracle", "mysql":"MySQL", "postgres":"PostgreSQL"}
@@ -1343,7 +1343,7 @@ def remote_stack_upgrade(args, scriptPath, stackId):
 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]))
+    # args.warnings.append('{0} not found. Please, run DDL script manually'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
     if VERBOSE:
       print_warning_msg('{0} not found'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
     return -1, "Client wasn't found", "Client wasn't found"
@@ -1390,6 +1390,135 @@ def execute_remote_script(args, scriptPath):
 
   return -2, "Wrong database", "Wrong database"
 
+def prepare_stack_upgrade_command(args, stackId):
+  db_index = DATABASE_NAMES.index(args.database)
+  tool = DATABASE_CLI_TOOLS_DESC[db_index]
+
+  scriptPath = DATABASE_STACK_UPGRADE_SCRIPTS[db_index]
+
+  stack_name, stack_version = stackId.split(STACK_NAME_VER_SEP)
+  if args.database == "oracle":
+    sid_or_sname = "sid"
+    if (hasattr(args, 'sid_or_sname') and args.sid_or_sname == "sname") or \
+      (hasattr(args, 'jdbc_url') and args.jdbc_url and re.match(ORACLE_SNAME_PATTERN, args.jdbc_url)):
+      print_info_msg("using SERVICE_NAME instead of SID for Oracle")
+      sid_or_sname = "service_name"
+
+    command = '{0} {1}'.format(tool, ORACLE_UPGRADE_STACK_ARGS.format(
+      args.database_username,
+      args.database_password,
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      scriptPath,
+      sid_or_sname,
+      stack_name,
+      stack_version
+    )).strip()
+    return command
+  elif args.database == "mysql":
+    command = '{0} {1}'.format(tool, MYSQL_UPGRADE_STACK_ARGS.format(
+      args.database_host,
+      args.database_port,
+      args.database_username,
+      args.database_password,
+      args.database_name,
+      scriptPath,
+      stack_name,
+      stack_version
+    )).strip()
+    return command
+  pass
+
+
+def prepare_schema_upgrade_command(args):
+  db_index = DATABASE_NAMES.index(args.database)
+  tool = DATABASE_CLI_TOOLS_DESC[db_index]
+
+  scriptPath = DATABASE_UPGRADE_SCRIPTS[db_index]
+
+  if args.database == "postgres":
+    os.environ["PGPASSWORD"] = args.database_password
+    command = '{0} {1}'.format(tool,  POSTGRES_EXEC_ARGS.format(
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      args.database_username,
+      scriptPath
+    )).strip()
+    return command
+  elif args.database == "oracle":
+    sid_or_sname = "sid"
+    if (hasattr(args, 'sid_or_sname') and args.sid_or_sname == "sname") or \
+      (hasattr(args, 'jdbc_url') and args.jdbc_url and re.match(ORACLE_SNAME_PATTERN, args.jdbc_url)):
+      print_info_msg("using SERVICE_NAME instead of SID for Oracle")
+      sid_or_sname = "service_name"
+
+    command = '{0} {1}'.format(tool, ORACLE_EXEC_ARGS.format(
+      args.database_username,
+      args.database_password,
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      scriptPath,
+      sid_or_sname
+    )).strip()
+
+    return command
+  elif args.database == "mysql":
+    MYSQL_EXEC_ARGS = MYSQL_EXEC_ARGS_WO_USER_VARS if MYSQL_INIT_SCRIPT == scriptPath else MYSQL_EXEC_ARGS_WITH_USER_VARS
+    command = '{0} {1}'.format(tool, MYSQL_EXEC_ARGS.format(
+      args.database_host,
+      args.database_port,
+      args.database_username,
+      args.database_password,
+      args.database_name,
+      scriptPath
+    )).strip()
+    return command
+  pass
+
+def prepare_local_repo_upgrade_commands(args, dbkey, dbvalue):
+  db_index = DATABASE_NAMES.index(args.database)
+  tool = DATABASE_CLI_TOOLS_DESC[db_index]
+
+  scriptPath = DATABASE_INSERT_METAINFO_SCRIPTS[db_index]
+
+  command_list = []
+
+  if args.database == "oracle":
+    sid_or_sname = "sid"
+    if (hasattr(args, 'sid_or_sname') and args.sid_or_sname == "sname") or \
+      (hasattr(args, 'jdbc_url') and args.jdbc_url and re.match(ORACLE_SNAME_PATTERN, args.jdbc_url)):
+      print_info_msg("using SERVICE_NAME instead of SID for Oracle")
+      sid_or_sname = "service_name"
+
+    command_list.append('{0} {1}'.format(tool, ORACLE_UPGRADE_STACK_ARGS.format(
+      args.database_username,
+      args.database_password,
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      scriptPath,
+      sid_or_sname,
+      dbkey,
+      dbvalue
+    )).strip())
+
+    command_list.append('{0} {1}'.format(tool, ORACLE_UPGRADE_STACK_ARGS.format(
+      args.database_username,
+      args.database_password,
+      args.database_host,
+      args.database_port,
+      args.database_name,
+      DATABASE_FIX_LOCAL_REPO_SCRIPTS[db_index],
+      sid_or_sname,
+      '',
+      ''
+    )).strip())
+
+
+  return command_list
 
 def configure_database_password(showDefault=True):
   passwordDefault = PG_DEFAULT_PASSWORD
@@ -2427,12 +2556,12 @@ def upgrade_stack(args, stack_id):
         raise NonFatalException(err)
 
     else:
+      command = prepare_stack_upgrade_command(args, stack_id)
       err = 'Cannot find ' + client_desc + ' client in the path to upgrade the Ambari ' + \
             'Server stack. To upgrade stack of Ambari Server ' + \
-            'you must run the following DML against the database:' + \
-            os.linesep + client_usage_cmd
-      raise NonFatalException(err)
-
+            'you must run the following command:' + \
+            os.linesep + command
+      args.warnings.append(err)
 
     pass
   else:
@@ -2473,7 +2602,7 @@ def load_stack_values(version, filename):
 def upgrade_local_repo_remote_db(args, sqlfile, dbkey, dbvalue):
   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]))
+    # args.warnings.append('{0} not found. Please, run DDL script manually'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
     if VERBOSE:
       print_warning_msg('{0} not found'.format(DATABASE_CLI_TOOLS[DATABASE_INDEX]))
     return -1, "Client wasn't found", "Client wasn't found"
@@ -2537,9 +2666,14 @@ def upgrade_local_repo_db(args, dbkey, dbvalue):
         raise NonFatalException(err)
 
     else:
+      commands = prepare_local_repo_upgrade_commands(args, dbkey, dbvalue)
       err = 'Cannot find ' + client_desc + ' client in the path to upgrade the local ' + \
-            'repo information.'
-      raise NonFatalException(err)
+            'repo information. To upgrade local repo information. ' + \
+            'you must run the following commands:'
+      for command in commands:
+        err = err + os.linesep + command
+        pass
+      args.warnings.append(err)
 
     pass
   else:
@@ -2655,11 +2789,12 @@ def upgrade(args):
         raise NonFatalException(err)
 
     else:
+      command = prepare_schema_upgrade_command(args)
       err = 'Cannot find ' + client_desc + ' client in the path to upgrade the Ambari ' + \
             'Server schema. To upgrade Ambari Server schema ' + \
-            'you must run the following DDL against the database:' + \
-            os.linesep + client_usage_cmd
-      raise NonFatalException(err)
+            'you must run the following command:' + \
+            os.linesep + command
+      args.warnings.append(err)
 
     pass
   else:
@@ -4079,6 +4214,12 @@ def main():
         print 'NOTE: Restart Ambari Server to apply changes'+ \
               ' ("ambari-server restart|stop|start")'
 
+    if options.warnings:
+      for warning in options.warnings:
+        print_warning_msg(warning)
+        pass
+      options.exit_message = "Ambari Server '%s' completed with warnings." % action
+      pass
   except FatalException as e:
     if e.reason is not None:
       print_error_msg("Exiting with exit code {0}. Reason: {1}".format(e.code, e.reason))

http://git-wip-us.apache.org/repos/asf/ambari/blob/bd1af437/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 36fb6df..9041d47 100644
--- a/ambari-server/src/test/python/TestAmbariServer.py
+++ b/ambari-server/src/test/python/TestAmbariServer.py
@@ -2775,6 +2775,67 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     self.assertTrue(get_db_cli_tool_mock.called)
     self.assertTrue(execute_remote_script_mock.called)
 
+
+  def test_prepare_schema_upgrade_command(self):
+    test_command = "sqlplus -S -L " \
+                   "'user/pass@(description=(address=(protocol=TCP)(host=oraclehost)(port=1521))(connect_data=(sid=db_SID)))' " \
+                   "@/var/lib/ambari-server/resources/upgrade/ddl/Ambari-DDL-Oracle-UPGRADE.sql user"
+    args = MagicMock()
+    args.database="oracle"
+    args.database_username="user"
+    args.database_password="pass"
+    args.database_host="oraclehost"
+    args.sid_or_sname="sid"
+    args.jdbc_url="fake"
+    args.database_port="1521"
+    args.database_name="db_SID"
+
+    command = ambari_server.prepare_schema_upgrade_command(args)
+
+    self.assertEqual(command, test_command)
+
+    pass
+
+  def test_prepare_local_repo_upgrade_commands(self):
+    test_commands = [
+      "sqlplus -S -L 'user/pass@(description=(address=(protocol=TCP)(host=oraclehost)(port=1521))(connect_data=(sid=db_SID)))' @/var/lib/ambari-server/resources/upgrade/dml/Ambari-DML-Oracle-INSERT_METAINFO.sql key value",
+      "sqlplus -S -L 'user/pass@(description=(address=(protocol=TCP)(host=oraclehost)(port=1521))(connect_data=(sid=db_SID)))' @/var/lib/ambari-server/resources/upgrade/dml/Ambari-DML-Oracle-FIX_LOCAL_REPO.sql"
+    ]
+    args = MagicMock()
+    args.database="oracle"
+    args.database_username="user"
+    args.database_password="pass"
+    args.database_host="oraclehost"
+    args.sid_or_sname="sid"
+    args.jdbc_url="fake"
+    args.database_port="1521"
+    args.database_name="db_SID"
+
+    commands = ambari_server.prepare_local_repo_upgrade_commands(args, "key", "value")
+
+    self.assertEqual(commands, test_commands)
+
+    pass
+
+  def test_prepare_stack_upgrade_command(self):
+    test_command = "sqlplus -S -L 'user/pass@(description=(address=(protocol=TCP)(host=oraclehost)(port=1521))(connect_data=(sid=db_SID)))' " \
+                   "@/var/lib/ambari-server/resources/upgrade/dml/Ambari-DML-Oracle-UPGRADE_STACK.sql HDP 2.1.1"
+    args = MagicMock()
+    args.database="oracle"
+    args.database_username="user"
+    args.database_password="pass"
+    args.database_host="oraclehost"
+    args.sid_or_sname="sid"
+    args.jdbc_url="fake"
+    args.database_port="1521"
+    args.database_name="db_SID"
+
+    command = ambari_server.prepare_stack_upgrade_command(args, "HDP-2.1.1")
+
+    self.assertEqual(command, test_command)
+
+    pass
+
   def test_print_info_msg(self):
     out = StringIO.StringIO()
     sys.stdout = out
@@ -4537,3 +4598,5 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     self.assertTrue(get_ambari_properties_mock.called)
     self.assertTrue(load_stack_values_mock.called)
     self.assertFalse(upgrade_local_repo_db_mock.called)
+
+