diff --git a/python/nav/web/ipdevinfo/views.py b/python/nav/web/ipdevinfo/views.py index 7194eb01c6..84a054e48b 100644 --- a/python/nav/web/ipdevinfo/views.py +++ b/python/nav/web/ipdevinfo/views.py @@ -37,6 +37,7 @@ from nav.models.arnold import Identity from nav.models.service import Service from nav.models.profiles import Account +from nav.models.event import AlertHistory from nav.ipdevpoll.config import get_job_descriptions from nav.util import is_valid_ip from nav.web.ipdevinfo.utils import create_combined_urls @@ -597,11 +598,34 @@ def port_details(request, netbox_sysname, port_type=None, port_id=None, 'graphite_error': graphite_error, 'detention': detention, 'sensor_metrics': sensor_metrics, + 'alert_info': get_recent_alerts_interface(port) }, context_instance=RequestContext( request, processors=[search_form_processor])) +def get_recent_alerts_interface(interface, days_back=7): + """Returns the most recent linkState events for this interface""" + lowest_end_time = dt.datetime.now() - dt.timedelta(days=days_back) + alerts = AlertHistory.objects.filter( + event_type='linkState', + subid=interface.pk, + end_time__gt=lowest_end_time) + for alert in alerts: + try: + message = alert.messages.filter(type='sms')[0].message + except IndexError: + message = None + alert.message = message + + return { + 'alerts': alerts, + 'count': alerts.count(), + 'days_back': days_back, + 'has_unresolved_alerts': any(a.is_open() for a in alerts), + } + + def port_counter_graph(request, interfaceid, kind='Octets'): """Creates an url to Graphite for rendering a graph as an image diff --git a/templates/ipdevinfo/port-details-recent-alerts-frag.html b/templates/ipdevinfo/port-details-recent-alerts-frag.html new file mode 100644 index 0000000000..30786c92fa --- /dev/null +++ b/templates/ipdevinfo/port-details-recent-alerts-frag.html @@ -0,0 +1,66 @@ +
+ {% if port %} + + {# Table for listing recent alerts #} +

+ Alerts last {{ alert_info.days_back }} + day{{ alert_info.days_back|pluralize }} +

+ + + + + + + + + + + + + + + + + + + {% for a in alert_info.alerts %} + + + + + {% if a.is_open %} + + {% else %} + + {% endif %} + + + {% empty %} + + + + {% endfor %} + +
EventMessageStartEndDowntime
+ {{ alert_info.alerts|length }} + alert{{ alert_info.alerts|length|pluralize }} + found +
{{ a.event_type }} + + {{ a.message|default:"N/A" }} + + {{ a.start_time|date|default:"N/A" }} + {{ a.start_time|time }}Unresolved{{ a.end_time|date|default:"N/A" }} + {{ a.end_time|time }} + {% if a.is_stateful %} + {% if a.is_open %} + {{ a.start_time|timesince }} + {% else %} + {{ a.start_time|timesince:a.end_time }} + {% endif %} + {% endif %} +
No matching alerts found.
+ + {% endif %} +
diff --git a/templates/ipdevinfo/port-details.html b/templates/ipdevinfo/port-details.html index f26f864077..55dbedc0eb 100644 --- a/templates/ipdevinfo/port-details.html +++ b/templates/ipdevinfo/port-details.html @@ -12,6 +12,8 @@ } }); tabs.removeClass('notvisible').show(); + // Mark error tab + $('li[data-mark-as-error="True"]', tabs).removeClass('ui-state-default').addClass('ui-state-error'); }); {% endblock %} @@ -61,6 +63,9 @@
  • Activity graphs
  • Metric list
  • Port Sensors
  • +
  • + Recent alerts +
  • @@ -118,6 +123,11 @@

    Metrics

    {% include 'ipdevinfo/port-details-sensors-frag.html' %} + {# Recent alerts for this interface #} +
    + {% include "ipdevinfo/port-details-recent-alerts-frag.html" %} +
    +