def test_metric_alert(self, ma_load_jmx_mock): definition_json = self._get_metric_alert_definition() configuration = { 'hdfs-site': { 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80' } } collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") # trip an OK ma_load_jmx_mock.return_value = [1, 25] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('OK', alerts[0]['state']) self.assertEquals('(Unit Tests) OK: 1 25 125', alerts[0]['text']) # trip a warning ma_load_jmx_mock.return_value = [1, 75] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('WARNING', alerts[0]['state']) self.assertEquals('(Unit Tests) Warning: 1 75 175', alerts[0]['text']) # trip a critical now ma_load_jmx_mock.return_value = [1, 150] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('CRITICAL', alerts[0]['state']) self.assertEquals('(Unit Tests) Critical: 1 150 250', alerts[0]['text']) del definition_json['source']['jmx']['value'] collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") # now try without any jmx value to compare to ma_load_jmx_mock.return_value = [1, 25] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('OK', alerts[0]['state']) self.assertEquals('(Unit Tests) OK: 1 25 None', alerts[0]['text'])
def test_metric_alert(self, ma_load_jmx_mock): definition_json = self._get_metric_alert_definition() configuration = {'hdfs-site' : { 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80'} } collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") # trip an OK ma_load_jmx_mock.return_value = [1, 25] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('OK', alerts[0]['state']) self.assertEquals('(Unit Tests) OK: 1 25 125', alerts[0]['text']) # trip a warning ma_load_jmx_mock.return_value = [1, 75] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('WARNING', alerts[0]['state']) self.assertEquals('(Unit Tests) Warning: 1 75 175', alerts[0]['text']) # trip a critical now ma_load_jmx_mock.return_value = [1, 150] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('CRITICAL', alerts[0]['state']) self.assertEquals('(Unit Tests) Critical: 1 150 250', alerts[0]['text']) del definition_json['source']['jmx']['value'] collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") # now try without any jmx value to compare to ma_load_jmx_mock.return_value = [1, 25] alert.collect() alerts = collector.alerts() self.assertEquals(0, len(collector.alerts())) self.assertEquals('OK', alerts[0]['state']) self.assertEquals('(Unit Tests) OK: 1 25 None', alerts[0]['text'])
def test_metric_alert_uses_refresh_processor(self, http_response_mock, http_connection_mock): """ Tests that the RefreshHeaderProcessor is correctly chained and called :param http_response_mock: :param http_connection_mock: :return: """ http_conn = http_connection_mock.return_value http_conn.getresponse.return_value = MagicMock(status=200) http_response_mock.return_value = MagicMock(code=200) url_opener = urllib2.build_opener(RefreshHeaderProcessor()) response = url_opener.open("http://foo.bar.baz/jmx") self.assertFalse(response is None) self.assertTrue(http_conn.request.called) self.assertTrue(http_conn.getresponse.called) self.assertTrue(http_response_mock.called) # now we know that the refresh header is intercepting, reset the mocks # and try with a METRIC alert MagicMock.reset_mock(http_response_mock) MagicMock.reset_mock(http_connection_mock) definition_json = self._get_metric_alert_definition() configuration = { 'hdfs-site': { 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80' } } collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertFalse(response is None) self.assertTrue(http_conn.request.called) self.assertTrue(http_conn.getresponse.called) self.assertTrue(http_response_mock.called)
def test_metric_alert_uses_refresh_processor(self, http_response_mock, http_connection_mock): """ Tests that the RefreshHeaderProcessor is correctly chained and called :param http_response_mock: :param http_connection_mock: :return: """ http_conn = http_connection_mock.return_value http_conn.getresponse.return_value = MagicMock(status=200) http_response_mock.return_value = MagicMock(code=200) url_opener = urllib2.build_opener(RefreshHeaderProcessor()) response = url_opener.open("http://foo.bar.baz/jmx") self.assertFalse(response is None) self.assertTrue(http_conn.request.called) self.assertTrue(http_conn.getresponse.called) self.assertTrue(http_response_mock.called) # now we know that the refresh header is intercepting, reset the mocks # and try with a METRIC alert MagicMock.reset_mock(http_response_mock) MagicMock.reset_mock(http_connection_mock) definition_json = self._get_metric_alert_definition() configuration = {'hdfs-site' : { 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80'} } collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertFalse(response is None) self.assertTrue(http_conn.request.called) self.assertTrue(http_conn.getresponse.called) self.assertTrue(http_response_mock.called)
def test_alert_uri_structure(self, ma_load_jmx_mock): definition_json = self._get_metric_alert_definition() ma_load_jmx_mock.return_value = [0, 0] # run the alert without specifying any keys; an exception should be thrown # 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']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) # set properties that make no sense wihtout the main URI properties configuration = {'hdfs-site': {'dfs.http.policy': 'HTTP_ONLY'}} collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) # set an actual property key (http) configuration = { 'hdfs-site': { 'dfs.http.policy': 'HTTP_ONLY', 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state']) # set an actual property key (https) configuration = { 'hdfs-site': { 'dfs.http.policy': 'HTTP_ONLY', 'dfs.datanode.https.address': 'c6401.ambari.apache.org:443' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state']) # set both (http and https) configuration = { 'hdfs-site': { 'dfs.http.policy': 'HTTP_ONLY', 'dfs.datanode.http.address': 'c6401.ambari.apache.org:80', 'dfs.datanode.https.address': 'c6401.ambari.apache.org:443' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state'])
def test_alert_uri_structure(self, ma_load_jmx_mock): definition_json = self._get_metric_alert_definition() ma_load_jmx_mock.return_value = [0,0] # run the alert without specifying any keys; an exception should be thrown # 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']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) # set properties that make no sense wihtout the main URI properties configuration = {'hdfs-site' : { 'dfs.http.policy' : 'HTTP_ONLY'} } collector = AlertCollector() cluster_configuration = self.__get_cluster_configuration() self.__update_cluster_configuration(cluster_configuration, configuration) alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('UNKNOWN', collector.alerts()[0]['state']) # set an actual property key (http) configuration = {'hdfs-site' : { 'dfs.http.policy' : 'HTTP_ONLY', 'dfs.datanode.http.address' : 'c6401.ambari.apache.org:80' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state']) # set an actual property key (https) configuration = {'hdfs-site' : { 'dfs.http.policy' : 'HTTP_ONLY', 'dfs.datanode.https.address' : 'c6401.ambari.apache.org:443' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state']) # set both (http and https) configuration = {'hdfs-site' : { 'dfs.http.policy' : 'HTTP_ONLY', 'dfs.datanode.http.address' : 'c6401.ambari.apache.org:80', 'dfs.datanode.https.address' : 'c6401.ambari.apache.org:443' } } self.__update_cluster_configuration(cluster_configuration, configuration) collector = AlertCollector() alert = MetricAlert(definition_json, definition_json['source']) alert.set_helpers(collector, cluster_configuration) alert.set_cluster("c1", "c6401.ambari.apache.org") alert.collect() self.assertEquals('OK', collector.alerts()[0]['state'])