Skip to content

Commit caa98b8

Browse files
authored
Merge branch 'master' into get_group_members
2 parents 8237dc8 + 57c1d5a commit caa98b8

3 files changed

Lines changed: 115 additions & 11 deletions

File tree

hawkular/alerts.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,10 @@ class GroupConditionsInfo(ApiOject):
7171
'conditions', 'data_id_member_map'
7272
]
7373

74-
defaults = {
75-
'conditions': []
76-
}
74+
def __init__(self, dictionary=dict()):
75+
ApiOject.__init__(self, dictionary)
76+
udict = self.transform_dict_to_underscore(dictionary)
77+
self.conditions = Condition.list_to_object_list(udict.get('conditions'))
7778

7879
def addCondition(self, c):
7980
self.conditions.append(c)
@@ -164,10 +165,37 @@ def get_group_members(self, group_id):
164165
url = self._service_url(['triggers', 'groups', group_id, 'members'])
165166
return Trigger.list_to_object_list(self._get(url))
166167

168+
def update_group_trigger(self, group_id, trigger):
169+
"""
170+
:param group_id: group trigger id to be updated
171+
:param trigger: Trigger object, the group trigger to be updated
172+
"""
173+
data = self._serialize_object(trigger)
174+
self._put(self._service_url(['triggers', 'groups', group_id]), data, parse_json=False)
175+
176+
def delete_group_trigger(self, group_id, keep_non_orphans=False, keep_orphans=False):
177+
"""
178+
Delete a group trigger
179+
:param group_id: ID of the group trigger to delete
180+
:param keep_non_orphans: if True converts the non-orphan member triggers to standard triggers
181+
:param keep_orphans: if True converts the orphan member triggers to standard triggers
182+
"""
183+
params = {'keepNonOrphans': str(keep_non_orphans).lower(), 'keepOrphans': str(keep_orphans).lower()}
184+
self._delete(self._service_url(['triggers', 'groups', group_id], params=params))
185+
167186
def create_group_member(self, member):
168187
data = self._serialize_object(member)
169188
return Trigger(self._post(self._service_url(['triggers', 'groups', 'members']), data))
170189

190+
def get_trigger_conditions(self, trigger_id):
191+
"""
192+
Get all conditions for a specific trigger
193+
:param trigger_id: Trigger definition id to be retrieved
194+
:return: list of condition objects
195+
"""
196+
response = self._get(self._service_url(['triggers', trigger_id, 'conditions']))
197+
return Condition.list_to_object_list(response)
198+
171199
def create_group_conditions(self, group_id, trigger_mode, conditions):
172200
data = self._serialize_object(conditions)
173201
url = self._service_url(['triggers', 'groups', group_id, 'conditions', trigger_mode])

hawkular/client.py

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def _get_status_url(self):
165165
def tenant(self, tenant_id):
166166
self.tenant_id = tenant_id
167167

168-
def _http(self, url, method, data=None, decoder=None):
168+
def _http(self, url, method, data=None, decoder=None, parse_json=True):
169169
res = None
170170
req = Request(url=url)
171171
req.add_header('Content-Type', 'application/json')
@@ -193,10 +193,13 @@ def _http(self, url, method, data=None, decoder=None):
193193
req.get_method = lambda: method
194194
res = urlopen(req, context=self.context)
195195

196-
if res.getcode() == 200:
197-
data = json.load(reader(res), cls=decoder)
198-
elif res.getcode() == 204:
199-
data = {}
196+
if parse_json:
197+
if res.getcode() == 200:
198+
data = json.load(reader(res), cls=decoder)
199+
elif res.getcode() == 204:
200+
data = {}
201+
else:
202+
data = reader(res).read()
200203

201204
return data
202205

@@ -207,11 +210,11 @@ def _http(self, url, method, data=None, decoder=None):
207210
if res:
208211
res.close()
209212

210-
def _put(self, url, data):
211-
return self._http(url, 'PUT', data)
213+
def _put(self, url, data, parse_json=True):
214+
return self._http(url, 'PUT', data, parse_json=parse_json)
212215

213216
def _delete(self, url):
214-
return self._http(url, 'DELETE')
217+
return self._http(url, 'DELETE', parse_json=False)
215218

216219
def _post(self, url, data):
217220
return self._http(url, 'POST', data)

tests/test_alerts.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,13 @@
2222
import os
2323
from tests import base
2424

25+
try:
26+
# Python 3
27+
from urllib.error import HTTPError
28+
except ImportError:
29+
# Fall back to Python 2's urllib2
30+
from urllib2 import HTTPError
31+
2532

2633
class TestAlertsFunctionsBase(unittest.TestCase):
2734
def setUp(self):
@@ -125,6 +132,63 @@ def test_create_group_trigger(self):
125132
self.assertEqual(created_group_trigger.id, trigger.id)
126133
self.assertEqual(created_group_trigger.name, trigger.name)
127134

135+
def test_get_trigger_conditions(self):
136+
# Create group trigger object
137+
trigger = Trigger()
138+
trigger.id = 'group_trigger_01'
139+
trigger.name = 'group_trigger'
140+
self.client.create_group_trigger(trigger)
141+
142+
# Create condition objects
143+
condition1 = Condition()
144+
condition1.trigger_mode = TriggerMode.AUTORESOLVE
145+
condition1.type = ConditionType.THRESHOLD
146+
condition1.data_id = 'did1'
147+
condition1.threshold = 5
148+
condition1.operator = Operator.LT
149+
150+
condition2 = Condition()
151+
condition2.trigger_mode = TriggerMode.AUTORESOLVE
152+
condition2.type = ConditionType.THRESHOLD
153+
condition2.data_id = 'did2'
154+
condition2.threshold = 5
155+
condition2.operator = Operator.GT
156+
157+
condition3 = Condition()
158+
condition3.trigger_mode = TriggerMode.AUTORESOLVE
159+
condition3.type = ConditionType.THRESHOLD
160+
condition3.data_id = 'did3'
161+
condition3.threshold = 5
162+
condition3.operator = Operator.GTE
163+
164+
gc = GroupConditionsInfo()
165+
gc.addCondition(condition1)
166+
gc.addCondition(condition2)
167+
gc.addCondition(condition3)
168+
self.client.create_group_conditions(trigger.id, TriggerMode.AUTORESOLVE, gc)
169+
170+
gc = self.client.get_trigger_conditions(trigger.id)
171+
self.assertEqual(len(gc), 3)
172+
gc_dids = [c.data_id for c in gc]
173+
self.assertEqual(gc_dids, ['did1', 'did2', 'did3'])
174+
175+
def test_delete_group_trigger(self):
176+
# Create a group trigger
177+
gt = Trigger()
178+
gt.id = 'delete_group_trigger'
179+
gt.name = 'group_trigger_to_delete'
180+
self.client.create_group_trigger(gt)
181+
182+
group_count = len(self.client.list_triggers())
183+
# Delete the created group trigger
184+
self.client.delete_group_trigger('delete_group_trigger')
185+
186+
# Compare number of remaining triggers and query the deleted trigger id
187+
self.assertEqual(len(self.client.list_triggers()), group_count-1)
188+
with self.assertRaises(HTTPError) as e:
189+
self.client.get_trigger('delete_group_trigger')
190+
self.assertEqual(e.getcode(), 404)
191+
128192
def test_create_groups(self):
129193
# Create a group trigger
130194
t = Trigger()
@@ -161,3 +225,12 @@ def test_create_groups(self):
161225
gm = self.client.get_group_members('a-group-trigger')
162226
self.assertEqual(len(gm), 1)
163227
self.assertEqual(gm[0].id, 'member1')
228+
229+
# Update group trigger
230+
t.enabled = True
231+
t.severity = Severity.MEDIUM
232+
233+
self.client.update_group_trigger(t.id, t)
234+
gt = self.client.get_trigger(t.id)
235+
self.assertEqual(gt.enabled, True)
236+
self.assertEqual(gt.severity, Severity.MEDIUM)

0 commit comments

Comments
 (0)