浏览代码

AMBARI-2828 Add check for java exec - run the version command before we can start/stop/smoke services (Andrew Onischuk via dlysnichenko)

Lisnichenko Dmitro 11 年之前
父节点
当前提交
ad24d766d2

+ 13 - 1
ambari-agent/src/main/python/ambari_agent/PuppetExecutor.py

@@ -25,11 +25,13 @@ import pprint
 import threading
 import threading
 from threading import Thread
 from threading import Thread
 
 
+from shell import shellRunner
 from manifestGenerator import generateManifest
 from manifestGenerator import generateManifest
 from RepoInstaller import RepoInstaller
 from RepoInstaller import RepoInstaller
 from Grep import Grep
 from Grep import Grep
 import shell
 import shell
 
 
+JAVANOTVALID_MSG = "Cannot access JDK! Make sure you have permission to execute {0}/bin/java"
 
 
 logger = logging.getLogger()
 logger = logging.getLogger()
 
 
@@ -54,6 +56,7 @@ class PuppetExecutor:
     self.reposInstalled = False
     self.reposInstalled = False
     self.config = config
     self.config = config
     self.modulesdir = self.puppetModule + "/modules"
     self.modulesdir = self.puppetModule + "/modules"
+    self.sh = shellRunner()
 
 
   def configureEnviron(self, environ):
   def configureEnviron(self, environ):
     if not self.config.has_option("puppet", "ruby_home"):
     if not self.config.has_option("puppet", "ruby_home"):
@@ -143,8 +146,17 @@ class PuppetExecutor:
 
 
     logger.info("ExitCode : "  + str(result["exitcode"]))
     logger.info("ExitCode : "  + str(result["exitcode"]))
     return result
     return result
-
+  
+  def isJavaAvailable(self, command):
+    javaExecutablePath = "{0}/bin/java".format(command['configurations']['global']['java64_home'])
+    return not self.sh.run([javaExecutablePath, '-version'])['exitCode']
+    
   def runCommand(self, command, tmpoutfile, tmperrfile):
   def runCommand(self, command, tmpoutfile, tmperrfile):
+    # After installing we must have jdk available for start/stop/smoke
+    if command['roleCommand']!="INSTALL" and not self.isJavaAvailable(command):
+      errMsg = JAVANOTVALID_MSG.format(command['configurations']['global']['java64_home'])
+      return {'stdout': '', 'stderr': errMsg, 'exitcode': 1}
+
     taskId = 0
     taskId = 0
     if command.has_key("taskId"):
     if command.has_key("taskId"):
       taskId = command['taskId']
       taskId = command['taskId']

+ 37 - 3
ambari-agent/src/test/python/TestPuppetExecutor.py

@@ -30,6 +30,7 @@ import json
 from AmbariConfig import AmbariConfig
 from AmbariConfig import AmbariConfig
 from mock.mock import patch, MagicMock, call
 from mock.mock import patch, MagicMock, call
 from threading import Thread
 from threading import Thread
+from shell import shellRunner
 
 
 class TestPuppetExecutor(TestCase):
 class TestPuppetExecutor(TestCase):
 
 
@@ -42,9 +43,22 @@ class TestPuppetExecutor(TestCase):
     self.assertEquals("--confdir=/tmp", command[2],"conf dir tmp")
     self.assertEquals("--confdir=/tmp", command[2],"conf dir tmp")
     self.assertEquals("--detailed-exitcodes", command[3], "make sure output \
     self.assertEquals("--detailed-exitcodes", command[3], "make sure output \
     correct")
     correct")
-
+    
+  @patch.object(shellRunner,'run')
+  def test_isJavaAvailable(self, cmdrun_mock):
+    puppetInstance = PuppetExecutor("/tmp", "/x", "/y", '/tmpdir', None)
+    command = {'configurations':{'global':{'java64_home':'/usr/jdk/jdk123'}}}
+    
+    cmdrun_mock.return_value = {'exitCode': 1, 'output': 'Command not found', 'error': ''}
+    self.assertEquals(puppetInstance.isJavaAvailable(command), False)
+    
+    cmdrun_mock.return_value = {'exitCode': 0, 'output': 'OK', 'error': ''}
+    self.assertEquals(puppetInstance.isJavaAvailable(command), True)
+    
+    
+  @patch.object(PuppetExecutor, 'isJavaAvailable')
   @patch.object(PuppetExecutor, 'runPuppetFile')
   @patch.object(PuppetExecutor, 'runPuppetFile')
-  def test_run_command(self, runPuppetFileMock):
+  def test_run_command(self, runPuppetFileMock, isJavaAvailableMock):
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
@@ -55,6 +69,7 @@ class TestPuppetExecutor(TestCase):
         result["exitcode"] = 0
         result["exitcode"] = 0
     runPuppetFileMock.side_effect = side_effect1
     runPuppetFileMock.side_effect = side_effect1
     puppetInstance.reposInstalled = False
     puppetInstance.reposInstalled = False
+    isJavaAvailableMock.return_value = True
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     self.assertEquals(res["exitcode"], 0)
     self.assertEquals(res["exitcode"], 0)
     self.assertTrue(puppetInstance.reposInstalled)
     self.assertTrue(puppetInstance.reposInstalled)
@@ -63,14 +78,31 @@ class TestPuppetExecutor(TestCase):
         result["exitcode"] = 999
         result["exitcode"] = 999
     runPuppetFileMock.side_effect = side_effect2
     runPuppetFileMock.side_effect = side_effect2
     puppetInstance.reposInstalled = False
     puppetInstance.reposInstalled = False
+    isJavaAvailableMock.return_value = True
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     self.assertEquals(res["exitcode"], 999)
     self.assertEquals(res["exitcode"], 999)
     self.assertFalse(puppetInstance.reposInstalled)
     self.assertFalse(puppetInstance.reposInstalled)
     os.unlink(tmpdir + os.sep + 'site-' + str(parsedJson["taskId"]) + '.pp')
     os.unlink(tmpdir + os.sep + 'site-' + str(parsedJson["taskId"]) + '.pp')
+    
+    def side_effect2(puppetFile, result, puppetEnv, tmpoutfile, tmperrfile):
+        result["exitcode"] = 0
+    runPuppetFileMock.side_effect = side_effect2
+    puppetInstance.reposInstalled = False
+    isJavaAvailableMock.return_value = False
+    parsedJson['roleCommand'] = "START"
+    parsedJson['configurations'] = {'global':{'java64_home':'/usr/jdk/jdk123'}}
+    res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
+    
+    JAVANOTVALID_MSG = "Cannot access JDK! Make sure you have permission to execute {0}/bin/java"
+    errMsg = JAVANOTVALID_MSG.format('/usr/jdk/jdk123')
+    self.assertEquals(res["exitcode"], 1)
+    self.assertEquals(res["stderr"], errMsg)
+    self.assertFalse(puppetInstance.reposInstalled)
 
 
+  @patch.object(PuppetExecutor, 'isJavaAvailable')
   @patch.object(RepoInstaller, 'generate_repo_manifests')
   @patch.object(RepoInstaller, 'generate_repo_manifests')
   @patch.object(PuppetExecutor, 'runPuppetFile')
   @patch.object(PuppetExecutor, 'runPuppetFile')
-  def test_overwrite_repos(self, runPuppetFileMock, generateRepoManifestMock):
+  def test_overwrite_repos(self, runPuppetFileMock, generateRepoManifestMock, isJavaAvailableMock):
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
@@ -80,6 +112,8 @@ class TestPuppetExecutor(TestCase):
     def side_effect(puppetFile, result, puppetEnv, tmpoutfile, tmperrfile):
     def side_effect(puppetFile, result, puppetEnv, tmpoutfile, tmperrfile):
       result["exitcode"] = 0
       result["exitcode"] = 0
     runPuppetFileMock.side_effect = side_effect
     runPuppetFileMock.side_effect = side_effect
+    
+    isJavaAvailableMock.return_value = True
 
 
     #If ambari-agent has been just started and no any commands were executed by
     #If ambari-agent has been just started and no any commands were executed by
     # PuppetExecutor.runCommand, then no repo files were updated by
     # PuppetExecutor.runCommand, then no repo files were updated by