# # Copyright (c) 2013-2015 Wind River Systems, Inc. # # The right to copy, distribute, modify, or otherwise make use # of this software may be licensed only pursuant to the terms # of an applicable Wind River license agreement. # import logging from django.core.urlresolvers import reverse # noqa # from django.template import defaultfilters as filters from django import template from django.utils.translation import string_concat # noqa from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext_lazy from horizon import exceptions from horizon import tables from openstack_dashboard import api from openstack_dashboard.dashboards.admin.inventory import tables as itables LOG = logging.getLogger(__name__) class AddSensorGroup(tables.LinkAction): name = "addsensorgroup" verbose_name = ("Add Sensor Group") url = "horizon:admin:inventory:addsensorgroup" classes = ("ajax-modal", "btn-create") icon = "plus" def get_link_url(self, datum=None): host_id = self.table.kwargs['host_id'] return reverse(self.url, args=(host_id,)) def allowed(self, request, datum): host = self.table.kwargs['host'] self.verbose_name = _("Add Sensor Group") classes = [c for c in self.classes if c != "disabled"] self.classes = classes if not host._administrative == 'locked': if "disabled" not in self.classes: self.classes = [c for c in self.classes] + ['disabled'] self.verbose_name = string_concat(self.verbose_name, ' ', _("(Node Unlocked)")) return True # The action should always be displayed class RemoveSensorGroup(tables.DeleteAction): data_type_singular = _("Sensor Group") data_type_plural = _("Sensor Groups") def allowed(self, request, sensorgroup=None): host = self.table.kwargs['host'] return host._administrative == 'locked' def delete(self, request, sensorgroup_id): host_id = self.table.kwargs['host_id'] try: api.sysinv.host_sensorgroup_delete(request, sensorgroup_id) except Exception: msg = _('Failed to delete host %(hid)s ' 'sensor group %(sensorgroup)s') % \ {'hid': host_id, 'sensorgroup': sensorgroup_id} redirect = reverse('horizon:admin:inventory:detail', args=(host_id,)) exceptions.handle(request, msg, redirect=redirect) class EditSensorGroup(tables.LinkAction): name = "update" verbose_name = _("Edit SensorGroup") url = "horizon:admin:inventory:editsensorgroup" classes = ("ajax-modal", "btn-edit") def get_link_url(self, sensorgroup=None): host_id = self.table.kwargs['host_id'] # sensorgroup_uuid = self.table.kwargs['sensorgroup_id'] return reverse(self.url, args=(host_id, sensorgroup.uuid)) def allowed(self, request, datum): # host = self.table.kwargs['host'] return True # return host._administrative == 'locked' def sensorgroup_suppressed(sensorgroup=None): if not sensorgroup: return False return (sensorgroup.suppress == "True") def get_sensorgroup_suppress(sensorgroup): suppress_str = "" if sensorgroup_suppressed(sensorgroup): suppress_str = "suppressed" return suppress_str class SuppressSensorGroup(tables.BatchAction): name = "suppress" action_type = 'danger' confirm_class = 'btn-danger' @staticmethod def action_present(count): return ungettext_lazy( u"Suppress SensorGroup", u"Suppress SensorGroups", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Suppressed SensorGroup", u"Suppressed SensorGroups", count ) def get_confirm_message(self, request, datum): return _("WARNING: This operation will suppress actions " "for sensorgroup '%s'. This will affect all sensors in " "this sensorgroup.") % datum.sensorgroupname def allowed(self, request, sensorgroup=None): return not sensorgroup_suppressed(sensorgroup) def action(self, request, sensorgroup_id): api.sysinv.host_sensorgroup_suppress(request, sensorgroup_id) def handle(self, table, request, obj_ids): return itables.handle_sysinv(self, table, request, obj_ids) class UnSuppressSensorGroup(tables.BatchAction): name = "unsuppress" classes = ('btn-warning', 'btn-unsuppress') @staticmethod def action_present(count): return ungettext_lazy( u"UnSuppress SensorGroup", u"UnSuppress SensorGroups", count ) @staticmethod def action_past(count): return ungettext_lazy( u"UnSuppressed SensorGroup", u"UnSuppressed SensorGroups", count ) def allowed(self, request, sensorgroup=None): return sensorgroup_suppressed(sensorgroup) def action(self, request, sensorgroup_id): api.sysinv.host_sensorgroup_unsuppress(request, sensorgroup_id) def handle(self, table, request, obj_ids): return itables.handle_sysinv(self, table, request, obj_ids) def get_sensors(sensorgroup): sensor_str_list = ", ".join(sensorgroup.sensorNameList) return sensor_str_list def get_sensorgroups(sensor): sensorgroup_str_list = ", ".join(sensor.sensorgroupNameList) return sensorgroup_str_list def get_sensorgroup_actions(sensorgroup): # if sensorgroup.something_configured == 'True': template_name = \ 'admin/inventory/sensors/_sensorgroup_actions.html' context = {"sensorgroup": sensorgroup} return template.loader.render_to_string(template_name, context) def get_sensor_actions(sensor): # if sensor.something_configured == 'True': template_name = \ 'admin/inventory/sensors/_sensor_actions.html' context = {"sensor": sensor} return template.loader.render_to_string(template_name, context) class RelearnSensorModel(tables.Action): name = "relearn" requires_input = False icon = "refresh" action_type = 'danger' verbose_name = _("Relearn Sensor Model") confirm_message = "This operation will delete this sensor model." \ "All alarm assertions against this model will be " \ "cleared. Any sensor suppression settings at the " \ "group or sensor levels will be lost. " \ "Will attempt to preserve customized group actions " \ "and monitor interval in new model." def allowed(self, request, datum): bm_type = self.table.kwargs['host'].bm_type return bm_type and bm_type.lower() != 'none' def single(self, table, request, obj_ids): LOG.debug("requesting relearn of sensor model for host " "%s", table.kwargs['host'].uuid) api.sysinv.host_sensorgroup_relearn(request, table.kwargs['host'].uuid) class SensorGroupsTable(tables.DataTable): name = tables.Column('sensorgroupname', link="horizon:admin:inventory:sensorgroupdetail", verbose_name=('Name')) sensor_type = tables.Column('sensortype', verbose_name=('SensorType')) sensor_state = tables.Column('state', verbose_name=('State')) sensors = tables.Column(get_sensors, verbose_name=('Sensors'), help_text=_("Sensors in SensorGroup.")) actions_group = tables.Column(get_sensorgroup_actions, verbose_name=('Sensor Handling Actions'), help_text=_("Actions performed on " "Sensor Event.")) suppressed = tables.Column(get_sensorgroup_suppress, verbose_name=('Suppression'), help_text=_("Indicates 'suppressed' if Actions " "are suppressed.")) def get_object_id(self, datum): return unicode(datum.uuid) def get_object_display(self, datum): return datum.sensorgroupname class Meta(object): name = "sensorgroups" verbose_name = ("Sensor Groups") columns = ('name', 'sensor_type', 'sensor_state', 'sensors', 'actions_group', 'suppressed') multi_select = False row_actions = (EditSensorGroup, UnSuppressSensorGroup, SuppressSensorGroup) table_actions = (RelearnSensorModel,) hidden_title = False class EditSensor(tables.LinkAction): name = "updatesensor" verbose_name = _("Edit Sensor") url = "horizon:admin:inventory:editsensor" classes = ("ajax-modal", "btn-edit") def get_link_url(self, sensor=None): host_id = self.table.kwargs['host_id'] # sensorgroup_uuid = self.table.kwargs['sensorgroup_id'] return reverse(self.url, args=(host_id, sensor.uuid)) def allowed(self, request, datum): # host = self.table.kwargs['host'] return True # return host._administrative == 'locked' def sensor_suppressed(sensor=None): if not sensor: return False return (sensor.suppress == "True") def get_suppress(sensor): suppress_str = "" if sensor_suppressed(sensor): suppress_str = "suppressed" return suppress_str class SuppressSensor(tables.BatchAction): name = "suppress" classes = ('btn-confirm', 'btn-suppress') confirm_class = 'btn-confirm' @staticmethod def action_present(count): return ungettext_lazy( u"Suppress Sensor", u"Suppress Sensors", count ) @staticmethod def action_past(count): return ungettext_lazy( u"Suppressed Sensor", u"Suppressed Sensors", count ) def get_confirm_message(self, request, datum): return _("WARNING: This operation will suppress actions " " for sensor '%s'. ") % datum.sensorname def allowed(self, request, sensor=None): return not sensor_suppressed(sensor) def action(self, request, sensor_id): api.sysinv.host_sensor_suppress(request, sensor_id) def handle(self, table, request, obj_ids): return itables.handle_sysinv(self, table, request, obj_ids) class UnSuppressSensor(tables.BatchAction): name = "unsuppress" classes = ('btn-warning', 'btn-unsuppress') @staticmethod def action_present(count): return ungettext_lazy( u"UnSuppress Sensor", u"UnSuppress Sensors", count ) @staticmethod def action_past(count): return ungettext_lazy( u"UnSuppressed Sensor", u"UnSuppressed Sensors", count ) def allowed(self, request, sensor=None): return sensor_suppressed(sensor) def action(self, request, sensor_id): api.sysinv.host_sensor_unsuppress(request, sensor_id) def handle(self, table, request, obj_ids): return itables.handle_sysinv(self, table, request, obj_ids) class SensorsFilterAction(tables.FilterAction): def filter(self, table, sensors, filter_string): """Naive case-insensitive search.""" q = filter_string.lower() def comp(sensor): if (q in sensor.sensorname.lower() or q in sensor.sensorgroupname.lower() or q in sensor.sensortype.lower() or q in sensor.state or q in sensor.status): return True return False return filter(comp, sensors) class SensorsTable(tables.DataTable): name = tables.Column('sensorname', link="horizon:admin:inventory:sensordetail", verbose_name=('Name')) sensor_type = tables.Column('sensortype', verbose_name=('SensorType')) sensor_status = tables.Column('status', verbose_name=('Status')) sensor_state = tables.Column('state', verbose_name=('State')) suppressed = tables.Column(get_suppress, verbose_name=('Suppression'), help_text=_("Indicates 'suppressed' if Actions " "are suppressed.")) sensorgroupname = tables.Column(get_sensorgroups, verbose_name=('Sensor Group Name')) def get_object_id(self, datum): return unicode(datum.uuid) def get_object_display(self, datum): return datum.sensorname class Meta(object): name = "sensors" verbose_name = ("Sensors") columns = ('name', 'sensorgroupname', 'sensor_type', 'sensor_state', 'sensor_status', 'suppressed') multi_select = False row_actions = (SuppressSensor, UnSuppressSensor) # EditSensor table_actions = (SensorsFilterAction,) hidden_title = False