You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by al...@apache.org on 2015/06/08 23:04:24 UTC

ambari git commit: AMBARI-11743. NameNode is forced to leave safemode, which causes HBMaster master to crash if done too quickly (alejandro)

Repository: ambari
Updated Branches:
  refs/heads/trunk 2df3a954e -> c13c5828b


AMBARI-11743. NameNode is forced to leave safemode, which causes HBMaster master to crash if done too quickly (alejandro)


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

Branch: refs/heads/trunk
Commit: c13c5828b2f9dc169aca41df5bc2c4363a6919be
Parents: 2df3a95
Author: Alejandro Fernandez <af...@hortonworks.com>
Authored: Fri Jun 5 17:24:25 2015 -0700
Committer: Alejandro Fernandez <af...@hortonworks.com>
Committed: Mon Jun 8 12:56:46 2015 -0700

----------------------------------------------------------------------
 .../libraries/functions/copy_tarball.py         |  9 ++-
 .../2.1.0.2.0/package/scripts/hdfs_namenode.py  | 50 +++++-------
 .../python/stacks/2.0.6/HDFS/test_namenode.py   | 83 +++++++++++---------
 .../stacks/2.0.6/HIVE/test_hive_server.py       | 29 ++++---
 .../stacks/2.2/SPARK/test_job_history_server.py | 39 ++++++++-
 5 files changed, 125 insertions(+), 85 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c13c5828/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py b/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py
index 1226439..8eab473 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/copy_tarball.py
@@ -73,14 +73,15 @@ def _get_single_version_from_hdp_select():
     code, stdoutdata = shell.call(get_hdp_versions_cmd, logoutput=True)
     with open(tmp_file, 'r+') as file:
       out = file.read()
-  except:
-    Logger.error("Could not parse output of {0}".format(str(tmp_file)))
+  except Exception, e:
+    Logger.logger.exception("Could not parse output of {0}. Error: {1}".format(str(tmp_file), str(e)))
   finally:
     try:
       if os.path.exists(tmp_file):
         os.remove(tmp_file)
-    except:
-      pass
+    except Exception, e:
+      Logger.logger.exception("Could not remove file {0}. Error: {1}".format(str(tmp_file), str(e)))
+
   if code != 0 or out is None or out == "":
     Logger.error("Could not verify HDP version by calling '{0}'. Return Code: {1}, Output: {2}.".format(get_hdp_versions_cmd, str(code), str(out)))
     return None

http://git-wip-us.apache.org/repos/asf/ambari/blob/c13c5828/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
index d26d145..827c03d 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/scripts/hdfs_namenode.py
@@ -89,61 +89,53 @@ def namenode(action=None, do_format=True, rolling_restart=False, env=None):
       Execute(format("{kinit_path_local} -kt {hdfs_user_keytab} {hdfs_principal_name}"),
               user = params.hdfs_user)
 
-    is_namenode_safe_mode_off = format("hadoop dfsadmin -fs {namenode_address} -safemode get | grep 'Safe mode is OFF'")
+    is_namenode_safe_mode_off = format("hdfs dfsadmin -fs {namenode_address} -safemode get | grep 'Safe mode is OFF'")
     if params.dfs_ha_enabled:
       is_active_namenode_cmd = as_user(format("hdfs --config {hadoop_conf_dir} haadmin -getServiceState {namenode_id} | grep active"), params.hdfs_user, env={'PATH':params.hadoop_bin_dir})
     else:
       is_active_namenode_cmd = None
 
-    # During normal operations, if HA is enabled and it is in standby, then stay in current state, otherwise, leave safemode.
-    # During Rolling Upgrade, both namenodes must leave safemode.
+    # During normal operations, if HA is enabled and it is in standby, then no need to check safemode staus.
+    # During Rolling Upgrade, both namenodes must eventually leave safemode, and Ambari can wait for this.
 
     # ___Scenario_________|_Expected safemode state___|_Wait for safemode OFF____|
     # 1 (HA and active)   | ON -> OFF                 | Yes                      |
     # 2 (HA and standby)  | no change (yes during RU) | no check (yes during RU) |
     # 3 (no-HA)           | ON -> OFF                 | Yes                      |
-    leave_safe_mode = False
+    check_for_safemode_off = False
     msg = ""
     if params.dfs_ha_enabled:
       code, out = shell.call(is_active_namenode_cmd, logoutput=True) # If active NN, code will be 0
       if code == 0: # active
-        leave_safe_mode = True
-        msg = "Must leave safemode since High Availability is enabled and this is the Active NameNode."
+        check_for_safemode_off = True
+        msg = "Must wait to leave safemode since High Availability is enabled and this is the Active NameNode."
       elif rolling_restart:
-        leave_safe_mode = True
-        msg = "Must leave safemode since High Availability is enabled during a Rolling Upgrade"
+        check_for_safemode_off = True
+        msg = "Must wait to leave safemode since High Availability is enabled during a Rolling Upgrade"
     else:
-      msg = "Must leave safemode since High Availability is not enabled."
-      leave_safe_mode = True
+      msg = "Must wait to leave safemode since High Availability is not enabled."
+      check_for_safemode_off = True
 
     if not msg:
       msg = "Will remain in the current safemode state."
     Logger.info(msg)
 
-    if leave_safe_mode:
-      # First check if Namenode is not in 'safemode OFF' (equivalent to safemode ON), if so, then leave it
+    if check_for_safemode_off:
+      # First check if Namenode is not in 'safemode OFF' (equivalent to safemode ON). If safemode is OFF, no change.
+      # If safemode is ON, first wait for NameNode to leave safemode on its own (if that doesn't happen within 30 seconds, then
+      # force NameNode to leave safemode).
       Logger.info("Checking the NameNode safemode status since may need to transition from ON to OFF.")
-      code, out = shell.call(is_namenode_safe_mode_off, user=params.hdfs_user)
-      if code != 0:
-        Logger.info("Will need to leave safemode, state should be OFF.")
-        leave_safe_mode_cmd = format("hdfs --config {hadoop_conf_dir} dfsadmin -fs {namenode_address} -safemode leave")
-        Execute(leave_safe_mode_cmd,
-                tries=10,
-                try_sleep=10,
-                user=params.hdfs_user,
-                path=[params.hadoop_bin_dir],
-        )
 
-        Logger.info("Checking if safemode state is now OFF.")
-        # Verify if Namenode should be in safemode OFF
+      try:
+        # Wait up to 30 mins
         Execute(is_namenode_safe_mode_off,
-                tries=40,
+                tries=180,
                 try_sleep=10,
-                path=[params.hadoop_bin_dir],
-                user=params.hdfs_user
+                user=params.hdfs_user,
+                logoutput=True
         )
-        pass
-      pass
+      except Fail:
+        Logger.error("NameNode is still in safemode, please be careful with commands that need safemode OFF.")
 
     # Always run this on non-HA, or active NameNode during HA.
     create_hdfs_directories(is_active_namenode_cmd)

http://git-wip-us.apache.org/repos/asf/ambari/blob/c13c5828/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py
index b920c17..f6c3b1a 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HDFS/test_namenode.py
@@ -50,7 +50,7 @@ class TestNamenode(RMFTestCase):
                        config_file = "altfs_plus_hdfs.json",
                        hdp_stack_version = self.STACK_VERSION,
                        target = RMFTestCase.TARGET_COMMON_SERVICES,
-                       call_mocks = [(5,"")],
+                       call_mocks = [(0,"")],
     )
     self.assert_configure_default()
     self.assertResourceCalled('Execute', 'ls /hadoop/hdfs/namenode | wc -l  | grep -q ^0$',)
@@ -87,18 +87,12 @@ class TestNamenode(RMFTestCase):
                               environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'},
                               not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid` >/dev/null 2>&1',
                               )
-    self.assertResourceCalled('Execute', 'hdfs --config /etc/hadoop/conf dfsadmin -fs hdfs://c6405.ambari.apache.org:8020 -safemode leave',
-                              path = ['/usr/bin'],
-                              tries = 10,
-                              try_sleep = 10,
-                              user = 'hdfs',
-                              )
-    self.assertResourceCalled('Execute', "hadoop dfsadmin -fs hdfs://c6405.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
-                              path = ['/usr/bin'],
-                              tries = 40,
-                              user = 'hdfs',
-                              try_sleep = 10,
-                              )
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://c6405.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
+    )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = False,
         only_if=None,
@@ -166,7 +160,7 @@ class TestNamenode(RMFTestCase):
                        config_file = "default.json",
                        hdp_stack_version = self.STACK_VERSION,
                        target = RMFTestCase.TARGET_COMMON_SERVICES,
-                       call_mocks = [(5,"")],
+                       call_mocks = [(0,"")],
     )
     self.assert_configure_default()
     self.assertResourceCalled('Execute', 'ls /hadoop/hdfs/namenode | wc -l  | grep -q ^0$',)
@@ -203,17 +197,11 @@ class TestNamenode(RMFTestCase):
         environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'},
         not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid` >/dev/null 2>&1',
     )
-    self.assertResourceCalled('Execute', 'hdfs --config /etc/hadoop/conf dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode leave',
-        path = ['/usr/bin'],
-        tries = 10,
-        try_sleep = 10,
-        user = 'hdfs',
-    )
-    self.assertResourceCalled('Execute', "hadoop dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
-        path = ['/usr/bin'],
-        tries = 40,
-        user = 'hdfs',
-        try_sleep = 10,
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
     )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = False,
@@ -302,7 +290,7 @@ class TestNamenode(RMFTestCase):
                        config_file = "secured.json",
                        hdp_stack_version = self.STACK_VERSION,
                        target = RMFTestCase.TARGET_COMMON_SERVICES,
-                       call_mocks = [(5,"")],
+                       call_mocks = [(0,"")],
     )
     self.assert_configure_secured()
     self.assertResourceCalled('Execute', 'ls /hadoop/hdfs/namenode | wc -l  | grep -q ^0$',)
@@ -342,17 +330,11 @@ class TestNamenode(RMFTestCase):
     self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs',
                               user='hdfs',
                               )
-    self.assertResourceCalled('Execute', 'hdfs --config /etc/hadoop/conf dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode leave',
-        path = ['/usr/bin'],
-        tries = 10,
-        try_sleep = 10,
-        user = 'hdfs',
-    )
-    self.assertResourceCalled('Execute', "hadoop dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
-        path = ['/usr/bin'],
-        tries = 40,
-        user = 'hdfs',
-        try_sleep = 10,
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://c6401.ambari.apache.org:8020 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
     )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = True,
@@ -448,6 +430,12 @@ class TestNamenode(RMFTestCase):
         environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'},
         not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid` >/dev/null 2>&1',
     )
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://ns1 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
+    )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = False,
         only_if = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export  PATH=/bin:/usr/bin ; hdfs --config /etc/hadoop/conf haadmin -getServiceState nn1 | grep active'",
@@ -533,6 +521,12 @@ class TestNamenode(RMFTestCase):
     self.assertResourceCalled('Execute', '/usr/bin/kinit -kt /etc/security/keytabs/hdfs.headless.keytab hdfs',
         user = 'hdfs',
     )
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://ns1 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
+    )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = True,
         only_if = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export  PATH=/bin:/usr/bin ; hdfs --config /etc/hadoop/conf haadmin -getServiceState nn1 | grep active'",
@@ -627,6 +621,12 @@ class TestNamenode(RMFTestCase):
                               environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'},
                               not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid` >/dev/null 2>&1',
                               )
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://ns1 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
+    )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = False,
         only_if = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export  PATH=/bin:/usr/bin ; hdfs --config /etc/hadoop/conf haadmin -getServiceState nn1 | grep active'",
@@ -677,7 +677,7 @@ class TestNamenode(RMFTestCase):
   # tests namenode start command when NameNode HA is enabled, and
   # the HA cluster is started initially, rather than using the UI Wizard
   # this test verifies the startup of a "standby" namenode
-  @patch.object(shell, "call", new=MagicMock(return_value=(5,"")))
+  @patch.object(shell, "call", new=MagicMock(return_value=(0,"")))
   def test_start_ha_bootstrap_standby_from_blueprint(self):
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/namenode.py",
                        classname = "NameNode",
@@ -718,7 +718,12 @@ class TestNamenode(RMFTestCase):
                               environment = {'HADOOP_LIBEXEC_DIR': '/usr/lib/hadoop/libexec'},
                               not_if = 'ls /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid >/dev/null 2>&1 && ps -p `cat /var/run/hadoop/hdfs/hadoop-hdfs-namenode.pid` >/dev/null 2>&1',
                               )
-
+    self.assertResourceCalled('Execute', "hdfs dfsadmin -fs hdfs://ns1 -safemode get | grep 'Safe mode is OFF'",
+        tries=180,
+        try_sleep=10,
+        user="hdfs",
+        logoutput=True
+    )
     self.assertResourceCalled('HdfsResource', '/tmp',
         security_enabled = False,
         only_if = "ambari-sudo.sh su hdfs -l -s /bin/bash -c 'export  PATH=/bin:/usr/bin ; hdfs --config /etc/hadoop/conf haadmin -getServiceState nn2 | grep active'",

http://git-wip-us.apache.org/repos/asf/ambari/blob/c13c5828/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py b/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
index 6fcd0f1..5800bf1 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/HIVE/test_hive_server.py
@@ -29,16 +29,17 @@ from resource_management.core import shell
 from resource_management.libraries.script.script import Script
 from resource_management.libraries.functions import copy_tarball
 from resource_management.libraries import functions
-
+from resource_management.core.logger import Logger
 
 @patch.object(functions, "get_hdp_version", new = MagicMock(return_value="2.0.0.0-1234"))
 @patch("resource_management.libraries.functions.check_thrift_port_sasl", new=MagicMock())
-#@patch("atlas_plugin_utils.configure_for_plugin", new=MagicMock())
 class TestHiveServer(RMFTestCase):
   COMMON_SERVICES_PACKAGE_DIR = "HIVE/0.12.0.2.0/package"
   STACK_VERSION = "2.0.6"
   UPGRADE_STACK_VERSION = "2.2"
 
+  def setUp(self):
+    Logger.logger = MagicMock()
 
   @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
   @patch.object(Script, "is_hdp_stack_greater_or_equal", new = MagicMock(return_value=False))
@@ -54,9 +55,11 @@ class TestHiveServer(RMFTestCase):
     self.assert_configure_default()
     self.assertNoMoreResources()
 
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
   @patch("socket.socket")
   @patch.object(Script, "is_hdp_stack_greater_or_equal", new = MagicMock(return_value=False))
-  def test_start_default(self, socket_mock):
+  def test_start_default(self, socket_mock, copy_to_hfds_mock):
+    copy_to_hfds_mock.return_value = None
     s = socket_mock.return_value
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_server.py",
                        classname="HiveServer",
@@ -116,8 +119,10 @@ class TestHiveServer(RMFTestCase):
     )
     self.assertNoMoreResources()
 
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
   @patch.object(Script, "is_hdp_stack_greater_or_equal", new = MagicMock(return_value=False))
-  def test_start_default_alt_tmp(self):
+  def test_start_default_alt_tmp(self, copy_to_hfds_mock):
+    copy_to_hfds_mock.return_value = None
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_server.py",
                        classname = "HiveServer",
                        command = "start",
@@ -144,9 +149,10 @@ class TestHiveServer(RMFTestCase):
     )
     self.assertNoMoreResources()
 
-
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
   @patch.object(Script, "is_hdp_stack_greater_or_equal", new = MagicMock(return_value=False))
-  def test_start_default_alt_nn_ha_tmp(self):
+  def test_start_default_alt_nn_ha_tmp(self, copy_to_hfds_mock):
+    copy_to_hfds_mock.return_value = None
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_server.py",
                        classname = "HiveServer",
                        command = "start",
@@ -211,11 +217,13 @@ class TestHiveServer(RMFTestCase):
     self.assert_configure_secured()
     self.assertNoMoreResources()
 
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
   @patch("hive_service.check_fs_root")
   @patch("socket.socket")
   @patch.object(Script, "is_hdp_stack_greater_or_equal", new = MagicMock(return_value=False))
-  def test_start_secured(self, socket_mock, check_fs_root_mock):
+  def test_start_secured(self, socket_mock, check_fs_root_mock, copy_to_hfds_mock):
     s = socket_mock.return_value
+    copy_to_hfds_mock.return_value = None
 
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/hive_server.py",
                        classname = "HiveServer",
@@ -302,6 +310,10 @@ class TestHiveServer(RMFTestCase):
         mode = 0755,
     )
 
+    if self._testMethodName == "test_socket_timeout":
+      # This test will not call any more resources.
+      return
+
     self.assertResourceCalled('HdfsResource', '/apps/hive/warehouse',
         security_enabled = False,
         hadoop_bin_dir = '/usr/bin',
@@ -630,10 +642,9 @@ class TestHiveServer(RMFTestCase):
                               cd_access='a',
     )
 
-  @patch("hive_service.check_fs_root")
   @patch("time.time")
   @patch("socket.socket")
-  def test_socket_timeout(self, socket_mock, time_mock, check_fs_root_mock):
+  def test_socket_timeout(self, socket_mock, time_mock):
     s = socket_mock.return_value
     s.connect = MagicMock()    
     s.connect.side_effect = socket.error("")

http://git-wip-us.apache.org/repos/asf/ambari/blob/c13c5828/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py b/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py
index 8e91481..db83824 100644
--- a/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py
+++ b/ambari-server/src/test/python/stacks/2.2/SPARK/test_job_history_server.py
@@ -26,7 +26,9 @@ class TestJobHistoryServer(RMFTestCase):
   COMMON_SERVICES_PACKAGE_DIR = "SPARK/1.2.0.2.2/package"
   STACK_VERSION = "2.2"
 
-  def test_configure_default(self):
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
+  def test_configure_default(self, copy_to_hdfs_mock):
+    copy_to_hdfs_mock = True
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/job_history_server.py",
                    classname = "JobHistoryServer",
                    command = "configure",
@@ -36,8 +38,10 @@ class TestJobHistoryServer(RMFTestCase):
     )
     self.assert_configure_default()
     self.assertNoMoreResources()
-    
-  def test_start_default(self):
+
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
+  def test_start_default(self, copy_to_hdfs_mock):
+    copy_to_hdfs_mock.return_value = True
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/job_history_server.py",
                    classname = "JobHistoryServer",
                    command = "start",
@@ -46,6 +50,18 @@ class TestJobHistoryServer(RMFTestCase):
                    target = RMFTestCase.TARGET_COMMON_SERVICES
     )
     self.assert_configure_default()
+    self.assertResourceCalled('HdfsResource', None,
+        security_enabled = False,
+        hadoop_bin_dir = '/usr/hdp/current/hadoop-client/bin',
+        keytab = UnknownConfigurationMock(),
+        default_fs = 'hdfs://c6401.ambari.apache.org:8020',
+        hdfs_site = {u'a': u'b'},
+        kinit_path_local = '/usr/bin/kinit',
+        principal_name = UnknownConfigurationMock(),
+        user = 'hdfs',
+        action = ['execute'],
+        hadoop_conf_dir = '/usr/hdp/current/hadoop-client/conf',
+    )
     self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/start-history-server.sh',
         environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'},
         not_if = 'ls /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid >/dev/null 2>&1 && ps -p `cat /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid` >/dev/null 2>&1',
@@ -81,7 +97,9 @@ class TestJobHistoryServer(RMFTestCase):
     self.assert_configure_secured()
     self.assertNoMoreResources()
 
-  def test_start_secured(self):
+  @patch("resource_management.libraries.functions.copy_tarball.copy_to_hdfs")
+  def test_start_secured(self, copy_to_hdfs_mock):
+    copy_to_hdfs_mock.return_value = True
     self.executeScript(self.COMMON_SERVICES_PACKAGE_DIR + "/scripts/job_history_server.py",
                    classname = "JobHistoryServer",
                    command = "start",
@@ -94,6 +112,19 @@ class TestJobHistoryServer(RMFTestCase):
         user = 'spark',
     )
 
+    self.assertResourceCalled('HdfsResource', None,
+        action=['execute'],
+        default_fs= UnknownConfigurationMock(),
+        hadoop_bin_dir='/usr/hdp/current/hadoop-client/bin',
+        hadoop_conf_dir='/usr/hdp/current/hadoop-client/conf',
+        hdfs_site=UnknownConfigurationMock(),
+        keytab=UnknownConfigurationMock(),
+        kinit_path_local='/usr/bin/kinit',
+        principal_name=UnknownConfigurationMock(),
+        security_enabled=True,
+        user=UnknownConfigurationMock()
+    )
+
     self.assertResourceCalled('Execute', '/usr/hdp/current/spark-client/sbin/start-history-server.sh',
         environment = {'JAVA_HOME': u'/usr/jdk64/jdk1.7.0_45'},
         not_if = 'ls /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid >/dev/null 2>&1 && ps -p `cat /var/run/spark/spark-spark-org.apache.spark.deploy.history.HistoryServer-1.pid` >/dev/null 2>&1',