Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Groups management / hosts/services SLA panels #490

Merged
merged 7 commits into from
Apr 22, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
52 changes: 38 additions & 14 deletions module/datamanager.py
Original file line number Diff line number Diff line change
Expand Up @@ -527,26 +527,39 @@ def search_hosts_and_services(self, search, user, get_impacts=True, sorter=None)
items = new_items

if (t == 'hg' or t == 'hgroup') and s.lower() != 'all':
logger.debug("[WebUI - datamanager] searching for a hostgroup %s", s)
logger.debug("[WebUI - datamanager] searching for items in the hostgroup %s", s)
group = self.get_hostgroup(s)
if not group:
return []
# Items have a item.get_groupnames() method that returns a comma separated string ...
items = [i for i in items if group in i.get_groupnames().split(',')]
# Items have a item.get_groupnames() method that returns a comma separated string ... strange format!
for item in items:
if group.get_name() in item.get_groupnames().split(', '):
logger.debug("[WebUI - datamanager] => item %s is a known member!", item.get_name())
items = [i for i in items if group.get_name() in i.get_groupnames().split(', ')]

if (t == 'sg' or t == 'sgroup') and s.lower() != 'all':
logger.warning("[WebUI - datamanager] searching for a servicegroup %s", s)
logger.debug("[WebUI - datamanager] searching for items in the servicegroup %s", s)
group = self.get_servicegroup(s)
if not group:
return []
# Items have a item.get_groupnames() method that returns a comma separated string ...
items = [i for i in items if group in i.get_groupnames().split(',')]
# Items have a item.get_groupnames() method that returns a comma+space separated string ... strange format!
for item in items:
if group.get_name() in item.get_groupnames().split(', '):
logger.debug("[WebUI - datamanager] => item %s is a known member!", item.get_name())
items = [i for i in items if group.get_name() in i.get_groupnames().split(', ')]

#@mohierf: to be refactored!
if (t == 'cg' or t == 'cgroup') and s.lower() != 'all':
logger.debug("[WebUI - datamanager] searching for a contactgroup %s", s)
logger.info("[WebUI - datamanager] searching for items related with the contactgroup %s", s)
group = self.get_contactgroup(s, user)
if not group:
return []
# Items have a item.get_groupnames() method that returns a comma+space separated string ... strange format!
for item in items:
for contact in item.contacts:
if group.get_name() in contact.get_groupnames().split(', '):
logger.debug("[WebUI - datamanager] => contact %s is a known member!", contact.get_name())

contacts = [c for c in self.get_contacts(user=user) if c in group.members]
items = list(set(itertools.chain(*[self._only_related_to(items, self.rg.contacts.find_by_name(c)) for c in contacts])))

Expand Down Expand Up @@ -874,13 +887,12 @@ def set_hostgroups_level(self, user):
# All known hostgroups are level 0 groups ...
for group in self.get_hostgroups(user=user):
logger.debug("[WebUI - datamanager] set_hostgroups_level, group: %s", group)
# logger.info("[WebUI - datamanager] set_hostgroups_level, group members: %s", group.members)
if not hasattr(group, 'level'):
self.set_hostgroup_level(group, 0, user)

def set_hostgroup_level(self, group, level, user):
logger.debug("[WebUI - datamanager] set_hostgroup_level, group: %s, level: %d", group, level)
setattr(group, 'level', level)
logger.debug("[WebUI - datamanager] set_hostgroup_level, group: %s, level: %d", group, level)

for g in sorted(group.get_hostgroup_members()):
if not g:
Expand All @@ -892,7 +904,7 @@ def set_hostgroup_level(self, group, level, user):
except AttributeError:
pass

def get_hostgroups(self, user=None, name=None, parent=None, members=False):
def get_hostgroups(self, user=None, name=None, parent=None):
""" Get a list of known hosts groups

:param user: concerned user
Expand All @@ -919,7 +931,7 @@ def get_hostgroups(self, user=None, name=None, parent=None, members=False):
else:
return self._only_related_to(items, user)

def get_hostgroup(self, name, user=None, members=False):
def get_hostgroup(self, name, user=None):
""" Get a specific hosts group

:param name: searched hosts group name
Expand All @@ -931,21 +943,33 @@ def get_hostgroup(self, name, user=None, members=False):
except UnicodeEncodeError:
pass

return self._is_related_to(self.get_hostgroups(user=user, name=name, members=members), user)
group = self.get_hostgroups(user=user, name=name)
return self._is_related_to(self.get_hostgroups(user=user, name=name), user)

def get_hostgroup_members(self, name, user=None):
def get_hostgroup_hosts(self, name, user=None):
""" Get a list of hosts members of a group

:param name: searched group name
:param user: concerned user
:returns: List of hosts groups related to the user
"""
logger.warning("[WebUI - datamanager] get_hostgroup_hosts: %s", name)
try:
name = name.decode('utf8', 'ignore')
except UnicodeEncodeError:
pass

return self._is_related_to(self.get_hostgroup(user=user, name=name, members=True), user)
group = self.get_hostgroup(user=user, name=name)
logger.warning("[WebUI - datamanager] get_hostgroup_hosts, found: %s", group)
if group:
for host in group.get_hosts():
logger.warning("[WebUI - datamanager] -> host: %s, contacts: %s", host.get_name(), host.contacts)
if user:
for contact in host.contacts:
if contact.contact_name == user.contact_name:
logger.info("[WebUI - relation], user is a contact through an hostgroup")
return self._is_related_to(group.get_hosts(), user)
return None

##
# Services groups
Expand Down
158 changes: 44 additions & 114 deletions module/plugins/dashboard/views/currently.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -540,77 +540,42 @@
</div>
<div id="p_panel_percentage_hosts" class="panel-collapse collapse {{'in' if not panels['panel_percentage_hosts']['collapsed'] else ''}}">
<div class="panel-body">
<!-- Hosts -->
<div class="col-xs-6 col-sm-3">
<!-- Hosts SLA icons -->
<div class="col-xs-4 col-sm-4 text-center">
%if username != 'anonymous':
<a href="/all?search=type:host is:UP" class="btn btn-sm">
<a href="/all?search=type:host" class="btn">
%end
<div>
%state = h['pct_up']
%font='ok' if state >= app.hosts_states_critical else 'warning' if state >= app.hosts_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{h['pct_up']}}%</span>
%state = (100 - h['pct_up'])
%font='ok' if state >= app.hosts_states_warning else 'warning' if state >= app.hosts_states_critical else 'critical'
<span class="badger-big badger-right font-{{font}}">{{state}}%</span>
</div>

<i class="fa fa-5x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Hosts up</p>
<i class="fa fa-4x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;SLA</p>

%if username != 'anonymous':
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:host is:UNREACHABLE" class="btn btn-sm">
%end
<div>
%state = 100.0-h['pct_unreachable']
%font='ok' if state >= app.hosts_states_critical else 'warning' if state >= app.hosts_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{h['pct_unreachable']}}%</span>
</div>

<i class="fa fa-5x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Hosts unreachable</p>

%if username != 'anonymous':
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:host is:DOWN" class="btn btn-sm">
%end
<div>
%state = 100.0-h['pct_down']
%font='ok' if state >= app.hosts_states_critical else 'warning' if state >= app.hosts_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{h['pct_down']}}%</span>
</div>

<i class="fa fa-5x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Hosts down</p>

%if username != 'anonymous':
%for state in 'up', 'unreachable', 'down':
<div class="col-xs-4 col-sm-4 text-center">
<a role="button" href="/all?search=type:host is:{{state}} isnot:ack isnot:downtime" class="font-{{state.lower()}}">
<span class="hosts-count" data-count="{{ h['nb_' + state] }}" data-state="{{ state }}" style="font-size: 1.8em;">{{ h['pct_' + state] }}%</span>
<br/>
<span style="font-size: 1em;">{{ state }}</span>
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:host is:UNKNOWN" class="btn btn-sm">
%end
<div>
%state = 100.0-h['pct_unknown']
%font='ok' if state >= app.hosts_states_critical else 'warning' if state >= app.hosts_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{h['pct_unknown']}}%</span>
</div>

<i class="fa fa-5x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Hosts unknown</p>

%if username != 'anonymous':
%end
%known_problems=h['nb_ack']+h['nb_downtime']+h['nb_unknown']
%pct_known_problems=round(100.0 * known_problems / h['nb_elts'], 2)
<div class="col-xs-4 col-sm-4 text-center">
<a role="button" href="/all?search=type:host is:ack" class="font-unknown">
<span class="hosts-count" data-count="{{ h['nb_' + state] }}" data-state="{{ state }}" style="font-size: 1.8em;">{{ pct_known_problems }}%</span>
<br/>
<span style="font-size: 1em;">Known problems</span>
</a>
%end
</div>
</div>
</div>
Expand All @@ -629,77 +594,42 @@
</div>
<div id="p_panel_percentage_services" class="panel-collapse collapse {{'in' if not panels['panel_percentage_services']['collapsed'] else ''}}">
<div class="panel-body">
<!-- Services -->
<div class="col-xs-6 col-sm-3">
<!-- Services SLA icons -->
<div class="col-xs-4 col-sm-4 text-center">
%if username != 'anonymous':
<a href="/all?search=type:service is:OK" class="btn btn-sm">
<a href="/all?search=type:service" class="btn">
%end
<div>
%state = s['pct_ok']
%font='ok' if state >= app.services_states_critical else 'warning' if state >= app.services_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{s['pct_ok']}}%</span>
%state = (100 - s['pct_ok'])
%font='ok' if state >= app.services_states_warning else 'warning' if state >= app.services_states_critical else 'critical'
<span class="badger-big badger-right font-{{font}}">{{state}}%</span>
</div>

<i class="fa fa-5x fa-bars font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Services ok</p>
<i class="fa fa-4x fa-server font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;SLA</p>

%if username != 'anonymous':
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:service is:WARNING" class="btn btn-sm">
%end
<div>
%state = 100.0-s['pct_warning']
%font='ok' if state >= app.services_states_critical else 'warning' if state >= app.services_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{s['pct_warning']}}%</span>
</div>

<i class="fa fa-5x fa-bars font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Services warning</p>

%if username != 'anonymous':
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:service is:CRITICAL" class="btn btn-sm">
%end
<div>
%state = 100.0-s['pct_critical']
%font='ok' if state >= app.services_states_critical else 'warning' if state >= app.services_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{s['pct_critical']}}%</span>
</div>

<i class="fa fa-5x fa-bars font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Services critical</p>

%if username != 'anonymous':
%for state in 'ok', 'warning', 'critical':
<div class="col-xs-4 col-sm-4 text-center">
<a role="button" href="/all?search=type:service is:{{state}} isnot:ack isnot:downtime" class="font-{{state.lower()}}">
<span class="services-count" data-count="{{ s['nb_' + state] }}" data-state="{{ state }}" style="font-size: 1.8em;">{{ s['pct_' + state] }}%</span>
<br/>
<span style="font-size: 1em;">{{ state }}</span>
</a>
%end
</div>

<div class="col-xs-6 col-sm-3">
%if username != 'anonymous':
<a href="/all?search=type:host is:UNKNOWN" class="btn btn-sm">
%end
<div>
%state = 100.0-s['pct_unknown']
%font='ok' if state >= app.services_states_critical else 'warning' if state >= app.services_states_warning else 'critical'
<span class="badger-big badger-right font-{{font}}">{{s['pct_unknown']}}%</span>
</div>

<i class="fa fa-5x fa-bars font-{{font}}"></i>
<p class="badger-title font-{{font}}">&nbsp;Services unknown</p>

%if username != 'anonymous':
%end
%known_problems=s['nb_ack']+s['nb_downtime']+s['nb_unknown']
%pct_known_problems=round(100.0 * known_problems / s['nb_elts'], 2)
<div class="col-xs-4 col-sm-4 text-center">
<a role="button" href="/all?search=type:service is:ack" class="font-unknown">
<span class="services-count" data-count="{{ s['nb_' + state] }}" data-state="{{ state }}" style="font-size: 1.8em;">{{ pct_known_problems }}%</span>
<br/>
<span style="font-size: 1em;">Known problems</span>
</a>
%end
</div>
</div>
</div>
Expand Down
4 changes: 1 addition & 3 deletions module/plugins/groups/groups.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,11 +38,9 @@ def show_contactgroups():
level = int(app.request.GET.get('level', 0))
parent = app.request.GET.get('parent', None)

cgroups = sorted(app.datamgr.get_contactgroups(parent=parent, user=user), key=lambda cg: cg.contactgroup_name)

return {
'level': level,
'contactgroups': cgroups,
'contactgroups': sorted(app.datamgr.get_contactgroups(parent=parent, user=user), key=lambda cg: cg.contactgroup_name),
'user': user
}

Expand Down
Loading