alerta_alerta/tests/test_actions.py

205 lines
8.2 KiB
Python

import json
import unittest
from uuid import uuid4
from alerta.app import alarm_model, create_app, db, plugins
class ActionsTestCase(unittest.TestCase):
def setUp(self):
test_config = {
'TESTING': True,
'AUTH_REQUIRED': False,
'ALERT_TIMEOUT': 120,
'HISTORY_LIMIT': 5
}
self.app = create_app(test_config)
self.client = self.app.test_client()
self.resource = str(uuid4()).upper()[:8]
self.fatal_alert = {
'event': 'node_down',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'critical',
'correlate': ['node_down', 'node_marginal', 'node_up'],
'tags': ['foo'],
'attributes': {'foo': 'abc def', 'bar': 1234, 'baz': False},
}
self.critical_alert = {
'event': 'node_marginal',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'critical',
'correlate': ['node_down', 'node_marginal', 'node_up'],
'timeout': 30
}
self.major_alert = {
'event': 'node_marginal',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'major',
'correlate': ['node_down', 'node_marginal', 'node_up'],
'timeout': 40
}
self.warn_alert = {
'event': 'node_marginal',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'warning',
'correlate': ['node_down', 'node_marginal', 'node_up'],
'timeout': 50
}
self.normal_alert = {
'event': 'node_up',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'normal',
'correlate': ['node_down', 'node_marginal', 'node_up'],
'timeout': 100
}
self.ok_alert = {
'event': 'node_up',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'ok',
'correlate': ['node_down', 'node_marginal', 'node_up']
}
self.cleared_alert = {
'event': 'node_up',
'resource': self.resource,
'environment': 'Production',
'service': ['Network'],
'severity': 'cleared',
'correlate': ['node_down', 'node_marginal', 'node_up']
}
self.headers = {
'Content-type': 'application/json',
'X-Forwarded-For': '10.0.0.1'
}
def tearDown(self):
plugins.plugins.clear()
db.destroy()
def test_alert(self):
# create alert
response = self.client.post('/alert', data=json.dumps(self.major_alert), headers=self.headers)
self.assertEqual(response.status_code, 201)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['resource'], self.resource)
self.assertEqual(data['alert']['status'], 'open')
self.assertEqual(data['alert']['duplicateCount'], 0)
self.assertEqual(data['alert']['trendIndication'], 'moreSevere')
alert_id = data['id']
# ack alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'ack'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'major')
self.assertEqual(data['alert']['status'], 'ack')
# un-ack alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'unack'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'major')
self.assertEqual(data['alert']['status'], 'open')
# close alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'close'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'normal')
self.assertEqual(data['alert']['status'], 'closed')
# open alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'open'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'major')
self.assertEqual(data['alert']['status'], alarm_model.DEFAULT_STATUS)
def test_unwind_actions(self):
# new alert => open
# create alert
response = self.client.post('/alert', data=json.dumps(self.warn_alert), headers=self.headers)
self.assertEqual(response.status_code, 201)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['resource'], self.resource)
self.assertEqual(data['alert']['severity'], 'warning')
self.assertEqual(data['alert']['status'], 'open')
self.assertEqual(data['alert']['duplicateCount'], 0)
self.assertEqual(data['alert']['trendIndication'], 'moreSevere')
alert_id = data['id']
# ack alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'ack'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'warning')
self.assertEqual(data['alert']['status'], 'ack')
# shelve alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'shelve'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'warning')
self.assertEqual(data['alert']['status'], 'shelved')
# unshelve alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'unshelve'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'warning')
self.assertEqual(data['alert']['status'], 'ack')
# unack alert
response = self.client.put('/alert/' + alert_id + '/action',
data=json.dumps({'action': 'unack'}), headers=self.headers)
self.assertEqual(response.status_code, 200)
response = self.client.get('/alert/' + alert_id)
self.assertEqual(response.status_code, 200)
data = json.loads(response.data.decode('utf-8'))
self.assertEqual(data['alert']['severity'], 'warning')
self.assertEqual(data['alert']['status'], 'open')