Skip to content

Commit

Permalink
Improve spy and event messages, use is_problem
Browse files Browse the repository at this point in the history
Ref #289 add unit tests
  • Loading branch information
algorys committed Mar 25, 2018
1 parent 252ebfb commit 1a579d0
Show file tree
Hide file tree
Showing 10 changed files with 130 additions and 113 deletions.
41 changes: 41 additions & 0 deletions alignak_app/items/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,3 +89,44 @@ def get_display_name(self):
return self.data['alias'].title()

return self.name.title()

def get_overall_tooltip(self, services):
"""
Return corresponding overall state tooltip depends of ``_overall_state_id`` of Host and its
Services
:param services: list of Service items
:type services: list
:return: overall tooltip message
:rtype: str
"""

host_msg = self.get_tooltip()

event_messages = [
_('%s. You have nothing to do.') % host_msg,
_('%s and his services are ok or acknowledged.') % host_msg,
_('%s and his services are ok or downtimed.') % host_msg,
_('%s, some services may be unknown.') % host_msg,
_('%s, some services may be in critical condition or unreachable !') % host_msg,
_('%s, some services are not monitored.') % host_msg,
]

state_lvl = []

for service in services:
state_lvl.append(service.data['_overall_state_id'])

state_lvl.append(self.data['_overall_state_id'])

try:
max_state_lvl = max(state_lvl)
overall_tooltip = event_messages[max_state_lvl]

if not services:
overall_tooltip = '%s, no services...' % host_msg
except IndexError as e:
logger.error('Can\'t get overall tooltip, %s', e)
return host_msg

return overall_tooltip
74 changes: 1 addition & 73 deletions alignak_app/items/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def get_tooltip(self):
action = _('not monitored')

if action:
return _('%s is %s and %s') % (self.name.capitalize(), self.data['ls_state'], action)
return _('%s is %s but %s') % (self.name.capitalize(), self.data['ls_state'], action)

return _('%s is %s') % (self.name.capitalize(), self.data['ls_state'])

Expand Down Expand Up @@ -221,75 +221,3 @@ def get_overall_state_icon(services, host_overall):
except IndexError: # pragma: no cover
logger.error('Empty services and no host overall state id, can\'t get real host state icon')
return 'all_services_none'


def get_host_msg_and_event_type(host_and_services):
"""
Return corresponding event icon to number of services who are in alert
:param host_and_services: Host() item and its Service() items
:type host_and_services: dict
:return: event type and message
:rtype: dict
"""

host_msg = host_and_services['host'].get_tooltip()

event_messages = [
{
'message': _('%s. You have nothing to do.') % (
host_msg
),
'event_type': 'OK'
},
{
'message': _('%s and his services are ok or acknowledged.') % (
host_msg
),
'event_type': 'INFO'
},
{
'message': _('%s and his services are ok or downtimed.') % (
host_msg
),
'event_type': 'INFO'
},
{
'message': _('%s, some services may be unknown.') % (
host_msg
),
'event_type': 'WARNING'
},
{
'message': _('%s, some services may be in critical condition or unreachable !') % (
host_msg
),
'event_type': 'DOWN'
},
{
'message': _('%s, some services are not monitored.') % (
host_msg
),
'event_type': 'DOWN'
}
]
state_lvl = []

for service in host_and_services['services']:
state_lvl.append(service.data['_overall_state_id'])
state_lvl.append(host_and_services['host'].data['_overall_state_id'])

try:
max_state_lvl = max(state_lvl)
msg_and_event_type = event_messages[max_state_lvl]

if not host_and_services['services']:
msg_and_event_type['message'] = '%s, no services...' % host_msg
except IndexError as e:
logger.error('get_host_msg_and_event_type(): can\'t get message, %s', e)
return {
'message': _('Host is %s.') % host_msg,
'event_type': host_and_services['host'].data['ls_state']
}

return msg_and_event_type
22 changes: 22 additions & 0 deletions alignak_app/qobjects/events/item.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,3 +104,25 @@ def get_icon(event_type):
return key

return 'error'

@staticmethod
def get_event_type(data):
"""
Return event type depending of data content
:param data: data of backend item
:type data: dict
:return: event type for item
:rtype: str
"""

event_type = ''
if data['ls_acknowledged']:
event_type = 'ACK'
if data['ls_downtimed']:
event_type = 'DOWNTIME'

if not event_type:
event_type = data['ls_state']

return event_type
21 changes: 10 additions & 11 deletions alignak_app/qobjects/events/spy.py
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,11 @@ def send_spy_events(self):
if self.spy_list_widget.spied_hosts:
for host_id in self.spy_list_widget.spied_hosts:
host = data_manager.get_item('host', host_id)
msg = '%s still have problems...' % host.get_display_name()

get_events_widget().add_event(
host.data['ls_state'],
msg,
EventItem.get_event_type(host.data),
_('Host %s, current state: %s') % (
host.get_display_name(), host.data['ls_state']),
host=host.item_id
)

Expand Down Expand Up @@ -147,11 +148,9 @@ def manage_host_events(self, row):
if services:
problems = False
for service in services:
if service.data['ls_state'] in ['WARNING', 'CRITICAL', 'UNKNOWN'] and \
not service.data['ls_acknowledged'] and \
not service.data['ls_downtimed']:
if data_manager.is_problem('service', service.data):
problems = True
svc_state = 'Service %s is %s' % (
svc_state = _('Service %s is %s') % (
service.get_display_name(), service.data['ls_state']
)

Expand All @@ -167,17 +166,17 @@ def manage_host_events(self, row):
if not problems:
event = EventItem()
event.initialize(
'WARNING',
'%s is %s but services of host seems managed.' % (
host.data['ls_state'],
_('%s is %s. Services of host seems managed.') % (
host.get_display_name(), host.data['ls_state']),
host=host.item_id
)
self.host_list_widget.insertItem(0, event)
else:
no_service_event = EventItem()
no_service_event.initialize(
'WARNING',
'No services for this host'
host.data['ls_state'],
_('%s is %s. No services.') % (host.get_display_name(), host.data['ls_state'])
)
self.host_list_widget.insertItem(0, no_service_event)

Expand Down
8 changes: 4 additions & 4 deletions alignak_app/qobjects/events/spy_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,14 +67,14 @@ def add_spy_host(self, host_id):
self.spied_hosts.append(host_id)
host = data_manager.get_item('host', '_id', host_id)
if host:
item = EventItem()
item.initialize(
host.data['ls_state'],
event_item = EventItem()
event_item.initialize(
EventItem.get_event_type(host.data),
_('Host %s, current state: %s') % (
host.get_display_name(), host.data['ls_state']),
host=host.item_id
)
self.insertItem(0, item)
self.insertItem(0, event_item)

logger.info('Spy a new host: %s', host.name)
logger.debug('... with id: %s', host_id)
Expand Down
7 changes: 2 additions & 5 deletions alignak_app/qobjects/host/host.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,8 +32,7 @@

from alignak_app.backend.backend import app_backend
from alignak_app.backend.datamanager import data_manager
from alignak_app.items.item import get_host_msg_and_event_type, Item
from alignak_app.items.item import get_icon_name, get_overall_state_icon
from alignak_app.items.item import Item, get_icon_name, get_overall_state_icon
from alignak_app.utils.config import settings
from alignak_app.utils.time import get_time_diff_since_last_timestamp

Expand Down Expand Up @@ -426,9 +425,7 @@ def update_host(self, host_item=None):

self.labels['host_icon'].setPixmap(QPixmap(icon_pixmap))
self.labels['host_icon'].setToolTip(
get_host_msg_and_event_type(
{'host': self.host_item, 'services': self.service_items}
)['message']
self.host_item.get_overall_tooltip(self.service_items)
)
self.labels['host_name'].setText('%s' % self.host_item.get_display_name())

Expand Down
38 changes: 21 additions & 17 deletions test/test_all_items.py
Original file line number Diff line number Diff line change
Expand Up @@ -194,23 +194,6 @@ def test_get_real_host_state_icon(self):
under_test = get_overall_state_icon([], 10)
self.assertEqual('all_services_none', under_test)

def test_get_host_msg_and_event_type(self):
"""Get Host Message and Event Type"""

data_manager.update_database('host', self.host_list)
data_manager.update_database('service', self.service_list)

host_and_services = data_manager.get_host_with_services('_id1')

under_test = get_host_msg_and_event_type(host_and_services)

self.assertEqual(
'Host1 is UNKNOWN and acknowledged, '
'some services may be in critical condition or unreachable !',
under_test['message']
)
self.assertEqual(under_test['event_type'], 'DOWN')

def test_get_request_history_model(self):
"""Get History Request Model"""

Expand Down Expand Up @@ -307,6 +290,27 @@ def test_get_request_host_model(self):
self.assertTrue('params' in under_test)
self.assertTrue('projection' in under_test)

def test_get_overall_tooltip(self):
"""Get Overall Tooltip of Host"""

under_test = Host()
under_test.create(
'_id1',
{
'_overall_state_id': 1,
'ls_state': 'DOWN',
'ls_downtimed': True,
'ls_acknowledged': False,
'active_checks_enabled': True,
'passive_checks_enabled': False,
},
'hostname'
)

tooltip_test = under_test.get_overall_tooltip([])

self.assertEqual('Hostname is DOWN but downtimed, no services...', tooltip_test)

def test_get_request_service_model(self):
"""Get Service Request Model"""

Expand Down
5 changes: 4 additions & 1 deletion test/test_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,7 @@ def test_query_hosts_data(self):
self.assertIsNotNone(data_manager.database['host'])

self.assertTrue(data_manager.db_is_ready['host'])
self.assertTrue(data_manager.db_is_ready['problems']['host'])

def test_query_services_data(self):
"""Query Services Data"""
Expand Down Expand Up @@ -209,9 +210,11 @@ def test_query_problems(self):
under_test.query_services_problems('WARNING')

self.assertIsNotNone(data_manager.database['problems'])

self.assertTrue(data_manager.db_is_ready['problems']['WARNING'])

under_test.query_services_problems('UNKNOWN')
self.assertTrue(data_manager.db_is_ready['problems']['UNKNOWN'])

def test_query_daemons_data(self):
"""Query Daemons Data"""

Expand Down
23 changes: 23 additions & 0 deletions test/test_event_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -109,3 +109,26 @@ def test_get_event_item_icon(self):
# Found not equal to error
under_test = EventItem.get_icon('UNREACHABLE')
self.assertNotEqual('error', under_test)

def test_get_event_type(self):
"""Get Event Type"""

data_test = {
'ls_state': 'OK',
'ls_acknowledged': False,
'ls_downtimed': False,
}

# Return state if not ack or downtimed
under_test = EventItem.get_event_type(data_test)
self.assertEqual('OK', under_test)

# Return "ACK" if acknowledged
data_test['ls_acknowledged'] = True
under_test = EventItem.get_event_type(data_test)
self.assertEqual('ACK', under_test)

# Return "DOWNTIME" if downtimed
data_test['ls_downtimed'] = True
under_test = EventItem.get_event_type(data_test)
self.assertEqual('DOWNTIME', under_test)
4 changes: 2 additions & 2 deletions test/test_spy_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ def test_manage_host_events_with_valid_rows(self):
# Host list equal to 1, No services are attached to host
self.assertEqual(1, under_test.host_list_widget.count())
self.assertEqual(
'No services for this host',
'Hostname is DOWN. No services.',
under_test.host_list_widget.item(0).data(Qt.DisplayRole)
)

Expand Down Expand Up @@ -286,6 +286,6 @@ def test_manage_host_events_with_valid_rows(self):
# Host list equal to 1, cause one service is CRITICAL
self.assertEqual(1, under_test.host_list_widget.count())
self.assertEqual(
'Hostname is DOWN but services of host seems managed.',
'Hostname is DOWN. Services of host seems managed.',
under_test.host_list_widget.item(0).data(Qt.DisplayRole)
)

0 comments on commit 1a579d0

Please sign in to comment.