You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2013/11/22 21:37:52 UTC

git commit: AMBARI-3854. HostCleanup.py kills java processes not related to ambari (Artem Baranchuk via dlysnichenko)

Updated Branches:
  refs/heads/trunk 181ea4f3d -> 87bf327a7


AMBARI-3854. HostCleanup.py kills java processes not related to ambari (Artem Baranchuk via dlysnichenko)


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

Branch: refs/heads/trunk
Commit: 87bf327a7d6b767acc93833eca320f2bf36237d9
Parents: 181ea4f
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Fri Nov 22 22:37:08 2013 +0200
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Fri Nov 22 22:37:08 2013 +0200

----------------------------------------------------------------------
 .../src/main/python/ambari_agent/HostCleanup.py | 19 +++++++++--
 .../test/python/ambari_agent/TestHostCleanup.py | 36 ++++++++++++++------
 2 files changed, 42 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/87bf327a/ambari-agent/src/main/python/ambari_agent/HostCleanup.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/HostCleanup.py b/ambari-agent/src/main/python/ambari_agent/HostCleanup.py
index 2f56376..00fbe32 100644
--- a/ambari-agent/src/main/python/ambari_agent/HostCleanup.py
+++ b/ambari-agent/src/main/python/ambari_agent/HostCleanup.py
@@ -168,11 +168,18 @@ class HostCleanup:
     except:
       logger.warn("Cannot read dir list: " + str(sys.exc_info()[0]))
 
+    process_items = []
     try:
-      if config.has_option(PROCESS_SECTION, PROCESS_KEY):
-        propertyMap[PROCESS_SECTION] = config.get(PROCESS_SECTION, PROCESS_KEY).split(',')
+      pids = [pid for pid in os.listdir('/proc') if pid.isdigit()]
+      for pid in pids:
+        cmd = open(os.path.join('/proc', pid, 'cmdline'), 'rb').read()
+        cmd = cmd.replace('\0', ' ')
+        if not 'AmbariServer' in cmd and not 'HostCleanup' in cmd:
+          if 'java' in cmd and JAVA_HOME in cmd:
+            process_items.append(int(pid))
     except:
-      logger.warn("Cannot read process list: " + str(sys.exc_info()[0]))
+      pass
+    propertyMap[PROCESS_SECTION] = process_items
 
     try:
       alt_map = {}
@@ -473,6 +480,8 @@ def main():
   parser.add_option("-s", "--silent",
                     action="store_true", dest="silent", default=False,
                     help="Silently accepts default prompt values")
+  parser.add_option('-j', '--java-home', default="/usr/jdk64/jdk1.6.0_31", dest="java_home",
+                    help="Use specified java_home.")
 
 
   (options, args) = parser.parse_args()
@@ -485,6 +494,10 @@ def main():
   handler.setFormatter(formatter)
   logger.addHandler(handler)
 
+  # set java_home
+  global JAVA_HOME
+  JAVA_HOME = options.java_home
+
   # set verbose
   if options.verbose:
     logging.basicConfig(level=logging.DEBUG)

http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/87bf327a/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py b/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py
index 3534195..d8004ca 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestHostCleanup.py
@@ -20,7 +20,7 @@ limitations under the License.
 
 from unittest import TestCase
 import unittest
-from mock.mock import patch, MagicMock, call, create_autospec
+from mock.mock import patch, Mock, MagicMock, call, create_autospec
 from ambari_agent import HostCleanup
 import StringIO
 import sys
@@ -58,7 +58,8 @@ class TestHostCleanup(TestCase):
     # enable stdout
     sys.stdout = sys.__stdout__
 
-  def test_read_host_check_file_with_content(self):
+  @patch("os.listdir", create=True, autospec=True)
+  def test_read_host_check_file_with_content(self, os_listdir_mock):
     out = StringIO.StringIO()
     sys.stdout = out
     tmpfile = tempfile.mktemp()
@@ -87,8 +88,16 @@ created = 2013-07-02 20:39:22.162757"""
     f.write(fileContent)
     f.close()
 
-    propMap = self.hostcleanup.read_host_check_file(tmpfile)
-    self.assertTrue("323" in propMap["processes"])
+    os_listdir_mock.return_value = ['111']
+    tf2 = tempfile.mktemp()
+    f2 = open(tf2,'w')
+    f2.write('java_home|hadoop')
+    f2.close()
+    with patch('os.path.join') as patch_join_mock:
+      patch_join_mock.return_value = f2.name
+      propMap = self.hostcleanup.read_host_check_file(tmpfile)
+
+    self.assertTrue(111 in propMap["processes"])
     self.assertTrue("mysql" in propMap["users"])
     self.assertTrue("HDP-epel" in propMap["repositories"])
     self.assertTrue("/etc/hadoop" in propMap["directories"])
@@ -98,12 +107,13 @@ created = 2013-07-02 20:39:22.162757"""
     sys.stdout = sys.__stdout__
 
   class HostCleanupOptions:
-    def __init__(self, outputfile, inputfile, skip, verbose, silent):
+    def __init__(self, outputfile, inputfile, skip, verbose, silent, java_home):
       self.outputfile = outputfile
       self.inputfile = inputfile
       self.skip = skip
       self.verbose = verbose
       self.silent = silent
+      self.java_home = java_home
 
   @patch.object(HostCleanup, 'get_YN_input')
   @patch.object(HostCleanup.HostCleanup, 'do_cleanup')
@@ -116,12 +126,12 @@ created = 2013-07-02 20:39:22.162757"""
   def test_options(self, parser_mock, file_handler_mock, logging_mock, read_host_check_file_mock,
                    set_formatter_mock, user_root_mock, do_cleanup_mock, get_yn_input_mock):
     parser_mock.return_value = (TestHostCleanup.HostCleanupOptions('/someoutputfile', '/someinputfile', '', False,
-                                                                   False), [])
+                                                                   False, 'java_home'), [])
     file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
     user_root_mock.return_value = True
     get_yn_input_mock.return_value = True
     HostCleanup.main()
-    
+
     # test --out
     file_handler_mock.assert_called_with('/someoutputfile')
     # test --skip
@@ -144,7 +154,7 @@ created = 2013-07-02 20:39:22.162757"""
   def test_options_silent(self, parser_mock, file_handler_mock, logging_mock, read_host_check_file_mock,
                    set_formatter_mock, user_root_mock, do_cleanup_mock, get_yn_input_mock):
     parser_mock.return_value = (TestHostCleanup.HostCleanupOptions('/someoutputfile', '/someinputfile', '', False,
-                                                                   True), [])
+                                                                   True, 'java_home'), [])
     file_handler_mock.return_value = logging.FileHandler('') # disable creating real file
     user_root_mock.return_value = True
     get_yn_input_mock.return_value = True
@@ -307,11 +317,16 @@ created = 2013-07-02 20:39:22.162757"""
 
   @patch("ConfigParser.RawConfigParser")
   @patch("__builtin__.open")
-  def test_read_host_check_file(self, openMock, readMock):
+  @patch("os.listdir", create=True, autospec=True)
+  def test_read_host_check_file(self, os_listdir_mock, openMock, readMock):
     out = StringIO.StringIO()
     sys.stdout = out
     f = MagicMock()
-    openMock.return_value = f
+
+    openRead = MagicMock()
+    openRead.read.return_value = 'java_home|hadoop'
+    openMock.side_effect = [f, openRead]
+    os_listdir_mock.return_value = ['111']
 
     propertyMap = self.hostcleanup.read_host_check_file('test')
 
@@ -322,6 +337,7 @@ created = 2013-07-02 20:39:22.162757"""
     self.assertTrue(propertyMap.has_key(USER_SECTION))
     self.assertTrue(propertyMap.has_key(DIR_SECTION))
     self.assertTrue(propertyMap.has_key(PROCESS_SECTION))
+    self.assertEquals(propertyMap[PROCESS_SECTION][0], 111)
 
     sys.stdout = sys.__stdout__