402 lines
13 KiB
Python
Executable File
402 lines
13 KiB
Python
Executable File
#
|
|
# 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 _("<b>WARNING</b>: 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 _("<b>WARNING</b>: 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
|