You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by fb...@apache.org on 2015/04/17 05:45:12 UTC

ambari git commit: AMBARI-10491 [WinTP2] Ambari server: Ensure the service can be configured to run under a domain account

Repository: ambari
Updated Branches:
  refs/heads/trunk 68c68a6f0 -> 962a8a006


AMBARI-10491 [WinTP2] Ambari server: Ensure the service can be configured to run under a domain account

+Fixed service username handling at registration.
+Fixed service registration workflow.
+Updated unit tests.


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/962a8a00
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/962a8a00
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/962a8a00

Branch: refs/heads/trunk
Commit: 962a8a006e35860d391d10781d0b911d7f602d9d
Parents: 68c68a6
Author: Florian Barca <fb...@hortonworks.com>
Authored: Thu Apr 16 20:45:03 2015 -0700
Committer: Florian Barca <fb...@hortonworks.com>
Committed: Thu Apr 16 20:45:03 2015 -0700

----------------------------------------------------------------------
 .../main/python/ambari_commons/os_windows.py    |  12 +-
 ambari-server/src/main/python/ambari-server.py  |  17 ++-
 .../python/ambari_server/serverConfiguration.py |   3 -
 .../main/python/ambari_server/serverSetup.py    | 150 ++++++++++++-------
 .../src/main/python/ambari_windows_service.py   |  17 +--
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |   1 +
 .../src/test/python/TestAmbariServer.py         | 142 +++++++++---------
 7 files changed, 200 insertions(+), 142 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-common/src/main/python/ambari_commons/os_windows.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/ambari_commons/os_windows.py b/ambari-common/src/main/python/ambari_commons/os_windows.py
index edbcc7b..38db310 100644
--- a/ambari-common/src/main/python/ambari_commons/os_windows.py
+++ b/ambari-common/src/main/python/ambari_commons/os_windows.py
@@ -629,7 +629,7 @@ class WinService(win32serviceutil.ServiceFramework):
       installArgs.append("--perfmondll=" + perfMonDll)
     installArgs.append("install")
 
-    win32serviceutil.HandleCommandLine(cls, classPath, installArgs)
+    return win32serviceutil.HandleCommandLine(cls, classPath, installArgs)
 
   @classmethod
   def Start(cls, waitSecs = 30):
@@ -740,6 +740,16 @@ class UserHelper(object):
         return UserHelper.ACTION_FAILED, e.strerror
     return UserHelper.ACTION_OK, "User created."
 
+  def find_user(self):
+    try:
+      user_info = win32net.NetUserGetInfo(self.dcName, self.userName, 0)
+    except pywintypes.error as e:
+      if e.winerror == 2221:
+        return False
+      else:
+        raise
+    return True
+
   def add_user_privilege(self, privilege):
     try:
       acc_sid = win32security.LookupAccountName(self.dcName, self.userName)[0]

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/main/python/ambari-server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari-server.py b/ambari-server/src/main/python/ambari-server.py
index f1f005d..749a965 100755
--- a/ambari-server/src/main/python/ambari-server.py
+++ b/ambari-server/src/main/python/ambari-server.py
@@ -69,12 +69,6 @@ class UserActionRestart(UserAction):
     self.need_restart = self.fn(*self.args, **self.kwargs)
 
 
-def winsetup(options):
-  from ambari_windows_service import svcsetup
-
-  setup(options)
-  svcsetup()
-
 #
 # Starts the Ambari Server as a standalone process.
 # Ensures only one instance of the process is running.
@@ -269,6 +263,13 @@ def restore(args):
 
 @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY)
 def init_parser_options(parser):
+  parser.add_option('-k', '--service-user-name', dest="svc_user",
+                    default=None,
+                    help="User account under which the Ambari Server service will run")
+  parser.add_option('-x', '--service-user-password', dest="svc_password",
+                    default=None,
+                    help="Password for the Ambari Server service user account")
+
   parser.add_option('-f', '--init-script-file', dest="init_db_script_file",
                     default="resources" + os.sep + "Ambari-DDL-SQLServer-CREATE.sql",
                     help="File with database setup script")
@@ -302,7 +303,7 @@ def init_parser_options(parser):
                     help="Database user password")
   parser.add_option('--jdbc-driver', default=None, dest="jdbc_driver",
                     help="Specifies the path to the JDBC driver JAR file")
-  # -b, -i, -k and -x the remaining available short options
+  # -b and -i the remaining available short options
   # -h reserved for help
 
 @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT)
@@ -475,7 +476,7 @@ def fix_database_options(options, parser):
 @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY)
 def create_user_action_map(args, options):
   action_map = {
-    SETUP_ACTION: UserAction(winsetup, options),
+    SETUP_ACTION: UserAction(setup, options),
     START_ACTION: UserAction(svcstart),
     PSTART_ACTION: UserAction(start, options),
     STOP_ACTION: UserAction(stop),

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/main/python/ambari_server/serverConfiguration.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_server/serverConfiguration.py b/ambari-server/src/main/python/ambari_server/serverConfiguration.py
index c13202c..26ee4b0 100644
--- a/ambari-server/src/main/python/ambari_server/serverConfiguration.py
+++ b/ambari-server/src/main/python/ambari_server/serverConfiguration.py
@@ -126,9 +126,6 @@ JDBC_RCA_USE_INTEGRATED_AUTH_PROPERTY = "server.jdbc.rca.use.integrated.auth"
 
 ### # End Windows-specific # ###
 
-SERVICE_USERNAME_KEY = "TMP_AMBARI_USERNAME"
-SERVICE_PASSWORD_KEY = "TMP_AMBARI_PASSWORD"
-
 # resources repo configuration
 RESOURCES_DIR_PROPERTY = "resources.dir"
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/main/python/ambari_server/serverSetup.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_server/serverSetup.py b/ambari-server/src/main/python/ambari_server/serverSetup.py
index ddb44fd..26e1292 100644
--- a/ambari-server/src/main/python/ambari_server/serverSetup.py
+++ b/ambari-server/src/main/python/ambari_server/serverSetup.py
@@ -27,7 +27,7 @@ import sys
 from ambari_commons.exceptions import FatalException
 from ambari_commons.firewall import Firewall
 from ambari_commons.inet_utils import force_download_file, download_progress
-from ambari_commons.logging_utils import get_silent, print_info_msg, print_warning_msg, print_error_msg
+from ambari_commons.logging_utils import get_silent, print_info_msg, print_warning_msg, print_error_msg, get_verbose
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
 from ambari_commons.os_utils import copy_files, run_os_command, is_root
@@ -38,7 +38,7 @@ from ambari_server.serverConfiguration import configDefaults, JDKRelease, \
   get_resources_location, get_value_from_properties, read_ambari_user, update_properties, validate_jdk, write_property, \
   JAVA_HOME, JAVA_HOME_PROPERTY, JCE_NAME_PROPERTY, JDBC_RCA_URL_PROPERTY, JDBC_URL_PROPERTY, \
   JDK_NAME_PROPERTY, JDK_RELEASES, NR_USER_PROPERTY, OS_FAMILY, OS_FAMILY_PROPERTY, OS_TYPE, OS_TYPE_PROPERTY, OS_VERSION, \
-  SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY, VIEWS_DIR_PROPERTY, JDBC_DATABASE_PROPERTY
+  VIEWS_DIR_PROPERTY, JDBC_DATABASE_PROPERTY
 from ambari_server.serverUtils import is_server_runing
 from ambari_server.setupSecurity import adjust_directory_permissions
 from ambari_server.userInput import get_YN_input, get_validated_string_input
@@ -161,29 +161,34 @@ class AmbariUserChecks(object):
     self.NR_DEFAULT_USER = ""
     self.NR_USER_COMMENT = "Ambari user"
 
+    self.register_service = False
+    self.user = None
+    self.password = None
+
   def do_checks(self):
     try:
       user = read_ambari_user()
-      create_user = False
-      update_user_setting = False
-      if user is not None:
-        create_user = get_YN_input(self.NR_USER_CHANGE_PROMPT.format(user), False)
-        update_user_setting = create_user  # Only if we will create another user
-      else:  # user is not configured yet
-        update_user_setting = True  # Write configuration anyway
-        create_user = get_YN_input(self.NR_USER_CUSTOMIZE_PROMPT, False)
-        if not create_user:
-          user = self.NR_DEFAULT_USER
-
-      if create_user:
-        (retcode, user) = self._create_custom_user()
+      if not user:
+        user = self.NR_DEFAULT_USER
+
+      if self.user is not None:   #Command-line parameter is the default
+        update_user_setting = True
+        prompt_msg = self.NR_USER_CUSTOMIZE_PROMPT.format('y')
+      else:
+        update_user_setting = False
+        if user != self.NR_DEFAULT_USER:
+          prompt_msg = self.NR_USER_CHANGE_PROMPT.format(user, 'n')
+        else:
+          prompt_msg = self.NR_USER_CUSTOMIZE_PROMPT.format('n')
+        self.user = user if user else self.NR_DEFAULT_USER
+
+      self.register_service = get_YN_input(prompt_msg, update_user_setting)
+      if self.register_service:
+        retcode = self._create_custom_user()
         if retcode != 0:
           return retcode
 
-      if update_user_setting:
-        write_property(NR_USER_PROPERTY, user)
-
-      adjust_directory_permissions(user)
+      adjust_directory_permissions(self.user)
     except OSError as e:
       print_error_msg("Failed: %s" % str(e))
       return 4
@@ -197,62 +202,79 @@ class AmbariUserChecks(object):
 
 @OsFamilyImpl(os_family=OSConst.WINSRV_FAMILY)
 class AmbariUserChecksWindows(AmbariUserChecks):
-  def __init__(self):
+  def __init__(self, options):
     super(AmbariUserChecksWindows, self).__init__()
 
-    self.NR_USER_CHANGE_PROMPT = "Ambari-server service is configured to run under user '{0}'. Change this setting [y/n] (n)? "
-    self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server service [y/n] (n)? "
+    self.NR_USER_CHANGE_PROMPT = "Ambari-server service is configured to run under user '{0}'. Change this setting [y/n] ({1})? "
+    self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server service [y/n] ({0})? "
     self.NR_DEFAULT_USER = "NT AUTHORITY\SYSTEM"
+    self.NR_SYSTEM_USERS = {"NT AUTHORITY\SYSTEM", "NT AUTHORITY\NetworkService", "NT AUTHORITY\LocalService"}
+
+    self.user = options.svc_user
+    self.password = options.svc_password
 
   def _create_custom_user(self):
     user = get_validated_string_input(
-      "Enter user account for ambari-server service ({0}):".format(self.NR_DEFAULT_USER),
-      self.NR_DEFAULT_USER, None,
+      "Enter user account for ambari-server service ({0}):".format(self.user),
+      self.user, None,
       "Invalid username.",
       False
     )
-    if user == self.NR_DEFAULT_USER:
-      return 0, user
-    password = get_validated_string_input("Enter password for user {0}:".format(user), "", None, "Password", True, False)
+    if user in self.NR_SYSTEM_USERS:
+      self.user = user
+      return 0
 
     from ambari_commons.os_windows import UserHelper
 
     uh = UserHelper(user)
 
-    status, message = uh.create_user(password)
-    if status == UserHelper.USER_EXISTS:
-      print_info_msg("User {0} already exists, make sure that you typed correct password for user, "
-                     "skipping user creation".format(user))
+    if not uh.find_user():
+      if get_silent():
+        password = self.password
+      else:
+        password = get_validated_string_input("Enter password for user {0}:".format(user), "", None, "Password", True, False)
+
+      status, message = uh.create_user(password)
+      if status == UserHelper.USER_EXISTS:
+        print_info_msg("User {0} already exists, make sure that you typed correct password for user, "
+                       "skipping user creation".format(user))
 
-    elif status == UserHelper.ACTION_FAILED:  # fail
-      print_warning_msg("Can't create user {0}. Failed with message {1}".format(user, message))
-      return UserHelper.ACTION_FAILED, None
+      elif status == UserHelper.ACTION_FAILED:  # fail
+        print_warning_msg("Can't create user {0}. Failed with message {1}".format(user, message))
+        return UserHelper.ACTION_FAILED
 
-    # setting SeServiceLogonRight to user
+      self.password = password
 
+    # setting SeServiceLogonRight and SeBatchLogonRight to user
+    #This is unconditional
     status, message = uh.add_user_privilege('SeServiceLogonRight')
     if status == UserHelper.ACTION_FAILED:
       print_warning_msg("Can't add SeServiceLogonRight to user {0}. Failed with message {1}".format(user, message))
-      return UserHelper.ACTION_FAILED, None
+      return UserHelper.ACTION_FAILED
+
+    status, message = uh.add_user_privilege('SeBatchLogonRight')
+    if status == UserHelper.ACTION_FAILED:
+      print_warning_msg("Can't add SeServiceLogonRight to user {0}. Failed with message {1}".format(user, message))
+      return UserHelper.ACTION_FAILED
 
     print_info_msg("User configuration is done.")
     print_warning_msg("When using non SYSTEM user make sure that your user has read\write access to log directories and "
                       "all server directories. In case of integrated authentication for SQL Server make sure that your "
                       "user is properly configured to use the ambari database.")
-    #storing username and password in os.environ temporary to pass them to service
-    if uh.domainName:
-      user = uh.domainName + '\\' + user
-    os.environ[SERVICE_USERNAME_KEY] = user
-    os.environ[SERVICE_PASSWORD_KEY] = password
-    return 0, user
+
+    if user.find('\\') == -1:
+      self.user = '.\\' + user
+    else:
+      self.user = user
+    return 0
 
 @OsFamilyImpl(os_family=OsFamilyImpl.DEFAULT)
 class AmbariUserChecksLinux(AmbariUserChecks):
-  def __init__(self):
+  def __init__(self, options):
     super(AmbariUserChecksLinux, self).__init__()
 
-    self.NR_USER_CHANGE_PROMPT = "Ambari-server daemon is configured to run under user '{0}'. Change this setting [y/n] (n)? "
-    self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server daemon [y/n] (n)? "
+    self.NR_USER_CHANGE_PROMPT = "Ambari-server daemon is configured to run under user '{0}'. Change this setting [y/n] ({1})? "
+    self.NR_USER_CUSTOMIZE_PROMPT = "Customize user account for ambari-server daemon [y/n] ({0})? "
     self.NR_DEFAULT_USER = "root"
 
     self.NR_USERADD_CMD = 'useradd -M --comment "{1}" ' \
@@ -261,7 +283,7 @@ class AmbariUserChecksLinux(AmbariUserChecks):
   def _create_custom_user(self):
     user = get_validated_string_input(
       "Enter user account for ambari-server daemon (root):",
-      "root",
+      self.user,
       "^[a-z_][a-z0-9_-]{1,31}$",
       "Invalid username.",
       False
@@ -277,13 +299,36 @@ class AmbariUserChecksLinux(AmbariUserChecks):
     elif retcode != 0:  # fail
       print_warning_msg("Can't create user {0}. Command {1} "
                         "finished with {2}: \n{3}".format(user, command, retcode, err))
-      return retcode, None
+      return retcode
 
     print_info_msg("User configuration is done.")
-    return 0, user
 
-def check_ambari_user():
-  return AmbariUserChecks().do_checks()
+    self.user = user
+
+    return 0
+
+def check_ambari_user(options):
+  uc = AmbariUserChecks(options)
+  retcode = uc.do_checks()
+  return retcode, uc.register_service, uc.user, uc.password
+
+
+#
+# Windows service setup
+#
+
+@OsFamilyFuncImpl(os_family=OSConst.WINSRV_FAMILY)
+def service_setup(register_service, svc_user, svc_password):
+  from ambari_windows_service import svcsetup
+
+  result = svcsetup(register_service, svc_user, svc_password)
+  if result == 0:
+    write_property(NR_USER_PROPERTY, svc_user)
+
+@OsFamilyFuncImpl(os_family=OsFamilyImpl.DEFAULT)
+def service_setup(register_service, svc_user, svc_password):
+  #Nothing else to do in Linux
+  write_property(NR_USER_PROPERTY, svc_user)
 
 
 #
@@ -971,7 +1016,7 @@ def setup(options):
     raise FatalException(retcode, err)
 
   #Create ambari user, if needed
-  retcode = check_ambari_user()
+  (retcode, register_service, svc_user, svc_password) = check_ambari_user(options)
   if not retcode == 0:
     err = 'Failed to create user. Exiting.'
     raise FatalException(retcode, err)
@@ -1012,8 +1057,9 @@ def setup(options):
     raise FatalException(retcode, err)
 
   # we've already done this, but new files were created so run it one time.
-  adjust_directory_permissions(read_ambari_user())
+  adjust_directory_permissions(svc_user)
 
+  service_setup(register_service, svc_user, svc_password)
 
 #
 # Setup the JCE policy for Ambari Server.

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/main/python/ambari_windows_service.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/python/ambari_windows_service.py b/ambari-server/src/main/python/ambari_windows_service.py
index 8e86163..502aeb9 100644
--- a/ambari-server/src/main/python/ambari_windows_service.py
+++ b/ambari-server/src/main/python/ambari_windows_service.py
@@ -27,8 +27,7 @@ from ambari_commons.logging_utils import set_silent, set_verbose, print_info_msg
 from ambari_commons.os_utils import remove_file
 from ambari_commons.os_windows import SvcStatusCallback
 from ambari_server.serverConfiguration import configDefaults, get_ambari_properties, get_value_from_properties, \
-  DEBUG_MODE_KEY, PID_NAME, SERVER_OUT_FILE_KEY, SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY, SUSPEND_START_MODE_KEY, \
-  VERBOSE_OUTPUT_KEY
+  DEBUG_MODE_KEY, PID_NAME, SERVER_OUT_FILE_KEY, SUSPEND_START_MODE_KEY, VERBOSE_OUTPUT_KEY
 
 
 class AmbariServerService(AmbariService):
@@ -86,15 +85,15 @@ def ctrlHandler(ctrlType):
   AmbariServerService.DefCtrlCHandler()
   return True
 
-def svcsetup():
+def svcsetup(register_service, username=None, password=None):
   AmbariServerService.set_ctrl_c_handler(ctrlHandler)
 
   scriptFile, ext = os.path.splitext(__file__.replace('/', os.sep))
   classPath = scriptFile + "." + AmbariServerService.__name__
 
-  # we don't save password between 'setup' runs, so we can't run Install every time. We run 'setup' only if user and
-  # password provided or if service not installed
-  if (SERVICE_USERNAME_KEY in os.environ and SERVICE_PASSWORD_KEY in os.environ):
-    AmbariServerService.Install(classPath=classPath, username=os.environ[SERVICE_USERNAME_KEY], password=os.environ[SERVICE_PASSWORD_KEY])
-  elif AmbariServerService.QueryStatus() == "not installed":
-    AmbariServerService.Install(classPath)
+  # We don't save the password between 'setup' runs, so we can't run Install every time. We run Install only if the
+  # operator acknowledged changing the username or if the service is not yet installed
+  if (register_service or AmbariServerService.QueryStatus() == "not installed"):
+    return AmbariServerService.Install(classPath=classPath, username=username, password=password)
+  else:
+    return 0

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index a69e235..e38e2c5 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -214,6 +214,7 @@ CREATE TABLE users (
   create_time DATETIME DEFAULT GETDATE(),
   user_password VARCHAR(255),
   active INTEGER NOT NULL DEFAULT 1,
+  active_widget_layouts VARCHAR(1024) DEFAULT NULL,
   PRIMARY KEY CLUSTERED (user_id),
   UNIQUE (
     ldap_user,

http://git-wip-us.apache.org/repos/asf/ambari/blob/962a8a00/ambari-server/src/test/python/TestAmbariServer.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/TestAmbariServer.py b/ambari-server/src/test/python/TestAmbariServer.py
index 17e8aea..5c05ad3 100644
--- a/ambari-server/src/test/python/TestAmbariServer.py
+++ b/ambari-server/src/test/python/TestAmbariServer.py
@@ -1122,16 +1122,19 @@ class TestAmbariServer(TestCase):
   @patch("ambari_server.serverSetup.run_os_command")
   def test_create_custom_user(self, run_os_command_mock, print_warning_msg_mock,
                               print_info_msg_mock, get_validated_string_input_mock):
+    options = MagicMock()
+
     user = "dummy-user"
     get_validated_string_input_mock.return_value = user
 
-    userChecks = AmbariUserChecks()
+    userChecks = AmbariUserChecks(options)
 
     # Testing scenario: absent user
     run_os_command_mock.side_effect = [(0, "", "")]
     result = userChecks._create_custom_user()
     self.assertFalse(print_warning_msg_mock.called)
-    self.assertEquals(result, (0, user))
+    self.assertEquals(result, 0)
+    self.assertEquals(userChecks.user, user)
 
     print_info_msg_mock.reset_mock()
     print_warning_msg_mock.reset_mock()
@@ -1141,7 +1144,8 @@ class TestAmbariServer(TestCase):
     run_os_command_mock.side_effect = [(9, "", "")]
     result = userChecks._create_custom_user()
     self.assertTrue("User dummy-user already exists" in str(print_info_msg_mock.call_args_list[1][0]))
-    self.assertEquals(result, (0, user))
+    self.assertEquals(result, 0)
+    self.assertEquals(userChecks.user, user)
 
     print_info_msg_mock.reset_mock()
     print_warning_msg_mock.reset_mock()
@@ -1151,139 +1155,138 @@ class TestAmbariServer(TestCase):
     run_os_command_mock.side_effect = [(1, "", "")]
     result = userChecks._create_custom_user()
     self.assertTrue(print_warning_msg_mock.called)
-    self.assertEquals(result, (1, None))
+    self.assertEquals(result, 1)
     pass
 
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("ambari_server.serverSetup.read_ambari_user")
   @patch("ambari_server.serverSetup.get_YN_input")
-  @patch.object(AmbariUserChecksLinux, "_create_custom_user")
-  @patch.object(AmbariUserChecksWindows, "_create_custom_user")
-  @patch("ambari_server.serverSetup.write_property")
+  @patch("ambari_server.serverSetup.get_validated_string_input")
   @patch("ambari_server.serverSetup.adjust_directory_permissions")
+  @patch("ambari_server.serverSetup.run_os_command")
   @patch("ambari_server.serverSetup.print_error_msg")
-  def test_check_ambari_user(self, print_error_msg_mock,
-                             adjust_directory_permissions_mock, write_property_mock,
-                             create_custom_user_mock, create_custom_user_2_mock, get_YN_input_mock, read_ambari_user_mock):
+  @patch("ambari_server.serverSetup.print_warning_msg")
+  @patch("ambari_server.serverSetup.print_info_msg")
+  def test_check_ambari_user(self, print_info_msg_mock, print_warning_msg_mock, print_error_msg_mock,
+                             run_os_command_mock, adjust_directory_permissions_mock,
+                             get_validated_string_input_mock, get_YN_input_mock, read_ambari_user_mock):
+
+    options = MagicMock()
+
+    run_os_command_mock.return_value = (0, "", "")
 
     # Scenario: user is already defined, user does not want to reconfigure it
     read_ambari_user_mock.return_value = "dummy-user"
     get_YN_input_mock.return_value = False
-    result = check_ambari_user()
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertFalse(write_property_mock.called)
-    self.assertFalse(create_custom_user_mock.called or create_custom_user_2_mock.called)
+    self.assertFalse(get_validated_string_input_mock.called)
+    self.assertFalse(run_os_command_mock.called)
     self.assertTrue(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 0)
+    self.assertEqual(result[0], 0)
 
     get_YN_input_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
 
     # Scenario: user is already defined, but user wants to reconfigure it
 
     read_ambari_user_mock.return_value = "dummy-user"
-    create_custom_user_2_mock.return_value = create_custom_user_mock.return_value = (0, "new-dummy-user")
+    get_validated_string_input_mock.return_value = "new-dummy-user"
     get_YN_input_mock.return_value = True
-    result = check_ambari_user()
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertTrue(write_property_mock.called)
-    self.assertTrue(write_property_mock.call_args[0][1] == "new-dummy-user")
-    self.assertTrue(create_custom_user_mock.called or create_custom_user_2_mock.called)
+    self.assertTrue(result[2] == "new-dummy-user")
+    self.assertTrue(get_validated_string_input_mock.called)
     self.assertTrue(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 0)
+    self.assertEqual(result[0], 0)
 
     get_YN_input_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
 
     # Negative scenario: user is already defined, but user wants
     # to reconfigure it, user creation failed
 
     read_ambari_user_mock.return_value = "dummy-user"
-    create_custom_user_2_mock.return_value = create_custom_user_mock.return_value = (1, None)
+    run_os_command_mock.return_value = (1, "", "")
     get_YN_input_mock.return_value = True
-    result = check_ambari_user()
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertTrue(create_custom_user_mock.called or create_custom_user_2_mock.called)
-    self.assertFalse(write_property_mock.called)
+    self.assertTrue(get_validated_string_input_mock.called)
+    self.assertTrue(run_os_command_mock.called)
     self.assertFalse(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 1)
+    self.assertEqual(result[0], 1)
 
     get_YN_input_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
 
     # Scenario: user is not defined (setup process)
     read_ambari_user_mock.return_value = None
     get_YN_input_mock.return_value = True
-    create_custom_user_2_mock.return_value = create_custom_user_mock.return_value = (0, "dummy-user")
-    result = check_ambari_user()
+    get_validated_string_input_mock.return_value = "dummy-user"
+    run_os_command_mock.return_value = (0, "", "")
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertTrue(create_custom_user_mock.called or create_custom_user_2_mock.called)
-    self.assertTrue(write_property_mock.called)
-    self.assertTrue(write_property_mock.call_args[0][1] == "dummy-user")
+    self.assertTrue(get_validated_string_input_mock.called)
+    self.assertTrue(run_os_command_mock.called)
+    self.assertTrue(result[2] == "dummy-user")
     self.assertTrue(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 0)
+    self.assertEqual(result[0], 0)
 
     get_YN_input_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
 
     # Scenario: user is not defined (setup process), user creation failed
 
     read_ambari_user_mock.return_value = None
     get_YN_input_mock.return_value = True
-    create_custom_user_2_mock.return_value = create_custom_user_mock.return_value = (1, None)
-    result = check_ambari_user()
+    run_os_command_mock.return_value = (1, "", "")
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertTrue(create_custom_user_mock.called or create_custom_user_2_mock.called)
-    self.assertFalse(write_property_mock.called)
+    self.assertTrue(get_validated_string_input_mock.called)
+    self.assertTrue(run_os_command_mock.called)
     self.assertFalse(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 1)
+    self.assertEqual(result[0], 1)
 
     get_YN_input_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
 
     # negative scenario: user is not defined (setup process), user creation failed
 
     read_ambari_user_mock.return_value = None
     get_YN_input_mock.return_value = True
-    create_custom_user_2_mock.return_value = create_custom_user_mock.return_value = (1, None)
-    result = check_ambari_user()
+    run_os_command_mock.return_value = (1, "", "")
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertTrue(create_custom_user_mock.called or create_custom_user_2_mock.called)
-    self.assertFalse(write_property_mock.called)
+    self.assertTrue(get_validated_string_input_mock.called)
+    self.assertTrue(run_os_command_mock.called)
     self.assertFalse(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 1)
+    self.assertEqual(result[0], 1)
 
     get_YN_input_mock.reset_mock()
-    create_custom_user_mock.reset_mock()
-    create_custom_user_2_mock.reset_mock()
-    write_property_mock.reset_mock()
+    get_validated_string_input_mock.reset_mock()
+    run_os_command_mock.reset_mock()
     adjust_directory_permissions_mock.reset_mock()
 
     # Scenario: user is not defined and left to be root
     read_ambari_user_mock.return_value = None
     get_YN_input_mock.return_value = False
-    result = check_ambari_user()
+    result = check_ambari_user(options)
     self.assertTrue(get_YN_input_mock.called)
-    self.assertFalse(create_custom_user_mock.called or create_custom_user_2_mock.called)
-    self.assertTrue(write_property_mock.called)
-    self.assertTrue(write_property_mock.call_args[0][1] == "root")
+    self.assertFalse(get_validated_string_input_mock.called)
+    self.assertFalse(run_os_command_mock.called)
+    self.assertTrue(result[2] == "root")
     self.assertTrue(adjust_directory_permissions_mock.called)
-    self.assertEqual(result, 0)
+    self.assertEqual(result[0], 0)
     pass
 
   @patch("ambari_server.serverConfiguration.search_file")
@@ -2866,10 +2869,11 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @patch("ambari_server.serverSetup.proceedJDBCProperties")
   @patch("ambari_server.serverSetup.extract_views")
   @patch("ambari_server.serverSetup.adjust_directory_permissions")
+  @patch("ambari_server.serverSetup.service_setup")
   @patch("ambari_server.serverSetup.read_ambari_user")
   @patch("ambari_server.serverSetup.expand_jce_zip_file")
-  def test_setup(self, expand_jce_zip_file_mock,
-                 read_ambari_user_mock, adjust_dirs_mock, extract_views_mock, proceedJDBCProperties_mock, is_root_mock,
+  def test_setup(self, expand_jce_zip_file_mock, read_ambari_user_mock,
+                 service_setup_mock, adjust_dirs_mock, extract_views_mock, proceedJDBCProperties_mock, is_root_mock,
                  disable_security_enhancements_mock, check_jdbc_drivers_mock, check_ambari_user_mock,
                  download_jdk_mock, configure_os_settings_mock, get_ambari_properties_mock,
                  get_YN_input_mock, gvsi_mock, gvsi_1_mock,
@@ -2969,7 +2973,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     # remote case
     is_root_mock.return_value = True
     disable_security_enhancements_mock.return_value = (0, "")
-    check_ambari_user_mock.return_value = 0
+    check_ambari_user_mock.return_value = (0, False, 'user', None)
     check_jdbc_drivers_mock.return_value = 0
     download_jdk_mock.return_value = 0
     configure_os_settings_mock.return_value = 0
@@ -4752,7 +4756,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     read_password_mock.return_value = "encrypted_bigdata"
     ensure_jdbc_driver_installed_mock.return_value = True
     check_jdbc_drivers_mock.return_value = 0
-    check_ambari_user_mock.return_value = 0
+    check_ambari_user_mock.return_value = (0, False, 'user', None)
     download_jdk_mock.return_value = 0
     configure_os_settings_mock.return_value = 0
     verify_setup_allowed_method.return_value = 0
@@ -6429,7 +6433,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     verify_setup_allowed_method.return_value = 0
     is_root_mock.return_value = True
     check_selinux_mock.return_value = 0
-    check_ambari_user_mock.return_value = 0
+    check_ambari_user_mock.return_value = (0, False, 'user', None)
     check_jdbc_drivers_mock.return_value = 0
     check_postgre_up_mock.return_value = "running", 0, "", ""
     #is_local_database_mock.return_value = True