浏览代码

AMBARI-3008. Command "ambari-server setup -s" ends with error on SUSE. (Dmitry Sen via odiachenko)

Oleksandr Diachenko 11 年之前
父节点
当前提交
9a5060c0c6
共有 2 个文件被更改,包括 34 次插入3 次删除
  1. 10 3
      ambari-server/src/main/python/ambari-server.py
  2. 24 0
      ambari-server/src/test/python/TestAmbaryServer.py

+ 10 - 3
ambari-server/src/main/python/ambari-server.py

@@ -214,6 +214,8 @@ AMBARI_PROPERTIES_FILE="ambari.properties"
 AMBARI_PROPERTIES_RPMSAVE_FILE="ambari.properties.rpmsave"
 RESOURCES_DIR_PROPERTY="resources.dir"
 
+SETUP_DB_CONNECT_TIMEOUT = 5
+SETUP_DB_CONNECT_ATTEMPTS = 3
 SETUP_DB_CMD = ['su', '-', 'postgres',
         '--command=psql -f {0} -v username=\'"{1}"\' -v password="\'{2}\'" -v dbname="{3}"']
 UPGRADE_STACK_CMD = ['su', 'postgres',
@@ -877,9 +879,14 @@ def setup_db(args):
   command = SETUP_DB_CMD[:]
   command[-1] = command[-1].format(scriptFile, username, password, dbname)
 
-  retcode, outdata, errdata = run_os_command(command)
-  if not retcode == 0:
-    print errdata
+  for i in range(SETUP_DB_CONNECT_ATTEMPTS):
+    print 'Connecting to the database. Attempt %d...' % (i+1)
+    retcode, outdata, errdata = run_os_command(command)
+    if retcode == 0:
+      return retcode
+    time.sleep(SETUP_DB_CONNECT_TIMEOUT)
+
+  print_error_msg(errdata)
   return retcode
 
 

+ 24 - 0
ambari-server/src/test/python/TestAmbaryServer.py

@@ -522,7 +522,31 @@ class TestAmbariServer(TestCase):
     self.assertTrue(configure_database_username_password_mock.called)
     self.assertEqual(0, result)
 
+  @patch.object(ambari_server, "configure_database_username_password")
+  @patch("time.sleep")
+  @patch.object(ambari_server, "run_os_command")
+  def test_setup_db_connect_attempts_fail(self, run_os_command_mock,
+                                          sleep_mock, config_db_mock):
+    run_os_command_mock.side_effect = [(1, "error", "error"),(1, "error", "error"),
+                                       (1, "error", "error")]
+    result = ambari_server.setup_db(MagicMock())
+    self.assertTrue(run_os_command_mock.called)
+    self.assertEqual(1, result)
+    self.assertEqual(3, sleep_mock.call_count)
+    pass
 
+  @patch.object(ambari_server, "configure_database_username_password")
+  @patch("time.sleep")
+  @patch.object(ambari_server, "run_os_command")
+  def test_setup_db_connect_attempts_success(self, run_os_command_mock,
+                                             sleep_mock, config_db_mock):
+    run_os_command_mock.side_effect = [(1, "error", "error"),(0, None, None),
+                                       (0, None, None)]
+    result = ambari_server.setup_db(MagicMock())
+    self.assertTrue(run_os_command_mock.called)
+    self.assertEqual(0, result)
+    self.assertEqual(1, sleep_mock.call_count)
+    pass
 
   @patch.object(ambari_server, "get_YN_input")
   @patch.object(ambari_server, "run_os_command")