فهرست منبع

AMBARI-9525 Enable refresh-stack-hash command on windows

Added the refresh-stask-hash command to the main script and to the batch file. Fixed stacks directory retrieval. Fixed resources directory retrieval inconsistencies. Updated unit tests.
Florian Barca 10 سال پیش
والد
کامیت
190bd0b043

+ 13 - 2
ambari-common/src/main/python/ambari_commons/os_check.py

@@ -70,6 +70,17 @@ VER_NT_WORKSTATION = 1
 VER_NT_DOMAIN_CONTROLLER = 2
 VER_NT_DOMAIN_CONTROLLER = 2
 VER_NT_SERVER = 3
 VER_NT_SERVER = 3
 
 
+# Linux specific releases, caching them since they are execution invariants
+_IS_ORACLE_LINUX = os.path.exists('/etc/oracle-release')
+_IS_REDHAT_LINUX = os.path.exists('/etc/redhat-release')
+
+def _is_oracle_linux():
+  return _IS_ORACLE_LINUX
+
+def _is_redhat_linux():
+  return _IS_REDHAT_LINUX
+
+
 class OS_CONST_TYPE(type):
 class OS_CONST_TYPE(type):
 
 
   # Declare here os type mapping
   # Declare here os type mapping
@@ -148,7 +159,7 @@ class OSCheck:
 
 
       if PYTHON_VER < 26:
       if PYTHON_VER < 26:
         distribution = platform.dist()
         distribution = platform.dist()
-      elif os.path.exists('/etc/redhat-release'):
+      elif _is_redhat_linux():
         distribution = platform.dist()
         distribution = platform.dist()
       else:
       else:
         distribution = platform.linux_distribution()
         distribution = platform.linux_distribution()
@@ -171,7 +182,7 @@ class OSCheck:
     operatingSystem = dist[0].lower()
     operatingSystem = dist[0].lower()
 
 
     # special cases
     # special cases
-    if os.path.exists('/etc/oracle-release'):
+    if _is_oracle_linux():
       return 'oraclelinux'
       return 'oraclelinux'
     elif operatingSystem.startswith('suse linux enterprise server'):
     elif operatingSystem.startswith('suse linux enterprise server'):
       return 'sles'
       return 'sles'

+ 2 - 1
ambari-server/src/main/python/ambari-server.py

@@ -307,7 +307,7 @@ def init_parser_options(parser):
 
 
 @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT)
 @OsFamilyFuncImpl(OsFamilyImpl.DEFAULT)
 def init_parser_options(parser):
 def init_parser_options(parser):
-  optparse.Option('-f', '--init-script-file',
+  parser.add_option('-f', '--init-script-file',
                     default='/var/lib/ambari-server/'
                     default='/var/lib/ambari-server/'
                             'resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql',
                             'resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql',
                     help="File with setup script")
                     help="File with setup script")
@@ -484,6 +484,7 @@ def create_user_action_map(args, options):
     UPGRADE_ACTION: UserAction(upgrade, options),
     UPGRADE_ACTION: UserAction(upgrade, options),
     LDAP_SETUP_ACTION: UserAction(setup_ldap),
     LDAP_SETUP_ACTION: UserAction(setup_ldap),
     SETUP_SECURITY_ACTION: UserActionRestart(setup_security, options),
     SETUP_SECURITY_ACTION: UserActionRestart(setup_security, options),
+    REFRESH_STACK_HASH_ACTION: UserAction(refresh_stack_hash_action),
   }
   }
   return action_map
   return action_map
 
 

+ 4 - 10
ambari-server/src/main/python/ambari_server/dbConfiguration.py

@@ -25,10 +25,9 @@ from ambari_commons.exceptions import FatalException
 from ambari_commons.logging_utils import get_silent, print_error_msg, print_info_msg, print_warning_msg, set_silent
 from ambari_commons.logging_utils import get_silent, print_error_msg, print_info_msg, print_warning_msg, set_silent
 from ambari_commons.os_family_impl import OsFamilyImpl
 from ambari_commons.os_family_impl import OsFamilyImpl
 from ambari_commons.str_utils import cbool
 from ambari_commons.str_utils import cbool
-from ambari_server.serverConfiguration import decrypt_password_for_alias, get_value_from_properties, get_is_secure, \
-  is_alias_string, \
-  JDBC_PASSWORD_PROPERTY, JDBC_RCA_PASSWORD_ALIAS, PRESS_ENTER_MSG, get_ambari_properties, update_properties, \
-  RESOURCES_DIR_PROPERTY, JDBC_PATTERNS, configDefaults
+from ambari_server.serverConfiguration import decrypt_password_for_alias, get_ambari_properties, get_is_secure, \
+  get_resources_location, get_value_from_properties, is_alias_string, \
+  JDBC_PASSWORD_PROPERTY, JDBC_RCA_PASSWORD_ALIAS, PRESS_ENTER_MSG
 from ambari_server.userInput import get_validated_string_input
 from ambari_server.userInput import get_validated_string_input
 
 
 
 
@@ -454,13 +453,8 @@ def check_jdbc_drivers(args):
     err = "Error getting ambari properties"
     err = "Error getting ambari properties"
     print_error_msg(err)
     print_error_msg(err)
     raise FatalException(-1, err)
     raise FatalException(-1, err)
-  conf_file = properties.fileName
 
 
-  try:
-    resources_dir = properties[RESOURCES_DIR_PROPERTY]
-  except (KeyError), e:
-    err = 'Property ' + str(e) + ' is not defined at ' + conf_file
-    raise FatalException(1, err)
+  resources_dir = get_resources_location(properties)
 
 
   try:
   try:
     db_idx_orig = args.database_index
     db_idx_orig = args.database_index

+ 4 - 7
ambari-server/src/main/python/ambari_server/dbConfiguration_linux.py

@@ -33,7 +33,8 @@ from ambari_commons.exceptions import NonFatalException, FatalException
 from ambari_commons.os_utils import copy_files, find_in_path, is_root, remove_file, run_os_command
 from ambari_commons.os_utils import copy_files, find_in_path, is_root, remove_file, run_os_command
 from ambari_server.dbConfiguration import DBMSConfig, USERNAME_PATTERN, SETUP_DB_CONNECT_ATTEMPTS, \
 from ambari_server.dbConfiguration import DBMSConfig, USERNAME_PATTERN, SETUP_DB_CONNECT_ATTEMPTS, \
     SETUP_DB_CONNECT_TIMEOUT, STORAGE_TYPE_LOCAL, DEFAULT_USERNAME, DEFAULT_PASSWORD
     SETUP_DB_CONNECT_TIMEOUT, STORAGE_TYPE_LOCAL, DEFAULT_USERNAME, DEFAULT_PASSWORD
-from ambari_server.serverConfiguration import get_ambari_properties, get_value_from_properties, configDefaults, \
+from ambari_server.serverConfiguration import encrypt_password, store_password_file, \
+    get_ambari_properties, get_resources_location, get_value_from_properties, configDefaults, \
     OS_TYPE, OS_FAMILY, AMBARI_PROPERTIES_FILE, RESOURCES_DIR_PROPERTY, \
     OS_TYPE, OS_FAMILY, AMBARI_PROPERTIES_FILE, RESOURCES_DIR_PROPERTY, \
     JDBC_DATABASE_PROPERTY, JDBC_DATABASE_NAME_PROPERTY, JDBC_POSTGRES_SCHEMA_PROPERTY, \
     JDBC_DATABASE_PROPERTY, JDBC_DATABASE_NAME_PROPERTY, JDBC_POSTGRES_SCHEMA_PROPERTY, \
     JDBC_HOSTNAME_PROPERTY, JDBC_PORT_PROPERTY, \
     JDBC_HOSTNAME_PROPERTY, JDBC_PORT_PROPERTY, \
@@ -41,7 +42,7 @@ from ambari_server.serverConfiguration import get_ambari_properties, get_value_f
     JDBC_DRIVER_PROPERTY, JDBC_URL_PROPERTY, \
     JDBC_DRIVER_PROPERTY, JDBC_URL_PROPERTY, \
     JDBC_RCA_USER_NAME_PROPERTY, JDBC_RCA_PASSWORD_ALIAS, JDBC_RCA_PASSWORD_FILE_PROPERTY, \
     JDBC_RCA_USER_NAME_PROPERTY, JDBC_RCA_PASSWORD_ALIAS, JDBC_RCA_PASSWORD_FILE_PROPERTY, \
     JDBC_RCA_DRIVER_PROPERTY, JDBC_RCA_URL_PROPERTY, \
     JDBC_RCA_DRIVER_PROPERTY, JDBC_RCA_URL_PROPERTY, \
-    PERSISTENCE_TYPE_PROPERTY, encrypt_password, store_password_file
+    PERSISTENCE_TYPE_PROPERTY
 from ambari_server.userInput import get_YN_input, get_validated_string_input, read_password
 from ambari_server.userInput import get_YN_input, get_validated_string_input, read_password
 from ambari_server.utils import get_postgre_hba_dir, get_postgre_running_status
 from ambari_server.utils import get_postgre_hba_dir, get_postgre_running_status
 
 
@@ -153,11 +154,7 @@ class LinuxDBMSConfig(DBMSConfig):
   def _install_jdbc_driver(self, properties, files_list):
   def _install_jdbc_driver(self, properties, files_list):
     if type(files_list) is not int:
     if type(files_list) is not int:
       print 'Copying JDBC drivers to server resources...'
       print 'Copying JDBC drivers to server resources...'
-      try:
-        resources_dir = properties[RESOURCES_DIR_PROPERTY]
-      except KeyError:
-        print_error_msg("There is no value for " + RESOURCES_DIR_PROPERTY + "in " + AMBARI_PROPERTIES_FILE)
-        return False
+      resources_dir = get_resources_location(properties)
 
 
       db_name = self.dbms_full_name.lower()
       db_name = self.dbms_full_name.lower()
       symlink_name = db_name + "-jdbc-driver.jar"
       symlink_name = db_name + "-jdbc-driver.jar"

+ 47 - 49
ambari-server/src/main/python/ambari_server/resourceFilesKeeper.py

@@ -23,7 +23,6 @@ import os, sys
 import zipfile
 import zipfile
 import glob
 import glob
 import pprint
 import pprint
-from xml.dom import minidom
 
 
 
 
 class KeeperException(Exception):
 class KeeperException(Exception):
@@ -55,11 +54,12 @@ class ResourceFilesKeeper():
   # Change that to True to see debug output at stderr
   # Change that to True to see debug output at stderr
   DEBUG=False
   DEBUG=False
 
 
-  def __init__(self, resources_dir, verbose=False, nozip=False):
+  def __init__(self, resources_dir, stacks_dir, verbose=False, nozip=False):
     """
     """
       nozip = create only hash files and skip creating zip archives
       nozip = create only hash files and skip creating zip archives
     """
     """
     self.resources_dir = resources_dir
     self.resources_dir = resources_dir
+    self.stacks_root = stacks_dir
     self.verbose = verbose
     self.verbose = verbose
     self.nozip = nozip
     self.nozip = nozip
 
 
@@ -72,21 +72,31 @@ class ResourceFilesKeeper():
     # probably, later we will need some additional operations
     # probably, later we will need some additional operations
 
 
 
 
+  def _iter_update_directory_archive(self, subdirs_list):
+    for subdir in subdirs_list:
+      for root, dirs, _ in os.walk(subdir):
+        for d in dirs:
+          if d in self.ARCHIVABLE_DIRS:
+            full_path = os.path.abspath(os.path.join(root, d))
+            self.update_directory_archive(full_path)
+
+  def _update_resources_subdir_archive(self, subdir):
+    archive_root = os.path.join(self.resources_dir, subdir)
+    self.dbg_out("Updating archive for {0} dir at {1}...".format(subdir, archive_root))
+
+    # update the directories so that the .hash is generated
+    self.update_directory_archive(archive_root)
+
   def update_directory_archieves(self):
   def update_directory_archieves(self):
     """
     """
     Please see AMBARI-4481 for more details
     Please see AMBARI-4481 for more details
     """
     """
-    stacks_root = os.path.join(self.resources_dir, self.STACKS_DIR)
-    self.dbg_out("Updating archives for stack dirs at {0}...".format(stacks_root))
-    valid_stacks = self.list_stacks(stacks_root)
+    # archive stacks
+    self.dbg_out("Updating archives for stack dirs at {0}...".format(self.stacks_root))
+    valid_stacks = self.list_stacks(self.stacks_root)
     self.dbg_out("Stacks: {0}".format(pprint.pformat(valid_stacks)))
     self.dbg_out("Stacks: {0}".format(pprint.pformat(valid_stacks)))
     # Iterate over stack directories
     # Iterate over stack directories
-    for stack_dir in valid_stacks:
-      for root, dirs, _ in os.walk(stack_dir):
-        for d in dirs:
-          if d in self.ARCHIVABLE_DIRS:
-            full_path = os.path.abspath(os.path.join(root, d))
-            self.update_directory_archive(full_path)
+    self._iter_update_directory_archive(valid_stacks)
 
 
     # archive common services
     # archive common services
     common_services_root = os.path.join(self.resources_dir, self.COMMON_SERVICES_DIR)
     common_services_root = os.path.join(self.resources_dir, self.COMMON_SERVICES_DIR)
@@ -94,58 +104,40 @@ class ResourceFilesKeeper():
     valid_common_services = self.list_common_services(common_services_root)
     valid_common_services = self.list_common_services(common_services_root)
     self.dbg_out("Common Services: {0}".format(pprint.pformat(valid_common_services)))
     self.dbg_out("Common Services: {0}".format(pprint.pformat(valid_common_services)))
     # Iterate over common services directories
     # Iterate over common services directories
-    for common_service_dir in valid_common_services:
-      for root, dirs, _ in os.walk(common_service_dir):
-        for d in dirs:
-          if d in self.ARCHIVABLE_DIRS:
-            full_path = os.path.abspath(os.path.join(root, d))
-            self.update_directory_archive(full_path)
-
+    self._iter_update_directory_archive(valid_common_services)
 
 
     # custom actions
     # custom actions
-    custom_actions_root = os.path.join(self.resources_dir,self.CUSTOM_ACTIONS_DIR)        
-    self.dbg_out("Updating archive for {0} dir at {1}...".format(self.CUSTOM_ACTIONS_DIR, 
-        custom_actions_root))
-        
+    self._update_resources_subdir_archive(self.CUSTOM_ACTIONS_DIR)
+
     # agent host scripts
     # agent host scripts
-    host_scripts_root = os.path.join(self.resources_dir,self.HOST_SCRIPTS_DIR)    
-    self.dbg_out("Updating archive for {0} dir at {1}...".format(self.HOST_SCRIPTS_DIR, 
-        host_scripts_root))
-    
-    # update the directories so that the .hash is generated
-    self.update_directory_archive(custom_actions_root)
-    self.update_directory_archive(host_scripts_root)
+    self._update_resources_subdir_archive(self.HOST_SCRIPTS_DIR)
+
 
 
+  def _list_metainfo_dirs(self, root_dir):
+    valid_items = []  # Format: <stack_dir, ignore(True|False)>
+    glob_pattern = "{0}/*/*".format(root_dir)
+    dirs = glob.glob(glob_pattern)
+    for directory in dirs:
+      metainfo_file = os.path.join(directory, self.METAINFO_XML)
+      if os.path.exists(metainfo_file):
+        valid_items.append(directory)
+    return valid_items
 
 
-  def list_stacks(self, stacks_root):
+  def list_stacks(self, root_dir):
     """
     """
     Builds a list of stack directories
     Builds a list of stack directories
     """
     """
-    valid_stacks = [] # Format: <stack_dir, ignore(True|False)>
-    glob_pattern = "{0}/*/*".format(stacks_root)
     try:
     try:
-      stack_dirs = glob.glob(glob_pattern)
-      for directory in stack_dirs:
-        metainfo_file = os.path.join(directory, self.METAINFO_XML)
-        if os.path.exists(metainfo_file):
-          valid_stacks.append(directory)
-      return valid_stacks
+      return self._list_metainfo_dirs(root_dir)
     except Exception, err:
     except Exception, err:
       raise KeeperException("Can not list stacks: {0}".format(str(err)))
       raise KeeperException("Can not list stacks: {0}".format(str(err)))
 
 
-  def list_common_services(self, common_services_root):
+  def list_common_services(self, root_dir):
     """
     """
     Builds a list of common services directories
     Builds a list of common services directories
     """
     """
-    valid_common_services = []
-    glob_pattern = "{0}/*/*".format(common_services_root)
     try:
     try:
-      common_services_dirs = glob.glob(glob_pattern)
-      for directory in common_services_dirs:
-        metainfo_file = os.path.join(directory, self.METAINFO_XML)
-        if os.path.exists(metainfo_file):
-          valid_common_services.append(directory)
-      return valid_common_services
+      return self._list_metainfo_dirs(root_dir)
     except Exception, err:
     except Exception, err:
       raise KeeperException("Can not list common services: {0}".format(str(err)))
       raise KeeperException("Can not list common services: {0}".format(str(err)))
 
 
@@ -269,8 +261,14 @@ def main(argv=None):
   Params:
   Params:
     1: Path to resources root directory
     1: Path to resources root directory
   """
   """
-  path = argv[1]
-  resource_files_keeper = ResourceFilesKeeper(path, nozip=True)
+  res_path = argv[1]
+
+  if len(argv) >= 3:
+    stacks_path = argv[2]
+  else:
+    stacks_path = os.path.join(res_path, ResourceFilesKeeper.STACKS_DIR)
+
+  resource_files_keeper = ResourceFilesKeeper(res_path, stacks_path, nozip=True)
   resource_files_keeper.perform_housekeeping()
   resource_files_keeper.perform_housekeeping()
 
 
 
 

+ 19 - 2
ambari-server/src/main/python/ambari_server/serverConfiguration.py

@@ -137,7 +137,6 @@ SERVICE_PASSWORD_KEY = "TMP_AMBARI_PASSWORD"
 
 
 # resources repo configuration
 # resources repo configuration
 RESOURCES_DIR_PROPERTY = "resources.dir"
 RESOURCES_DIR_PROPERTY = "resources.dir"
-RESOURCES_DIR_DEFAULT = "resources"
 
 
 # stack repo upgrade
 # stack repo upgrade
 STACK_LOCATION_KEY = 'metadata.path'
 STACK_LOCATION_KEY = 'metadata.path'
@@ -1102,9 +1101,27 @@ def get_java_exe_path():
 
 
 
 
 #
 #
-# Stack upgrade
+# Server resource files location
 #
 #
+def get_resources_location(properties):
+  err = 'Invalid directory'
+  try:
+    resources_dir = properties[RESOURCES_DIR_PROPERTY]
+    if not resources_dir:
+      resources_dir = configDefaults.SERVER_RESOURCES_DIR
+  except (KeyError), e:
+    err = 'Property ' + str(e) + ' is not defined at ' + properties.fileName
+    resources_dir = configDefaults.SERVER_RESOURCES_DIR
+
+  if not os.path.exists(os.path.abspath(resources_dir)):
+    msg = 'Resources dir ' + resources_dir + ' is incorrectly configured: ' + err
+    raise FatalException(1, msg)
+
+  return resources_dir
 
 
+#
+# Stack upgrade
+#
 def get_stack_location(properties):
 def get_stack_location(properties):
   stack_location = properties[STACK_LOCATION_KEY]
   stack_location = properties[STACK_LOCATION_KEY]
   if stack_location is None:
   if stack_location is None:

+ 23 - 34
ambari-server/src/main/python/ambari_server/serverSetup.py

@@ -34,20 +34,17 @@ from ambari_commons.os_utils import copy_files, run_os_command, is_root
 from ambari_commons.str_utils import compress_backslashes
 from ambari_commons.str_utils import compress_backslashes
 from ambari_server.dbConfiguration import DBMSConfigFactory, check_jdbc_drivers
 from ambari_server.dbConfiguration import DBMSConfigFactory, check_jdbc_drivers
 from ambari_server.serverConfiguration import configDefaults, JDKRelease, \
 from ambari_server.serverConfiguration import configDefaults, JDKRelease, \
-  get_ambari_properties, get_full_ambari_classpath, get_java_exe_path, get_JAVA_HOME, get_value_from_properties, \
-  read_ambari_user, update_properties, validate_jdk, write_property, \
+  get_ambari_properties, get_full_ambari_classpath, get_is_secure, get_is_persisted, get_java_exe_path, get_JAVA_HOME, \
+  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, \
   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, \
   JDK_NAME_PROPERTY, JDK_RELEASES, NR_USER_PROPERTY, OS_FAMILY, OS_FAMILY_PROPERTY, OS_TYPE, OS_TYPE_PROPERTY, OS_VERSION, \
-  RESOURCES_DIR_PROPERTY, SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY, VIEWS_DIR_PROPERTY, get_is_secure, \
-  get_is_persisted
+  SERVICE_PASSWORD_KEY, SERVICE_USERNAME_KEY, VIEWS_DIR_PROPERTY
 from ambari_server.serverUtils import is_server_runing
 from ambari_server.serverUtils import is_server_runing
 from ambari_server.setupSecurity import adjust_directory_permissions
 from ambari_server.setupSecurity import adjust_directory_permissions
 from ambari_server.userInput import get_YN_input, get_validated_string_input
 from ambari_server.userInput import get_YN_input, get_validated_string_input
 from ambari_server.utils import locate_file
 from ambari_server.utils import locate_file
 
 
 
 
-
-
 # selinux commands
 # selinux commands
 GET_SE_LINUX_ST_CMD = locate_file('sestatus', '/usr/sbin')
 GET_SE_LINUX_ST_CMD = locate_file('sestatus', '/usr/sbin')
 SE_SETENFORCE_CMD = "setenforce 0"
 SE_SETENFORCE_CMD = "setenforce 0"
@@ -407,11 +404,7 @@ class JDKSetup(object):
 
 
     jdk_cfg = self.jdks[self.jdk_index]
     jdk_cfg = self.jdks[self.jdk_index]
 
 
-    try:
-      resources_dir = properties[RESOURCES_DIR_PROPERTY]
-    except (KeyError), e:
-      err = 'Property ' + str(e) + ' is not defined at ' + conf_file
-      raise FatalException(1, err)
+    resources_dir = get_resources_location(properties)
 
 
     dest_file = os.path.abspath(os.path.join(resources_dir, jdk_cfg.dest_file))
     dest_file = os.path.abspath(os.path.join(resources_dir, jdk_cfg.dest_file))
     if os.path.exists(dest_file):
     if os.path.exists(dest_file):
@@ -472,16 +465,10 @@ class JDKSetup(object):
     self._ensure_java_home_env_var_is_set(java_home_dir)
     self._ensure_java_home_env_var_is_set(java_home_dir)
 
 
   def download_and_unpack_jce_policy(self, properties):
   def download_and_unpack_jce_policy(self, properties):
-    conf_file = properties.fileName
-
     err_msg_stdout = "JCE Policy files are required for secure HDP setup. Please ensure " \
     err_msg_stdout = "JCE Policy files are required for secure HDP setup. Please ensure " \
               " all hosts have the JCE unlimited strength policy 6, files."
               " all hosts have the JCE unlimited strength policy 6, files."
 
 
-    try:
-      resources_dir = properties[RESOURCES_DIR_PROPERTY]
-    except (KeyError), e:
-      err = 'Property ' + str(e) + ' is not defined at ' + conf_file
-      raise FatalException(1, err)
+    resources_dir = get_resources_location(properties)
 
 
     jdk_cfg = self.jdks[self.jdk_index]
     jdk_cfg = self.jdks[self.jdk_index]
 
 
@@ -782,13 +769,8 @@ def _cache_jdbc_driver(args):
   if properties == -1:
   if properties == -1:
     err = "Error getting ambari properties"
     err = "Error getting ambari properties"
     raise FatalException(-1, err)
     raise FatalException(-1, err)
-  conf_file = properties.fileName
 
 
-  try:
-    resources_dir = properties[RESOURCES_DIR_PROPERTY]
-  except (KeyError), e:
-    err = 'Property ' + str(e) + ' is not defined at ' + conf_file
-    raise FatalException(1, err)
+  resources_dir = get_resources_location(properties)
 
 
   symlink_name = args.jdbc_db + "-jdbc-driver.jar"
   symlink_name = args.jdbc_db + "-jdbc-driver.jar"
   jdbc_symlink = os.path.join(resources_dir, symlink_name)
   jdbc_symlink = os.path.join(resources_dir, symlink_name)
@@ -1023,22 +1005,29 @@ def setup(options):
 # Setup the JCE policy for Ambari Server.
 # Setup the JCE policy for Ambari Server.
 #
 #
 def setup_jce_policy(args):
 def setup_jce_policy(args):
-  if os.path.exists(args[1]):
-    if not os.path.split(args[1])[0] == configDefaults.SERVER_RESOURCES_DIR:
-      try:
-        shutil.copy(args[1], configDefaults.SERVER_RESOURCES_DIR)
-      except Exception as e:
-        err = "Fail while trying to copy {0} to {1}. {2}".format(args[1], configDefaults.SERVER_RESOURCES_DIR, e)
-        raise FatalException(1, err)
-  else:
+  if not os.path.exists(args[1]):
     err = "Can not run 'setup-jce'. Invalid path {0}.".format(args[1])
     err = "Can not run 'setup-jce'. Invalid path {0}.".format(args[1])
     raise FatalException(1, err)
     raise FatalException(1, err)
 
 
   properties = get_ambari_properties()
   properties = get_ambari_properties()
+  resources_dir = get_resources_location(properties)
+
+  zip_path = os.path.split(args[1])
+  zip_dir = zip_path[0]
+
+  if not zip_dir == resources_dir:
+    try:
+      shutil.copy(args[1], resources_dir)
+    except Exception as e:
+      err = "Fail while trying to copy {0} to {1}. {2}".format(args[1], resources_dir, e)
+      raise FatalException(1, err)
+
   jdk_path = properties.get_property(JAVA_HOME_PROPERTY)
   jdk_path = properties.get_property(JAVA_HOME_PROPERTY)
-  resources_dir = properties.get_property(RESOURCES_DIR_PROPERTY)
+  if not jdk_path or not os.path.exists(jdk_path):
+    err = "JDK not installed, you need to run 'ambari-server setup' before attempting to install the JCE policy."
+    raise FatalException(1, err)
 
 
-  zip_name = os.path.split(args[1])[1]
+  zip_name = zip_path[1]
   properties.process_pair(JCE_NAME_PROPERTY, zip_name)
   properties.process_pair(JCE_NAME_PROPERTY, zip_name)
 
 
   print 'Installing JCE policy...'
   print 'Installing JCE policy...'

+ 4 - 5
ambari-server/src/main/python/ambari_server/serverUtils.py

@@ -25,7 +25,7 @@ from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_utils import run_os_command
 from ambari_commons.os_utils import run_os_command
 from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException
 from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperException
-from ambari_server.serverConfiguration import configDefaults, PID_NAME, get_ambari_properties, get_stack_location, \
+from ambari_server.serverConfiguration import configDefaults, PID_NAME, get_resources_location, get_stack_location, \
   CLIENT_API_PORT, SSL_API, DEFAULT_SSL_API_PORT, SSL_API_PORT
   CLIENT_API_PORT, SSL_API, DEFAULT_SSL_API_PORT, SSL_API_PORT
 
 
 
 
@@ -83,10 +83,9 @@ def is_server_runing():
 # Performs HDP stack housekeeping
 # Performs HDP stack housekeeping
 #
 #
 def refresh_stack_hash(properties):
 def refresh_stack_hash(properties):
-  stack_location = get_stack_location(properties)
-  # Hack: we determine resource dir as a parent dir for stack_location
-  resources_location = os.path.dirname(stack_location)
-  resource_files_keeper = ResourceFilesKeeper(resources_location)
+  resources_location = get_resources_location(properties)
+  stacks_location = get_stack_location(properties)
+  resource_files_keeper = ResourceFilesKeeper(resources_location, stacks_location)
 
 
   try:
   try:
     print "Organizing resource files at {0}...".format(resources_location,
     print "Organizing resource files at {0}...".format(resources_location,

+ 3 - 11
ambari-server/src/main/python/ambari_server_main.py

@@ -18,7 +18,6 @@ See the License for the specific language governing permissions and
 limitations under the License.
 limitations under the License.
 '''
 '''
 import getpass
 import getpass
-
 import os
 import os
 import stat
 import stat
 import subprocess
 import subprocess
@@ -26,7 +25,7 @@ import tempfile
 import sys
 import sys
 
 
 from ambari_commons.exceptions import FatalException
 from ambari_commons.exceptions import FatalException
-from ambari_commons.logging_utils import get_debug_mode, get_verbose, print_warning_msg, print_info_msg, \
+from ambari_commons.logging_utils import get_debug_mode, print_warning_msg, print_info_msg, \
   set_debug_mode_from_options
   set_debug_mode_from_options
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
@@ -34,9 +33,9 @@ from ambari_commons.os_utils import is_root
 from ambari_server.dbConfiguration import ensure_dbms_is_running, ensure_jdbc_driver_is_installed
 from ambari_server.dbConfiguration import ensure_dbms_is_running, ensure_jdbc_driver_is_installed
 from ambari_server.serverConfiguration import configDefaults, find_jdk, get_ambari_classpath, get_ambari_properties, \
 from ambari_server.serverConfiguration import configDefaults, find_jdk, get_ambari_classpath, get_ambari_properties, \
   get_conf_dir, get_is_persisted, get_is_secure, get_java_exe_path, get_original_master_key, read_ambari_user, \
   get_conf_dir, get_is_persisted, get_is_secure, get_java_exe_path, get_original_master_key, read_ambari_user, \
-  PID_NAME, RESOURCES_DIR_DEFAULT, RESOURCES_DIR_PROPERTY, SECURITY_KEY_ENV_VAR_NAME, SECURITY_MASTER_KEY_LOCATION, \
+  PID_NAME, SECURITY_KEY_ENV_VAR_NAME, SECURITY_MASTER_KEY_LOCATION, \
   SETUP_OR_UPGRADE_MSG, check_database_name_property, parse_properties_file
   SETUP_OR_UPGRADE_MSG, check_database_name_property, parse_properties_file
-from ambari_server.serverUtils import is_server_runing, refresh_stack_hash
+from ambari_server.serverUtils import refresh_stack_hash
 from ambari_server.setupHttps import get_fqdn
 from ambari_server.setupHttps import get_fqdn
 from ambari_server.setupSecurity import save_master_key
 from ambari_server.setupSecurity import save_master_key
 from ambari_server.utils import check_reverse_lookup, save_pid, locate_file, looking_for_pid, wait_for_pid, \
 from ambari_server.utils import check_reverse_lookup, save_pid, locate_file, looking_for_pid, wait_for_pid, \
@@ -106,13 +105,6 @@ ULIMIT_OPEN_FILES_KEY = 'ulimit.open.files'
 ULIMIT_OPEN_FILES_DEFAULT = 10000
 ULIMIT_OPEN_FILES_DEFAULT = 10000
 
 
 
 
-def get_resources_location(properties):
-  res_location = properties[RESOURCES_DIR_PROPERTY]
-  if res_location is None:
-    res_location = RESOURCES_DIR_DEFAULT
-  return res_location
-
-
 @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY)
 @OsFamilyFuncImpl(OSConst.WINSRV_FAMILY)
 def ensure_can_start_under_current_user(ambari_user):
 def ensure_can_start_under_current_user(ambari_user):
   #Ignore the requirement to run as root. In Windows, by default the child process inherits the security context
   #Ignore the requirement to run as root. In Windows, by default the child process inherits the security context

+ 8 - 2
ambari-server/src/main/windows/ambari-server.ps1

@@ -262,7 +262,7 @@ switch ($($args[0])){
   }
   }
   "upgrade"
   "upgrade"
   {
   {
-    echo "Upgrade Ambari Server"
+    echo "Upgrading Ambari Server"
     _upgrade $args
     _upgrade $args
     echo "Ambari Server Upgrade finished"
     echo "Ambari Server Upgrade finished"
   }
   }
@@ -291,9 +291,15 @@ switch ($($args[0])){
     _pstart $args
     _pstart $args
     echo "Ambari Server security setup finished"
     echo "Ambari Server security setup finished"
   }
   }
+  "refresh-stack-hash"
+  {
+    echo "Refreshing stack hash"
+    _pstart $args
+    echo "Refreshing stack hash finished"
+  }
   default
   default
   {
   {
-    echo "Usage: ambari-server {start|stop|restart|setup|upgrade|status|upgradestack|setup-ldap|setup-security} [options]"
+    echo "Usage: ambari-server {start|stop|restart|setup|upgrade|status|upgradestack|setup-ldap|setup-security|refresh-stack-hash} [options]"
     echo "Use ambari-server <action> --help to get details on options available."
     echo "Use ambari-server <action> --help to get details on options available."
     echo "Or, simply invoke ambari-server.py --help to print the options."
     echo "Or, simply invoke ambari-server.py --help to print the options."
     $retcode=1
     $retcode=1

+ 52 - 19
ambari-server/src/test/python/TestAmbariServer.py

@@ -73,7 +73,8 @@ with patch("platform.linux_distribution", return_value = os_distro_value):
           LDAP_MGR_PASSWORD_PROPERTY, LDAP_MGR_PASSWORD_ALIAS, JDBC_PASSWORD_FILENAME, NR_USER_PROPERTY, SECURITY_KEY_IS_PERSISTED, \
           LDAP_MGR_PASSWORD_PROPERTY, LDAP_MGR_PASSWORD_ALIAS, JDBC_PASSWORD_FILENAME, NR_USER_PROPERTY, SECURITY_KEY_IS_PERSISTED, \
           SSL_TRUSTSTORE_PASSWORD_PROPERTY, SECURITY_IS_ENCRYPTION_ENABLED, SSL_TRUSTSTORE_PASSWORD_ALIAS, \
           SSL_TRUSTSTORE_PASSWORD_PROPERTY, SECURITY_IS_ENCRYPTION_ENABLED, SSL_TRUSTSTORE_PASSWORD_ALIAS, \
           SECURITY_MASTER_KEY_LOCATION, SECURITY_KEYS_DIR, LDAP_PRIMARY_URL_PROPERTY, store_password_file, \
           SECURITY_MASTER_KEY_LOCATION, SECURITY_KEYS_DIR, LDAP_PRIMARY_URL_PROPERTY, store_password_file, \
-          get_pass_file_path, GET_FQDN_SERVICE_URL, JDBC_USE_INTEGRATED_AUTH_PROPERTY, SECURITY_KEY_ENV_VAR_NAME
+          get_pass_file_path, GET_FQDN_SERVICE_URL, JDBC_USE_INTEGRATED_AUTH_PROPERTY, SECURITY_KEY_ENV_VAR_NAME, \
+          JAVA_HOME_PROPERTY
         from ambari_server.serverUtils import is_server_runing, refresh_stack_hash
         from ambari_server.serverUtils import is_server_runing, refresh_stack_hash
         from ambari_server.serverSetup import check_selinux, check_ambari_user, proceedJDBCProperties, SE_STATUS_DISABLED, SE_MODE_ENFORCING, configure_os_settings, \
         from ambari_server.serverSetup import check_selinux, check_ambari_user, proceedJDBCProperties, SE_STATUS_DISABLED, SE_MODE_ENFORCING, configure_os_settings, \
           download_and_install_jdk, prompt_db_properties, setup, \
           download_and_install_jdk, prompt_db_properties, setup, \
@@ -2161,17 +2162,24 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     # Successful JDK download
     # Successful JDK download
     args.java_home = None
     args.java_home = None
     validate_jdk_mock.return_value = False
     validate_jdk_mock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     path_isfileMock.return_value = False
     path_isfileMock.return_value = False
     args.jdk_location = None
     args.jdk_location = None
     run_os_command_mock.return_value = (0, "Creating jdk1/jre" , None)
     run_os_command_mock.return_value = (0, "Creating jdk1/jre" , None)
     statResult = MagicMock()
     statResult = MagicMock()
     statResult.st_size = 32000
     statResult.st_size = 32000
     statMock.return_value = statResult
     statMock.return_value = statResult
-    rcode = download_and_install_jdk(args)
+    try:
+      rcode = download_and_install_jdk(args)
+    except Exception, e:
+      raise
     self.assertEqual(0, rcode)
     self.assertEqual(0, rcode)
 
 
     # Test case: not accept the license"
     # Test case: not accept the license"
     get_YN_input_mock.return_value = False
     get_YN_input_mock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     download_and_install_jdk(args)
     download_and_install_jdk(args)
     self.assertTrue(exit_mock.called)
     self.assertTrue(exit_mock.called)
 
 
@@ -2180,7 +2188,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     get_JAVA_HOME_mock.return_value = "some_jdk"
     get_JAVA_HOME_mock.return_value = "some_jdk"
     validate_jdk_mock.return_value = True
     validate_jdk_mock.return_value = True
     get_YN_input_mock.return_value = False
     get_YN_input_mock.return_value = False
-    path_existsMock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     force_download_file_mock.reset_mock()
     force_download_file_mock.reset_mock()
     with patch("ambari_server.serverSetup.JDKSetup._download_jce_policy") as download_jce_policy_mock:
     with patch("ambari_server.serverSetup.JDKSetup._download_jce_policy") as download_jce_policy_mock:
       rcode = download_and_install_jdk(args)
       rcode = download_and_install_jdk(args)
@@ -2191,7 +2200,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     update_properties_mock.reset_mock()
     update_properties_mock.reset_mock()
     args.java_home = "somewhere"
     args.java_home = "somewhere"
     validate_jdk_mock.return_value = True
     validate_jdk_mock.return_value = True
-    path_existsMock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     get_JAVA_HOME_mock.return_value = "some_jdk"
     get_JAVA_HOME_mock.return_value = "some_jdk"
     path_isfileMock.return_value = True
     path_isfileMock.return_value = True
     download_and_install_jdk(args)
     download_and_install_jdk(args)
@@ -2216,7 +2226,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     args.jdk_location = None
     args.jdk_location = None
     validate_jdk_mock.return_value = False
     validate_jdk_mock.return_value = False
     update_properties_mock.reset_mock()
     update_properties_mock.reset_mock()
-    path_existsMock.side_effect = [False, True]
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, True, True, True]
     get_validated_string_input_mock.return_value = "2"
     get_validated_string_input_mock.return_value = "2"
     get_JAVA_HOME_mock.return_value = None
     get_JAVA_HOME_mock.return_value = None
     rcode = download_and_install_jdk(args)
     rcode = download_and_install_jdk(args)
@@ -2226,8 +2237,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     # Test case: Setup ambari-server first time, Custom JDK selected, JDK not exists
     # Test case: Setup ambari-server first time, Custom JDK selected, JDK not exists
     update_properties_mock.reset_mock()
     update_properties_mock.reset_mock()
     validate_jdk_mock.return_value = False
     validate_jdk_mock.return_value = False
-    path_existsMock.side_effect = None
-    path_existsMock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     get_validated_string_input_mock.return_value = "2"
     get_validated_string_input_mock.return_value = "2"
     get_JAVA_HOME_mock.return_value = None
     get_JAVA_HOME_mock.return_value = None
     try:
     try:
@@ -2242,7 +2253,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     validate_jdk_mock.return_value = False
     validate_jdk_mock.return_value = False
     path_isfileMock.return_value = False
     path_isfileMock.return_value = False
     update_properties_mock.reset_mock()
     update_properties_mock.reset_mock()
-    path_existsMock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     get_validated_string_input_mock.return_value = "2"
     get_validated_string_input_mock.return_value = "2"
     get_JAVA_HOME_mock.return_value = None
     get_JAVA_HOME_mock.return_value = None
     flag = False
     flag = False
@@ -2258,7 +2270,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     #Test case: Setup ambari-server with java home passed. Path to java home doesn't exist
     #Test case: Setup ambari-server with java home passed. Path to java home doesn't exist
     args.java_home = "somewhere"
     args.java_home = "somewhere"
     validate_jdk_mock.return_value = False
     validate_jdk_mock.return_value = False
-    path_existsMock.return_value = False
+    path_existsMock.reset_mock()
+    path_existsMock.side_effect = [True, False, True, False]
     try:
     try:
       download_and_install_jdk(args)
       download_and_install_jdk(args)
       self.fail("Should throw exception")
       self.fail("Should throw exception")
@@ -2759,7 +2772,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   def test_setup_jce_policy(self, open_mock, search_file_mock, get_ambari_properties_mock, unpack_jce_policy_mock,
   def test_setup_jce_policy(self, open_mock, search_file_mock, get_ambari_properties_mock, unpack_jce_policy_mock,
                             update_properties_mock, path_split_mock, shutil_copy_mock, exists_mock):
                             update_properties_mock, path_split_mock, shutil_copy_mock, exists_mock):
     exists_mock.return_value = True
     exists_mock.return_value = True
-    properties = MagicMock()
+    properties = Properties()
+    properties.process_pair(JAVA_HOME_PROPERTY, "/java_home")
     unpack_jce_policy_mock.return_value = 0
     unpack_jce_policy_mock.return_value = 0
     get_ambari_properties_mock.return_value = properties
     get_ambari_properties_mock.return_value = properties
     conf_file = 'etc/ambari-server/conf/ambari.properties'
     conf_file = 'etc/ambari-server/conf/ambari.properties'
@@ -2814,6 +2828,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
       setup_jce_policy(args)
       setup_jce_policy(args)
     except FatalException:
     except FatalException:
       self.assertTrue(True)
       self.assertTrue(True)
+    pass
 
 
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("ambari_commons.firewall.run_os_command")
   @patch("ambari_commons.firewall.run_os_command")
@@ -3256,7 +3271,6 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @patch("ambari_server.serverConfiguration.get_validated_string_input")
   @patch("ambari_server.serverConfiguration.get_validated_string_input")
   @patch("os.environ")
   @patch("os.environ")
   @patch("ambari_server.setupSecurity.get_ambari_properties")
   @patch("ambari_server.setupSecurity.get_ambari_properties")
-  @patch("ambari_server.serverUtils.get_ambari_properties")
   @patch("ambari_server.serverSetup.get_ambari_properties")
   @patch("ambari_server.serverSetup.get_ambari_properties")
   @patch("ambari_server.serverConfiguration.get_ambari_properties")
   @patch("ambari_server.serverConfiguration.get_ambari_properties")
   @patch("ambari_server_main.get_ambari_properties")
   @patch("ambari_server_main.get_ambari_properties")
@@ -3282,7 +3296,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
                  find_jdk_mock, check_database_name_property_mock, search_file_mock,
                  find_jdk_mock, check_database_name_property_mock, search_file_mock,
                  popenMock, openMock, pexistsMock,
                  popenMock, openMock, pexistsMock,
                  get_ambari_properties_mock, get_ambari_properties_2_mock, get_ambari_properties_3_mock,
                  get_ambari_properties_mock, get_ambari_properties_2_mock, get_ambari_properties_3_mock,
-                 get_ambari_properties_4_mock, get_ambari_properties_5_mock, os_environ_mock,
+                 get_ambari_properties_4_mock, os_environ_mock,
                  get_validated_string_input_method, write_property_method,
                  get_validated_string_input_method, write_property_method,
                  os_chmod_method, get_is_secure_mock, get_is_persisted_mock,
                  os_chmod_method, get_is_secure_mock, get_is_persisted_mock,
                  save_master_key_method, get_master_key_location_method,
                  save_master_key_method, get_master_key_location_method,
@@ -3291,6 +3305,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
                  wait_for_pid_mock, looking_for_pid_mock, stdout_write_mock, stdout_flush_mock):
                  wait_for_pid_mock, looking_for_pid_mock, stdout_write_mock, stdout_flush_mock):
 
 
     def reset_mocks():
     def reset_mocks():
+      pexistsMock.reset_mock()
+
       args = MagicMock()
       args = MagicMock()
       del args.dbms
       del args.dbms
       del args.database_index
       del args.database_index
@@ -3325,7 +3341,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     p = Properties()
     p = Properties()
     p.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, 'False')
     p.process_pair(SECURITY_IS_ENCRYPTION_ENABLED, 'False')
 
 
-    get_ambari_properties_5_mock.return_value = get_ambari_properties_4_mock.return_value = \
+    get_ambari_properties_4_mock.return_value = \
       get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
       get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
       get_ambari_properties_mock.return_value = p
       get_ambari_properties_mock.return_value = p
     get_is_secure_mock.return_value = False
     get_is_secure_mock.return_value = False
@@ -3433,12 +3449,16 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     # Test exception handling on resource files housekeeping
     # Test exception handling on resource files housekeeping
     perform_housekeeping_mock.reset_mock()
     perform_housekeeping_mock.reset_mock()
     perform_housekeeping_mock.side_effect = KeeperException("some_reason")
     perform_housekeeping_mock.side_effect = KeeperException("some_reason")
+
+    pexistsMock.return_value = True
+
     try:
     try:
       _ambari_server_.start(args)
       _ambari_server_.start(args)
       self.fail("Should fail with exception")
       self.fail("Should fail with exception")
     except FatalException as e:
     except FatalException as e:
       self.assertTrue('some_reason' in e.reason)
       self.assertTrue('some_reason' in e.reason)
     self.assertTrue(perform_housekeeping_mock.called)
     self.assertTrue(perform_housekeeping_mock.called)
+
     perform_housekeeping_mock.side_effect = lambda *v, **kv : None
     perform_housekeeping_mock.side_effect = lambda *v, **kv : None
     perform_housekeeping_mock.reset_mock()
     perform_housekeeping_mock.reset_mock()
 
 
@@ -3827,11 +3847,12 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("os.path.isfile")
   @patch("os.path.isfile")
   @patch("ambari_server.serverSetup.get_ambari_properties")
   @patch("ambari_server.serverSetup.get_ambari_properties")
+  @patch("os.path.exists")
   @patch("os.path.lexists")
   @patch("os.path.lexists")
   @patch("os.remove")
   @patch("os.remove")
   @patch("os.symlink")
   @patch("os.symlink")
   @patch("shutil.copy")
   @patch("shutil.copy")
-  def test_proceedJDBCProperties(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mock,
+  def test_proceedJDBCProperties(self, copy_mock, os_symlink_mock, os_remove_mock, lexists_mock, exists_mock,
                                  get_ambari_properties_mock, isfile_mock):
                                  get_ambari_properties_mock, isfile_mock):
     args = MagicMock()
     args = MagicMock()
 
 
@@ -3876,6 +3897,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     p = MagicMock()
     p = MagicMock()
     get_ambari_properties_mock.return_value = p
     get_ambari_properties_mock.return_value = p
     p.__getitem__.side_effect = KeyError("test exception")
     p.__getitem__.side_effect = KeyError("test exception")
+    exists_mock.return_value = False
     fail = False
     fail = False
 
 
     try:
     try:
@@ -3889,6 +3911,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     args.jdbc_db = "postgres"
     args.jdbc_db = "postgres"
     get_ambari_properties_mock.return_value = MagicMock()
     get_ambari_properties_mock.return_value = MagicMock()
     isfile_mock.side_effect = [True, False]
     isfile_mock.side_effect = [True, False]
+    exists_mock.return_value = True
     fail = False
     fail = False
 
 
     def side_effect():
     def side_effect():
@@ -3927,6 +3950,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @patch("__builtin__.open")
   @patch("__builtin__.open")
   @patch("os.path.isfile")
   @patch("os.path.isfile")
   @patch("os.path.lexists")
   @patch("os.path.lexists")
+  @patch("os.path.exists")
   @patch("os.remove")
   @patch("os.remove")
   @patch("os.symlink")
   @patch("os.symlink")
   @patch.object(Properties, "store")
   @patch.object(Properties, "store")
@@ -3950,7 +3974,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
                             is_root_mock, update_ambari_properties_mock, find_properties_file_mock, run_os_command_mock,
                             is_root_mock, update_ambari_properties_mock, find_properties_file_mock, run_os_command_mock,
                             run_schema_upgrade_mock, read_ambari_user_mock, print_warning_msg_mock,
                             run_schema_upgrade_mock, read_ambari_user_mock, print_warning_msg_mock,
                             adjust_directory_permissions_mock, properties_store_mock,
                             adjust_directory_permissions_mock, properties_store_mock,
-                            os_symlink_mock, os_remove_mock, lexists_mock, isfile_mock, open_mock):
+                            os_symlink_mock, os_remove_mock, exists_mock, lexists_mock, isfile_mock, open_mock):
 
 
     def reset_mocks():
     def reset_mocks():
       run_os_command_mock.reset_mock()
       run_os_command_mock.reset_mock()
@@ -4043,6 +4067,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     get_ambari_properties_mock.return_value = properties
     get_ambari_properties_mock.return_value = properties
     get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2]
     get_ambari_properties_3_mock.side_effect = get_ambari_properties_2_mock.side_effect = [properties, properties2, properties2]
 
 
+    exists_mock.return_value = True
+
     try:
     try:
       upgrade(args)
       upgrade(args)
     except FatalException as fe:
     except FatalException as fe:
@@ -4102,8 +4128,8 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
       self.assertTrue(write_property_mock.called)
       self.assertTrue(write_property_mock.called)
       self.assertFalse(move_user_custom_actions_mock.called)
       self.assertFalse(move_user_custom_actions_mock.called)
       self.assertTrue(os_symlink_mock.called)
       self.assertTrue(os_symlink_mock.called)
-      self.assertTrue(os_symlink_mock.call_args_list[0][0][0] == "mysql-connector-java.jar")
-      self.assertTrue(os_symlink_mock.call_args_list[0][0][1] == "mysql-jdbc-driver.jar")
+      self.assertTrue(os_symlink_mock.call_args_list[0][0][0] == "/var/lib/ambari-server/resources/mysql-connector-java.jar")
+      self.assertTrue(os_symlink_mock.call_args_list[0][0][1] == "/var/lib/ambari-server/resources/mysql-jdbc-driver.jar")
 
 
     args = reset_mocks()
     args = reset_mocks()
 
 
@@ -4131,6 +4157,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch("__builtin__.open")
   @patch("__builtin__.open")
   @patch("os.path.isfile")
   @patch("os.path.isfile")
+  @patch("os.path.exists")
   @patch("os.path.lexists")
   @patch("os.path.lexists")
   @patch("os.remove")
   @patch("os.remove")
   @patch("os.symlink")
   @patch("os.symlink")
@@ -4159,7 +4186,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
                    read_ambari_user_mock, print_warning_msg_mock,
                    read_ambari_user_mock, print_warning_msg_mock,
                    adjust_directory_permissions_mock,
                    adjust_directory_permissions_mock,
                    find_properties_file_mock, change_db_files_owner_mock, properties_store_mock,
                    find_properties_file_mock, change_db_files_owner_mock, properties_store_mock,
-                   os_symlink_mock, os_remove_mock, lexists_mock, isfile_mock, open_mock):
+                   os_symlink_mock, os_remove_mock, lexists_mock, exists_mock, isfile_mock, open_mock):
 
 
     def reset_mocks():
     def reset_mocks():
       isfile_mock.reset_mock()
       isfile_mock.reset_mock()
@@ -4210,6 +4237,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     read_ambari_user_mock.return_value = None
     read_ambari_user_mock.return_value = None
     run_schema_upgrade_mock.return_value = 0
     run_schema_upgrade_mock.return_value = 0
     change_db_files_owner_mock.return_value = 0
     change_db_files_owner_mock.return_value = 0
+    exists_mock.return_value = True
     upgrade(args)
     upgrade(args)
     self.assertTrue(print_warning_msg_mock.called)
     self.assertTrue(print_warning_msg_mock.called)
     warning_args = print_warning_msg_mock.call_args[0][0]
     warning_args = print_warning_msg_mock.call_args[0][0]
@@ -4276,6 +4304,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
     get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
       get_ambari_properties_mock.return_value = p
       get_ambari_properties_mock.return_value = p
     p.__getitem__.side_effect = ["something", "something", "something", KeyError("test exception")]
     p.__getitem__.side_effect = ["something", "something", "something", KeyError("test exception")]
+    exists_mock.return_value = False
     fail = False
     fail = False
 
 
     try:
     try:
@@ -4293,6 +4322,7 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
 
 
     get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
     get_ambari_properties_3_mock.return_value = get_ambari_properties_2_mock.return_value = \
       get_ambari_properties_mock.return_value = props
       get_ambari_properties_mock.return_value = props
+    exists_mock.return_value = True
     lexists_mock.return_value = True
     lexists_mock.return_value = True
     isfile_mock.side_effect = [True, False]
     isfile_mock.side_effect = [True, False]
 
 
@@ -6543,9 +6573,12 @@ MIIFHjCCAwYCCQDpHKOBI+Lt0zANBgkqhkiG9w0BAQUFADBRMQswCQYDVQQGEwJV
     run_metainfo_upgrade_mock.assert_called_with({})
     run_metainfo_upgrade_mock.assert_called_with({})
     pass
     pass
 
 
+  @patch("os.path.exists")
   @patch.object(ResourceFilesKeeper, "perform_housekeeping")
   @patch.object(ResourceFilesKeeper, "perform_housekeeping")
   def test_refresh_stack_hash(self,
   def test_refresh_stack_hash(self,
-    perform_housekeeping_mock):
+    perform_housekeeping_mock, path_exists_mock):
+
+    path_exists_mock.return_value = True
 
 
     properties = Properties()
     properties = Properties()
     refresh_stack_hash(properties)
     refresh_stack_hash(properties)

+ 6 - 6
ambari-server/src/test/python/TestOSCheck.py

@@ -43,11 +43,11 @@ with patch("platform.linux_distribution", return_value = ('Suse','11','Final')):
 
 
 class TestOSCheck(TestCase):
 class TestOSCheck(TestCase):
   @patch.object(OSCheck, "os_distribution")
   @patch.object(OSCheck, "os_distribution")
-  @patch("os.path.exists")
-  def test_get_os_type(self, mock_exists, mock_linux_distribution):
+  @patch("ambari_commons.os_check._is_oracle_linux")
+  def test_get_os_type(self, mock_is_oracle_linux, mock_linux_distribution):
 
 
     # 1 - Any system
     # 1 - Any system
-    mock_exists.return_value = False
+    mock_is_oracle_linux.return_value = False
     mock_linux_distribution.return_value = ('my_os', '', '')
     mock_linux_distribution.return_value = ('my_os', '', '')
     result = OSCheck.get_os_type()
     result = OSCheck.get_os_type()
     self.assertEquals(result, 'my_os')
     self.assertEquals(result, 'my_os')
@@ -63,19 +63,19 @@ class TestOSCheck(TestCase):
       pass
       pass
 
 
     # 3 - path exist: '/etc/oracle-release'
     # 3 - path exist: '/etc/oracle-release'
-    mock_exists.return_value = True
+    mock_is_oracle_linux.return_value = True
     mock_linux_distribution.return_value = ('some_os', '', '')
     mock_linux_distribution.return_value = ('some_os', '', '')
     result = OSCheck.get_os_type()
     result = OSCheck.get_os_type()
     self.assertEquals(result, 'oraclelinux')
     self.assertEquals(result, 'oraclelinux')
 
 
     # 4 - Common system
     # 4 - Common system
-    mock_exists.return_value = False
+    mock_is_oracle_linux.return_value = False
     mock_linux_distribution.return_value = ('CenToS', '', '')
     mock_linux_distribution.return_value = ('CenToS', '', '')
     result = OSCheck.get_os_type()
     result = OSCheck.get_os_type()
     self.assertEquals(result, 'centos')
     self.assertEquals(result, 'centos')
 
 
     # 5 - Red Hat Enterprise Linux
     # 5 - Red Hat Enterprise Linux
-    mock_exists.return_value = False
+    mock_is_oracle_linux.return_value = False
     # Red Hat Enterprise Linux Server release 6.5 (Santiago)
     # Red Hat Enterprise Linux Server release 6.5 (Santiago)
     mock_linux_distribution.return_value = ('Red Hat Enterprise Linux Server', '6.5', 'Santiago')
     mock_linux_distribution.return_value = ('Red Hat Enterprise Linux Server', '6.5', 'Santiago')
     result = OSCheck.get_os_type()
     result = OSCheck.get_os_type()

+ 19 - 13
ambari-server/src/test/python/TestResourceFilesKeeper.py

@@ -34,6 +34,7 @@ from ambari_server.resourceFilesKeeper import ResourceFilesKeeper, KeeperExcepti
 
 
 class TestResourceFilesKeeper(TestCase):
 class TestResourceFilesKeeper(TestCase):
 
 
+  TEST_RESOURCES_DIR = "../resources"
   TEST_STACKS_DIR="../resources/stacks"
   TEST_STACKS_DIR="../resources/stacks"
 
 
   # Stack that is not expected to change
   # Stack that is not expected to change
@@ -66,9 +67,10 @@ class TestResourceFilesKeeper(TestCase):
 
 
   @patch.object(ResourceFilesKeeper, "update_directory_archieves")
   @patch.object(ResourceFilesKeeper, "update_directory_archieves")
   def test_perform_housekeeping(self, update_directory_archieves_mock):
   def test_perform_housekeeping(self, update_directory_archieves_mock):
-    resource_files_keeper = ResourceFilesKeeper("/dummy-path")
+    resource_files_keeper = ResourceFilesKeeper("/dummy-resources", "/dummy-path")
     resource_files_keeper.perform_housekeeping()
     resource_files_keeper.perform_housekeeping()
     update_directory_archieves_mock.assertCalled()
     update_directory_archieves_mock.assertCalled()
+    pass
 
 
 
 
   @patch.object(ResourceFilesKeeper, "update_directory_archive")
   @patch.object(ResourceFilesKeeper, "update_directory_archive")
@@ -85,7 +87,7 @@ class TestResourceFilesKeeper(TestCase):
     list_common_services_mock.return_value = [self.DUMMY_UNCHANGEABLE_COMMON_SERVICES,
     list_common_services_mock.return_value = [self.DUMMY_UNCHANGEABLE_COMMON_SERVICES,
                                               self.DUMMY_UNCHANGEABLE_COMMON_SERVICES]
                                               self.DUMMY_UNCHANGEABLE_COMMON_SERVICES]
     abspath_mock.side_effect = lambda s : s
     abspath_mock.side_effect = lambda s : s
-    resource_files_keeper = ResourceFilesKeeper(self.TEST_STACKS_DIR)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.TEST_STACKS_DIR)
     resource_files_keeper.update_directory_archieves()
     resource_files_keeper.update_directory_archieves()
     self.assertEquals(pprint.pformat(
     self.assertEquals(pprint.pformat(
       update_directory_archive_mock.call_args_list),
       update_directory_archive_mock.call_args_list),
@@ -99,14 +101,15 @@ class TestResourceFilesKeeper(TestCase):
             "dummy_common_services/HIVE/0.11.0.2.0.5.0/package'),\n "
             "dummy_common_services/HIVE/0.11.0.2.0.5.0/package'),\n "
             "call('../resources/TestAmbaryServer.samples/"
             "call('../resources/TestAmbaryServer.samples/"
             "dummy_common_services/HIVE/0.11.0.2.0.5.0/package'),\n "
             "dummy_common_services/HIVE/0.11.0.2.0.5.0/package'),\n "
-            "call('../resources/stacks/custom_actions'),\n "
-            "call('../resources/stacks/host_scripts')]")
+            "call('../resources/custom_actions'),\n "
+            "call('../resources/host_scripts')]")
+    pass
 
 
 
 
   @patch("glob.glob")
   @patch("glob.glob")
   @patch("os.path.exists")
   @patch("os.path.exists")
   def test_list_stacks(self, exists_mock, glob_mock):
   def test_list_stacks(self, exists_mock, glob_mock):
-    resource_files_keeper = ResourceFilesKeeper(self.SOME_PATH)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.SOME_PATH)
     # Test normal execution flow
     # Test normal execution flow
     glob_mock.return_value = ["stack1", "stack2", "stack3"]
     glob_mock.return_value = ["stack1", "stack2", "stack3"]
     exists_mock.side_effect = [True, False, True]
     exists_mock.side_effect = [True, False, True]
@@ -127,7 +130,7 @@ class TestResourceFilesKeeper(TestCase):
   @patch("glob.glob")
   @patch("glob.glob")
   @patch("os.path.exists")
   @patch("os.path.exists")
   def test_list_common_services(self, exists_mock, glob_mock):
   def test_list_common_services(self, exists_mock, glob_mock):
-    resource_files_keeper = ResourceFilesKeeper(self.SOME_PATH)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.SOME_PATH)
     # Test normal execution flow
     # Test normal execution flow
     glob_mock.return_value = ["common_service1", "common_service2", "common_service3"]
     glob_mock.return_value = ["common_service1", "common_service2", "common_service3"]
     exists_mock.side_effect = [True, False, True]
     exists_mock.side_effect = [True, False, True]
@@ -154,7 +157,7 @@ class TestResourceFilesKeeper(TestCase):
     # Test situation when there is no saved directory hash
     # Test situation when there is no saved directory hash
     read_hash_sum_mock.return_value = None
     read_hash_sum_mock.return_value = None
     count_hash_sum_mock.return_value = self.YA_HASH
     count_hash_sum_mock.return_value = self.YA_HASH
-    resource_files_keeper = ResourceFilesKeeper(self.SOME_PATH)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.SOME_PATH)
     resource_files_keeper.update_directory_archive(self.SOME_PATH)
     resource_files_keeper.update_directory_archive(self.SOME_PATH)
     self.assertTrue(read_hash_sum_mock.called)
     self.assertTrue(read_hash_sum_mock.called)
     self.assertTrue(count_hash_sum_mock.called)
     self.assertTrue(count_hash_sum_mock.called)
@@ -218,17 +221,18 @@ class TestResourceFilesKeeper(TestCase):
     # Test nozip option
     # Test nozip option
     read_hash_sum_mock.return_value = None
     read_hash_sum_mock.return_value = None
     count_hash_sum_mock.return_value = self.YA_HASH
     count_hash_sum_mock.return_value = self.YA_HASH
-    resource_files_keeper = ResourceFilesKeeper(self.SOME_PATH, nozip=True)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.SOME_PATH, nozip=True)
     resource_files_keeper.update_directory_archive(self.SOME_PATH)
     resource_files_keeper.update_directory_archive(self.SOME_PATH)
     self.assertTrue(read_hash_sum_mock.called)
     self.assertTrue(read_hash_sum_mock.called)
     self.assertTrue(count_hash_sum_mock.called)
     self.assertTrue(count_hash_sum_mock.called)
     self.assertFalse(zip_directory_mock.called)
     self.assertFalse(zip_directory_mock.called)
     self.assertTrue(write_hash_sum_mock.called)
     self.assertTrue(write_hash_sum_mock.called)
+    pass
 
 
 
 
   def test_count_hash_sum(self):
   def test_count_hash_sum(self):
     # Test normal flow
     # Test normal flow
-    resource_files_keeper = ResourceFilesKeeper(self.DUMMY_UNCHANGEABLE_PACKAGE)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)
     test_dir = os.path.join(self.DUMMY_UNCHANGEABLE_PACKAGE)
     test_dir = os.path.join(self.DUMMY_UNCHANGEABLE_PACKAGE)
     hash_sum = resource_files_keeper.count_hash_sum(test_dir)
     hash_sum = resource_files_keeper.count_hash_sum(test_dir)
     self.assertEquals(hash_sum, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH)
     self.assertEquals(hash_sum, self.DUMMY_UNCHANGEABLE_PACKAGE_HASH)
@@ -246,7 +250,7 @@ class TestResourceFilesKeeper(TestCase):
 
 
 
 
   def test_read_hash_sum(self):
   def test_read_hash_sum(self):
-    resource_files_keeper = ResourceFilesKeeper(self.DUMMY_UNCHANGEABLE_PACKAGE)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)
     hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE)
     hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE)
     self.assertEquals(hash_sum, "dummy_hash")
     self.assertEquals(hash_sum, "dummy_hash")
 
 
@@ -272,11 +276,12 @@ class TestResourceFilesKeeper(TestCase):
         open_mock.side_effect = self.exc_side_effect
         open_mock.side_effect = self.exc_side_effect
         res = resource_files_keeper.read_hash_sum("path-to-directory")
         res = resource_files_keeper.read_hash_sum("path-to-directory")
         self.assertEqual(res, None)
         self.assertEqual(res, None)
+    pass
 
 
 
 
   def test_write_hash_sum(self):
   def test_write_hash_sum(self):
     NEW_HASH = "new_hash"
     NEW_HASH = "new_hash"
-    resource_files_keeper = ResourceFilesKeeper(self.DUMMY_UNCHANGEABLE_PACKAGE)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)
     resource_files_keeper.write_hash_sum(
     resource_files_keeper.write_hash_sum(
       self.DUMMY_UNCHANGEABLE_PACKAGE, NEW_HASH)
       self.DUMMY_UNCHANGEABLE_PACKAGE, NEW_HASH)
     hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE)
     hash_sum = resource_files_keeper.read_hash_sum(self.DUMMY_UNCHANGEABLE_PACKAGE)
@@ -302,7 +307,7 @@ class TestResourceFilesKeeper(TestCase):
 
 
   def test_zip_directory(self):
   def test_zip_directory(self):
     # Test normal flow
     # Test normal flow
-    resource_files_keeper = ResourceFilesKeeper(self.DUMMY_UNCHANGEABLE_PACKAGE)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)
     resource_files_keeper.zip_directory(self.DUMMY_UNCHANGEABLE_PACKAGE)
     resource_files_keeper.zip_directory(self.DUMMY_UNCHANGEABLE_PACKAGE)
     arc_file = os.path.join(self.DUMMY_UNCHANGEABLE_PACKAGE,
     arc_file = os.path.join(self.DUMMY_UNCHANGEABLE_PACKAGE,
                             ResourceFilesKeeper.ARCHIVE_NAME)
                             ResourceFilesKeeper.ARCHIVE_NAME)
@@ -328,12 +333,13 @@ class TestResourceFilesKeeper(TestCase):
 
 
 
 
   def test_is_ignored(self):
   def test_is_ignored(self):
-    resource_files_keeper = ResourceFilesKeeper(self.DUMMY_UNCHANGEABLE_PACKAGE)
+    resource_files_keeper = ResourceFilesKeeper(self.TEST_RESOURCES_DIR, self.DUMMY_UNCHANGEABLE_PACKAGE)
     self.assertTrue(resource_files_keeper.is_ignored(".hash"))
     self.assertTrue(resource_files_keeper.is_ignored(".hash"))
     self.assertTrue(resource_files_keeper.is_ignored("archive.zip"))
     self.assertTrue(resource_files_keeper.is_ignored("archive.zip"))
     self.assertTrue(resource_files_keeper.is_ignored("dummy.pyc"))
     self.assertTrue(resource_files_keeper.is_ignored("dummy.pyc"))
     self.assertFalse(resource_files_keeper.is_ignored("dummy.py"))
     self.assertFalse(resource_files_keeper.is_ignored("dummy.py"))
     self.assertFalse(resource_files_keeper.is_ignored("1.sh"))
     self.assertFalse(resource_files_keeper.is_ignored("1.sh"))
+    pass
 
 
 
 
   def exc_side_effect(self, *a):
   def exc_side_effect(self, *a):

+ 9 - 0
ambari-server/src/test/python/host_scripts/TestAlertDiskSpace.py

@@ -22,8 +22,17 @@ from mock.mock import patch, MagicMock
 from ambari_commons.os_check import OSCheck
 from ambari_commons.os_check import OSCheck
 from stacks.utils.RMFTestCase import *
 from stacks.utils.RMFTestCase import *
 
 
+from only_for_platform import get_platform, not_for_platform, only_for_platform, PLATFORM_LINUX, PLATFORM_WINDOWS
+
+if get_platform() != PLATFORM_WINDOWS:
+  os_distro_value = ('Suse','11','Final')
+  from pwd import getpwnam
+else:
+  #No Windows tests for now, but start getting prepared
+  os_distro_value = ('win2012serverr2','6.3','WindowsServer')
 
 
 class TestAlertDiskSpace(RMFTestCase):
 class TestAlertDiskSpace(RMFTestCase):
+  @patch.object(OSCheck, "os_distribution", new = MagicMock(return_value = os_distro_value))
   @patch('alert_disk_space._get_disk_usage')
   @patch('alert_disk_space._get_disk_usage')
   @patch("os.path.isdir")
   @patch("os.path.isdir")
   @patch.object(OSCheck, "get_os_family", new = MagicMock(return_value = 'redhat'))
   @patch.object(OSCheck, "get_os_family", new = MagicMock(return_value = 'redhat'))