Skip to content

Commit

Permalink
Merge pull request #269 from Alignak-monitoring-contrib/develop+fix_l…
Browse files Browse the repository at this point in the history
…ivesynthesis_ls_ack_downtime_only

Fix livesynthesis when receive only ls_acknowledged or ls_downtimes b…
  • Loading branch information
mohierf committed Feb 1, 2017
2 parents 98bce86 + 97b4d65 commit 9d140b2
Show file tree
Hide file tree
Showing 2 changed files with 301 additions and 1 deletion.
8 changes: 7 additions & 1 deletion alignak_backend/livesynthesis.py
Original file line number Diff line number Diff line change
Expand Up @@ -267,14 +267,20 @@ def livesynthesis_to_update(type_check, updated, original):
"""

# State modification
if 'ls_state' not in updated and 'ls_state_type' not in updated:
if 'ls_state' not in updated and 'ls_state_type' not in updated \
and 'ls_acknowledged' not in updated and 'ls_downtimed' not in updated:
return False, False
elif 'ls_state' in updated and 'ls_state_type' not in updated:
plus = "%s_%s_%s" % (type_check, updated['ls_state'].lower(),
original['ls_state_type'].lower())
elif 'ls_state' not in updated and 'ls_state_type' in updated:
plus = "%s_%s_%s" % (type_check, original['ls_state'].lower(),
updated['ls_state_type'].lower())
elif 'ls_state' not in updated and 'ls_state_type' not in updated:
if 'ls_acknowledged' in updated and not updated['ls_acknowledged'] \
or 'ls_downtimed' in updated and not updated['ls_downtimed']:
plus = "%s_%s_%s" % (type_check, original['ls_state'].lower(),
original['ls_state_type'].lower())
else:
# so have 'state' and 'state_type' in updated
plus = "%s_%s_%s" % (type_check, updated['ls_state'].lower(),
Expand Down
294 changes: 294 additions & 0 deletions test/test_hook_livesynthesis.py
Original file line number Diff line number Diff line change
Expand Up @@ -1472,3 +1472,297 @@ def test_realms(self):
self.assertEqual(ls['services_unknown_soft'], 0)
self.assertEqual(ls['services_unreachable_hard'], 0)
self.assertEqual(ls['services_unreachable_soft'], 0)

def test_ack_downtime_raise_expire(self):
"""
Test livesynthesis when updating only ls_acknowledged and ls_downtime by broker module
when have a ack/downtime raise / expire
:return: None
"""
headers = {'Content-Type': 'application/json'}
sort_id = {'sort': '_id'}
# Add command
data = json.loads(open('cfg/command_ping.json').read())
data['_realm'] = self.realm_all
requests.post(self.endpoint + '/command', json=data, headers=headers, auth=self.auth)
# Check if command right in backend
response = requests.get(self.endpoint + '/command', params=sort_id, auth=self.auth)
resp = response.json()
self.assertEqual(len(resp['_items']), 3)
rc = resp['_items']

# Add host
data = json.loads(open('cfg/host_srv001.json').read())
data['check_command'] = rc[2]['_id']
if 'realm' in data:
del data['realm']
data['_realm'] = self.realm_all
requests.post(self.endpoint + '/host', json=data, headers=headers, auth=self.auth)
response = requests.get(self.endpoint + '/host', params=sort_id, auth=self.auth)
resp = response.json()
self.assertEqual(len(resp['_items']), 2)
rh = resp['_items']

# Add service
data = json.loads(open('cfg/service_srv001_ping.json').read())
data['host'] = rh[1]['_id']
data['check_command'] = rc[2]['_id']
data['_realm'] = self.realm_all
requests.post(self.endpoint + '/service', json=data, headers=headers, auth=self.auth)

# Get host
response = requests.get(self.endpoint + '/host', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
ls_host = copy.copy(r[1])
updated_field = ls_host['_updated']

# Update live state for an acknowledge_raise
time.sleep(.1)
data = {
'ls_acknowledged': True,
}
headers_patch = {
'Content-Type': 'application/json',
'If-Match': ls_host['_etag']
}
requests.patch(self.endpoint + '/host/' + ls_host['_id'], json=data,
headers=headers_patch, auth=self.auth)
response = requests.get(
self.endpoint + '/host/' + ls_host['_id'], params=sort_id, auth=self.auth
)
resp = response.json()
ls_host = resp
# _updated field did not changed...
self.assertEqual(updated_field, ls_host['_updated'])

response = requests.get(self.endpoint + '/livesynthesis', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
self.assertEqual(len(r), 1)
self.assertEqual(r[0]['hosts_total'], 1)
self.assertEqual(r[0]['hosts_up_hard'], 0)
self.assertEqual(r[0]['hosts_up_soft'], 0)
self.assertEqual(r[0]['hosts_down_hard'], 0)
self.assertEqual(r[0]['hosts_down_soft'], 0)
self.assertEqual(r[0]['hosts_unreachable_hard'], 0)
self.assertEqual(r[0]['hosts_unreachable_soft'], 0)
self.assertEqual(r[0]['hosts_acknowledged'], 1)
self.assertEqual(r[0]['hosts_in_downtime'], 0)
self.assertEqual(r[0]['services_total'], 1)
self.assertEqual(r[0]['services_ok_hard'], 0)
self.assertEqual(r[0]['services_ok_soft'], 0)
self.assertEqual(r[0]['services_warning_hard'], 0)
self.assertEqual(r[0]['services_warning_soft'], 0)
self.assertEqual(r[0]['services_critical_hard'], 0)
self.assertEqual(r[0]['services_critical_soft'], 0)
self.assertEqual(r[0]['services_unknown_hard'], 1)
self.assertEqual(r[0]['services_unknown_soft'], 0)
self.assertEqual(r[0]['services_unreachable_hard'], 0)
self.assertEqual(r[0]['services_unreachable_soft'], 0)
self.assertEqual(r[0]['services_acknowledged'], 0)
self.assertEqual(r[0]['services_in_downtime'], 0)

# update livestate with host_check_result
data = {
'ls_state': 'DOWN',
'ls_state_id': 1,
'ls_state_type': 'HARD',
'ls_last_check': 1465686371,
'ls_last_state': 'DOWN',
'ls_last_state_type': 'HARD',
'ls_output': 'CRITICAL - Plugin timed out after 10 seconds',
'ls_long_output': '',
'ls_perf_data': '',
'ls_acknowledged': True,
'ls_execution_time': 10.1046719551,
'ls_latency': 0.926582098
}
headers_patch = {
'Content-Type': 'application/json',
'If-Match': ls_host['_etag']
}
requests.patch(self.endpoint + '/host/' + ls_host['_id'], json=data,
headers=headers_patch, auth=self.auth)
response = requests.get(self.endpoint + '/host', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
ls_host = copy.copy(r[1])
# _updated field did not changed...
self.assertEqual(updated_field, ls_host['_updated'])

response = requests.get(self.endpoint + '/livesynthesis', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
self.assertEqual(len(r), 1)
self.assertEqual(r[0]['hosts_total'], 1)
self.assertEqual(r[0]['hosts_up_hard'], 0)
self.assertEqual(r[0]['hosts_up_soft'], 0)
self.assertEqual(r[0]['hosts_down_hard'], 0)
self.assertEqual(r[0]['hosts_down_soft'], 0)
self.assertEqual(r[0]['hosts_unreachable_hard'], 0)
self.assertEqual(r[0]['hosts_unreachable_soft'], 0)
self.assertEqual(r[0]['hosts_acknowledged'], 1)
self.assertEqual(r[0]['hosts_in_downtime'], 0)
self.assertEqual(r[0]['services_total'], 1)
self.assertEqual(r[0]['services_ok_hard'], 0)
self.assertEqual(r[0]['services_ok_soft'], 0)
self.assertEqual(r[0]['services_warning_hard'], 0)
self.assertEqual(r[0]['services_warning_soft'], 0)
self.assertEqual(r[0]['services_critical_hard'], 0)
self.assertEqual(r[0]['services_critical_soft'], 0)
self.assertEqual(r[0]['services_unknown_hard'], 1)
self.assertEqual(r[0]['services_unknown_soft'], 0)
self.assertEqual(r[0]['services_unreachable_hard'], 0)
self.assertEqual(r[0]['services_unreachable_soft'], 0)
self.assertEqual(r[0]['services_acknowledged'], 0)
self.assertEqual(r[0]['services_in_downtime'], 0)

# Update live state for an acknowledge_expire
time.sleep(.1)
data = {
'ls_acknowledged': False,
}
headers_patch = {
'Content-Type': 'application/json',
'If-Match': ls_host['_etag']
}
requests.patch(self.endpoint + '/host/' + ls_host['_id'], json=data,
headers=headers_patch, auth=self.auth)
response = requests.get(
self.endpoint + '/host/' + ls_host['_id'], params=sort_id, auth=self.auth
)
resp = response.json()
ls_host = resp
# _updated field did not changed...
self.assertEqual(updated_field, ls_host['_updated'])

response = requests.get(self.endpoint + '/livesynthesis', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
self.assertEqual(len(r), 1)
self.assertEqual(r[0]['hosts_total'], 1)
self.assertEqual(r[0]['hosts_up_hard'], 0)
self.assertEqual(r[0]['hosts_up_soft'], 0)
self.assertEqual(r[0]['hosts_down_hard'], 1)
self.assertEqual(r[0]['hosts_down_soft'], 0)
self.assertEqual(r[0]['hosts_unreachable_hard'], 0)
self.assertEqual(r[0]['hosts_unreachable_soft'], 0)
self.assertEqual(r[0]['hosts_acknowledged'], 0)
self.assertEqual(r[0]['hosts_in_downtime'], 0)
self.assertEqual(r[0]['services_total'], 1)
self.assertEqual(r[0]['services_ok_hard'], 0)
self.assertEqual(r[0]['services_ok_soft'], 0)
self.assertEqual(r[0]['services_warning_hard'], 0)
self.assertEqual(r[0]['services_warning_soft'], 0)
self.assertEqual(r[0]['services_critical_hard'], 0)
self.assertEqual(r[0]['services_critical_soft'], 0)
self.assertEqual(r[0]['services_unknown_hard'], 1)
self.assertEqual(r[0]['services_unknown_soft'], 0)
self.assertEqual(r[0]['services_unreachable_hard'], 0)
self.assertEqual(r[0]['services_unreachable_soft'], 0)
self.assertEqual(r[0]['services_acknowledged'], 0)
self.assertEqual(r[0]['services_in_downtime'], 0)

# case host_check_result used before acknowledge_raise
# update livestate with host_check_result
data = {
'ls_state': 'DOWN',
'ls_state_id': 1,
'ls_state_type': 'HARD',
'ls_last_check': 1465686371,
'ls_last_state': 'DOWN',
'ls_last_state_type': 'HARD',
'ls_output': 'CRITICAL - Plugin timed out after 10 seconds',
'ls_long_output': '',
'ls_perf_data': '',
'ls_acknowledged': True,
'ls_execution_time': 10.1046719551,
'ls_latency': 0.926582098
}
headers_patch = {
'Content-Type': 'application/json',
'If-Match': ls_host['_etag']
}
requests.patch(self.endpoint + '/host/' + ls_host['_id'], json=data,
headers=headers_patch, auth=self.auth)
response = requests.get(self.endpoint + '/host', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
ls_host = copy.copy(r[1])
# _updated field did not changed...
self.assertEqual(updated_field, ls_host['_updated'])

response = requests.get(self.endpoint + '/livesynthesis', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
self.assertEqual(len(r), 1)
self.assertEqual(r[0]['hosts_total'], 1)
self.assertEqual(r[0]['hosts_up_hard'], 0)
self.assertEqual(r[0]['hosts_up_soft'], 0)
self.assertEqual(r[0]['hosts_down_hard'], 0)
self.assertEqual(r[0]['hosts_down_soft'], 0)
self.assertEqual(r[0]['hosts_unreachable_hard'], 0)
self.assertEqual(r[0]['hosts_unreachable_soft'], 0)
self.assertEqual(r[0]['hosts_acknowledged'], 1)
self.assertEqual(r[0]['hosts_in_downtime'], 0)
self.assertEqual(r[0]['services_total'], 1)
self.assertEqual(r[0]['services_ok_hard'], 0)
self.assertEqual(r[0]['services_ok_soft'], 0)
self.assertEqual(r[0]['services_warning_hard'], 0)
self.assertEqual(r[0]['services_warning_soft'], 0)
self.assertEqual(r[0]['services_critical_hard'], 0)
self.assertEqual(r[0]['services_critical_soft'], 0)
self.assertEqual(r[0]['services_unknown_hard'], 1)
self.assertEqual(r[0]['services_unknown_soft'], 0)
self.assertEqual(r[0]['services_unreachable_hard'], 0)
self.assertEqual(r[0]['services_unreachable_soft'], 0)
self.assertEqual(r[0]['services_acknowledged'], 0)
self.assertEqual(r[0]['services_in_downtime'], 0)

# Update live state for an acknowledge_raise
time.sleep(.1)
data = {
'ls_acknowledged': True,
}
headers_patch = {
'Content-Type': 'application/json',
'If-Match': ls_host['_etag']
}
requests.patch(self.endpoint + '/host/' + ls_host['_id'], json=data,
headers=headers_patch, auth=self.auth)
response = requests.get(
self.endpoint + '/host/' + ls_host['_id'], params=sort_id, auth=self.auth
)
resp = response.json()
ls_host = resp
# _updated field did not changed...
self.assertEqual(updated_field, ls_host['_updated'])

response = requests.get(self.endpoint + '/livesynthesis', params=sort_id, auth=self.auth)
resp = response.json()
r = resp['_items']
self.assertEqual(len(r), 1)
self.assertEqual(r[0]['hosts_total'], 1)
self.assertEqual(r[0]['hosts_up_hard'], 0)
self.assertEqual(r[0]['hosts_up_soft'], 0)
self.assertEqual(r[0]['hosts_down_hard'], 0)
self.assertEqual(r[0]['hosts_down_soft'], 0)
self.assertEqual(r[0]['hosts_unreachable_hard'], 0)
self.assertEqual(r[0]['hosts_unreachable_soft'], 0)
self.assertEqual(r[0]['hosts_acknowledged'], 1)
self.assertEqual(r[0]['hosts_in_downtime'], 0)
self.assertEqual(r[0]['services_total'], 1)
self.assertEqual(r[0]['services_ok_hard'], 0)
self.assertEqual(r[0]['services_ok_soft'], 0)
self.assertEqual(r[0]['services_warning_hard'], 0)
self.assertEqual(r[0]['services_warning_soft'], 0)
self.assertEqual(r[0]['services_critical_hard'], 0)
self.assertEqual(r[0]['services_critical_soft'], 0)
self.assertEqual(r[0]['services_unknown_hard'], 1)
self.assertEqual(r[0]['services_unknown_soft'], 0)
self.assertEqual(r[0]['services_unreachable_hard'], 0)
self.assertEqual(r[0]['services_unreachable_soft'], 0)
self.assertEqual(r[0]['services_acknowledged'], 0)
self.assertEqual(r[0]['services_in_downtime'], 0)

0 comments on commit 9d140b2

Please sign in to comment.