Skip to content

Commit 4defe61

Browse files
authored
Merge pull request #39 from swenske/master
2 parents d4a0112 + 6f8fd0b commit 4defe61

File tree

3 files changed

+40
-39
lines changed

3 files changed

+40
-39
lines changed

alertmanager/alertmanager.py

+19-30
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,6 @@ class AlertManager(object):
2121
2222
"""
2323

24-
SUCCESS_STATUSES = ['success']
25-
ERROR_STATUSES = ['error']
26-
2724
def __init__(self, host, port=9093, req_obj=None):
2825
"""
2926
Init method.
@@ -72,8 +69,7 @@ def _check_response(self, req):
7269
7370
This is a protected method that should only be used by methods making
7471
API calls. The intention is to check out responses for a successful
75-
HTTP status code along with a successful return from the Alert Manager
76-
API.
72+
HTTP status code from the Alert Manager API.
7773
7874
Parameters
7975
----------
@@ -89,21 +85,13 @@ def _check_response(self, req):
8985
9086
Raises
9187
------
92-
ValueError
93-
Raise a value error if the 'status' key of our response is in
94-
our list of error statuses from Alert Manager.
9588
HTTPError
9689
Raise an http error if our response objects status_code attribute
9790
is not in requests.codes.ok (basically not a 200).
9891
9992
"""
100-
if (req.status_code == requests.codes.ok
101-
and req.json()['status'] in self.SUCCESS_STATUSES):
102-
return True
103-
elif (req.status_code == requests.codes.ok
104-
and req.json()['status'] in self.ERROR_STATUSES):
105-
raise ValueError('{} ==> {}'.format(req.json()['errorType'],
106-
req.json()['error']))
93+
if req.status_code == requests.codes.ok:
94+
return True
10795
else:
10896
raise HTTPError('{} ==> {}'.format(req.status_code, req.text))
10997

@@ -161,13 +149,13 @@ def get_alerts(self, **kwargs):
161149
Return a list of Alert objects from our Alert Manager instance.
162150
163151
"""
164-
route = "/api/v1/alerts"
152+
route = "/api/v2/alerts"
165153
self._validate_get_alert_kwargs(**kwargs)
166154
if kwargs.get('filter'):
167155
kwargs['filter'] = self._handle_filters(kwargs['filter'])
168156
r = self._make_request("GET", route, params=kwargs)
169157
if self._check_response(r):
170-
return [Alert(alert) for alert in r.json()['data']]
158+
return [Alert(alert) for alert in r.json()]
171159

172160
def _validate_get_alert_kwargs(self, **kwargs):
173161
"""
@@ -287,10 +275,10 @@ def post_alerts(self, *alert):
287275
else:
288276
converted = Alert.from_dict(obj)
289277
payload.append(converted.validate_and_dump())
290-
route = "/api/v1/alerts"
278+
route = "/api/v2/alerts"
291279
r = self._make_request("POST", route, json=payload)
292280
if self._check_response(r):
293-
return Alert.from_dict(r.json())
281+
return Alert.from_dict({'status': [r.status_code]})
294282

295283
def get_status(self):
296284
"""
@@ -305,7 +293,7 @@ def get_status(self):
305293
Return the response from Alert Manager as an Alert object.
306294
307295
"""
308-
route = "/api/v1/status"
296+
route = "/api/v2/status"
309297
r = self._make_request("GET", route)
310298
if self._check_response(r):
311299
return Alert.from_dict(r.json())
@@ -327,7 +315,7 @@ def get_receivers(self):
327315
Return the response from Alert Manager as an Alert object.
328316
329317
"""
330-
route = "/api/v1/receivers"
318+
route = "/api/v2/receivers"
331319
r = self._make_request("GET", route)
332320
if self._check_response(r):
333321
return Alert.from_dict(r.json())
@@ -344,10 +332,10 @@ def get_alert_groups(self):
344332
Return the response from Alert Manager as an Alert object.
345333
346334
"""
347-
route = "/api/v1/alerts/groups"
335+
route = "/api/v2/alerts/groups"
348336
r = self._make_request("GET", route)
349337
if self._check_response(r):
350-
return Alert.from_dict(r.json())
338+
return [Alert(group) for group in r.json()]
351339

352340
def get_silence(self, id=None):
353341
"""
@@ -370,12 +358,13 @@ def get_silence(self, id=None):
370358
case a list of silences.
371359
372360
"""
373-
route = "/api/v1/silences"
361+
route = "/api/v2/silences"
374362
if id:
363+
route = "/api/v2/silence/"
375364
route = urljoin(route, id)
376365
r = self._make_request("GET", route)
377366
if self._check_response(r):
378-
return Alert.from_dict(r.json())
367+
return [Alert(silence) for silence in r.json()]
379368

380369
def get_silences(self, **kwargs):
381370
"""
@@ -398,13 +387,13 @@ def get_silences(self, **kwargs):
398387
Return a list of Silence objects from our Alert Manager instance.
399388
400389
"""
401-
route = "/api/v1/silences"
390+
route = "/api/v2/silences"
402391
self._validate_get_silence_kwargs(**kwargs)
403392
if kwargs.get('filter'):
404393
kwargs['filter'] = self._handle_filters(kwargs['filter'])
405394
r = self._make_request("GET", route, params=kwargs)
406395
if self._check_response(r):
407-
return [Alert(alert) for alert in r.json()['data']]
396+
return [Alert(alert) for alert in r.json()]
408397

409398
def post_silence(self, silence):
410399
"""
@@ -440,7 +429,7 @@ def post_silence(self, silence):
440429
else:
441430
silence = Silence.from_dict(silence)
442431
silence = silence.validate_and_dump()
443-
route = "/api/v1/silences"
432+
route = "/api/v2/silences"
444433
r = self._make_request("POST", route, json=silence)
445434
if self._check_response(r):
446435
return Alert.from_dict(r.json())
@@ -464,8 +453,8 @@ def delete_silence(self, silence_id):
464453
Return the response from Alert Manager as an Alert object.
465454
466455
"""
467-
route = "/api/v1/silence/"
456+
route = "/api/v2/silence/"
468457
route = urljoin(route, silence_id)
469458
r = self._make_request("DELETE", route)
470459
if self._check_response(r):
471-
return Alert.from_dict(r.json())
460+
return Alert.from_dict({'status': [r.status_code]})

tests/alertmanager_test.py

+9-8
Original file line numberDiff line numberDiff line change
@@ -32,34 +32,35 @@ def test_get_silences(self):
3232

3333
def test_post_alerts(self):
3434
result = self.a_manager.post_alerts(self.alert)
35-
self.assertIn('success', result.status)
35+
self.assertIn(200, result.status)
3636

3737
def test_get_status(self):
3838
result = self.a_manager.get_status()
39-
self.assertIn('success', result.status)
39+
self.assertIn('ready', result.cluster.status)
4040

4141
def test_get_receivers(self):
4242
result = self.a_manager.get_status()
43-
self.assertIn('success', result.status)
43+
self.assertIn('ready', result.cluster.status)
4444

4545
def test_get_alert_groups(self):
4646
result = self.a_manager.get_alert_groups()
47-
self.assertIn('success', result.status)
47+
self.assertTrue(result)
4848

4949
def test_get_silence(self):
5050
result = self.a_manager.get_silence()
51-
self.assertIn('success', result.status)
51+
self.assertTrue(result)
5252

5353
def test_post_silence(self):
5454
result = self.a_manager.post_silence(self.silence)
55-
self.assertIn('success', result.status)
55+
print(result)
56+
self.assertTrue(result)
5657

5758
def test_delete_silence(self):
5859
self.a_manager.post_silence(self.silence)
5960
time.sleep(2)
6061
silences = self.a_manager.get_silence()
61-
for silence in silences['data']:
62+
for silence in silences:
6263
if silence['status']['state'] == 'active':
6364
silence_id = silence['id']
6465
result = self.a_manager.delete_silence(silence_id)
65-
self.assertIn('success', result.status)
66+
self.assertIn(200, result.status)

tests/data.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
from datetime import datetime
2+
import time
3+
4+
def am_fmt(ts):
5+
""" format time to AM format """
6+
return datetime.utcfromtimestamp(ts).strftime('%Y-%m-%dT%H:%M:%S.%fZ')
7+
18
TEST_ADD_MATCHER_DATA = {
29
'matchers': [{'name': 'alertname', 'value': 'alert1', 'isRegex': False}],
310
'endsAt': 'some_date_string'
@@ -41,5 +48,9 @@
4148
}
4249

4350
TEST_SILENCE_POST_DATA = {
44-
'matchers': [{'name': 'alertname', 'value': 'alert1', 'isRegex': False}]
51+
"matchers": [{'name': 'alertname', 'value': 'alert1', 'isRegex': False}],
52+
"startsAt": am_fmt(int(time.time())),
53+
"endsAt": am_fmt(int(time.time()) + (60 * 60)),
54+
"createdBy": "pytest",
55+
"comment": "pytest"
4556
}

0 commit comments

Comments
 (0)