瀏覽代碼

AMBARI-8316. Bootstaraping and starting agents as non-root (aonishuk)

Andrew Onishuk 11 年之前
父節點
當前提交
8eaf00328d

+ 9 - 2
ambari-agent/conf/unix/ambari-agent

@@ -48,6 +48,12 @@ AMBARI_AGENT_PY_SCRIPT=/usr/lib/python2.6/site-packages/ambari_agent/AmbariAgent
 OK=1
 NOTOK=0
 
+current_user=`awk -v val=$EUID -F ":" '$3==val{print $1}' /etc/passwd`
+# setup necessary ownership
+sudo chown -R $current_user "/var/lib/ambari-agent/ambari-env.sh"
+sudo chown -R $current_user "/var/run/ambari-agent"
+sudo chown -R $current_user "/var/log/ambari-agent"
+sudo chown -R $current_user "/var/lib/ambari-agent/data"
 
 if [ -a /usr/bin/python2.7 ] && [ -z "$PYTHON" ]; then
   PYTHON=/usr/bin/python2.7
@@ -106,8 +112,9 @@ check_python_version ()
 
 retcode=0
 
-if [ "$(id -u)" != "0" ]; then
- echo "You can't perform this operation as non-root user. Please, re-login as root user"
+sudo -v
+if [ "$?" != "0" ]; then
+ echo "You can't perform this operation as non-sudoer user. Please, re-login as one"
  exit 0
 fi
 

+ 1 - 0
ambari-agent/conf/unix/ambari-agent.ini

@@ -28,6 +28,7 @@ data_cleanup_max_size_MB = 100
 ping_port=8670
 cache_dir=/var/lib/ambari-agent/cache
 tolerate_download_failures=true
+run_as_user=root
 
 [command]
 maxretries=2

+ 13 - 5
ambari-agent/etc/init.d/ambari-agent

@@ -19,20 +19,28 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+run_as_user=`cat /etc/ambari-agent/conf/ambari-agent.ini | grep run_as_user | tr -d ' ' | awk -F '=' '{ print $2}'`
+
+if [ "$EUID" != `id -u $run_as_user` ] ; then
+  command_prefx="su - $run_as_user -c"
+else
+  command_prefx="bash -c"
+fi
+
 case "$1" in
   start)
-        /usr/sbin/ambari-agent $@
+        $command_prefx "/usr/sbin/ambari-agent $@"
         ;;
   stop)
-        /usr/sbin/ambari-agent $@
+        $command_prefx "/usr/sbin/ambari-agent $@"
         ;;
   status)
-        /usr/sbin/ambari-agent $@
+        $command_prefx "/usr/sbin/ambari-agent $@"
         exit $?
         ;;
   restart)
-        $0 stop
-        $0 start
+        $command_prefx "$0 stop"
+        $command_prefx "$0 start"
         ;;
   reset)
         /usr/sbin/ambari-agent $@

+ 1 - 0
ambari-agent/src/main/python/ambari_agent/AgentConfig_linux.py

@@ -35,6 +35,7 @@ data_cleanup_max_age=2592000
 data_cleanup_max_size_MB = 100
 ping_port=8670
 cache_dir=/var/lib/ambari-agent/cache
+run_as_user=root
 
 [services]
 

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

@@ -23,6 +23,7 @@ import signal
 from optparse import OptionParser
 import sys
 import traceback
+import getpass
 import os
 import time
 import platform
@@ -35,6 +36,7 @@ from PingPortListener import PingPortListener
 import hostname
 from DataCleaner import DataCleaner
 import socket
+from ambari_agent import shell
 logger = logging.getLogger()
 
 formatstr = "%(levelname)s %(asctime)s %(filename)s:%(lineno)d - %(message)s"
@@ -204,8 +206,10 @@ def main(heartbeat_stop_callback=None):
 
   expected_hostname = options.expected_hostname
 
-  setup_logging(options.verbose)
+  current_user = getpass.getuser()
 
+  setup_logging(options.verbose)
+  
   default_cfg = {'agent': {'prefix': '/home/ambari'}}
   config.load(default_cfg)
 

+ 6 - 2
ambari-agent/src/main/python/ambari_agent/shell.py

@@ -156,8 +156,12 @@ class shellRunnerLinux:
     except Exception:
       logger.warn("can not switch user for RUN_COMMAND.")
     code = 0
-    cmd = " "
-    cmd = cmd.join(script)
+    
+    cmd = script
+    
+    if isinstance(script, list):
+      cmd = " ".join(script)
+
     p = subprocess.Popen(cmd, preexec_fn=_changeUid, stdout=subprocess.PIPE,
                          stderr=subprocess.PIPE, shell=True, close_fds=True)
     out, err = p.communicate()

+ 5 - 3
ambari-server/src/main/java/org/apache/ambari/server/bootstrap/BSRunner.java

@@ -150,10 +150,11 @@ class BSRunner extends Thread {
   public void run() {
     String hostString = createHostString(sshHostInfo.getHosts());
     String user = sshHostInfo.getUser();
+    String userRunAs = sshHostInfo.getUserRunAs();
     if (user == null || user.isEmpty()) {
       user = DEFAULT_USER;
     }
-    String commands[] = new String[11];
+    String commands[] = new String[12];
     String shellCommand[] = new String[3];
     BSStat stat = BSStat.RUNNING;
     String scriptlog = "";
@@ -193,13 +194,14 @@ class BSRunner extends Thread {
       commands[7] = this.clusterOsFamily;
       commands[8] = this.projectVersion;
       commands[9] = this.serverPort+"";
+      commands[10] = userRunAs;
       if (this.passwordFile != null) {
-        commands[10] = this.passwordFile.toString();
+        commands[11] = this.passwordFile.toString();
       }
       LOG.info("Host= " + hostString + " bs=" + this.bsScript + " requestDir=" +
           requestIdDir + " user=" + user + " keyfile=" + this.sshKeyFile +
           " passwordFile " + this.passwordFile + " server=" + this.ambariHostname +
-          " version=" + projectVersion + " serverPort=" + this.serverPort);
+          " version=" + projectVersion + " serverPort=" + this.serverPort + " userRunAs="+ userRunAs);
 
       String[] env = new String[] { "AMBARI_PASSPHRASE=" + agentSetupPassword };
       if (this.verbose)

+ 14 - 0
ambari-server/src/main/java/org/apache/ambari/server/bootstrap/SshHostInfo.java

@@ -50,6 +50,9 @@ public class SshHostInfo {
 
   @XmlElement
   private String password;
+  
+  @XmlElement
+  private String userRunAs;
 
   public String getSshKey() {
     return sshKey;
@@ -90,6 +93,17 @@ public class SshHostInfo {
   public void setPassword(String password) {
     this.password = password;
   }
+  
+  public String getUserRunAs() {
+    // TODO: remove this once UI supports customizing ambari run-as-user
+    if(userRunAs == null)
+      return "root";
+    return userRunAs;
+  }
+
+  public void setUserRunAs(String userRunAs) {
+    this.userRunAs = userRunAs;
+  }
 
   public String hostListAsString() {
     StringBuilder ret = new StringBuilder();

+ 13 - 7
ambari-server/src/main/python/bootstrap.py

@@ -364,11 +364,12 @@ class Bootstrap(threading.Thread):
     setupFile = self.getRemoteName(self.SETUP_SCRIPT_FILENAME)
     passphrase = os.environ[AMBARI_PASSPHRASE_VAR_NAME]
     server = self.shared_state.ambari_server
+    user_run_as = self.shared_state.user_run_as
     version = self.getAmbariVersion()
     port = self.getAmbariPort()
     passwordFile = self.getPasswordFile()
     return "sudo -S python " + str(setupFile) + " " + str(expected_hostname) + \
-           " " + str(passphrase) + " " + str(server) + " " + str(version) + \
+           " " + str(passphrase) + " " + str(server)+ " " + str(user_run_as) + " " + str(version) + \
            " " + str(port) + " < " + str(passwordFile)
 
 
@@ -376,10 +377,11 @@ class Bootstrap(threading.Thread):
     setupFile=self.getRemoteName(self.SETUP_SCRIPT_FILENAME)
     passphrase=os.environ[AMBARI_PASSPHRASE_VAR_NAME]
     server=self.shared_state.ambari_server
+    user_run_as = self.shared_state.user_run_as
     version=self.getAmbariVersion()
     port=self.getAmbariPort()
     return "sudo python " + str(setupFile) + " " + str(expected_hostname) + \
-           " " + str(passphrase) + " " + str(server) + " " + str(version) + \
+           " " + str(passphrase) + " " + str(server)+ " " + str(user_run_as) + " " + str(version) + \
            " " + str(port)
 
 
@@ -620,7 +622,7 @@ class PBootstrap:
 class SharedState:
   def __init__(self, user, sshkey_file, script_dir, boottmpdir, setup_agent_file,
                ambari_server, cluster_os_type, ambari_version, server_port,
-               password_file = None):
+               user_run_as, password_file = None):
     self.hostlist_to_remove_password_file = None
     self.user = user
     self.sshkey_file = sshkey_file
@@ -630,6 +632,7 @@ class SharedState:
     self.ambari_server = ambari_server
     self.cluster_os_type = cluster_os_type
     self.ambari_version = ambari_version
+    self.user_run_as = user_run_as
     self.password_file = password_file
     self.statuses = None
     self.server_port = server_port
@@ -644,9 +647,11 @@ def main(argv=None):
   if len(onlyargs) < 3:
     sys.stderr.write("Usage: <comma separated hosts> "
                      "<tmpdir for storage> <user> <sshkey_file> <agent setup script>"
-                     " <ambari-server name> <cluster os type> <ambari version> <ambari port> <passwordFile>\n")
+                     " <ambari-server name> <cluster os type> <ambari version> <ambari port> <user_run_as> <passwordFile>\n")
     sys.exit(2)
     pass
+  
+
   #Parse the input
   hostList = onlyargs[0].split(",")
   bootdir =  onlyargs[1]
@@ -657,7 +662,8 @@ def main(argv=None):
   cluster_os_type = onlyargs[6]
   ambariVersion = onlyargs[7]
   server_port = onlyargs[8]
-  passwordFile = onlyargs[9]
+  user_run_as = onlyargs[9]
+  passwordFile = onlyargs[10]
 
   # ssh doesn't like open files
   subprocess.Popen(["chmod", "600", sshkey_file], stdout=subprocess.PIPE)
@@ -669,10 +675,10 @@ def main(argv=None):
                " using " + scriptDir + " cluster primary OS: " + cluster_os_type +
                " with user '" + user + "' sshKey File " + sshkey_file + " password File " + passwordFile +\
                " using tmp dir " + bootdir + " ambari: " + ambariServer +"; server_port: " + server_port +\
-               "; ambari version: " + ambariVersion)
+               "; ambari version: " + ambariVersion+"; user_run_as: " + user_run_as)
   sharedState = SharedState(user, sshkey_file, scriptDir, bootdir, setupAgentFile,
                        ambariServer, cluster_os_type, ambariVersion,
-                       server_port, passwordFile)
+                       server_port, user_run_as, passwordFile)
   pbootstrap = PBootstrap(hostList, sharedState)
   pbootstrap.run()
   return 0 # Hack to comply with current usage

+ 22 - 16
ambari-server/src/main/python/setupAgent.py

@@ -62,18 +62,21 @@ def installAgent(projectVersion):
   return execOsCommand(Command, tries=3, try_sleep=10)
 
 
-def configureAgent(server_hostname):
+def configureAgent(server_hostname, user_run_as):
   """ Configure the agent so that it has all the configs knobs properly installed """
   osCommand = ["sed", "-i.bak", "s/hostname=localhost/hostname=" + server_hostname +
                                 "/g", "/etc/ambari-agent/conf/ambari-agent.ini"]
   execOsCommand(osCommand)
+  osCommand = ["sed", "-i.bak", "s/run_as_user=.*$/run_as_user=" + user_run_as +
+                                "/g", "/etc/ambari-agent/conf/ambari-agent.ini"]
+  execOsCommand(osCommand)
   return
 
 
-def runAgent(passPhrase, expected_hostname):
+def runAgent(passPhrase, expected_hostname, user_run_as):
   os.environ[AMBARI_PASSPHRASE_VAR] = passPhrase
-  agent_retcode = subprocess.call("/usr/sbin/ambari-agent restart --expected-hostname=" +
-                                  expected_hostname, shell=True)
+  agent_retcode = subprocess.call("su - {0} -c '/usr/sbin/ambari-agent restart --expected-hostname={1}'".format(user_run_as, expected_hostname)
+                                  , shell=True)
   for i in range(3):
     time.sleep(1)
     ret = execOsCommand(["tail", "-20", "/var/log/ambari-agent/ambari-agent.log"])
@@ -168,8 +171,9 @@ def checkServerReachability(host, port):
 #               0        Expected host name
 #               1        Password
 #               2        Host name
-#      X        3        Project Version (Ambari)
-#      X        4        Server port
+#               3        User to run agent as
+#      X        4        Project Version (Ambari)
+#      X        5        Server port
 
 
 def parseArguments(argv=None):
@@ -182,28 +186,30 @@ def parseArguments(argv=None):
   expected_hostname = args[0]
   passPhrase = args[1]
   hostname = args[2]
+  user_run_as = args[3]
   projectVersion = ""
   server_port = 8080
 
-  if len(args) > 3:
-    projectVersion = args[3]
-
   if len(args) > 4:
+    projectVersion = args[4]
+
+  if len(args) > 5:
     try:
-      server_port = int(args[4])
+      server_port = int(args[5])
     except (Exception):
       server_port = 8080
 
-  return expected_hostname, passPhrase, hostname, projectVersion, server_port
+  return expected_hostname, passPhrase, hostname, user_run_as, projectVersion, server_port
 
 
 def main(argv=None):
   # Parse passed arguments
   expected_hostname, passPhrase, hostname,\
-  projectVersion, server_port = parseArguments(argv)
+  user_run_as, projectVersion, server_port = parseArguments(argv)
 
   checkServerReachability(hostname, server_port)
-
+  
+  projectVersion = "1.7.0"
   if projectVersion == "null" or projectVersion == "{ambariVersion}" or projectVersion == "":
     retcode = getOptimalVersion("")
   else:
@@ -224,9 +230,9 @@ def main(argv=None):
                                         "versions of ambari-agent:"+retcode["log"][0].strip()})
   else:
       sys.exit(retcode)
-
-  configureAgent(hostname)
-  sys.exit(runAgent(passPhrase, expected_hostname))
+  
+  configureAgent(hostname, user_run_as)
+  sys.exit(runAgent(passPhrase, expected_hostname, user_run_as))
 
 if __name__ == '__main__':
   logging.basicConfig(level=logging.DEBUG)

+ 34 - 34
ambari-server/src/test/python/TestBootstrap.py

@@ -42,7 +42,7 @@ class TestBootstrap(TestCase):
 
   def test_getRemoteName(self):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
-                      "setupAgentFile", "ambariServer", "centos6", None, "8440")
+                      "setupAgentFile", "ambariServer", "centos6", None, "8440", "root")
     res = bootstrap_obj = Bootstrap("hostname", shared_state)
     utime1 = 1234
     utime2 = 12345
@@ -65,7 +65,7 @@ class TestBootstrap(TestCase):
   def test_getAmbariPort(self):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     self.assertEquals(bootstrap_obj.getAmbariPort(),"8440")
     shared_state.server_port = None
@@ -81,11 +81,11 @@ class TestBootstrap(TestCase):
   @patch("os.path.realpath")
   def test_bootstrap_main(self, dirname_mock, realpath_mock, run_mock, exit_mock, stderr_mock, subprocess_Popen_mock):
     bootstrap.main(["bootstrap.py", "hostname,hostname2", "/tmp/bootstrap", "root", "sshkey_file", "setupAgent.py", "ambariServer", \
-                    "centos6", "1.1.1", "8440", "passwordfile"])
+                    "centos6", "1.1.1", "8440", "root", "passwordfile"])
     self.assertTrue(run_mock.called)
     run_mock.reset_mock()
     bootstrap.main(["bootstrap.py", "hostname,hostname2", "/tmp/bootstrap", "root", "sshkey_file", "setupAgent.py", "ambariServer", \
-                    "centos6", "1.1.1", "8440", None])
+                    "centos6", "1.1.1", "8440", "root", None])
     self.assertTrue(run_mock.called)
     run_mock.reset_mock()
     def side_effect(retcode):
@@ -104,21 +104,21 @@ class TestBootstrap(TestCase):
   def test_getRunSetupWithPasswordCommand(self, environ_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     environ_mock.__getitem__.return_value = "TEST_PASSPHRASE"
     bootstrap_obj = Bootstrap("hostname", shared_state)
     utime = 1234
     bootstrap_obj.getUtime = MagicMock(return_value=utime)
     ret = bootstrap_obj.getRunSetupWithPasswordCommand("hostname")
     expected = "sudo -S python /var/lib/ambari-agent/data/tmp/setupAgent{0}.py hostname TEST_PASSPHRASE " \
-               "ambariServer  8440 < /var/lib/ambari-agent/data/tmp/host_pass{0}".format(utime)
+               "ambariServer root  8440 < /var/lib/ambari-agent/data/tmp/host_pass{0}".format(utime)
     self.assertEquals(ret, expected)
 
 
   def test_generateRandomFileName(self):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     self.assertTrue(bootstrap_obj.generateRandomFileName(None) == bootstrap_obj.getUtime())
 
@@ -128,7 +128,7 @@ class TestBootstrap(TestCase):
   def test_is_suse(self, open_mock, isfile_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     isfile_mock.return_value = True
     f = open_mock.return_value
@@ -140,7 +140,7 @@ class TestBootstrap(TestCase):
   def test_getRepoDir(self, is_suse_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     # Suse
     is_suse_mock.return_value = True
@@ -154,7 +154,7 @@ class TestBootstrap(TestCase):
   def test_getSetupScript(self):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     self.assertEquals(bootstrap_obj.shared_state.script_dir, "scriptDir")
 
@@ -164,7 +164,7 @@ class TestBootstrap(TestCase):
     version = "1.1.1"
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               version, "8440")
+                               version, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname")
     self.assertTrue(runSetupCommand.endswith(version + " 8440"))
@@ -175,7 +175,7 @@ class TestBootstrap(TestCase):
     version = None
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               version, "8440")
+                               version, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     runSetupCommand = bootstrap_obj.getRunSetupCommand("hostname")
     self.assertTrue(runSetupCommand.endswith(" 8440"))
@@ -216,7 +216,7 @@ class TestBootstrap(TestCase):
   def test_SCP(self, popenMock):
     params = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                   "setupAgentFile", "ambariServer", "centos6",
-                                  "1.2.1", "8440")
+                                  "1.2.1", "8440", "root")
     host_log_mock = MagicMock()
     log = {'text': ""}
     def write_side_effect(text):
@@ -259,7 +259,7 @@ class TestBootstrap(TestCase):
   def test_SSH(self, popenMock):
     params = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                   "setupAgentFile", "ambariServer", "centos6",
-                                  "1.2.1", "8440")
+                                  "1.2.1", "8440", "root")
     host_log_mock = MagicMock()
     log = {'text': ""}
     def write_side_effect(text):
@@ -315,7 +315,7 @@ class TestBootstrap(TestCase):
   def test_getOsCheckScript(self):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     ocs = bootstrap_obj.getOsCheckScript()
     self.assertEquals(ocs, "scriptDir/os_check_type.py")
@@ -325,7 +325,7 @@ class TestBootstrap(TestCase):
   def test_getOsCheckScriptRemoteLocation(self, getRemoteName_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     v = "/tmp/os_check_type1374259902.py"
     getRemoteName_mock.return_value = v
@@ -337,7 +337,7 @@ class TestBootstrap(TestCase):
   def test_getRepoFile(self, is_suse_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     is_suse_mock.return_value = False
     rf = bootstrap_obj.getRepoFile()
@@ -351,7 +351,7 @@ class TestBootstrap(TestCase):
                             init_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     expected = 42
     init_mock.return_value = None
@@ -372,7 +372,7 @@ class TestBootstrap(TestCase):
                     getOsCheckScriptRemoteLocation_mock, getOsCheckScript_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     getOsCheckScript_mock.return_value = "OsCheckScript"
     getOsCheckScriptRemoteLocation_mock.return_value = "OsCheckScriptRemoteLocation"
@@ -392,7 +392,7 @@ class TestBootstrap(TestCase):
   def test_getRepoFile(self, hasPassword_mock, getRemoteName_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     # Without password
     hasPassword_mock.return_value = False
@@ -421,7 +421,7 @@ class TestBootstrap(TestCase):
                            getMoveRepoFileCommand):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     getMoveRepoFileCommand.return_value = "MoveRepoFileCommand"
     getRepoDir.return_value  = "RepoDir"
@@ -469,7 +469,7 @@ class TestBootstrap(TestCase):
                             init_mock, getOsCheckScriptRemoteLocation_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     getOsCheckScriptRemoteLocation_mock.return_value = "OsCheckScriptRemoteLocation"
     expected = 42
@@ -491,7 +491,7 @@ class TestBootstrap(TestCase):
                          getRunSetupCommand_mock, init_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     getRunSetupCommand_mock.return_value = "RunSetupCommand"
     expected = 42
@@ -511,7 +511,7 @@ class TestBootstrap(TestCase):
                               hasPassword_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     # With password
     hasPassword_mock.return_value = True
@@ -530,7 +530,7 @@ class TestBootstrap(TestCase):
     tmp_dir = tempfile.gettempdir()
     shared_state = SharedState("root", "sshkey_file", "scriptDir", tmp_dir,
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     done_file = os.path.join(tmp_dir, "hostname.done")
     expected = 42
@@ -547,7 +547,7 @@ class TestBootstrap(TestCase):
   def test_checkSudoPackage(self, write_mock, run_mock, init_mock, server_family_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     expected = 42
     init_mock.return_value = None
@@ -565,7 +565,7 @@ class TestBootstrap(TestCase):
   def test_checkSudoPackageUbuntu(self, write_mock, run_mock, init_mock, server_family_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "ubuntu12",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     expected = 42
     init_mock.return_value = None
@@ -585,7 +585,7 @@ class TestBootstrap(TestCase):
                               init_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     expected = 42
     getPasswordFile_mock.return_value = "PasswordFile"
@@ -608,7 +608,7 @@ class TestBootstrap(TestCase):
                             scp_init_mock, getPasswordFile_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440", password_file="PasswordFile")
+                               None, "8440", "root", password_file="PasswordFile")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     getPasswordFile_mock.return_value = "PasswordFile"
      # Testing max retcode return
@@ -641,7 +641,7 @@ class TestBootstrap(TestCase):
                                         run_mock, init_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     expected = 42
     getPasswordFile_mock.return_value = "PasswordFile"
@@ -658,7 +658,7 @@ class TestBootstrap(TestCase):
     expected = 43
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     # Normal case
     def act_normal_return_int():
@@ -691,7 +691,7 @@ class TestBootstrap(TestCase):
                hasPassword_mock, try_to_execute_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     # Testing workflow without password
     bootstrap_obj.copied_password_file = False
@@ -763,7 +763,7 @@ class TestBootstrap(TestCase):
   def test_interruptBootstrap(self, write_mock, createDoneFile_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     bootstrap_obj = Bootstrap("hostname", shared_state)
     bootstrap_obj.interruptBootstrap()
     self.assertTrue(createDoneFile_mock.called)
@@ -780,7 +780,7 @@ class TestBootstrap(TestCase):
                       info_mock, warn_mock, time_mock, sleep_mock):
     shared_state = SharedState("root", "sshkey_file", "scriptDir", "bootdir",
                                "setupAgentFile", "ambariServer", "centos6",
-                               None, "8440")
+                               None, "8440", "root")
     n = 180
     time = 100500
     time_mock.return_value = time

+ 4 - 4
ambari-server/src/test/python/TestSetupAgent.py

@@ -47,7 +47,7 @@ class TestSetupAgent(TestCase):
   def test_configureAgent(self, execOsCommand_mock):
     # Test if expected_hostname is passed
     hostname = "test.hst"
-    setup_agent.configureAgent(hostname)
+    setup_agent.configureAgent(hostname, "root")
     cmdStr = str(execOsCommand_mock.call_args_list[0][0])
     self.assertTrue(hostname in cmdStr)
 
@@ -62,7 +62,7 @@ class TestSetupAgent(TestCase):
     call_mock.return_value = 0
     execOsCommand_mock.return_value = {'log': 'log', 'exitstatus': 0}
     # Test if expected_hostname is passed
-    ret = setup_agent.runAgent(passphrase, expected_hostname)
+    ret = setup_agent.runAgent(passphrase, expected_hostname, "root")
     cmdStr = str(call_mock.call_args_list[0][0])
     self.assertTrue(expected_hostname in cmdStr)
     self.assertEqual(ret, 0)
@@ -71,7 +71,7 @@ class TestSetupAgent(TestCase):
     execOsCommand_mock.reset_mock()
     # Key 'log' not found
     execOsCommand_mock.return_value = None
-    ret = setup_agent.runAgent(passphrase, expected_hostname)
+    ret = setup_agent.runAgent(passphrase, expected_hostname, "root")
     cmdStr = str(call_mock.call_args_list[0][0])
     self.assertTrue(expected_hostname in cmdStr)
     self.assertEqual(ret, 0)
@@ -80,7 +80,7 @@ class TestSetupAgent(TestCase):
     # Retcode id not 0
     call_mock.return_value = 2
     execOsCommand_mock.return_value = {'log': 'log', 'exitstatus': 2}
-    ret = setup_agent.runAgent(passphrase, expected_hostname)
+    ret = setup_agent.runAgent(passphrase, expected_hostname, "root")
     cmdStr = str(call_mock.call_args_list[0][0])
     self.assertTrue(expected_hostname in cmdStr)
     self.assertEqual(ret, 2)