Exemplo n.º 1
0
    def test_alert(self, conn_mock):
        ca_connection = MagicMock()
        response = MagicMock()
        response.status = 200
        ca_connection.getresponse.return_value = response
        conn_mock.return_value = ca_connection
        response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":1,"1459966370838":3}}]}'

        # OK, but no datapoints above the minimum threshold
        [status, messages] = alert.execute(configurations=configs,
                                           parameters=parameters)
        self.assertEqual(status, RESULT_STATE_OK)
        self.assertTrue(messages is not None and len(messages) == 1)
        self.assertEquals(
            'No datapoints found above the minimum threshold of 30 seconds',
            messages[0])

        # Unable to calculate the standard deviation for 1 data point
        response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000}}]}'
        [status, messages] = alert.execute(configurations=configs,
                                           parameters=parameters)
        self.assertEqual(status, RESULT_STATE_SKIPPED)
        self.assertTrue(messages is not None and len(messages) == 1)
        self.assertEquals(
            'Unable to calculate the standard deviation for 1 datapoints',
            messages[0])

        # OK
        response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":50000}}]}'
        [status, messages] = alert.execute(configurations=configs,
                                           parameters=parameters)
        self.assertEqual(status, RESULT_STATE_OK)
        self.assertTrue(messages is not None and len(messages) == 1)
        self.assertTrue(
            'OK. Percentage standard deviation value is' in messages[0])

        # Warning
        response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":1000000}}]}'
        [status, messages] = alert.execute(configurations=configs,
                                           parameters=parameters)
        self.assertEqual(status, RESULT_STATE_WARNING)
        self.assertTrue(messages is not None and len(messages) == 1)
        self.assertTrue(
            'WARNING. Percentage standard deviation' in messages[0])

        # HTTP request to AMS failed
        response.read.return_value = ''
        response.status = 501
        [status, messages] = alert.execute(configurations=configs,
                                           parameters=parameters)
        self.assertEqual(status, RESULT_STATE_UNKNOWN)
        self.assertTrue(messages is not None and len(messages) == 1)
        self.assertEquals('Unable to retrieve metrics from AMS.', messages[0])
 def test_missing_configs(self):
   """
   Check that the status is UNKNOWN when configs are missing.
   """
   configs = {}
   [status, messages] = alert.execute(configurations=configs)
   self.assertEqual(status, RESULT_STATE_UNKNOWN)
   self.assertTrue(messages is not None and len(messages) == 1)
   self.assertTrue('is a required parameter for the script' in messages[0])
  def make_alert_tests(self, configs, conn_mock, _host_name = None):
    connection = MagicMock()
    response = MagicMock()
    response.status = 200
    connection.getresponse.return_value = response
    conn_mock.return_value = connection
    response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":1,"1459966370838":3}}]}'

    alert._get_state_from_jmx = dummy_get_state_from_jmx
    alert._get_ssl_version = dummy_get_ssl_version

    # OK, but no datapoints above the minimum threshold
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_OK)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('There were no data points above the minimum threshold of 30 seconds',messages[0])

    # Unable to calculate the standard deviation for 1 data point
    response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000}}]}'
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_SKIPPED)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('There are not enough data points to calculate the standard deviation (1 sampled)', messages[0])

    # OK
    response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":50000}}]}'
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_OK)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('The variance for this alert is 7071ms which is within 100% of the 45000ms average (45000ms is the limit)', messages[0])

    # Warning
    response.read.return_value = '{"metrics":[{"metricname":"metric1","metrics":{"1459966360838":40000,"1459966370838":1000000}}]}'
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_WARNING)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('The variance for this alert is 678823ms which is 131% of the 520000ms average (520000ms is the limit)', messages[0])

    # HTTP request to AMS failed
    response.read.return_value = ''
    response.status = 501
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_UNKNOWN)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('Unable to retrieve metrics from the Ambari Metrics service.', messages[0])

    # Unable to connect to AMS
    conn_mock.side_effect = Exception('Unable to connect to AMS')
    [status, messages] = alert.execute(configurations=configs, parameters=parameters, host_name=_host_name)
    self.assertEqual(status, RESULT_STATE_UNKNOWN)
    self.assertTrue(messages is not None and len(messages) == 1)
    self.assertEquals('Unable to retrieve metrics from the Ambari Metrics service.', messages[0])