Forráskód Böngészése

AMBARI-2462. Enhance processing of ojdbc.jar before starting ambari server (AMBARI-2349) (Oleksandr Diachenko via smohanty)

git-svn-id: https://svn.apache.org/repos/asf/incubator/ambari/trunk@1495627 13f79535-47bb-0310-9956-ffa450edef68
Sumit Mohanty 12 éve
szülő
commit
00d618d566

+ 37 - 30
ambari-server/src/main/python/ambari-server.py

@@ -1295,13 +1295,9 @@ def get_ambari_properties():
 
 # Load database connection properties from conf file
 def parse_properties_file(args):
-  conf_file = find_properties_file()
-  properties = Properties()
-
-  try:
-    properties.load(open(conf_file))
-  except Exception, e:
-    print 'Could not read ambari config file "%s": %s' % (conf_file, e)
+  properties = get_ambari_properties()
+  if properties == -1:
+    print_error_msg ("Error getting ambari properties")
     return -1
 
   args.persistence_type = properties[PERSISTENCE_TYPE_PROPERTY]
@@ -1717,33 +1713,44 @@ def copy_files(files, dest_dir):
 
 def check_jdbc_drivers(args):
   properties = get_ambari_properties()
+  if properties == -1:
+    print_error_msg ("Error getting ambari properties")
+    return -1
+  
+  result = find_jdbc_driver(args)
   
-  ## ask user twice
-  for i in range(0,2):
-    result = find_jdbc_driver(args)
-    if result == -1:
-      msg = 'WARNING: Before starting Ambari Server, ' \
-            'the {0} JDBC driver JAR file must be copied to {1}. Press enter to continue.'.format(
+  msg = 'Before starting Ambari Server, ' \
+        'you must copy the {0} JDBC driver JAR file to {1}.'.format(
         DATABASE_FULL_NAMES[args.database],
-        JAVA_SHARE_PATH
-      )
-      if not SILENT:
-        raw_input(msg)
-      else:
-        print_warning_msg(msg)
+        JAVA_SHARE_PATH)
 
-    # check if user provided drivers
-    result = find_jdbc_driver(args)
+  
+  if result == -1:
+  
+    if SILENT:
+      print_error_msg(msg)
+      raise FatalException(-1, msg)
+    else:
+      print_warning_msg(msg)
+      raw_input(PRESS_ENTER_MSG)
+      result = find_jdbc_driver(args)
+      if result == -1:
+        print_error_msg(msg)
+        raise FatalException(-1, msg)
+        
+  # Check if selected RDBMS requires drivers to copy
+  if type(result) is not int:
+    print 'Copying JDBC drivers to server resources...'
+    try:
+      resources_dir = properties[RESOURCES_DIR_PROPERTY]
+    except KeyError:
+      print_error_msg("There is no value for " + RESOURCES_DIR_PROPERTY + "in " + AMBARI_PROPERTIES_FILE)
+      return -1
 
-    if type(result) is not int:
-      print 'Copying JDBC drivers to server resources...'
-      try:
-        resources_dir = properties[RESOURCES_DIR_PROPERTY]
-      except KeyError:
-        print_error_msg("There is no value for " + RESOURCES_DIR_PROPERTY + "in " + AMBARI_PROPERTIES_FILE)
-        return -1
-      copy_files(result, resources_dir)
-      break
+    copy_status = copy_files(result, resources_dir)
+    
+    if not copy_status == 0:
+      raise FatalException(-1, "Failed to copy JDBC drivers to server resources")
 
   return 0
 

+ 161 - 35
ambari-server/src/test/python/TestAmbaryServer.py

@@ -2316,38 +2316,6 @@ class TestAmbariServer(TestCase):
       self.assertTrue("Client wasn't found" in fe.reason)
       pass
 
-
-  @patch.object(ambari_server, "get_ambari_properties")
-  @patch.object(ambari_server, "find_jdbc_driver")
-  @patch.object(ambari_server, "copy_files")
-  @patch('__builtin__.raw_input')
-  def test_check_jdbc_drivers(self, raw_input_mock, copy_files_mock, find_jdbc_driver_mock, get_ambari_properties_mock):
-    args = MagicMock()
-    
-    # Check positive scenario
-    drivers_list = ['driver_file']
-    resources_dir = '/tmp'
-    
-    get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
-    find_jdbc_driver_mock.return_value = drivers_list
-    
-    rcode = ambari_server.check_jdbc_drivers(args)
-    
-    self.assertEqual(0, rcode)
-    copy_files_mock.assert_called_with(drivers_list, resources_dir)
-    
-    #Check negative scenario
-    find_jdbc_driver_mock.return_value = -1
-    
-    args.database = "oracle"
-    
-    rcode = ambari_server.check_jdbc_drivers(args)
-    
-    self.assertEqual(0, rcode)
-    #Ensure user was asked to provide drivers
-    self.assertTrue(raw_input_mock.called)
-    
-
   @patch.object(ambari_server, "find_properties_file")
   def test_get_ambari_properties(self, find_properties_file_mock):
 
@@ -2465,11 +2433,169 @@ class TestAmbariServer(TestCase):
     sys.stdout = sys.__stdout__
 
 
-  @patch.object(ambari_server, "search_file")
-  def test_parse_properties_file(self, search_file_mock):
+  @patch.object(ambari_server, "get_ambari_properties")
+  @patch.object(ambari_server, "find_jdbc_driver")
+  @patch.object(ambari_server, "copy_files")
+  @patch.object(ambari_server, "print_error_msg")
+  @patch.object(ambari_server, "print_warning_msg")
+  @patch('__builtin__.raw_input')
+  def test_check_jdbc_drivers(self, raw_input_mock, print_warning_msg, print_error_msg_mock, copy_files_mock,
+                              find_jdbc_driver_mock, get_ambari_properties_mock):
+
+    out = StringIO.StringIO()
+    sys.stdout = out
+
+    args = MagicMock()
+    
+    # Check positive scenario
+    drivers_list = ['driver_file']
+    resources_dir = '/tmp'
+    
+    get_ambari_properties_mock.return_value = {ambari_server.RESOURCES_DIR_PROPERTY : resources_dir}
+    find_jdbc_driver_mock.return_value = drivers_list
+    copy_files_mock.return_value = 0
+    
+    args.database = "oracle"
+    
+    rcode = ambari_server.check_jdbc_drivers(args)
+    
+    self.assertEqual(0, rcode)
+    copy_files_mock.assert_called_with(drivers_list, resources_dir)
+    
+    get_ambari_properties_mock.reset_mock()
+    find_jdbc_driver_mock.reset_mock()
+    copy_files_mock.reset_mock()
+    print_error_msg_mock.reset_mock()
+    print_warning_msg.reset_mock()
+    raw_input_mock.reset_mock()
+    
+    
+    
+    # Check negative scenarios
+    # Silent option, no drivers
+    ambari_server.SILENT = True
+    
+    find_jdbc_driver_mock.return_value = -1
+    
+    failed = False
+    
+    try:
+      rcode = ambari_server.check_jdbc_drivers(args)
+    except FatalException:
+      failed = True
+    
+    self.assertTrue(print_error_msg_mock.called)
+    self.assertTrue(failed)
+    
+    get_ambari_properties_mock.reset_mock()
+    find_jdbc_driver_mock.reset_mock()
+    copy_files_mock.reset_mock()
+    print_error_msg_mock.reset_mock()
+    print_warning_msg.reset_mock()
+    raw_input_mock.reset_mock()
+    
+    # Non-Silent option, no drivers
+    ambari_server.SILENT = False
+    
+    find_jdbc_driver_mock.return_value = -1
+    
+    failed = False
+    
+    try:
+      rcode = ambari_server.check_jdbc_drivers(args)
+    except FatalException:
+      failed = True
+
+    self.assertTrue(failed)
+    self.assertTrue(print_error_msg_mock.called)
+    
+    get_ambari_properties_mock.reset_mock()
+    find_jdbc_driver_mock.reset_mock()
+    copy_files_mock.reset_mock()
+    print_error_msg_mock.reset_mock()
+    print_warning_msg.reset_mock()
+    raw_input_mock.reset_mock()
+    
+    # Non-Silent option, no drivers at first ask, present drivers after that
+    
+    find_jdbc_driver_mock.side_effect = [-1, drivers_list]
+    
+    rcode = ambari_server.check_jdbc_drivers(args)
+    
+    self.assertEqual(0, rcode)
+    copy_files_mock.assert_called_with(drivers_list, resources_dir)
+    
+    get_ambari_properties_mock.reset_mock()
+    find_jdbc_driver_mock.reset_mock()
+    copy_files_mock.reset_mock()
+    print_error_msg_mock.reset_mock()
+    print_warning_msg.reset_mock()
+    raw_input_mock.reset_mock()
+    
+    # Non-Silent option, no drivers at first ask, no drivers after that
+    find_jdbc_driver_mock.side_effect = [-1, -1]
+    
+    failed = False
+    
+    try:
+      rcode = ambari_server.check_jdbc_drivers(args)
+    except FatalException:
+      failed = True
+    
+    self.assertTrue(failed)
+    self.assertTrue(print_error_msg_mock.called)
+    
+    get_ambari_properties_mock.reset_mock()
+    find_jdbc_driver_mock.reset_mock()
+    copy_files_mock.reset_mock()
+    print_error_msg_mock.reset_mock()
+    print_warning_msg.reset_mock()
+    raw_input_mock.reset_mock()
+    
+    
+    
+    
+    # Failed to copy_files    
+    
+    find_jdbc_driver_mock.side_effect = [drivers_list]
+    try:
+      rcode = ambari_server.check_jdbc_drivers(args)
+    except FatalException:
+      failed = True
+    
+    self.assertTrue(failed)
+    
+    sys.stdout = sys.__stdout__
+    
+    
+  @patch.object(ambari_server, "find_properties_file")
+  def test_get_ambari_properties(self, find_properties_file_mock):
+
+    find_properties_file_mock.return_value = None
+    rcode = ambari_server.get_ambari_properties()
+    self.assertEqual(rcode, -1)
+  
+    tf1 = tempfile.NamedTemporaryFile()
+    find_properties_file_mock.return_value = tf1.name
+    prop_name='name'
+    prop_value='val'
+    
+    with open(tf1.name, 'w') as fout:
+      fout.write(prop_name + '=' + prop_value)
+    fout.close()
+
+    properties = ambari_server.get_ambari_properties()
+    
+    self.assertEqual(properties[prop_name], prop_value)
+    self.assertEqual(properties.fileName, os.path.abspath(tf1.name))
+    
+    sys.stdout = sys.__stdout__
+
+  @patch.object(ambari_server, "find_properties_file")
+  def test_parse_properties_file(self, find_properties_file_mock):
 
     tf1 = tempfile.NamedTemporaryFile(mode='r')
-    search_file_mock.return_value = tf1.name
+    find_properties_file_mock.return_value = tf1.name
 
     args = MagicMock()
     ambari_server.parse_properties_file(args)