Updated Branches: refs/heads/trunk 1d93addee -> ad24d766d
AMBARI-2828 Add check for java exec - run the version command before we can start/stop/smoke services (Andrew Onischuk 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/ad24d766 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ambari/tree/ad24d766 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ambari/diff/ad24d766 Branch: refs/heads/trunk Commit: ad24d766d2ec0804ab555a4dd63c27ea8ed01406 Parents: 1d93add Author: Lisnichenko Dmitro <[email protected]> Authored: Wed Aug 14 22:22:57 2013 +0300 Committer: Lisnichenko Dmitro <[email protected]> Committed: Wed Aug 14 22:22:57 2013 +0300 ---------------------------------------------------------------------- .../main/python/ambari_agent/PuppetExecutor.py | 14 ++++++- .../src/test/python/TestPuppetExecutor.py | 40 ++++++++++++++++++-- 2 files changed, 50 insertions(+), 4 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/ad24d766/ambari-agent/src/main/python/ambari_agent/PuppetExecutor.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/main/python/ambari_agent/PuppetExecutor.py b/ambari-agent/src/main/python/ambari_agent/PuppetExecutor.py index 61390cd..4769b07 100644 --- a/ambari-agent/src/main/python/ambari_agent/PuppetExecutor.py +++ b/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'] http://git-wip-us.apache.org/repos/asf/incubator-ambari/blob/ad24d766/ambari-agent/src/test/python/TestPuppetExecutor.py ---------------------------------------------------------------------- diff --git a/ambari-agent/src/test/python/TestPuppetExecutor.py b/ambari-agent/src/test/python/TestPuppetExecutor.py index bc0d910..85e480e 100644 --- a/ambari-agent/src/test/python/TestPuppetExecutor.py +++ b/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
