Jelajahi Sumber

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 tahun lalu
induk
melakukan
ad24d766d2

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

@@ -25,11 +25,13 @@ import pprint
 import threading
 from threading import Thread
 
+from shell import shellRunner
 from manifestGenerator import generateManifest
 from RepoInstaller import RepoInstaller
 from Grep import Grep
 import shell
 
+JAVANOTVALID_MSG = "Cannot access JDK! Make sure you have permission to execute {0}/bin/java"
 
 logger = logging.getLogger()
 
@@ -54,6 +56,7 @@ class PuppetExecutor:
     self.reposInstalled = False
     self.config = config
     self.modulesdir = self.puppetModule + "/modules"
+    self.sh = shellRunner()
 
   def configureEnviron(self, environ):
     if not self.config.has_option("puppet", "ruby_home"):
@@ -143,8 +146,17 @@ class PuppetExecutor:
 
     logger.info("ExitCode : "  + str(result["exitcode"]))
     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):
+    # 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
     if command.has_key("taskId"):
       taskId = command['taskId']

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

@@ -30,6 +30,7 @@ import json
 from AmbariConfig import AmbariConfig
 from mock.mock import patch, MagicMock, call
 from threading import Thread
+from shell import shellRunner
 
 class TestPuppetExecutor(TestCase):
 
@@ -42,9 +43,22 @@ class TestPuppetExecutor(TestCase):
     self.assertEquals("--confdir=/tmp", command[2],"conf dir tmp")
     self.assertEquals("--detailed-exitcodes", command[3], "make sure output \
     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')
-  def test_run_command(self, runPuppetFileMock):
+  def test_run_command(self, runPuppetFileMock, isJavaAvailableMock):
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
@@ -55,6 +69,7 @@ class TestPuppetExecutor(TestCase):
         result["exitcode"] = 0
     runPuppetFileMock.side_effect = side_effect1
     puppetInstance.reposInstalled = False
+    isJavaAvailableMock.return_value = True
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     self.assertEquals(res["exitcode"], 0)
     self.assertTrue(puppetInstance.reposInstalled)
@@ -63,14 +78,31 @@ class TestPuppetExecutor(TestCase):
         result["exitcode"] = 999
     runPuppetFileMock.side_effect = side_effect2
     puppetInstance.reposInstalled = False
+    isJavaAvailableMock.return_value = True
     res = puppetInstance.runCommand(parsedJson, tmpdir + '/out.txt', tmpdir + '/err.txt')
     self.assertEquals(res["exitcode"], 999)
     self.assertFalse(puppetInstance.reposInstalled)
     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(PuppetExecutor, 'runPuppetFile')
-  def test_overwrite_repos(self, runPuppetFileMock, generateRepoManifestMock):
+  def test_overwrite_repos(self, runPuppetFileMock, generateRepoManifestMock, isJavaAvailableMock):
     tmpdir = AmbariConfig().getConfig().get("stack", "installprefix")
     puppetInstance = PuppetExecutor("/tmp", "/x", "/y", tmpdir, AmbariConfig().getConfig())
     jsonFile = open('../../main/python/ambari_agent/test.json', 'r')
@@ -80,6 +112,8 @@ class TestPuppetExecutor(TestCase):
     def side_effect(puppetFile, result, puppetEnv, tmpoutfile, tmperrfile):
       result["exitcode"] = 0
     runPuppetFileMock.side_effect = side_effect
+    
+    isJavaAvailableMock.return_value = True
 
     #If ambari-agent has been just started and no any commands were executed by
     # PuppetExecutor.runCommand, then no repo files were updated by