You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2018/01/02 16:56:49 UTC
ambari git commit: AMBARI-22394. Store and retrieve the ambari repo
urls for os family during bootstrap (Sneha Kanekar via ncole)
Repository: ambari
Updated Branches:
refs/heads/branch-feature-AMBARI-21674 c3a083826 -> 1374bde24
AMBARI-22394. Store and retrieve the ambari repo urls for os family during bootstrap (Sneha Kanekar via ncole)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/1374bde2
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/1374bde2
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/1374bde2
Branch: refs/heads/branch-feature-AMBARI-21674
Commit: 1374bde242410c4610c857a4296cd62724baa327
Parents: c3a0838
Author: Nate Cole <nc...@hortonworks.com>
Authored: Tue Jan 2 11:56:45 2018 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Tue Jan 2 11:56:45 2018 -0500
----------------------------------------------------------------------
ambari-server/src/main/python/bootstrap.py | 45 +++++---
ambari-server/src/main/python/os_check_type.py | 4 -
ambari-server/src/main/python/setupAgent.py | 35 +++++-
ambari-server/src/test/python/TestBootstrap.py | 72 +++++++++++--
ambari-server/src/test/python/TestSetupAgent.py | 107 +++++++++++++++++++
5 files changed, 233 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/1374bde2/ambari-server/src/main/python/bootstrap.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/bootstrap.py b/ambari-server/src/main/python/bootstrap.py
index f1c53ce..a1b44b7 100755
--- a/ambari-server/src/main/python/bootstrap.py
+++ b/ambari-server/src/main/python/bootstrap.py
@@ -36,6 +36,7 @@ import re
from datetime import datetime
from ambari_commons import OSCheck, OSConst
from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
+from ambari_server.serverConfiguration import get_ambari_properties, AMBARI_REPO
if OSCheck.is_windows_family():
from ambari_commons.os_utils import run_os_command, run_in_shell
@@ -407,6 +408,7 @@ class BootstrapDefault(Bootstrap):
TEMP_FOLDER = DEFAULT_AGENT_TEMP_FOLDER
OS_CHECK_SCRIPT_FILENAME = "os_check_type.py"
PASSWORD_FILENAME = "host_pass"
+ agent_os_type = ""
def getRemoteName(self, filename):
full_name = os.path.join(self.TEMP_FOLDER, filename)
@@ -602,7 +604,7 @@ class BootstrapDefault(Bootstrap):
else:
return server_port
- def getRunSetupWithPasswordCommand(self, expected_hostname):
+ def getRunSetupWithPasswordCommand(self, expected_hostname, ambariRepoUrl=""):
setupFile = self.getRemoteName(self.SETUP_SCRIPT_FILENAME)
passphrase = os.environ[AMBARI_PASSPHRASE_VAR_NAME]
server = self.shared_state.ambari_server
@@ -612,9 +614,9 @@ class BootstrapDefault(Bootstrap):
passwordFile = self.getPasswordFile()
return "{sudo} -S python ".format(sudo=AMBARI_SUDO) + str(setupFile) + " " + str(expected_hostname) + \
" " + str(passphrase) + " " + str(server)+ " " + quote_bash_args(str(user_run_as)) + " " + str(version) + \
- " " + str(port) + " < " + str(passwordFile)
+ " " + str(port) + " " + str(ambariRepoUrl) + " < " + str(passwordFile)
- def getRunSetupWithoutPasswordCommand(self, expected_hostname):
+ def getRunSetupWithoutPasswordCommand(self, expected_hostname, ambariRepoUrl=""):
setupFile=self.getRemoteName(self.SETUP_SCRIPT_FILENAME)
passphrase=os.environ[AMBARI_PASSPHRASE_VAR_NAME]
server=self.shared_state.ambari_server
@@ -623,7 +625,7 @@ class BootstrapDefault(Bootstrap):
port=self.getAmbariPort()
return "{sudo} python ".format(sudo=AMBARI_SUDO) + str(setupFile) + " " + str(expected_hostname) + \
" " + str(passphrase) + " " + str(server)+ " " + quote_bash_args(str(user_run_as)) + " " + str(version) + \
- " " + str(port)
+ " " + str(port) + " " + str(ambariRepoUrl)
def runCreatePythonWrapScript(self):
params = self.shared_state
@@ -643,13 +645,15 @@ class BootstrapDefault(Bootstrap):
self.host_log.write("==========================\n")
self.host_log.write("Running OS type check...")
- command = "chmod a+x %s && %s %s %s" % \
+ command = "chmod a+x %s && %s %s" % \
(self.getOsCheckScriptRemoteLocation(),
- PYTHON_ENV, self.getOsCheckScriptRemoteLocation(), params.cluster_os_type)
+ PYTHON_ENV, self.getOsCheckScriptRemoteLocation())
ssh = SSH(params.user, params.sshPort, params.sshkey_file, self.host, command,
params.bootdir, self.host_log)
retcode = ssh.run()
+ # log contains agent os_type followed by Connection closed message
+ self.agent_os_type = retcode["log"].split()[0]
self.host_log.write("\n")
return retcode
@@ -729,20 +733,35 @@ class BootstrapDefault(Bootstrap):
self.host_log.write("\n")
return retcode
- def getRunSetupCommand(self, expected_hostname):
+ def getRunSetupCommand(self, expected_hostname, ambariRepoUrl=""):
if self.hasPassword():
- return self.getRunSetupWithPasswordCommand(expected_hostname)
+ return self.getRunSetupWithPasswordCommand(expected_hostname, ambariRepoUrl)
else:
- return self.getRunSetupWithoutPasswordCommand(expected_hostname)
+ return self.getRunSetupWithoutPasswordCommand(expected_hostname, ambariRepoUrl)
def runSetupAgent(self):
params = self.shared_state
self.host_log.write("==========================\n")
self.host_log.write("Running setup agent script...")
- command = self.getRunSetupCommand(self.host)
- ssh = SSH(params.user, params.sshPort, params.sshkey_file, self.host, command,
- params.bootdir, self.host_log)
- retcode = ssh.run()
+
+ retcode = None
+ if params.cluster_os_type == self.agent_os_type:
+ command = self.getRunSetupCommand(self.host)
+ ssh = SSH(params.user, params.sshPort, params.sshkey_file, self.host, command,
+ params.bootdir, self.host_log)
+ retcode = ssh.run()
+ else:
+ properties = get_ambari_properties()
+ ambariRepoUrl = properties[AMBARI_REPO + '.' + self.agent_os_type]
+ if ambariRepoUrl:
+ command = self.getRunSetupCommand(self.host, ambariRepoUrl)
+ ssh = SSH(params.user, params.sshPort, params.sshkey_file, self.host, command,
+ params.bootdir, self.host_log)
+ retcode = ssh.run()
+ else:
+ retcode = {"exitstatus": 1, "log": "Ambari repo not found for os_type '{0}'. Please set ambari repo baseurl using command: ambari-server setup --ambari-repo <ambari repo baseurl>.".format(self.agent_os_type),
+ "errormsg": "Ambari repo not found for os_type '{0}'".format(self.agent_os_type)}
+
self.host_log.write("\n")
return retcode
http://git-wip-us.apache.org/repos/asf/ambari/blob/1374bde2/ambari-server/src/main/python/os_check_type.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/os_check_type.py b/ambari-server/src/main/python/os_check_type.py
index da37560..a4f0a14 100644
--- a/ambari-server/src/main/python/os_check_type.py
+++ b/ambari-server/src/main/python/os_check_type.py
@@ -23,10 +23,6 @@ from ambari_commons import OSCheck
def main(argv=None):
# Same logic that was in "os_type_check.sh"
- if len(sys.argv) != 2:
- print "Usage: <cluster_os>"
- raise Exception("Error in number of arguments. Usage: <cluster_os>")
- pass
current_os = get_os_type()
#log the current os type value to be used during bootstrap
http://git-wip-us.apache.org/repos/asf/ambari/blob/1374bde2/ambari-server/src/main/python/setupAgent.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/setupAgent.py b/ambari-server/src/main/python/setupAgent.py
index efc3d7c..b0aa7a3 100755
--- a/ambari-server/src/main/python/setupAgent.py
+++ b/ambari-server/src/main/python/setupAgent.py
@@ -24,6 +24,8 @@ import sys
import logging
import os
import subprocess
+import ConfigParser
+import re
from ambari_commons import OSCheck, OSConst
from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
@@ -303,6 +305,7 @@ def checkServerReachability(host, port):
# 3 User to run agent as
# X 4 Project Version (Ambari)
# X 5 Server port
+# X 6 Ambari Repo Url
def parseArguments(argv=None):
if argv is None: # make sure that arguments was passed
return {"exitstatus": 2, "log": "No arguments were passed"}
@@ -316,6 +319,7 @@ def parseArguments(argv=None):
user_run_as = args[3]
projectVersion = ""
server_port = 8080
+ ambariRepoUrl = ""
if len(args) > 4:
projectVersion = args[4]
@@ -326,7 +330,10 @@ def parseArguments(argv=None):
except (Exception):
server_port = 8080
- parsed_args = (expected_hostname, passPhrase, hostname, user_run_as, projectVersion, server_port)
+ if len(args) > 6:
+ ambariRepoUrl = args[6]
+
+ parsed_args = (expected_hostname, passPhrase, hostname, user_run_as, projectVersion, server_port, ambariRepoUrl)
return {"exitstatus": 0, "log": "", "parsed_args": parsed_args}
def run_setup(argv=None):
@@ -335,7 +342,7 @@ def run_setup(argv=None):
if (retcode["exitstatus"] != 0):
return retcode
- (expected_hostname, passPhrase, hostname, user_run_as, projectVersion, server_port) = retcode["parsed_args"]
+ (expected_hostname, passPhrase, hostname, user_run_as, projectVersion, server_port, ambariRepoUrl) = retcode["parsed_args"]
retcode = checkServerReachability(hostname, server_port)
if (retcode["exitstatus"] != 0):
@@ -352,9 +359,27 @@ def run_setup(argv=None):
# Verify that the ambari repo file is available before trying to install ambari-agent
ambari_repo_file = get_ambari_repo_file_full_name()
if os.path.exists(ambari_repo_file):
- retcode = installAgent(availableProjectVersion)
- if (not retcode["exitstatus"] == 0):
- return retcode
+ if ambariRepoUrl == "":
+ retcode = installAgent(availableProjectVersion)
+ if (not retcode["exitstatus"] == 0):
+ return retcode
+ else:
+ #update repo file to use given repo url
+ if OSCheck.is_suse_family() or OSCheck.is_redhat_family():
+ config = ConfigParser.RawConfigParser()
+ config.read(ambari_repo_file)
+ baseurl = config.get(config.sections()[0], 'baseurl')
+ elif OSCheck.is_ubuntu_family():
+ for line in open(ambari_repo_file,'r'):
+ match = re.search('^deb.*$', line)
+ if match is not None:
+ baseurl = match.group(0).split()[1]
+ break
+ subprocess.call(['sed', '-i', '-e', 's,' + baseurl + ',' + ambariRepoUrl + ',g', ambari_repo_file])
+ retcode = installAgent(availableProjectVersion)
+ if (not retcode["exitstatus"] == 0):
+ #failed due to new ambari repo url
+ return retcode
else:
return {"exitstatus": 2, "log": "Ambari repo file not found: {0}".format(ambari_repo_file)}
pass
http://git-wip-us.apache.org/repos/asf/ambari/blob/1374bde2/ambari-server/src/test/python/TestBootstrap.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestBootstrap.py b/ambari-server/src/test/python/TestBootstrap.py
index bea47f4..2549c9a 100644
--- a/ambari-server/src/test/python/TestBootstrap.py
+++ b/ambari-server/src/test/python/TestBootstrap.py
@@ -111,9 +111,9 @@ class TestBootstrap(TestCase):
bootstrap_obj = Bootstrap("hostname", shared_state)
utime = 1234
bootstrap_obj.getUtime = MagicMock(return_value=utime)
- ret = bootstrap_obj.getRunSetupWithPasswordCommand("hostname")
+ ret = bootstrap_obj.getRunSetupWithPasswordCommand("hostname", "ambariRepoUrl")
expected = "/var/lib/ambari-agent/tmp/ambari-sudo.sh -S python /var/lib/ambari-agent/tmp/setupAgent{0}.py hostname TEST_PASSPHRASE " \
- "ambariServer root 8440 < /var/lib/ambari-agent/tmp/host_pass{0}".format(utime)
+ "ambariServer root 8440 {1} < /var/lib/ambari-agent/tmp/host_pass{0}".format(utime, "ambariRepoUrl")
self.assertEquals(ret, expected)
@@ -159,8 +159,8 @@ class TestBootstrap(TestCase):
"setupAgentFile", "ambariServer", "centos6",
version, "8440", "root")
bootstrap_obj = Bootstrap("hostname", shared_state)
- runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname")
- self.assertTrue(runSetupCommand.endswith(version + " 8440"))
+ runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname", "ambariRepoUrl")
+ self.assertTrue(runSetupCommand.endswith(version + " 8440 ambariRepoUrl"))
def test_agent_setup_command_without_project_version(self):
@@ -170,8 +170,8 @@ class TestBootstrap(TestCase):
"setupAgentFile", "ambariServer", "centos6",
version, "8440", "root")
bootstrap_obj = Bootstrap("hostname", shared_state)
- runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname")
- self.assertTrue(runSetupCommand.endswith(" 8440"))
+ runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname", "ambariRepoUrl")
+ self.assertTrue(runSetupCommand.endswith(" 8440 ambariRepoUrl"))
# TODO: test_os_check_fail_fails_bootstrap_execution
@@ -512,15 +512,16 @@ class TestBootstrap(TestCase):
None, "8440", "root")
bootstrap_obj = Bootstrap("hostname", shared_state)
getOsCheckScriptRemoteLocation_mock.return_value = "OsCheckScriptRemoteLocation"
- expected = 42
+ expected = {'errormsg': '', 'exitstatus': 0, 'log': 'centos6 Connection to host1 closed.'}
init_mock.return_value = None
run_mock.return_value = expected
res = bootstrap_obj.runOsCheckScript()
self.assertEquals(res, expected)
command = str(init_mock.call_args[0][4])
+ self.assertEqual(res["log"].split()[0], "centos6")
self.assertEqual(command,
"chmod a+x OsCheckScriptRemoteLocation && "
- "env PYTHONPATH=$PYTHONPATH:/var/lib/ambari-agent/tmp OsCheckScriptRemoteLocation centos6")
+ "env PYTHONPATH=$PYTHONPATH:/var/lib/ambari-agent/tmp OsCheckScriptRemoteLocation")
@patch.object(SSH, "__init__")
@@ -533,6 +534,7 @@ class TestBootstrap(TestCase):
"setupAgentFile", "ambariServer", "centos6",
None, "8440", "root")
bootstrap_obj = Bootstrap("hostname", shared_state)
+ bootstrap_obj.agent_os_type = "centos6"
getRunSetupCommand_mock.return_value = "RunSetupCommand"
expected = 42
init_mock.return_value = None
@@ -542,6 +544,60 @@ class TestBootstrap(TestCase):
command = str(init_mock.call_args[0][4])
self.assertEqual(command, "RunSetupCommand")
+ @patch.object(SSH, "__init__")
+ @patch.object(BootstrapDefault, "getRunSetupCommand")
+ @patch.object(SSH, "run")
+ @patch.object(HostLog, "write")
+ @patch("os.environ")
+ def test_runSetupAgentForAmbariRepoUrl(self, environ_mock, write_mock, run_mock, getRunSetupCommand_mock, init_mock,):
+ environ_mock.__getitem__.return_value = "/tmp/"
+ getRunSetupCommand_mock.return_value = "RunSetupCommand"
+ run_mock.return_value = {'log': 'log', 'exitstatus': 0}
+ init_mock.return_value = None
+
+ if not os.path.exists('/tmp/ambari.properties'):
+ os.mknod('/tmp/ambari.properties')
+
+ #If cluster_os and agent_os type are different and ambariRepoUrl is found in property file
+ shared_state = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir",
+ "setupAgentFile", "ambariServer", "centos6", None, "8440", "root")
+ bootstrap_obj = Bootstrap("hostname", shared_state)
+ bootstrap_obj.agent_os_type = "redhat-ppc7"
+ f = open("/tmp/ambari.properties","a")
+ f.write("ambari.repo." + bootstrap_obj.agent_os_type + "=ambariRepoUrl")
+ f.close()
+ expected = {'log': 'log', 'exitstatus': 0}
+ run_mock.return_value = {'log': 'log', 'exitstatus': 0}
+ res = bootstrap_obj.runSetupAgent()
+ self.assertEqual(res,expected)
+
+ f = open("/tmp/ambari.properties","r")
+ lines = f.readlines()
+ f.close()
+ f = open("/tmp/ambari.properties","w")
+ for line in lines:
+ if not "ambari.repo." + bootstrap_obj.agent_os_type in line:
+ f.write(line)
+ f.close()
+
+ #If cluster_os and agent_os type are different and ambariRepoUrl is not found in property file
+ shared_state = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir",
+ "setupAgentFile", "ambariServer", "centos6", None, "8440", "root")
+ bootstrap_obj = Bootstrap("hostname", shared_state)
+ bootstrap_obj.agent_os_type = "redhat-ppc7"
+ expected = {"errormsg": "Ambari repo not found for os_type '{0}'".format(bootstrap_obj.agent_os_type), "exitstatus": 1, "log": "Ambari repo not found for os_type '{0}'. Please set ambari repo baseurl using command: ambari-server setup --ambari-repo <ambari repo baseurl>.".format(bootstrap_obj.agent_os_type)}
+ run_mock.return_value = {'log': 'log', 'exitstatus': 0}
+ res = bootstrap_obj.runSetupAgent()
+ self.assertEqual(res,expected)
+
+ #If cluster_os and agent_os type are same
+ shared_state = SharedState("root", "123", "sshkey_file", "scriptDir", "bootdir",
+ "setupAgentFile", "ambariServer", "redhat-ppc7", None, "8440", "root")
+ bootstrap_obj = Bootstrap("hostname", shared_state)
+ bootstrap_obj.agent_os_type = "redhat-ppc7"
+ expected = {'log': 'log', 'exitstatus': 0}
+ res = bootstrap_obj.runSetupAgent()
+ self.assertEqual(res,expected)
@patch.object(BootstrapDefault, "hasPassword")
@patch.object(BootstrapDefault, "getRunSetupWithPasswordCommand")
http://git-wip-us.apache.org/repos/asf/ambari/blob/1374bde2/ambari-server/src/test/python/TestSetupAgent.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestSetupAgent.py b/ambari-server/src/test/python/TestSetupAgent.py
index 0b33e9f..64faf85 100644
--- a/ambari-server/src/test/python/TestSetupAgent.py
+++ b/ambari-server/src/test/python/TestSetupAgent.py
@@ -20,6 +20,9 @@ from mock.mock import MagicMock
from unittest import TestCase
from mock.mock import patch
import sys
+import ConfigParser
+import os
+import re
from ambari_commons import OSCheck
from only_for_platform import get_platform, not_for_platform, only_for_platform, os_distro_value, PLATFORM_WINDOWS
@@ -59,6 +62,13 @@ class TestSetupAgent(TestCase):
pass
+ def test_parse_argument(self,):
+ arguments=["", "test.hst", "passphrase", "test", "root", "", 8080, "ambariRepoUrl"]
+ ret=setup_agent.parseArguments(arguments)
+ parsed_args = ("test.hst", "passphrase", "test", "root", "", 8080, "ambariRepoUrl")
+ self.assertEqual(ret["exitstatus"], 0)
+ self.assertEqual(ret["parsed_args"], parsed_args)
+
@not_for_platform(PLATFORM_WINDOWS)
@patch.object(setup_agent, 'execOsCommand')
@patch("os.environ")
@@ -524,6 +534,103 @@ class TestSetupAgent(TestCase):
self.assertTrue("exitstatus" in ret)
self.assertEqual(ret["exitstatus"], 1)
self.assertTrue(get_ambari_repo_file_full_name_mock() in ret["log"]) # ambari repo file not found message
+
+ # ambari repo base url passed for setting in repo file
+ def deleteDummyRepo():
+ if os.path.isfile('/tmp/dummy.repo'):
+ os.remove('/tmp/dummy.repo')
+
+ def createDummyRepo():
+ if not os.path.isfile('/tmp/dummy.repo'):
+ os.mknod('/tmp/dummy.repo')
+ fn = open('/tmp/dummy.repo','w+')
+ fn.write("[AMBARI.2.4.2.4-2.x]\n")
+ fn.write("baseurl=repoUrl")
+ fn.close()
+
+ # If agent installation is successful
+ createDummyRepo()
+ installAgent_mock.reset_mock()
+ getOptimalVersion_mock.reset_mock()
+ os_path_exists_mock.reset_mock()
+ installAgent_mock.return_value = {'log': 'log', 'exitstatus': 0}
+ getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
+ os_path_exists_mock.return_value = True
+ get_ambari_repo_file_full_name_mock.return_value = "/tmp/dummy.repo"
+ ret = setup_agent.main(("setupAgent.py","agents_host","password","server_hostname","root","1.1.1","8080","ambariRepoUrl"))
+ self.assertTrue(installAgent_mock.called)
+ self.assertTrue("exitstatus" in ret)
+ self.assertEqual(ret["exitstatus"], 0)
+ config = ConfigParser.RawConfigParser()
+ config.read("/tmp/dummy.repo")
+ baseurl = config.get(config.sections()[0],'baseurl')
+ self.assertEqual(baseurl, "ambariRepoUrl")
+
+ # If agent installation fails
+ exit_mock.reset_mock()
+ installAgent_mock.reset_mock()
+ getOptimalVersion_mock.reset_mock()
+ os_path_exists_mock.reset_mock()
+ installAgent_mock.return_value = {'log': 'log', 'exitstatus': 1}
+ getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
+ os_path_exists_mock.return_value = True
+ get_ambari_repo_file_full_name_mock.return_value = "/tmp/dummy.repo"
+ ret = setup_agent.main(("setupAgent.py","agents_host","password","server_hostname","root","1.1.1","8080","ambariRepoUrl"))
+ self.assertTrue(installAgent_mock.called)
+ self.assertTrue("exitstatus" in ret)
+ self.assertEqual(ret["exitstatus"], 1)
+ deleteDummyRepo()
+
+ #if os_type is ubuntu
+ is_suse_family_mock.return_value = False
+ is_ubuntu_family_mock.return_value = True
+
+ def deleteDummyRepoUbuntu():
+ if os.path.isfile('/tmp/dummy.list'):
+ os.remove('/tmp/dummy.list')
+
+ def createDummyRepoUbuntu():
+ if not os.path.isfile('/tmp/dummy.list'):
+ os.mknod('/tmp/dummy.list')
+ fn = open('/tmp/dummy.list','wt')
+ fn.write("#VERSION_NUMBER=2.4.2.4-2.x]\n")
+ fn.write("deb repoUrl Ambari main")
+ fn.close()
+
+ # If agent installation is successful
+ createDummyRepoUbuntu()
+ installAgent_mock.reset_mock()
+ getOptimalVersion_mock.reset_mock()
+ os_path_exists_mock.reset_mock()
+ installAgent_mock.return_value = {'log': 'log', 'exitstatus': 0}
+ getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
+ os_path_exists_mock.return_value = True
+ get_ambari_repo_file_full_name_mock.return_value = "/tmp/dummy.list"
+ ret = setup_agent.main(("setupAgent.py","agents_host","password","server_hostname","root","1.1.1","8080","ambariRepoUrl"))
+ self.assertTrue(installAgent_mock.called)
+ self.assertTrue("exitstatus" in ret)
+ self.assertEqual(ret["exitstatus"], 0)
+ for line in open('/tmp/dummy.list','r'):
+ match = re.search('^deb.*$', line)
+ if match is not None:
+ baseurl = match.group(0).split()[1]
+ break
+ self.assertEqual(baseurl, "ambariRepoUrl")
+
+ # If agent installation fails
+ exit_mock.reset_mock()
+ installAgent_mock.reset_mock()
+ getOptimalVersion_mock.reset_mock()
+ os_path_exists_mock.reset_mock()
+ installAgent_mock.return_value = {'log': 'log', 'exitstatus': 1}
+ getOptimalVersion_mock.return_value = {'log': '1.1.1', 'exitstatus': 0}
+ os_path_exists_mock.return_value = True
+ get_ambari_repo_file_full_name_mock.return_value = "/tmp/dummy.list"
+ ret = setup_agent.main(("setupAgent.py","agents_host","password","server_hostname","root","1.1.1","8080","ambariRepoUrl"))
+ self.assertTrue(installAgent_mock.called)
+ self.assertTrue("exitstatus" in ret)
+ self.assertEqual(ret["exitstatus"], 1)
+ deleteDummyRepoUbuntu()
pass
@patch.object(setup_agent, 'execOsCommand')