You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2016/03/08 21:54:02 UTC

ambari git commit: AMBARI-15324 - Kerberos Tickets Expire Too Frequently For Alerts (jonathanhurley)

Repository: ambari
Updated Branches:
  refs/heads/trunk 8615cac3a -> 2efe8945c


AMBARI-15324 - Kerberos Tickets Expire Too Frequently For Alerts (jonathanhurley)


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

Branch: refs/heads/trunk
Commit: 2efe8945c152fa5d4bdc51bf1828ca0ade4a004e
Parents: 8615cac
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Mon Mar 7 17:36:13 2016 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Tue Mar 8 15:53:52 2016 -0500

----------------------------------------------------------------------
 ambari-agent/conf/unix/ambari-agent.ini         |  1 +
 ambari-agent/conf/windows/ambari-agent.ini      |  1 +
 .../ambari_agent/AlertSchedulerHandler.py       | 13 +--
 .../src/main/python/ambari_agent/Controller.py  |  7 +-
 .../python/ambari_agent/alerts/base_alert.py    |  7 +-
 .../python/ambari_agent/alerts/metric_alert.py  | 11 ++-
 .../python/ambari_agent/alerts/port_alert.py    |  4 +-
 .../ambari_agent/alerts/recovery_alert.py       |  4 +-
 .../python/ambari_agent/alerts/script_alert.py  | 13 ++-
 .../python/ambari_agent/alerts/web_alert.py     | 11 +--
 .../ambari_agent/TestAlertSchedulerHandler.py   | 28 ++++---
 .../src/test/python/ambari_agent/TestAlerts.py  | 83 ++++++++++---------
 .../test/python/ambari_agent/TestBaseAlert.py   | 20 +++--
 .../test/python/ambari_agent/TestMetricAlert.py | 11 ++-
 .../test/python/ambari_agent/TestPortAlert.py   | 20 +++--
 .../test/python/ambari_agent/TestScriptAlert.py |  7 +-
 .../libraries/functions/curl_krb_request.py     | 86 +++++++++++++++++---
 .../package/alerts/alert_checkpoint_time.py     | 10 ++-
 .../package/alerts/alert_ha_namenode_health.py  |  7 +-
 .../package/alerts/alert_metrics_deviation.py   | 16 +++-
 .../package/alerts/alert_upgrade_finalized.py   |  9 +-
 .../package/alerts/alert_webhcat_server.py      | 18 ++--
 .../package/alerts/alert_nodemanager_health.py  |  6 +-
 .../alerts/alert_nodemanagers_summary.py        | 10 ++-
 24 files changed, 270 insertions(+), 133 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/conf/unix/ambari-agent.ini
----------------------------------------------------------------------
diff --git a/ambari-agent/conf/unix/ambari-agent.ini b/ambari-agent/conf/unix/ambari-agent.ini
index 05e898a..4ec16d6 100644
--- a/ambari-agent/conf/unix/ambari-agent.ini
+++ b/ambari-agent/conf/unix/ambari-agent.ini
@@ -32,6 +32,7 @@ tolerate_download_failures=true
 run_as_user=root
 parallel_execution=0
 alert_grace_period=5
+alert_kinit_timeout=14400000
 system_resource_overrides=/etc/resource_overrides
 
 [security]

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/conf/windows/ambari-agent.ini
----------------------------------------------------------------------
diff --git a/ambari-agent/conf/windows/ambari-agent.ini b/ambari-agent/conf/windows/ambari-agent.ini
index e490f7c..df88be6 100644
--- a/ambari-agent/conf/windows/ambari-agent.ini
+++ b/ambari-agent/conf/windows/ambari-agent.ini
@@ -30,6 +30,7 @@ cache_dir=cache
 tolerate_download_failures=true
 parallel_execution=0
 alert_grace_period=5
+alert_kinit_timeout=14400000
 system_resource_overrides=\\etc\\resource_overrides
 
 [security]

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py b/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
index eb9945b..b84832d 100644
--- a/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
+++ b/ambari-agent/src/main/python/ambari_agent/AlertSchedulerHandler.py
@@ -35,6 +35,7 @@ from alerts.script_alert import ScriptAlert
 from alerts.web_alert import WebAlert
 from alerts.recovery_alert import RecoveryAlert
 from ambari_agent.ExitHelper import ExitHelper
+
 logger = logging.getLogger(__name__)
 
 class AlertSchedulerHandler():
@@ -46,8 +47,7 @@ class AlertSchedulerHandler():
   TYPE_RECOVERY = 'RECOVERY'
 
   def __init__(self, cachedir, stacks_dir, common_services_dir, host_scripts_dir,
-      alert_grace_period, cluster_configuration, config, recovery_manager,
-      in_minutes=True):
+      cluster_configuration, config, recovery_manager, in_minutes=True):
 
     self.cachedir = cachedir
     self.stacks_dir = stacks_dir
@@ -58,7 +58,10 @@ class AlertSchedulerHandler():
 
     # a mapping between a cluster name and a unique hash for all definitions
     self._cluster_hashes = {}
-    
+
+    # the amount of time, in seconds, that an alert can run after it's scheduled time
+    alert_grace_period = int(config.get('agent', 'alert_grace_period', 5))
+
     if not os.path.exists(cachedir):
       try:
         os.makedirs(cachedir)
@@ -297,7 +300,7 @@ class AlertSchedulerHandler():
       if source_type == AlertSchedulerHandler.TYPE_METRIC:
         alert = MetricAlert(json_definition, source, self.config)
       elif source_type == AlertSchedulerHandler.TYPE_PORT:
-        alert = PortAlert(json_definition, source)
+        alert = PortAlert(json_definition, source, self.config)
       elif source_type == AlertSchedulerHandler.TYPE_SCRIPT:
         source['stacks_directory'] = self.stacks_dir
         source['common_services_directory'] = self.common_services_dir
@@ -306,7 +309,7 @@ class AlertSchedulerHandler():
       elif source_type == AlertSchedulerHandler.TYPE_WEB:
         alert = WebAlert(json_definition, source, self.config)
       elif source_type == AlertSchedulerHandler.TYPE_RECOVERY:
-        alert = RecoveryAlert(json_definition, source, self.recovery_manger)
+        alert = RecoveryAlert(json_definition, source, self.config, self.recovery_manger)
 
       if alert is not None:
         alert.set_cluster(clusterName, hostName)

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/Controller.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/Controller.py b/ambari-agent/src/main/python/ambari_agent/Controller.py
index eb2c363..c1c16ac 100644
--- a/ambari-agent/src/main/python/ambari_agent/Controller.py
+++ b/ambari-agent/src/main/python/ambari_agent/Controller.py
@@ -103,12 +103,9 @@ class Controller(threading.Thread):
 
     self.move_data_dir_mount_file()
 
-    self.alert_grace_period = int(config.get('agent', 'alert_grace_period', 5))
-
-    self.alert_scheduler_handler = AlertSchedulerHandler(alerts_cache_dir, 
+    self.alert_scheduler_handler = AlertSchedulerHandler(alerts_cache_dir,
       stacks_cache_dir, common_services_cache_dir, host_scripts_cache_dir,
-      self.alert_grace_period, self.cluster_configuration, config,
-      self.recovery_manager)
+      self.cluster_configuration, config, self.recovery_manager)
 
     self.alert_scheduler_handler.start()
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
index fd6b03c..92db07c 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/base_alert.py
@@ -29,6 +29,9 @@ logger = logging.getLogger()
 AlertUri = namedtuple('AlertUri', 'uri is_ssl_enabled')
 
 class BaseAlert(object):
+  # will force a kinit even if klist says there are valid tickets (4 hour default)
+  _DEFAULT_KINIT_TIMEOUT = 14400000
+
   RESULT_OK = "OK"
   RESULT_WARNING = "WARNING"
   RESULT_CRITICAL = "CRITICAL"
@@ -38,12 +41,12 @@ class BaseAlert(object):
   HA_NAMESERVICE_PARAM = "{{ha-nameservice}}"
   HA_ALIAS_PARAM = "{{alias}}"
 
-  def __init__(self, alert_meta, alert_source_meta):
+  def __init__(self, alert_meta, alert_source_meta, config):
     self.alert_meta = alert_meta
     self.alert_source_meta = alert_source_meta
     self.cluster_name = ''
     self.host_name = ''
-    
+    self.config = config
     
   def interval(self):
     """ gets the defined interval this check should run """

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py
index b2f4e33..d177bd4 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/metric_alert.py
@@ -42,7 +42,7 @@ DEFAULT_CONNECTION_TIMEOUT = 5.0
 class MetricAlert(BaseAlert):
   
   def __init__(self, alert_meta, alert_source_meta, config):
-    super(MetricAlert, self).__init__(alert_meta, alert_source_meta)
+    super(MetricAlert, self).__init__(alert_meta, alert_source_meta, config)
 
     connection_timeout = DEFAULT_CONNECTION_TIMEOUT
 
@@ -63,7 +63,9 @@ class MetricAlert(BaseAlert):
     self.connection_timeout = float(connection_timeout)
     self.curl_connection_timeout = int(connection_timeout)
 
-    self.config = config
+    # will force a kinit even if klist says there are valid tickets (4 hour default)
+    self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT))
+
 
   def _collect(self):
     if self.metric_info is None:
@@ -209,7 +211,7 @@ class MetricAlert(BaseAlert):
 
           response, error_msg, time_millis = curl_krb_request(tmp_dir, kerberos_keytab, kerberos_principal, url,
             "metric_alert", kerberos_executable_search_paths, False, self.get_name(), smokeuser,
-            connection_timeout=self.curl_connection_timeout)
+            connection_timeout=self.curl_connection_timeout, kinit_timer_ms = self.kinit_timeout)
 
           content = response
         else:
@@ -254,7 +256,8 @@ class MetricAlert(BaseAlert):
       if not json_is_valid and security_enabled and kerberos_principal is not None and kerberos_keytab is not None:
         http_response_code, error_msg, time_millis = curl_krb_request(tmp_dir, kerberos_keytab,
           kerberos_principal, url, "metric_alert", kerberos_executable_search_paths, True,
-          self.get_name(), smokeuser, connection_timeout=self.curl_connection_timeout)
+          self.get_name(), smokeuser, connection_timeout=self.curl_connection_timeout,
+          kinit_timer_ms = self.kinit_timeout)
 
     return (value_list, http_response_code)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py
index 92d28ad..1918327 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/port_alert.py
@@ -33,8 +33,8 @@ DEFAULT_CRITICAL_TIMEOUT = 5.0
 
 class PortAlert(BaseAlert):
 
-  def __init__(self, alert_meta, alert_source_meta):
-    super(PortAlert, self).__init__(alert_meta, alert_source_meta)
+  def __init__(self, alert_meta, alert_source_meta, config):
+    super(PortAlert, self).__init__(alert_meta, alert_source_meta, config)
 
     self.uri = None
     self.default_port = None

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py
index 760a737..3092a39 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/recovery_alert.py
@@ -30,8 +30,8 @@ DEFAULT_CRITICAL_RECOVERIES_COUNT = 4
 UNKNOWN_COMPONENT = 'UNKNOWN_COMPONENT'
 class RecoveryAlert(BaseAlert):
 
-  def __init__(self, alert_meta, alert_source_meta, recovery_manager):
-    super(RecoveryAlert, self).__init__(alert_meta, alert_source_meta)
+  def __init__(self, alert_meta, alert_source_meta, config, recovery_manager):
+    super(RecoveryAlert, self).__init__(alert_meta, alert_source_meta, config)
 
     self.recovery_manager = recovery_manager
     self.warning_count = DEFAULT_WARNING_RECOVERIES_COUNT

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py
index e8d0125..8dfa73e 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/script_alert.py
@@ -24,13 +24,15 @@ import os
 import re
 from alerts.base_alert import BaseAlert
 from resource_management.core.environment import Environment
-from resource_management.core.logger import Logger
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
 from ambari_agent import Constants
 
 logger = logging.getLogger("ambari_alerts")
 
 class ScriptAlert(BaseAlert):
+
   def __init__(self, alert_meta, alert_source_meta, config):
+
     """ ScriptAlert reporting structure is output from the script itself """
 
     alert_source_meta['reporting'] = {
@@ -40,9 +42,8 @@ class ScriptAlert(BaseAlert):
       'unknown': { 'text': '{0}' }
     }
 
-    super(ScriptAlert, self).__init__(alert_meta, alert_source_meta)
+    super(ScriptAlert, self).__init__(alert_meta, alert_source_meta, config)
 
-    self.config = config
     self.path = None
     self.stacks_dir = None
     self.common_services_dir = None
@@ -50,6 +51,9 @@ class ScriptAlert(BaseAlert):
     self.path_to_script = None
     self.parameters = {}
 
+    # will force a kinit even if klist says there are valid tickets (4 hour default)
+    self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT))
+
     if 'path' in alert_source_meta:
       self.path = alert_source_meta['path']
 
@@ -75,6 +79,9 @@ class ScriptAlert(BaseAlert):
         parameter_value = parameter['value']
         self.parameters[parameter_name] = parameter_value
 
+    # pass in some basic parameters to the scripts
+    self.parameters[KERBEROS_KINIT_TIMER_PARAMETER] = self.kinit_timeout
+
   def _collect(self):
     cmd_module = self._load_source()
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py b/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py
index 502526c..3f201c8 100644
--- a/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py
+++ b/ambari-agent/src/main/python/ambari_agent/alerts/web_alert.py
@@ -20,13 +20,13 @@ limitations under the License.
 
 import logging
 import time
-import os
 import urllib2
 import ssl
+
 from functools import wraps
 from urllib2 import HTTPError
 
-from  tempfile import gettempdir
+from tempfile import gettempdir
 from alerts.base_alert import BaseAlert
 from collections import namedtuple
 from resource_management.libraries.functions.get_port_from_url import get_port_from_url
@@ -66,7 +66,7 @@ ssl.wrap_socket = sslwrap(ssl.wrap_socket)
 class WebAlert(BaseAlert):
 
   def __init__(self, alert_meta, alert_source_meta, config):
-    super(WebAlert, self).__init__(alert_meta, alert_source_meta)
+    super(WebAlert, self).__init__(alert_meta, alert_source_meta, config)
 
     connection_timeout = DEFAULT_CONNECTION_TIMEOUT
 
@@ -83,7 +83,8 @@ class WebAlert(BaseAlert):
     self.connection_timeout = float(connection_timeout)
     self.curl_connection_timeout = int(connection_timeout)
 
-    self.config = config
+    # will force a kinit even if klist says there are valid tickets (4 hour default)
+    self.kinit_timeout = long(config.get('agent', 'alert_kinit_timeout', BaseAlert._DEFAULT_KINIT_TIMEOUT))
 
 
   def _collect(self):
@@ -194,7 +195,7 @@ class WebAlert(BaseAlert):
 
         response_code, error_msg, time_millis = curl_krb_request(tmp_dir, kerberos_keytab, kerberos_principal, url,
           "web_alert", kerberos_executable_search_paths, True, self.get_name(), smokeuser,
-          connection_timeout=self.curl_connection_timeout)
+          connection_timeout=self.curl_connection_timeout, kinit_timer_ms = self.kinit_timeout)
       else:
         # kerberos is not involved; use urllib2
         response_code, time_millis, error_msg = self._make_web_request_urllib(url)

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py b/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py
index 9fd426f..f4e7ba1 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestAlertSchedulerHandler.py
@@ -24,9 +24,10 @@ import os
 from ambari_agent.AlertSchedulerHandler import AlertSchedulerHandler
 from ambari_agent.alerts.metric_alert import MetricAlert
 from ambari_agent.alerts.port_alert import PortAlert
-from ambari_agent.alerts.script_alert import ScriptAlert
 from ambari_agent.alerts.web_alert import WebAlert
 
+from AmbariConfig import AmbariConfig
+
 from mock.mock import patch, Mock, MagicMock
 from unittest import TestCase
 
@@ -34,6 +35,9 @@ TEST_PATH = os.path.join('ambari_agent', 'dummy_files')
 
 class TestAlertSchedulerHandler(TestCase):
 
+  def setUp(self):
+    self.config = AmbariConfig()
+
   def test_load_definitions(self):
     scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None)
 
@@ -42,7 +46,7 @@ class TestAlertSchedulerHandler(TestCase):
     self.assertEquals(len(definitions), 1)
 
   def test_json_to_callable_metric(self):
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     json_definition = {
       'source': {
         'type': 'METRIC'
@@ -63,7 +67,7 @@ class TestAlertSchedulerHandler(TestCase):
       }
     }
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     callable_result = scheduler._AlertSchedulerHandler__json_to_callable('cluster', 'host', copy.deepcopy(json_definition))
 
     self.assertTrue(callable_result is not None)
@@ -79,7 +83,7 @@ class TestAlertSchedulerHandler(TestCase):
       }
     }
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     callable_result = scheduler._AlertSchedulerHandler__json_to_callable('cluster', 'host', copy.deepcopy(json_definition))
 
     self.assertTrue(callable_result is not None)
@@ -94,7 +98,7 @@ class TestAlertSchedulerHandler(TestCase):
       }
     }
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     callable_result = scheduler._AlertSchedulerHandler__json_to_callable('cluster', 'host', copy.deepcopy(json_definition))
 
     self.assertTrue(callable_result is None)
@@ -102,7 +106,7 @@ class TestAlertSchedulerHandler(TestCase):
   def test_execute_alert_noneScheduler(self):
     execution_commands = []
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     scheduler._AlertSchedulerHandler__scheduler = None
     alert_mock = Mock()
     scheduler._AlertSchedulerHandler__json_to_callable = Mock(return_value=alert_mock)
@@ -114,7 +118,7 @@ class TestAlertSchedulerHandler(TestCase):
   def test_execute_alert_noneCommands(self):
     execution_commands = None
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     alert_mock = Mock()
     scheduler._AlertSchedulerHandler__json_to_callable = Mock(return_value=alert_mock)
 
@@ -125,7 +129,7 @@ class TestAlertSchedulerHandler(TestCase):
   def test_execute_alert_emptyCommands(self):
     execution_commands = []
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     alert_mock = Mock()
     scheduler._AlertSchedulerHandler__json_to_callable = Mock(return_value=alert_mock)
 
@@ -144,7 +148,7 @@ class TestAlertSchedulerHandler(TestCase):
       }
     ]
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     alert_mock = MagicMock()
     alert_mock.collect = Mock()
     alert_mock.set_helpers = Mock()
@@ -159,7 +163,7 @@ class TestAlertSchedulerHandler(TestCase):
     self.assertTrue(alert_mock.collect.called)
 
   def test_load_definitions(self):
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     scheduler._AlertSchedulerHandler__config_maps = {
       'cluster': {}
     }
@@ -170,7 +174,7 @@ class TestAlertSchedulerHandler(TestCase):
     self.assertTrue(isinstance(alert_def, PortAlert))
 
   def test_load_definitions_noFile(self):
-    scheduler = AlertSchedulerHandler('wrong_path', 'wrong_path', 'wrong_path', 'wrong_path', 5, None, None, None)
+    scheduler = AlertSchedulerHandler('wrong_path', 'wrong_path', 'wrong_path', 'wrong_path', None, self.config, None)
     scheduler._AlertSchedulerHandler__config_maps = {
       'cluster': {}
     }
@@ -190,7 +194,7 @@ class TestAlertSchedulerHandler(TestCase):
       }
     ]
 
-    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, 5, None, None, None)
+    scheduler = AlertSchedulerHandler(TEST_PATH, TEST_PATH, TEST_PATH, TEST_PATH, None, self.config, None)
     alert_mock = MagicMock()
     alert_mock.interval = Mock(return_value=5)
     alert_mock.collect = Mock()

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestAlerts.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestAlerts.py b/ambari-agent/src/test/python/ambari_agent/TestAlerts.py
index 8344238..bf56703 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestAlerts.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestAlerts.py
@@ -41,11 +41,14 @@ from collections import namedtuple
 from mock.mock import MagicMock, patch
 from unittest import TestCase
 
+from AmbariConfig import AmbariConfig
+
 class TestAlerts(TestCase):
 
   def setUp(self):
     # save original open() method for later use
     self.original_open = open
+    self.config = AmbariConfig()
 
   def tearDown(self):
     sys.stdout == sys.__stdout__
@@ -62,8 +65,8 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
 
     ash = AlertSchedulerHandler(test_file_path, test_stack_path,
-      test_common_services_path, test_host_scripts_path, 5, cluster_configuration,
-      None, None)
+      test_common_services_path, test_host_scripts_path, cluster_configuration,
+      self.config, None)
 
     ash.start()
 
@@ -89,7 +92,7 @@ class TestAlerts(TestCase):
       0,2000,336283100000,
       socket.timeout,336283200000]
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     self.assertEquals(6, alert.interval())
@@ -134,7 +137,7 @@ class TestAlerts(TestCase):
     self.__update_cluster_configuration(cluster_configuration, {})
 
     rm = RecoveryManager(tempfile.mktemp(), True)
-    alert = RecoveryAlert(definition_json, definition_json['source'], rm)
+    alert = RecoveryAlert(definition_json, definition_json['source'], self.config, rm)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     self.assertEquals(1, alert.interval())
@@ -221,7 +224,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6402.ambari.apache.org")
 
@@ -266,7 +269,7 @@ class TestAlerts(TestCase):
 
     cluster_configuration = self.__get_cluster_configuration()
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(AlertCollector(), cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -354,7 +357,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -388,7 +391,7 @@ class TestAlerts(TestCase):
     del definition_json['source']['jmx']['value']
     collector = AlertCollector()
 
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -412,7 +415,7 @@ class TestAlerts(TestCase):
     # indicating that there was no URI and the result is UNKNOWN
     collector = AlertCollector()
     cluster_configuration = self.__get_cluster_configuration()
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -428,7 +431,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -444,7 +447,7 @@ class TestAlerts(TestCase):
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
     collector = AlertCollector()
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -460,7 +463,7 @@ class TestAlerts(TestCase):
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
     collector = AlertCollector()
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -477,7 +480,7 @@ class TestAlerts(TestCase):
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
     collector = AlertCollector()
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -501,7 +504,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -515,7 +518,7 @@ class TestAlerts(TestCase):
     # run the alert and check HTTP 500
     wa_make_web_request_mock.return_value = WebResponse(500,1.234,"Internal Server Error")
     collector = AlertCollector()
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -530,7 +533,7 @@ class TestAlerts(TestCase):
     wa_make_web_request_mock.return_value = WebResponse(0,0,'error message')
      
     collector = AlertCollector()
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     alert.collect()
@@ -551,7 +554,7 @@ class TestAlerts(TestCase):
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
     collector = AlertCollector()
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -573,8 +576,8 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
 
     ash = AlertSchedulerHandler(test_file_path, test_stack_path,
-      test_common_services_path, test_host_scripts_path, 5, cluster_configuration,
-      None, None)
+      test_common_services_path, test_host_scripts_path, cluster_configuration,
+      self.config, None)
 
     ash.start()
 
@@ -594,7 +597,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
     self.assertEquals(6, alert.interval())
@@ -620,8 +623,8 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
 
     ash = AlertSchedulerHandler(test_file_path, test_stack_path,
-      test_common_services_path, test_host_scripts_path, 5, cluster_configuration,
-      None, None)
+      test_common_services_path, test_host_scripts_path, cluster_configuration,
+      self.config, None)
 
     ash.start()
 
@@ -629,20 +632,20 @@ class TestAlerts(TestCase):
 
     definition_json = self._get_port_alert_definition()
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     ash.schedule_definition(alert)
 
     self.assertEquals(2, ash.get_job_count())
 
     definition_json['enabled'] = False
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     ash.schedule_definition(alert)
 
     # verify disabled alert not scheduled
     self.assertEquals(2, ash.get_job_count())
 
     definition_json['enabled'] = True
-    pa = PortAlert(definition_json, definition_json['source'])
+    pa = PortAlert(definition_json, definition_json['source'], self.config)
     ash.schedule_definition(pa)
 
     # verify enabled alert was scheduled
@@ -656,8 +659,8 @@ class TestAlerts(TestCase):
 
     cluster_configuration = self.__get_cluster_configuration()
     ash = AlertSchedulerHandler(test_file_path, test_stack_path,
-      test_common_services_path, test_host_scripts_path, 5, cluster_configuration,
-      None, None)
+      test_common_services_path, test_host_scripts_path, cluster_configuration,
+      self.config, None)
 
     ash.start()
 
@@ -691,7 +694,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = ScriptAlert(definition_json, definition_json['source'], None)
+    alert = ScriptAlert(definition_json, definition_json['source'], self.config)
 
     # instruct the test alert script to be skipped
     alert.set_helpers(collector, cluster_configuration )
@@ -709,32 +712,32 @@ class TestAlerts(TestCase):
   def test_default_reporting_text(self):
     definition_json = self._get_script_alert_definition()
 
-    alert = ScriptAlert(definition_json, definition_json['source'], None)
+    alert = ScriptAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), '{0}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{0}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}')
 
     definition_json['source']['type'] = 'PORT'
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'TCP OK - {0:.4f} response on port {1}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), 'TCP OK - {0:.4f} response on port {1}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed: {0} to {1}:{2}')
 
     definition_json['source']['type'] = 'WEB'
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'HTTP {0} response in {2:.4f} seconds')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), 'HTTP {0} response in {2:.4f} seconds')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), 'Connection failed to {1}')
 
     definition_json['source']['type'] = 'METRIC'
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), '{0}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{0}')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{0}')
 
     rm = RecoveryManager(tempfile.mktemp())
     definition_json['source']['type'] = 'RECOVERY'
-    alert = RecoveryAlert(definition_json, definition_json['source'], rm)
+    alert = RecoveryAlert(definition_json, definition_json['source'], self.config, rm)
     self.assertEquals(alert._get_reporting_text(alert.RESULT_OK), 'No recovery operations executed for {2}{0}.')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_WARNING), '{1} recovery operations executed for {2}{0}.')
     self.assertEquals(alert._get_reporting_text(alert.RESULT_CRITICAL), '{1} recovery operations executed for {2}{0}.')
@@ -973,7 +976,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -1065,13 +1068,13 @@ class TestAlerts(TestCase):
   def test_uri_timeout(self):
     # the web alert will have a timeout value
     definition_json = self._get_web_alert_definition()
-    alert = WebAlert(definition_json, definition_json['source'], None)
+    alert = WebAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(5.678, alert.connection_timeout)
     self.assertEquals(5, alert.curl_connection_timeout)
 
     # the metric definition will not and should default to 5.0
     definition_json = self._get_metric_alert_definition()
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     self.assertEquals(5.0, alert.connection_timeout)
 
 
@@ -1129,7 +1132,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = MetricAlert(definition_json, definition_json['source'], None)
+    alert = MetricAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6401.ambari.apache.org")
 
@@ -1162,7 +1165,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6402.ambari.apache.org")
 
@@ -1200,7 +1203,7 @@ class TestAlerts(TestCase):
     cluster_configuration = self.__get_cluster_configuration()
     self.__update_cluster_configuration(cluster_configuration, configuration)
 
-    alert = PortAlert(definition_json, definition_json['source'])
+    alert = PortAlert(definition_json, definition_json['source'], self.config)
     alert.set_helpers(collector, cluster_configuration)
     alert.set_cluster("c1", "c6402.ambari.apache.org")
 
@@ -1523,7 +1526,7 @@ class MockAlert(BaseAlert):
   Mock class for testing
   """
   def __init__(self):
-    super(MockAlert, self).__init__(None, None)
+    super(MockAlert, self).__init__(None, None, AmbariConfig())
 
   def get_name(self):
     return "mock_alert"

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py b/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py
index e67c894..62877f2 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestBaseAlert.py
@@ -20,16 +20,18 @@ limitations under the License.
 
 from unittest import TestCase
 from alerts.base_alert import BaseAlert
-
-alert = BaseAlert({}, {})
+from AmbariConfig import AmbariConfig
 
 class TestBaseAlert(TestCase):
 
+  def setUp(self):
+    self.config = AmbariConfig()
+
   def test_interval_noData(self):
     alert_meta = {}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     interval = alert.interval()
     self.assertEquals(interval, 1)
 
@@ -37,7 +39,7 @@ class TestBaseAlert(TestCase):
     alert_meta = {'interval': 0}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     interval = alert.interval()
     self.assertEquals(interval, 1)
 
@@ -45,7 +47,7 @@ class TestBaseAlert(TestCase):
     alert_meta = {'interval': 5}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     interval = alert.interval()
     self.assertEquals(interval, 5)
 
@@ -53,7 +55,7 @@ class TestBaseAlert(TestCase):
     alert_meta = {'enabled': 'true'}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     enabled = alert.is_enabled()
     self.assertEquals(enabled, 'true')
 
@@ -61,7 +63,7 @@ class TestBaseAlert(TestCase):
     alert_meta = {'name': 'ambari'}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     name = alert.get_name()
     self.assertEquals(name, 'ambari')
 
@@ -69,7 +71,7 @@ class TestBaseAlert(TestCase):
     alert_meta = {'uuid': '123'}
     alert_source_meta = {}
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     uuid = alert.get_uuid()
     self.assertEquals(uuid, '123')
 
@@ -79,7 +81,7 @@ class TestBaseAlert(TestCase):
     cluster = 'cluster'
     host = 'host'
 
-    alert = BaseAlert(alert_meta, alert_source_meta)
+    alert = BaseAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
     self.assertEquals(alert.cluster_name, cluster)
     self.assertEquals(alert.host_name, host)

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py b/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py
index 23e9f13..9dfb8e9 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestMetricAlert.py
@@ -21,10 +21,13 @@ limitations under the License.
 from unittest import TestCase
 from alerts.metric_alert import MetricAlert
 from mock.mock import Mock, MagicMock, patch
-import os
+from AmbariConfig import AmbariConfig
 
 class TestMetricAlert(TestCase):
 
+  def setUp(self):
+    self.config = AmbariConfig()
+
   @patch("urllib2.urlopen")
   def test_collect(self, urllib):
     alert_meta = {
@@ -81,7 +84,7 @@ class TestMetricAlert(TestCase):
     mock_collector = MagicMock()
     mock_collector.put = Mock(side_effect=collector_side_effect)
 
-    alert = MetricAlert(alert_meta, alert_source_meta)
+    alert = MetricAlert(alert_meta, alert_source_meta, self.config)
     alert.set_helpers(mock_collector, {'foo-site/bar': 12, 'foo-site/baz': 'asd'})
     alert.set_cluster(cluster, host)
 
@@ -143,7 +146,7 @@ class TestMetricAlert(TestCase):
     mock_collector = MagicMock()
     mock_collector.put = Mock(side_effect=collector_side_effect)
 
-    alert = MetricAlert(alert_meta, alert_source_meta)
+    alert = MetricAlert(alert_meta, alert_source_meta, self.config)
     alert.set_helpers(mock_collector, {'foo-site/bar': 12, 'foo-site/baz': 'asd'})
     alert.set_cluster(cluster, host)
 
@@ -204,7 +207,7 @@ class TestMetricAlert(TestCase):
     mock_collector = MagicMock()
     mock_collector.put = Mock(side_effect=collector_side_effect)
 
-    alert = MetricAlert(alert_meta, alert_source_meta, None)
+    alert = MetricAlert(alert_meta, alert_source_meta, self.config)
     alert.set_helpers(mock_collector, {'foo-site/bar': 12, 'foo-site/baz': 'asd'})
     alert.set_cluster(cluster, host)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py b/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py
index 195cc63..dffa56c 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestPortAlert.py
@@ -21,9 +21,13 @@ limitations under the License.
 from unittest import TestCase
 from alerts.port_alert import PortAlert
 from mock.mock import Mock, MagicMock, patch
+from AmbariConfig import AmbariConfig
 
 class TestPortAlert(TestCase):
 
+  def setUp(self):
+    self.config = AmbariConfig()
+
   @patch("socket.socket")
   @patch("time.time")
   def test_collect_defaultPort(self, time, socket):
@@ -44,7 +48,7 @@ class TestPortAlert(TestCase):
     expected_state = 'OK'
     expected_text = 'TCP OK - 0.2010 response on port 80'
     time.side_effect = [123, 324, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -84,7 +88,7 @@ class TestPortAlert(TestCase):
     expected_state = 'WARNING'
     expected_text = 'TCP OK - 3.1170 response on port 8080'
     time.side_effect = [123, 3240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -124,7 +128,7 @@ class TestPortAlert(TestCase):
     expected_state = 'CRITICAL'
     expected_text = 'Connection failed: Socket Timeout to 192.168.0.1:8080'
     time.side_effect = [123, 5240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -163,7 +167,7 @@ class TestPortAlert(TestCase):
     expected_state = 'CRITICAL'
     expected_text = 'Connection failed: Socket Timeout to host1:80'
     time.side_effect = [123, 5240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -204,7 +208,7 @@ class TestPortAlert(TestCase):
     expected_text = 'Connection failed: exception message to 192.168.0.1:8080'
     time.side_effect = [123, 345, 567]
     socket.side_effect = Exception('exception message')
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -249,7 +253,7 @@ class TestPortAlert(TestCase):
     expected_state = 'OK'
     expected_text = 'TCP OK - 3.1170 response on port 8080'
     time.side_effect = [123, 3240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -294,7 +298,7 @@ class TestPortAlert(TestCase):
     expected_state = 'CRITICAL'
     expected_text = 'Connection failed: Socket Timeout to 192.168.0.1:8080'
     time.side_effect = [123, 3240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):
@@ -339,7 +343,7 @@ class TestPortAlert(TestCase):
     expected_state = 'CRITICAL'
     expected_text = 'Connection failed: Socket Timeout to 192.168.0.1:8080'
     time.side_effect = [120, 123, 5240, 567]
-    alert = PortAlert(alert_meta, alert_source_meta)
+    alert = PortAlert(alert_meta, alert_source_meta, self.config)
     alert.set_cluster(cluster, host)
 
     def collector_side_effect(clus, data):

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py b/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py
index 46c7651..a56258b 100644
--- a/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py
+++ b/ambari-agent/src/test/python/ambari_agent/TestScriptAlert.py
@@ -23,10 +23,15 @@ from alerts.script_alert import ScriptAlert
 from mock.mock import Mock, MagicMock, patch
 import os
 
+from AmbariConfig import AmbariConfig
+
 DUMMY_PATH = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'dummy_files')
 
 class TestScriptAlert(TestCase):
 
+  def setUp(self):
+    self.config = AmbariConfig()
+
   def test_collect(self):
     alert_meta = {
       'name': 'alert1',
@@ -59,7 +64,7 @@ class TestScriptAlert(TestCase):
     mock_collector = MagicMock()
     mock_collector.put = Mock(side_effect=collector_side_effect)
 
-    alert = ScriptAlert(alert_meta, alert_source_meta, {})
+    alert = ScriptAlert(alert_meta, alert_source_meta, self.config)
     alert.set_helpers(mock_collector, {'foo-site/bar': 12, 'foo-site/baz': 'asd'})
     alert.set_cluster(cluster, host)
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py b/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py
index 1ccc45f..21cdd09 100644
--- a/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/curl_krb_request.py
@@ -24,7 +24,6 @@ __all__ = ["curl_krb_request"]
 import logging
 import os
 import time
-import threading
 
 from resource_management.core import global_lock
 from resource_management.core import shell
@@ -49,12 +48,52 @@ MAX_TIMEOUT_DEFAULT = CONNECTION_TIMEOUT_DEFAULT + 2
 
 logger = logging.getLogger()
 
+# a dictionary of the last time that a kinit was performed for a specific cache
+# dicionaries are inherently thread-safe in Python via the Global Interpreer Lock
+# https://docs.python.org/2/glossary.html#term-global-interpreter-lock
+_KINIT_CACHE_TIMES = {}
+
+# the default time in between forced kinit calls (4 hours)
+DEFAULT_KERBEROS_KINIT_TIMER_MS = 14400000
+
+# a parameter which can be used to pass around the above timout value
+KERBEROS_KINIT_TIMER_PARAMETER = "kerberos.kinit.timer"
+
 def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix,
-    krb_exec_search_paths, return_only_http_code, alert_name, user,
-    connection_timeout = CONNECTION_TIMEOUT_DEFAULT):
+    krb_exec_search_paths, return_only_http_code, caller_label, user,
+    connection_timeout = CONNECTION_TIMEOUT_DEFAULT,
+    kinit_timer_ms=DEFAULT_KERBEROS_KINIT_TIMER_MS):
+  """
+  Makes a curl request using the kerberos credentials stored in a calculated cache file. The
+  cache file is created by combining the supplied principal, keytab, user, and request name into
+  a unique hash.
+
+  This function will use the klist command to determine if the cache is expired and will perform
+  a kinit if necessary. Additionally, it has an internal timer to force a kinit after a
+  configurable amount of time. This is to prevent boundary issues where requests hit the edge
+  of a ticket's lifetime.
+
+  :param tmp_dir: the directory to use for storing the local kerberos cache for this request.
+  :param keytab: the location of the keytab to use when performing a kinit
+  :param principal: the principal to use when performing a kinit
+  :param url: the URL to request
+  :param cache_file_prefix: an identifier used to build the unique cache name for this request.
+                            This ensures that multiple requests can use the same cache.
+  :param krb_exec_search_paths: the search path to use for invoking kerberos binaries
+  :param return_only_http_code: True to return only the HTTP code, False to return GET content
+  :param caller_label: an identifier to give context into the caller of this module (used for logging)
+  :param user: the user to invoke the curl command as
+  :param connection_timeout: if specified, a connection timeout for curl (default 10 seconds)
+  :param kinit_timer_ms: if specified, the time (in ms), before forcing a kinit even if the
+                         klist cache is still valid.
+  :return:
+  """
 
   import uuid
 
+  # start off false
+  is_kinit_required = False
+
   # Create the kerberos credentials cache (ccache) file and set it in the environment to use
   # when executing curl. Use the md5 hash of the combination of the principal and keytab file
   # to generate a (relatively) unique cache filename so that we can use it as needed. Scope
@@ -75,19 +114,41 @@ def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix,
     else:
       klist_path_local = get_klist_path()
 
-    if shell.call("{0} -s {1}".format(klist_path_local, ccache_file_path), user=user)[0] != 0:
+    # take a look at the last time kinit was run for the specified cache and force a new
+    # kinit if it's time; this helps to avoid problems approaching ticket boundary when
+    # executing a klist and then a curl
+    last_kinit_time = _KINIT_CACHE_TIMES.get(ccache_file_name, 0)
+    current_time = long(time.time())
+    if current_time - kinit_timer_ms > last_kinit_time:
+      is_kinit_required = True
+
+    # if the time has not expired, double-check that the cache still has a valid ticket
+    if not is_kinit_required:
+      klist_command = "{0} -s {1}".format(klist_path_local, ccache_file_path)
+      is_kinit_required = (shell.call(klist_command, user=user)[0] != 0)
+
+    # if kinit is required, the perform the kinit
+    if is_kinit_required:
       if krb_exec_search_paths:
         kinit_path_local = get_kinit_path(krb_exec_search_paths)
       else:
         kinit_path_local = get_kinit_path()
 
-      logger.debug("[Alert][{0}] Enabling Kerberos authentication via GSSAPI using ccache at {1}.".format(
-        alert_name, ccache_file_path))
+      logger.debug("Enabling Kerberos authentication for %s via GSSAPI using ccache at %s",
+        caller_label, ccache_file_path)
+
+      # kinit; there's no need to set a ticket timeout as this will use the default invalidation
+      # configured in the krb5.conf - regenerating keytabs will not prevent an existing cache
+      # from working correctly
+      shell.checked_call("{0} -c {1} -kt {2} {3} > /dev/null".format(kinit_path_local,
+        ccache_file_path, keytab, principal), user=user)
 
-      shell.checked_call("{0} -l 5m -c {1} -kt {2} {3} > /dev/null".format(kinit_path_local, ccache_file_path, keytab, principal), user=user)
+      # record kinit time
+      _KINIT_CACHE_TIMES[ccache_file_name] = current_time
     else:
-      logger.debug("[Alert][{0}] Kerberos authentication via GSSAPI already enabled using ccache at {1}.".format(
-        alert_name, ccache_file_path))
+      # no kinit needed, use the cache
+      logger.debug("Kerberos authentication for %s via GSSAPI already enabled using ccache at %s.",
+        caller_label, ccache_file_path)
   finally:
     kinit_lock.release()
 
@@ -119,7 +180,7 @@ def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix,
                              user=user, env=kerberos_env)
   except Fail:
     if logger.isEnabledFor(logging.DEBUG):
-      logger.exception("[Alert][{0}] Unable to make a web request.".format(alert_name))
+      logger.exception("Unable to make a curl request for {0}.".format(caller_label))
     raise
   finally:
     if os.path.isfile(cookie_file):
@@ -138,6 +199,7 @@ def curl_krb_request(tmp_dir, keytab, principal, url, cache_file_prefix,
     else:
       return (curl_stdout, error_msg, time_millis)
 
-  logger.debug("[Alert][{0}] Curl response is empty! Please take a look at error message: ".
-               format(alert_name, str(error_msg)))
+  logger.debug("The curl response for %s is empty; standard error = %s",
+    caller_label, str(error_msg))
+
   return ("", error_msg, time_millis)

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py
index ef389cd..71e34e6 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_checkpoint_time.py
@@ -25,6 +25,8 @@ import logging
 import traceback
 
 from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
 from resource_management.core.environment import Environment
 
 LABEL = 'Last Checkpoint: [{h} hours, {m} minutes, {tx} transactions]'
@@ -133,6 +135,8 @@ def execute(configurations={}, parameters={}, host_name=None):
   if PERCENT_CRITICAL_KEY in parameters:
     percent_critical = float(parameters[PERCENT_CRITICAL_KEY]) * 100
 
+  kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
   # determine the right URI and whether to use SSL
   uri = http_uri
   if http_policy == 'HTTPS_ONLY':
@@ -159,14 +163,16 @@ def execute(configurations={}, parameters={}, host_name=None):
 
       last_checkpoint_time_response, error_msg, time_millis = curl_krb_request(env.tmp_dir, kerberos_keytab,
         kerberos_principal, last_checkpoint_time_qry,"checkpoint_time_alert", executable_paths, False,
-        "NameNode Last Checkpoint", smokeuser, connection_timeout=curl_connection_timeout)
+        "NameNode Last Checkpoint", smokeuser, connection_timeout=curl_connection_timeout,
+        kinit_timer_ms = kinit_timer_ms)
 
       last_checkpoint_time_response_json = json.loads(last_checkpoint_time_response)
       last_checkpoint_time = int(last_checkpoint_time_response_json["beans"][0]["LastCheckpointTime"])
 
       journal_transaction_info_response, error_msg, time_millis = curl_krb_request(env.tmp_dir, kerberos_keytab,
         kerberos_principal, journal_transaction_info_qry,"checkpoint_time_alert", executable_paths,
-        False, "NameNode Last Checkpoint", smokeuser, connection_timeout=curl_connection_timeout)
+        False, "NameNode Last Checkpoint", smokeuser, connection_timeout=curl_connection_timeout,
+        kinit_timer_ms = kinit_timer_ms)
 
       journal_transaction_info_response_json = json.loads(journal_transaction_info_response)
       journal_transaction_info = journal_transaction_info_response_json["beans"][0]["JournalTransactionInfo"]

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py
index a174cb4..70b1970 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_ha_namenode_health.py
@@ -21,9 +21,10 @@ limitations under the License.
 import urllib2
 import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
 import logging
-import traceback
 
 from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
 from resource_management.core.environment import Environment
 
 RESULT_STATE_OK = 'OK'
@@ -110,6 +111,7 @@ def execute(configurations={}, parameters={}, host_name=None):
     kerberos_principal = configurations[KERBEROS_PRINCIPAL]
     kerberos_principal = kerberos_principal.replace('_HOST', host_name)
 
+  kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
 
   # determine whether or not SSL is enabled
   is_ssl_enabled = False
@@ -165,7 +167,8 @@ def execute(configurations={}, parameters={}, host_name=None):
 
           state_response, error_msg, time_millis  = curl_krb_request(env.tmp_dir,
             kerberos_keytab, kerberos_principal, jmx_uri,"ha_nn_health", executable_paths, False,
-            "NameNode High Availability Health", smokeuser, connection_timeout=curl_connection_timeout)
+            "NameNode High Availability Health", smokeuser, connection_timeout=curl_connection_timeout,
+            kinit_timer_ms = kinit_timer_ms)
 
           state = _get_ha_state_from_json(state_response)
         else:

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py
index 217f3b8..f6a9a56 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_metrics_deviation.py
@@ -25,7 +25,12 @@ from math import sqrt
 import urllib
 import time
 import urllib2
-from resource_management import Environment, curl_krb_request
+from resource_management import Environment
+
+from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
+
 
 RESULT_STATE_OK = 'OK'
 RESULT_STATE_CRITICAL = 'CRITICAL'
@@ -178,6 +183,8 @@ def execute(configurations={}, parameters={}, host_name=None):
       if dfs_policy == "HTTPS_ONLY":
         is_ssl_enabled = True
 
+    kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
     name_service = configurations[NAMESERVICE_KEY]
     hdfs_site = configurations[HDFS_SITE_KEY]
 
@@ -215,9 +222,10 @@ def execute(configurations={}, parameters={}, host_name=None):
 
             # curl requires an integer timeout
             curl_connection_timeout = int(connection_timeout)
-            state_response, error_msg, time_millis  = curl_krb_request(env.tmp_dir,
-                                                                       kerberos_keytab, kerberos_principal, jmx_uri,"ha_nn_health", executable_paths, False,
-                                                                       "NameNode High Availability Health", smokeuser, connection_timeout=curl_connection_timeout)
+            state_response, error_msg, time_millis = curl_krb_request(env.tmp_dir,
+              kerberos_keytab, kerberos_principal, jmx_uri,"ha_nn_health", executable_paths, False,
+              "NameNode High Availability Health", smokeuser, connection_timeout=curl_connection_timeout,
+              kinit_timer_ms = kinit_timer_ms)
 
             state = _get_ha_state_from_json(state_response)
           else:

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py
index 6e8945c..fbda22e 100644
--- a/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py
+++ b/ambari-server/src/main/resources/common-services/HDFS/2.1.0.2.0/package/alerts/alert_upgrade_finalized.py
@@ -23,7 +23,10 @@ import ambari_simplejson as json # simplejson is much faster comparing to Python
 import logging
 import traceback
 
-from resource_management.libraries.functions.curl_krb_request import curl_krb_request, CONNECTION_TIMEOUT_DEFAULT
+from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
+from resource_management.libraries.functions.curl_krb_request import CONNECTION_TIMEOUT_DEFAULT
 from resource_management.core.environment import Environment
 
 NN_HTTP_ADDRESS_KEY = '{{hdfs-site/dfs.namenode.http-address}}'
@@ -100,6 +103,8 @@ def execute(configurations={}, parameters={}, host_name=None):
     kerberos_principal = configurations[KERBEROS_PRINCIPAL]
     kerberos_principal = kerberos_principal.replace('_HOST', host_name)
 
+  kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
   # determine the right URI and whether to use SSL
   uri = http_uri
   if http_policy == 'HTTPS_ONLY':
@@ -121,7 +126,7 @@ def execute(configurations={}, parameters={}, host_name=None):
       last_checkpoint_time_response, error_msg, time_millis = curl_krb_request(
         env.tmp_dir, kerberos_keytab,
         kerberos_principal, upgrade_finalized_qry, "upgrade_finalized_state", executable_paths, False,
-        "HDFS Upgrade Finalized State", smokeuser
+        "HDFS Upgrade Finalized State", smokeuser, kinit_timer_ms = kinit_timer_ms
        )
 
       upgrade_finalized_response_json = json.loads(last_checkpoint_time_response)

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py
index b49fd6e..c9575c0 100644
--- a/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py
+++ b/ambari-server/src/main/resources/common-services/HIVE/0.12.0.2.0/package/alerts/alert_webhcat_server.py
@@ -27,6 +27,9 @@ import logging
 
 from resource_management.core.environment import Environment
 from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
+
 
 RESULT_CODE_OK = "OK"
 RESULT_CODE_CRITICAL = "CRITICAL"
@@ -148,11 +151,13 @@ def execute(configurations={}, parameters={}, host_name=None):
       if KERBEROS_EXECUTABLE_SEARCH_PATHS_KEY in configurations:
         kerberos_executable_search_paths = configurations[KERBEROS_EXECUTABLE_SEARCH_PATHS_KEY]
 
+      kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
       env = Environment.get_instance()
       stdout, stderr, time_millis = curl_krb_request(env.tmp_dir, smokeuser_keytab, smokeuser_principal,
-                                                      query_url, "webhcat_alert_cc_", kerberos_executable_search_paths, True,
-                                                      "WebHCat Server Status", smokeuser,
-                                                      connection_timeout=curl_connection_timeout)
+        query_url, "webhcat_alert_cc_", kerberos_executable_search_paths, True,
+        "WebHCat Server Status", smokeuser, connection_timeout=curl_connection_timeout,
+        kinit_timer_ms = kinit_timer_ms)
 
       # check the response code
       response_code = int(stdout)
@@ -169,9 +174,10 @@ def execute(configurations={}, parameters={}, host_name=None):
 
       # now that we have the http status and it was 200, get the content
       stdout, stderr, total_time = curl_krb_request(env.tmp_dir, smokeuser_keytab, smokeuser_principal,
-                                                      query_url, "webhcat_alert_cc_", kerberos_executable_search_paths,
-                                                      False, "WebHCat Server Status", smokeuser,
-                                                      connection_timeout=curl_connection_timeout)
+        query_url, "webhcat_alert_cc_", kerberos_executable_search_paths,
+        False, "WebHCat Server Status", smokeuser, connection_timeout=curl_connection_timeout,
+        kinit_timer_ms = kinit_timer_ms)
+
       json_response = json.loads(stdout)
     except:
       return (RESULT_CODE_CRITICAL, [traceback.format_exc()])

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py
index ef5e6b3..2105bed 100644
--- a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py
+++ b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanager_health.py
@@ -26,6 +26,8 @@ import traceback
 from ambari_commons import OSCheck
 from ambari_commons.inet_utils import resolve_address
 from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
 from resource_management.core.environment import Environment
 
 RESULT_CODE_OK = 'OK'
@@ -155,9 +157,11 @@ def execute(configurations={}, parameters={}, host_name=None):
       # curl requires an integer timeout
       curl_connection_timeout = int(connection_timeout)
 
+      kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
       url_response, error_msg, time_millis  = curl_krb_request(env.tmp_dir, kerberos_keytab, kerberos_principal,
         query, "nm_health_alert", executable_paths, False, "NodeManager Health", smokeuser,
-        connection_timeout=curl_connection_timeout)
+        connection_timeout=curl_connection_timeout, kinit_timer_ms = kinit_timer_ms)
 
       json_response = json.loads(url_response)
     else:

http://git-wip-us.apache.org/repos/asf/ambari/blob/2efe8945/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py
index 119a1a1..adf27ec 100644
--- a/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py
+++ b/ambari-server/src/main/resources/common-services/YARN/2.1.0.2.0/package/alerts/alert_nodemanagers_summary.py
@@ -25,6 +25,8 @@ import traceback
 
 from ambari_commons.urllib_handlers import RefreshHeaderProcessor
 from resource_management.libraries.functions.curl_krb_request import curl_krb_request
+from resource_management.libraries.functions.curl_krb_request import DEFAULT_KERBEROS_KINIT_TIMER_MS
+from resource_management.libraries.functions.curl_krb_request import KERBEROS_KINIT_TIMER_PARAMETER
 from resource_management.core.environment import Environment
 
 ERROR_LABEL = '{0} NodeManager{1} {2} unhealthy.'
@@ -109,6 +111,8 @@ def execute(configurations={}, parameters={}, host_name=None):
   if CONNECTION_TIMEOUT_KEY in parameters:
     connection_timeout = float(parameters[CONNECTION_TIMEOUT_KEY])
 
+  kinit_timer_ms = parameters.get(KERBEROS_KINIT_TIMER_PARAMETER, DEFAULT_KERBEROS_KINIT_TIMER_MS)
+
   # determine the right URI and whether to use SSL
   uri = http_uri
   if http_policy == 'HTTPS_ONLY':
@@ -130,7 +134,8 @@ def execute(configurations={}, parameters={}, host_name=None):
 
       url_response, error_msg, time_millis  = curl_krb_request(env.tmp_dir, kerberos_keytab, kerberos_principal,
         live_nodemanagers_qry, "nm_health_summary_alert", executable_paths, False,
-        "NodeManager Health Summary", smokeuser, connection_timeout=curl_connection_timeout)
+        "NodeManager Health Summary", smokeuser, connection_timeout=curl_connection_timeout,
+        kinit_timer_ms = kinit_timer_ms)
 
       try:
         url_response_json = json.loads(url_response)
@@ -143,7 +148,8 @@ def execute(configurations={}, parameters={}, host_name=None):
       if convert_to_json_failed:
         response_code, error_msg, time_millis  = curl_krb_request(env.tmp_dir, kerberos_keytab, kerberos_principal,
           live_nodemanagers_qry, "nm_health_summary_alert", executable_paths, True,
-          "NodeManager Health Summary", smokeuser, connection_timeout=curl_connection_timeout)
+          "NodeManager Health Summary", smokeuser, connection_timeout=curl_connection_timeout,
+          kinit_timer_ms = kinit_timer_ms)
     else:
       live_nodemanagers = json.loads(get_value_from_jmx(live_nodemanagers_qry,
       "LiveNodeManagers", connection_timeout))