Merge "Refactor the FM panel to leverage AngularJS"
This commit is contained in:
commit
96e49c9a91
|
@ -1,2 +1,2 @@
|
||||||
SRC_DIR="starlingx-dashboard"
|
SRC_DIR="starlingx-dashboard"
|
||||||
TIS_PATCH_VER=22
|
TIS_PATCH_VER=23
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018 Wind River Systems, Inc.
|
# Copyright (c) 2018-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
@ -248,9 +248,14 @@ class EventSuppression(base.APIResourceWrapper):
|
||||||
super(EventSuppression, self).__init__(apiresource)
|
super(EventSuppression, self).__init__(apiresource)
|
||||||
|
|
||||||
|
|
||||||
def event_suppression_list(request):
|
def event_suppression_list(request, include_unsuppressed=False):
|
||||||
|
q = []
|
||||||
|
if not include_unsuppressed:
|
||||||
|
q.append(
|
||||||
|
dict(field='suppression_status', value='suppressed', op='eq',
|
||||||
|
type='string'))
|
||||||
|
|
||||||
suppression_list = fmclient(request).event_suppression.list()
|
suppression_list = fmclient(request).event_suppression.list(q)
|
||||||
|
|
||||||
return [EventSuppression(n) for n in suppression_list]
|
return [EventSuppression(n) for n in suppression_list]
|
||||||
|
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018 Wind River Systems, Inc.
|
# Copyright (c) 2018-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
import logging
|
||||||
|
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
|
||||||
|
@ -11,6 +12,9 @@ from openstack_dashboard.api.rest import utils as rest_utils
|
||||||
from starlingx_dashboard.api import fm
|
from starlingx_dashboard.api import fm
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
@urls.register
|
@urls.register
|
||||||
class AlarmSummary(generic.View):
|
class AlarmSummary(generic.View):
|
||||||
"""API for retrieving alarm summaries."""
|
"""API for retrieving alarm summaries."""
|
||||||
|
@ -22,3 +26,81 @@ class AlarmSummary(generic.View):
|
||||||
include_suppress = request.GET.get('include_suppress', False)
|
include_suppress = request.GET.get('include_suppress', False)
|
||||||
result = fm.alarm_summary_get(request, include_suppress)
|
result = fm.alarm_summary_get(request, include_suppress)
|
||||||
return result.to_dict()
|
return result.to_dict()
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Alarms(generic.View):
|
||||||
|
"""API for retrieving alarms."""
|
||||||
|
url_regex = r'fm/alarm_list/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request):
|
||||||
|
search_opts = {'suppression': 'SUPPRESS_SHOW'}
|
||||||
|
result = fm.alarm_list(request, search_opts=search_opts)
|
||||||
|
|
||||||
|
return {'items': [sc.to_dict() for sc in result]}
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Alarm(generic.View):
|
||||||
|
"""API for retrieving one alarm."""
|
||||||
|
url_regex = r'fm/alarm_get/(?P<uuid>[^/]+|default)/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request, uuid):
|
||||||
|
result = fm.alarm_get(request, uuid)
|
||||||
|
return result.to_dict()
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Events(generic.View):
|
||||||
|
"""API for retrieving events."""
|
||||||
|
url_regex = r'fm/event_log_list/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request):
|
||||||
|
search_opts = {'suppression': 'SUPPRESS_SHOW'}
|
||||||
|
result, _more = fm.event_log_list(request, search_opts=search_opts)
|
||||||
|
|
||||||
|
return {'items': [sc.to_dict() for sc in result]}
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class Event(generic.View):
|
||||||
|
"""API for retrieving one event."""
|
||||||
|
url_regex = r'fm/event_log_get/(?P<uuid>[^/]+|default)/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request, uuid):
|
||||||
|
result = fm.event_log_get(request, uuid)
|
||||||
|
return result.to_dict()
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class EventsSuppression(generic.View):
|
||||||
|
"""API for retrieving events suppression."""
|
||||||
|
url_regex = r'fm/events_suppression_list/$'
|
||||||
|
|
||||||
|
@rest_utils.ajax()
|
||||||
|
def get(self, request):
|
||||||
|
|
||||||
|
if 'include_unsuppressed' in request.GET:
|
||||||
|
include_unsuppressed = True
|
||||||
|
else:
|
||||||
|
include_unsuppressed = False
|
||||||
|
|
||||||
|
result = fm.event_suppression_list(
|
||||||
|
request, include_unsuppressed=include_unsuppressed)
|
||||||
|
return {'items': [sc.to_dict() for sc in result]}
|
||||||
|
|
||||||
|
|
||||||
|
@urls.register
|
||||||
|
class EventSuppression(generic.View):
|
||||||
|
"""API for updating the event suppression."""
|
||||||
|
url_regex = r'fm/event_suppression/(?P<uuid>[^/]+)$'
|
||||||
|
|
||||||
|
@rest_utils.ajax(data_required=True)
|
||||||
|
def patch(self, request, uuid):
|
||||||
|
|
||||||
|
result = fm.event_suppression_update(request, uuid, **(request.DATA))
|
||||||
|
return result.to_dict()
|
||||||
|
|
|
@ -1,9 +1,3 @@
|
||||||
# Copyright 2012 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Copyright 2012 Nebula, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
# not use this file except in compliance with the License. You may obtain
|
# not use this file except in compliance with the License. You may obtain
|
||||||
# a copy of the License at
|
# a copy of the License at
|
||||||
|
@ -16,7 +10,9 @@
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2013-2017 Wind River Systems, Inc.
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||||
|
@ -26,10 +22,9 @@ from openstack_dashboard.api import base
|
||||||
from openstack_dashboard.dashboards.admin import dashboard
|
from openstack_dashboard.dashboards.admin import dashboard
|
||||||
|
|
||||||
|
|
||||||
class FaultManagement(horizon.Panel):
|
class ActiveAlarms(horizon.Panel):
|
||||||
name = _("Fault Management")
|
name = _("Active Alarms")
|
||||||
slug = 'fault_management'
|
slug = "active_alarms"
|
||||||
permissions = ('openstack.services.platform',)
|
|
||||||
|
|
||||||
def allowed(self, context):
|
def allowed(self, context):
|
||||||
if context['request'].user.services_region == 'SystemController':
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
@ -37,7 +32,7 @@ class FaultManagement(horizon.Panel):
|
||||||
if not base.is_service_enabled(context['request'], 'platform'):
|
if not base.is_service_enabled(context['request'], 'platform'):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
return super(FaultManagement, self).allowed(context)
|
return super(ActiveAlarms, self).allowed(context)
|
||||||
|
|
||||||
def nav(self, context):
|
def nav(self, context):
|
||||||
if context['request'].user.services_region == 'SystemController':
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
@ -48,4 +43,4 @@ class FaultManagement(horizon.Panel):
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
dashboard.Admin.register(FaultManagement)
|
dashboard.Admin.register(ActiveAlarms)
|
|
@ -0,0 +1,29 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.conf.urls import url
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from horizon.browsers import views
|
||||||
|
|
||||||
|
from starlingx_dashboard.dashboards.admin.active_alarms import \
|
||||||
|
views as viewsDjango
|
||||||
|
|
||||||
|
title = _("Active Alarms")
|
||||||
|
urlpatterns = [
|
||||||
|
url(r'^$', views.AngularIndexView.as_view(title=title), name='index'),
|
||||||
|
url(r'^banner/$', viewsDjango.BannerView.as_view(), name='banner')
|
||||||
|
]
|
|
@ -0,0 +1,76 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013-2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _ # noqa
|
||||||
|
from django.views.generic import TemplateView
|
||||||
|
|
||||||
|
from horizon import exceptions
|
||||||
|
from openstack_dashboard.api.base import is_service_enabled
|
||||||
|
from starlingx_dashboard.api import dc_manager
|
||||||
|
from starlingx_dashboard.api import fm
|
||||||
|
|
||||||
|
|
||||||
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class BannerView(TemplateView):
|
||||||
|
template_name = 'header/_alarm_banner.html'
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
|
||||||
|
context = super(BannerView, self).get_context_data(**kwargs)
|
||||||
|
|
||||||
|
if not self.request.is_ajax():
|
||||||
|
raise exceptions.NotFound()
|
||||||
|
|
||||||
|
if (not self.request.user.is_authenticated() or
|
||||||
|
not self.request.user.is_superuser):
|
||||||
|
context["alarmbanner"] = False
|
||||||
|
elif 'dc_admin' in self.request.META.get('HTTP_REFERER'):
|
||||||
|
summaries = self.get_subcloud_data()
|
||||||
|
central_summary = self.get_data()
|
||||||
|
summaries.append(central_summary)
|
||||||
|
context["dc_admin"] = True
|
||||||
|
context["alarmbanner"] = True
|
||||||
|
context["OK"] = len(
|
||||||
|
[s for s in summaries if s.status == 'OK'])
|
||||||
|
context["degraded"] = len(
|
||||||
|
[s for s in summaries if s.status == 'degraded'])
|
||||||
|
context["critical"] = len(
|
||||||
|
[s for s in summaries if s.status == 'critical'])
|
||||||
|
context["disabled"] = len(
|
||||||
|
[s for s in summaries if s.status == 'disabled'])
|
||||||
|
elif is_service_enabled(self.request, 'platform'):
|
||||||
|
context["summary"] = self.get_data()
|
||||||
|
context["alarmbanner"] = True
|
||||||
|
|
||||||
|
return context
|
||||||
|
|
||||||
|
def get_data(self):
|
||||||
|
summary = None
|
||||||
|
try:
|
||||||
|
summary = fm.alarm_summary_get(self.request)
|
||||||
|
except Exception:
|
||||||
|
exceptions.handle(self.request,
|
||||||
|
_('Unable to retrieve alarm summary.'))
|
||||||
|
|
||||||
|
return summary
|
||||||
|
|
||||||
|
def get_subcloud_data(self):
|
||||||
|
return dc_manager.alarm_summary_list(self.request)
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
import horizon
|
||||||
|
from openstack_dashboard.api import base
|
||||||
|
|
||||||
|
|
||||||
|
class Events(horizon.Panel):
|
||||||
|
name = _("Events")
|
||||||
|
slug = "events"
|
||||||
|
|
||||||
|
def allowed(self, context):
|
||||||
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
return False
|
||||||
|
if not base.is_service_enabled(context['request'], 'platform'):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return super(Events, self).allowed(context)
|
||||||
|
|
||||||
|
def nav(self, context):
|
||||||
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
return False
|
||||||
|
if not base.is_service_enabled(context['request'], 'platform'):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.conf.urls import url
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from horizon.browsers import views
|
||||||
|
|
||||||
|
title = _("Events")
|
||||||
|
urlpatterns = [
|
||||||
|
url('', views.AngularIndexView.as_view(title=title), name='index'),
|
||||||
|
]
|
|
@ -0,0 +1,41 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
import horizon
|
||||||
|
from openstack_dashboard.api import base
|
||||||
|
|
||||||
|
|
||||||
|
class EventsSuppression(horizon.Panel):
|
||||||
|
name = _("Events Suppression")
|
||||||
|
slug = "events_suppression"
|
||||||
|
|
||||||
|
def allowed(self, context):
|
||||||
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
return False
|
||||||
|
if not base.is_service_enabled(context['request'], 'platform'):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return super(EventsSuppression, self).allowed(context)
|
||||||
|
|
||||||
|
def nav(self, context):
|
||||||
|
if context['request'].user.services_region == 'SystemController':
|
||||||
|
return False
|
||||||
|
if not base.is_service_enabled(context['request'], 'platform'):
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
|
@ -0,0 +1,25 @@
|
||||||
|
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
# a copy of the License at
|
||||||
|
#
|
||||||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
#
|
||||||
|
# Unless required by applicable law or agreed to in writing, software
|
||||||
|
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
# License for the specific language governing permissions and limitations
|
||||||
|
# under the License.
|
||||||
|
#
|
||||||
|
# Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
|
from django.conf.urls import url
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
from horizon.browsers import views
|
||||||
|
|
||||||
|
title = _("Events Suppression")
|
||||||
|
urlpatterns = [
|
||||||
|
url('', views.AngularIndexView.as_view(title=title), name='index'),
|
||||||
|
]
|
|
@ -1,280 +0,0 @@
|
||||||
# Copyright 2012 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Copyright 2012 Nebula, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
from django.utils.html import escape as escape_html
|
|
||||||
from django.utils.safestring import mark_safe
|
|
||||||
|
|
||||||
from django.utils.translation import pgettext_lazy
|
|
||||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
|
||||||
from django.utils.translation import ungettext_lazy
|
|
||||||
|
|
||||||
from horizon import exceptions
|
|
||||||
from horizon import tables
|
|
||||||
from horizon.utils import filters as utils_filters
|
|
||||||
from starlingx_dashboard import api as stx_api
|
|
||||||
|
|
||||||
SUPPRESSION_STATUS_CHOICES = (
|
|
||||||
("suppressed", False),
|
|
||||||
("unsuppressed", True),
|
|
||||||
("None", True),
|
|
||||||
)
|
|
||||||
SUPPRESSION_STATUS_DISPLAY_CHOICES = (
|
|
||||||
("suppressed", pgettext_lazy("Indicates this type of alarm \
|
|
||||||
is suppressed", "suppressed")),
|
|
||||||
("unsuppressed", pgettext_lazy("Indicates this type of alarm \
|
|
||||||
is unsuppressed", "unsuppressed")),
|
|
||||||
("None", pgettext_lazy("Indicates an event type", "None")),
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class AlarmsLimitAction(tables.LimitAction):
|
|
||||||
verbose_name = _("Alarms")
|
|
||||||
|
|
||||||
|
|
||||||
class AlarmFilterAction(tables.FixedWithQueryFilter):
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(AlarmFilterAction, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
self.filter_choices = [
|
|
||||||
(
|
|
||||||
(stx_api.fm.FM_SUPPRESS_SHOW, _("Show Suppressed"), True),
|
|
||||||
(stx_api.fm.FM_SUPPRESS_HIDE, _('Hide Suppressed'), True)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
self.default_value = stx_api.fm.FM_SUPPRESS_HIDE
|
|
||||||
|
|
||||||
self.disabled_choices = ['enabled']
|
|
||||||
|
|
||||||
|
|
||||||
class AlarmsTable(tables.DataTable):
|
|
||||||
alarm_id = tables.Column('alarm_id',
|
|
||||||
link="horizon:admin:fault_management:detail",
|
|
||||||
verbose_name=_('Alarm ID'))
|
|
||||||
reason_text = tables.Column('reason_text',
|
|
||||||
verbose_name=_('Reason Text'))
|
|
||||||
entity_instance_id = tables.Column('entity_instance_id',
|
|
||||||
verbose_name=_('Entity Instance ID'))
|
|
||||||
suppression_status = \
|
|
||||||
tables.Column('suppression_status',
|
|
||||||
verbose_name=_('Suppression Status'),
|
|
||||||
status=True,
|
|
||||||
status_choices=SUPPRESSION_STATUS_CHOICES,
|
|
||||||
display_choices=SUPPRESSION_STATUS_DISPLAY_CHOICES)
|
|
||||||
severity = tables.Column('severity',
|
|
||||||
verbose_name=_('Severity'))
|
|
||||||
timestamp = tables.Column('timestamp',
|
|
||||||
attrs={'data-type': 'timestamp'},
|
|
||||||
filters=(utils_filters.parse_isotime,),
|
|
||||||
verbose_name=_('Timestamp'))
|
|
||||||
|
|
||||||
def get_object_id(self, obj):
|
|
||||||
return obj.uuid
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = "alarms"
|
|
||||||
verbose_name = _("Active Alarms")
|
|
||||||
status_columns = ["suppression_status"]
|
|
||||||
limit_param = "alarm_limit"
|
|
||||||
pagination_param = "alarm_marker"
|
|
||||||
prev_pagination_param = 'prev_alarm_marker'
|
|
||||||
table_actions = (AlarmFilterAction, AlarmsLimitAction)
|
|
||||||
multi_select = False
|
|
||||||
hidden_title = False
|
|
||||||
|
|
||||||
|
|
||||||
class EventLogsLimitAction(tables.LimitAction):
|
|
||||||
verbose_name = _("Events")
|
|
||||||
|
|
||||||
|
|
||||||
class EventLogsFilterAction(tables.FixedWithQueryFilter):
|
|
||||||
def __init__(self, **kwargs):
|
|
||||||
super(EventLogsFilterAction, self).__init__(**kwargs)
|
|
||||||
|
|
||||||
self.filter_choices = [
|
|
||||||
(
|
|
||||||
(stx_api.fm.FM_ALL, _("All Events"), True),
|
|
||||||
(stx_api.fm.FM_ALARM, _('Alarm Events'), True),
|
|
||||||
(stx_api.fm.FM_LOG, _('Log Events'), True),
|
|
||||||
),
|
|
||||||
(
|
|
||||||
(stx_api.fm.FM_SUPPRESS_SHOW, _("Show Suppressed"), True),
|
|
||||||
(stx_api.fm.FM_SUPPRESS_HIDE, _('Hide Suppressed'), True)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
self.default_value = stx_api.fm.FM_ALL_SUPPRESS_HIDE
|
|
||||||
|
|
||||||
self.disabled_choices = ['enabled', 'enabled']
|
|
||||||
|
|
||||||
|
|
||||||
class EventLogsTable(tables.DataTable):
|
|
||||||
timestamp = tables.Column('timestamp',
|
|
||||||
attrs={'data-type': 'timestamp'},
|
|
||||||
filters=(utils_filters.parse_isotime,),
|
|
||||||
verbose_name=_('Timestamp'))
|
|
||||||
|
|
||||||
state = tables.Column('state', verbose_name=_('State'))
|
|
||||||
event_log_id = tables.Column('event_log_id',
|
|
||||||
link="horizon:admin:fault_management:"
|
|
||||||
"eventlogdetail",
|
|
||||||
verbose_name=_('ID'))
|
|
||||||
reason_text = tables.Column('reason_text', verbose_name=_('Reason Text'))
|
|
||||||
entity_instance_id = tables.Column('entity_instance_id',
|
|
||||||
verbose_name=_('Entity Instance ID'))
|
|
||||||
suppression_status = \
|
|
||||||
tables.Column('suppression_status',
|
|
||||||
verbose_name=_('Suppression Status'),
|
|
||||||
status=True,
|
|
||||||
status_choices=SUPPRESSION_STATUS_CHOICES,
|
|
||||||
display_choices=SUPPRESSION_STATUS_DISPLAY_CHOICES)
|
|
||||||
severity = tables.Column('severity', verbose_name=_('Severity'))
|
|
||||||
|
|
||||||
def get_object_id(self, obj):
|
|
||||||
return obj.uuid
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = "eventLogs"
|
|
||||||
verbose_name = _("Events")
|
|
||||||
status_columns = ["suppression_status"]
|
|
||||||
table_actions = (EventLogsFilterAction,
|
|
||||||
EventLogsLimitAction,)
|
|
||||||
limit_param = "event_limit"
|
|
||||||
pagination_param = "event_marker"
|
|
||||||
prev_pagination_param = 'prev_event_marker'
|
|
||||||
multi_select = False
|
|
||||||
|
|
||||||
|
|
||||||
class SuppressEvent(tables.BatchAction):
|
|
||||||
name = "suppress"
|
|
||||||
action_type = 'danger'
|
|
||||||
icon = "remove"
|
|
||||||
help_text = _("Events with selected Alarm ID will be suppressed.")
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def action_present(count):
|
|
||||||
return ungettext_lazy(
|
|
||||||
"Suppress Event",
|
|
||||||
"Suppress Event",
|
|
||||||
count
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def action_past(count):
|
|
||||||
return ungettext_lazy(
|
|
||||||
"Events suppressed for Alarm ID",
|
|
||||||
"Events suppressed for Alarm ID",
|
|
||||||
count
|
|
||||||
)
|
|
||||||
|
|
||||||
def allowed(self, request, datum):
|
|
||||||
"""Allow suppress action if Alarm ID is unsuppressed."""
|
|
||||||
if datum.suppression_status == stx_api.fm.FM_SUPPRESSED:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def action(self, request, obj_id):
|
|
||||||
kwargs = {"suppression_status": stx_api.fm.FM_SUPPRESSED}
|
|
||||||
|
|
||||||
try:
|
|
||||||
stx_api.fm.event_suppression_update(request, obj_id, **kwargs)
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(request,
|
|
||||||
_('Unable to set specified alarm type to \
|
|
||||||
suppressed\'s.'))
|
|
||||||
|
|
||||||
|
|
||||||
class UnsuppressEvent(tables.BatchAction):
|
|
||||||
name = "unsuppress"
|
|
||||||
action_type = 'danger'
|
|
||||||
icon = "remove"
|
|
||||||
help_text = _("Events with selected Alarm ID will be unsuppressed.")
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def action_present(count):
|
|
||||||
return ungettext_lazy(
|
|
||||||
"Unsuppress Event",
|
|
||||||
"Unsuppress Event",
|
|
||||||
count
|
|
||||||
)
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
def action_past(count):
|
|
||||||
return ungettext_lazy(
|
|
||||||
"Events unsuppressed for Alarm ID",
|
|
||||||
"Events unsuppressed for Alarm ID",
|
|
||||||
count
|
|
||||||
)
|
|
||||||
|
|
||||||
def allowed(self, request, datum):
|
|
||||||
"""Allow unsuppress action if Alarm ID is suppressed."""
|
|
||||||
if datum.suppression_status == stx_api.fm.FM_UNSUPPRESSED:
|
|
||||||
return False
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
def action(self, request, obj_id):
|
|
||||||
kwargs = {"suppression_status": stx_api.fm.FM_UNSUPPRESSED}
|
|
||||||
|
|
||||||
try:
|
|
||||||
stx_api.fm.event_suppression_update(request, obj_id, **kwargs)
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(request,
|
|
||||||
_('Unable to set specified alarm type to \
|
|
||||||
unsuppressed\'s.'))
|
|
||||||
|
|
||||||
|
|
||||||
class EventsSuppressionTable(tables.DataTable):
|
|
||||||
# noinspection PyMethodParameters
|
|
||||||
def description_inject(row_data): # pylint: disable=no-self-argument
|
|
||||||
description = \
|
|
||||||
escape_html(str(row_data.description)).replace("\n", "<br/>")
|
|
||||||
description = description.replace("\t", " ")
|
|
||||||
description = description.replace(" " * 4, " " * 4)
|
|
||||||
description = description.replace(" " * 3, " " * 3)
|
|
||||||
description = description.replace(" " * 2, " " * 2)
|
|
||||||
return mark_safe(description)
|
|
||||||
|
|
||||||
alarm_id = tables.Column('alarm_id',
|
|
||||||
verbose_name=_('Event ID'))
|
|
||||||
description = tables.Column(description_inject,
|
|
||||||
verbose_name=_('Description'))
|
|
||||||
status = tables.Column('suppression_status',
|
|
||||||
verbose_name=_('Status'))
|
|
||||||
|
|
||||||
def get_object_id(self, obj):
|
|
||||||
# return obj.alarm_id
|
|
||||||
return obj.uuid
|
|
||||||
|
|
||||||
def get_object_display(self, datum):
|
|
||||||
"""Returns a display name that identifies this object."""
|
|
||||||
if hasattr(datum, 'alarm_id'):
|
|
||||||
return datum.alarm_id
|
|
||||||
return None
|
|
||||||
|
|
||||||
class Meta(object):
|
|
||||||
name = "eventsSuppression"
|
|
||||||
limit_param = "events_suppression_limit"
|
|
||||||
pagination_param = "events_suppression_marker"
|
|
||||||
prev_pagination_param = 'prev_event_ids_marker'
|
|
||||||
verbose_name = _("Events Suppression")
|
|
||||||
row_actions = (SuppressEvent, UnsuppressEvent,)
|
|
||||||
multi_select = False
|
|
|
@ -1,309 +0,0 @@
|
||||||
# Copyright 2012 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Copyright 2012 Nebula, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
|
||||||
|
|
||||||
from horizon import exceptions
|
|
||||||
from horizon import tabs
|
|
||||||
from starlingx_dashboard import api as stx_api
|
|
||||||
from starlingx_dashboard.dashboards.admin.fault_management import tables
|
|
||||||
|
|
||||||
ALARMS_SUPPRESSION_FILTER_GROUP = 0
|
|
||||||
EVENT_SUPPRESSION_FILTER_GROUP = 1
|
|
||||||
|
|
||||||
|
|
||||||
class ActiveAlarmsTab(tabs.TableTab):
|
|
||||||
table_classes = (tables.AlarmsTable,)
|
|
||||||
name = _("Active Alarms")
|
|
||||||
slug = "alarms"
|
|
||||||
template_name = 'admin/fault_management/_active_alarms.html'
|
|
||||||
|
|
||||||
def has_more_data(self, table):
|
|
||||||
return self._more
|
|
||||||
|
|
||||||
def get_limit_count(self, table):
|
|
||||||
return self._limit
|
|
||||||
|
|
||||||
def getTableFromName(self, tableName):
|
|
||||||
table = self._tables[tableName]
|
|
||||||
return table
|
|
||||||
|
|
||||||
def set_suppression_filter(self, disabled_status):
|
|
||||||
alarmsTable = self.getTableFromName('alarms')
|
|
||||||
filter_action = alarmsTable._meta._filter_action
|
|
||||||
filter_action.set_disabled_filter_field_for_group(
|
|
||||||
ALARMS_SUPPRESSION_FILTER_GROUP, disabled_status)
|
|
||||||
filter_action.updateFromRequestDataToSession(self.request)
|
|
||||||
|
|
||||||
def get_context_data(self, request):
|
|
||||||
context = super(ActiveAlarmsTab, self).get_context_data(request)
|
|
||||||
|
|
||||||
summary = stx_api.fm.alarm_summary_get(
|
|
||||||
self.request, include_suppress=False)
|
|
||||||
context["total"] = summary.critical + summary.major + summary.minor \
|
|
||||||
+ summary.warnings
|
|
||||||
context["summary"] = summary
|
|
||||||
|
|
||||||
events_types = self.get_event_suppression_data()
|
|
||||||
suppressed_events_types = len([etype for etype
|
|
||||||
in events_types
|
|
||||||
if etype.suppression_status ==
|
|
||||||
'suppressed'])
|
|
||||||
|
|
||||||
alarms_table = self.getTableFromName('alarms')
|
|
||||||
|
|
||||||
suppress_filter = self.get_filters()
|
|
||||||
suppress_filter_state = suppress_filter.get('suppression')
|
|
||||||
|
|
||||||
hidden_found = 'hidden' in alarms_table.columns["suppression_status"].\
|
|
||||||
classes
|
|
||||||
|
|
||||||
if not hidden_found:
|
|
||||||
if suppressed_events_types == 0:
|
|
||||||
self.set_suppression_filter('disabled')
|
|
||||||
alarms_table.columns["suppression_status"]\
|
|
||||||
.classes.append('hidden')
|
|
||||||
elif suppress_filter_state == stx_api.fm.FM_SUPPRESS_HIDE:
|
|
||||||
self.set_suppression_filter('enabled')
|
|
||||||
alarms_table.columns["suppression_status"].classes\
|
|
||||||
.append('hidden')
|
|
||||||
else:
|
|
||||||
if suppressed_events_types == 0:
|
|
||||||
self.set_suppression_filter('disabled')
|
|
||||||
else:
|
|
||||||
self.set_suppression_filter('enabled')
|
|
||||||
if suppress_filter_state == stx_api.fm.FM_SUPPRESS_SHOW:
|
|
||||||
alarms_table.columns["suppression_status"].classes\
|
|
||||||
.remove('hidden')
|
|
||||||
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_filters(self, filters=None):
|
|
||||||
|
|
||||||
filters = filters or {}
|
|
||||||
alarmsTable = self.getTableFromName('alarms')
|
|
||||||
filter_action = alarmsTable._meta._filter_action
|
|
||||||
filter_action.updateFromRequestDataToSession(self.request)
|
|
||||||
filter_field = filter_action.get_filter_field(self.request)
|
|
||||||
|
|
||||||
if filter_field:
|
|
||||||
suppression = filter_action.get_filter_field_for_group(0)
|
|
||||||
filters["suppression"] = suppression
|
|
||||||
|
|
||||||
return filters
|
|
||||||
|
|
||||||
def get_alarms_data(self):
|
|
||||||
search_opts = {}
|
|
||||||
# get retrieve parameters from request/session env
|
|
||||||
limit = \
|
|
||||||
self.request.GET.get(tables.AlarmsTable.Meta.limit_param,
|
|
||||||
None)
|
|
||||||
|
|
||||||
search_opts = self.get_filters()
|
|
||||||
search_opts.update({
|
|
||||||
'paginate': True,
|
|
||||||
'sort_key': 'severity,entity_instance_id',
|
|
||||||
'sort_dir': 'asc'})
|
|
||||||
|
|
||||||
alarms = []
|
|
||||||
try:
|
|
||||||
if 'paginate' in search_opts:
|
|
||||||
alarms, self._more = stx_api.fm.alarm_list(
|
|
||||||
self.request, search_opts=search_opts)
|
|
||||||
else:
|
|
||||||
alarms = stx_api.fm.alarm_list(
|
|
||||||
self.request, search_opts=search_opts)
|
|
||||||
self._limit = limit
|
|
||||||
except Exception:
|
|
||||||
self._more = False
|
|
||||||
self._limit = None
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve alarms list.'))
|
|
||||||
return alarms
|
|
||||||
|
|
||||||
def get_event_suppression_data(self):
|
|
||||||
event_types = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
if 'suppression_list' not in self.tab_group.kwargs:
|
|
||||||
self.tab_group.kwargs['suppression_list'] = \
|
|
||||||
stx_api.fm.event_suppression_list(self.request)
|
|
||||||
event_types = self.tab_group.kwargs['suppression_list']
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve event suppression table'
|
|
||||||
' list.'))
|
|
||||||
return event_types
|
|
||||||
|
|
||||||
|
|
||||||
class EventLogTab(tabs.TableTab):
|
|
||||||
table_classes = (tables.EventLogsTable,)
|
|
||||||
name = _("Events")
|
|
||||||
slug = "eventLogs"
|
|
||||||
template_name = 'admin/fault_management/_summary.html'
|
|
||||||
preload = False
|
|
||||||
|
|
||||||
def has_more_data(self, table):
|
|
||||||
return self._more
|
|
||||||
|
|
||||||
def get_limit_count(self, table):
|
|
||||||
return self._limit
|
|
||||||
|
|
||||||
def getTableFromName(self, tableName):
|
|
||||||
table = self._tables[tableName]
|
|
||||||
return table
|
|
||||||
|
|
||||||
def set_suppression_filter(self, disabled_status):
|
|
||||||
alarmsTable = self.getTableFromName('eventLogs')
|
|
||||||
filter_action = alarmsTable._meta._filter_action
|
|
||||||
filter_action.set_disabled_filter_field_for_group(
|
|
||||||
EVENT_SUPPRESSION_FILTER_GROUP, disabled_status)
|
|
||||||
filter_action.updateFromRequestDataToSession(self.request)
|
|
||||||
|
|
||||||
def get_context_data(self, request):
|
|
||||||
context = super(EventLogTab, self).get_context_data(request)
|
|
||||||
|
|
||||||
events_types = self.get_event_suppression_data()
|
|
||||||
suppressed_events_types = len([etype for etype in events_types
|
|
||||||
if etype.suppression_status ==
|
|
||||||
'suppressed'])
|
|
||||||
|
|
||||||
event_log_table = self.getTableFromName('eventLogs')
|
|
||||||
|
|
||||||
filters = self.get_filters({'marker': None,
|
|
||||||
'limit': None,
|
|
||||||
'paginate': True})
|
|
||||||
|
|
||||||
suppress_filter_state = filters.get('suppression')
|
|
||||||
|
|
||||||
hidden_found = 'hidden' in event_log_table\
|
|
||||||
.columns["suppression_status"].classes
|
|
||||||
|
|
||||||
if not hidden_found:
|
|
||||||
if suppressed_events_types == 0:
|
|
||||||
self.set_suppression_filter('disabled')
|
|
||||||
event_log_table.columns["suppression_status"]\
|
|
||||||
.classes.append('hidden')
|
|
||||||
elif suppress_filter_state == stx_api.fm.FM_SUPPRESS_HIDE:
|
|
||||||
self.set_suppression_filter('enabled')
|
|
||||||
event_log_table.columns["suppression_status"].\
|
|
||||||
classes.append('hidden')
|
|
||||||
else:
|
|
||||||
if suppressed_events_types == 0:
|
|
||||||
self.set_suppression_filter('disabled')
|
|
||||||
else:
|
|
||||||
self.set_suppression_filter('enabled')
|
|
||||||
if suppress_filter_state == stx_api.fm.FM_SUPPRESS_SHOW:
|
|
||||||
event_log_table.columns["suppression_status"]\
|
|
||||||
.classes.remove('hidden')
|
|
||||||
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_filters(self, filters):
|
|
||||||
|
|
||||||
eventLogsTable = self.getTableFromName('eventLogs')
|
|
||||||
filter_action = eventLogsTable._meta._filter_action
|
|
||||||
filter_action.updateFromRequestDataToSession(self.request)
|
|
||||||
filter_field = filter_action.get_filter_field(self.request)
|
|
||||||
|
|
||||||
if filter_field:
|
|
||||||
filters["evtType"] = filter_action.get_filter_field_for_group(0)
|
|
||||||
filters["suppression"] = filter_action\
|
|
||||||
.get_filter_field_for_group(1)
|
|
||||||
|
|
||||||
return filters
|
|
||||||
|
|
||||||
def get_eventLogs_data(self):
|
|
||||||
|
|
||||||
# get retrieve parameters from request/session env
|
|
||||||
marker = \
|
|
||||||
self.request.GET.get(tables.EventLogsTable.Meta.pagination_param,
|
|
||||||
None)
|
|
||||||
limit = \
|
|
||||||
self.request.GET.get(tables.EventLogsTable.Meta.limit_param,
|
|
||||||
None)
|
|
||||||
search_opts = self.get_filters({'marker': marker,
|
|
||||||
'limit': limit,
|
|
||||||
'paginate': True})
|
|
||||||
events = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
# now retrieve data from rest API
|
|
||||||
events, self._more = \
|
|
||||||
stx_api.fm.event_log_list(self.request,
|
|
||||||
search_opts=search_opts)
|
|
||||||
self._limit = limit
|
|
||||||
return events
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
events = []
|
|
||||||
self._more = False
|
|
||||||
self._limit = None
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve Event Log list.'))
|
|
||||||
|
|
||||||
return events
|
|
||||||
|
|
||||||
def get_event_suppression_data(self):
|
|
||||||
event_types = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
if 'suppression_list' not in self.tab_group.kwargs:
|
|
||||||
self.tab_group.kwargs['suppression_list'] = \
|
|
||||||
stx_api.fm.event_suppression_list(self.request)
|
|
||||||
event_types = self.tab_group.kwargs['suppression_list']
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve event suppression \
|
|
||||||
table list.'))
|
|
||||||
return event_types
|
|
||||||
|
|
||||||
|
|
||||||
class EventsSuppressionTab(tabs.TableTab):
|
|
||||||
table_classes = (tables.EventsSuppressionTable,)
|
|
||||||
name = _("Events Suppression")
|
|
||||||
slug = "eventsSuppression"
|
|
||||||
template_name = 'admin/fault_management/_summary.html'
|
|
||||||
preload = False
|
|
||||||
|
|
||||||
def get_eventsSuppression_data(self):
|
|
||||||
event_suppression_list = []
|
|
||||||
|
|
||||||
try:
|
|
||||||
if 'suppression_list' not in self.tab_group.kwargs:
|
|
||||||
self.tab_group.kwargs['suppression_list'] = \
|
|
||||||
stx_api.fm.event_suppression_list(self.request)
|
|
||||||
event_suppression_list = self.tab_group.kwargs['suppression_list']
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve event suppression \
|
|
||||||
list\'s.'))
|
|
||||||
|
|
||||||
event_suppression_list.sort(key=lambda a: (a.alarm_id))
|
|
||||||
|
|
||||||
return event_suppression_list
|
|
||||||
|
|
||||||
|
|
||||||
class AlarmsTabs(tabs.TabGroup):
|
|
||||||
slug = "alarms_tabs"
|
|
||||||
tabs = (ActiveAlarmsTab, EventLogTab, EventsSuppressionTab)
|
|
||||||
sticky = True
|
|
|
@ -1,26 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
<div id="active-alarm-stats" class="info details">
|
|
||||||
<span>
|
|
||||||
<strong>{% trans "Active Alarms" %}:</strong>
|
|
||||||
<span class="badge {% if total != 0 %} badge-success{% endif %}">{{ total }}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<strong>{% trans "Critical" %}:</strong>
|
|
||||||
<span class="badge{% if summary.critical != 0 %} badge-danger{% endif %}">{{ summary.critical }}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<strong>{% trans "Major" %}:</strong>
|
|
||||||
<span class="badge{% if summary.major != 0 %} badge-danger{% endif %}">{{ summary.major }}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<strong>{% trans "Minor" %}:</strong>
|
|
||||||
<span class="badge{% if summary.minor != 0 %} badge-warning{% endif %}">{{ summary.minor }}</span>
|
|
||||||
</span>
|
|
||||||
<span>
|
|
||||||
<strong>{% trans "Warning" %}:</strong>
|
|
||||||
<span class="badge{% if summary.warnings != 0 %} badge-success{% endif %}">{{ summary.warnings }}</span>
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{ table.render }}
|
|
|
@ -1,58 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load i18n breadcrumb_nav %}
|
|
||||||
{% block title %}{% trans "Historical Alarm Details" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
{% if history.event_log_id == '' or history.event_log_id == ' ' %}
|
|
||||||
<h3> {{history.reason_text }} </h3>
|
|
||||||
{% else %}
|
|
||||||
<h3> {{history.state }} - {{history.event_log_id }} - {{history.reason_text }} </h3>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<div class="info row-fluid detail">
|
|
||||||
<h4>{% trans "Info" %}</h4>
|
|
||||||
<hr class="header_rule">
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Alarm UUID" %}</dt>
|
|
||||||
<dd>{{ history.uuid }}</dd>
|
|
||||||
{% if history.event_log_id != '' and history.event_log_id != ' ' %}
|
|
||||||
<dt>{% trans "Alarm ID" %}</dt>
|
|
||||||
<dd>{{ history.event_log_id }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>{% trans "Severity" %}</dt>
|
|
||||||
<dd>{{ history.severity }}</dd>
|
|
||||||
<dt>{% trans "Alarm State" %}</dt>
|
|
||||||
<dd>{{ history.state }}</dd>
|
|
||||||
<dt>{% trans "Alarm Type" %}</dt>
|
|
||||||
<dd>{{ history.event_log_type }}</dd>
|
|
||||||
<dt>{% trans "Timestamp" %}</dt>
|
|
||||||
<dd>{{ history.timestamp|parse_isotime }}</dd>
|
|
||||||
<dt>{% trans "Suppression" %}</dt>
|
|
||||||
<dd>{{ history.suppression }}</dd>
|
|
||||||
</dl>
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Entity Instance ID" %}</dt>
|
|
||||||
<dd>{{ history.entity_instance_id }}</dd>
|
|
||||||
{% if history.entity_type_id != '' and history.entity_type_id != ' ' %}
|
|
||||||
<dt>{% trans "Entity Type ID" %}</dt>
|
|
||||||
<dd>{{ history.entity_type_id }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>{% trans "Probable Cause" %}</dt>
|
|
||||||
<dd>{{ history.probable_cause }}</dd>
|
|
||||||
{% if history.proposed_repair_action != '' and history.proposed_repair_action != ' ' %}
|
|
||||||
<dt>{% trans "Proposed Repair Action" %}</dt>
|
|
||||||
<dd>{{ history.proposed_repair_action }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>{% trans "Service Affecting" %}</dt>
|
|
||||||
<dd>{{ history.service_affecting }}</dd>
|
|
||||||
{% if history.reason_text != '' and history.reason_text != ' ' %}
|
|
||||||
<dt>{% trans "Reason" %}</dt>
|
|
||||||
<dd>{{ history.reason_text }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
|
@ -1,50 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load i18n breadcrumb_nav %}
|
|
||||||
{% block title %}{% trans "Customer Log Details" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
{% if log.event_log_id == '' or log.event_log_id == ' ' %}
|
|
||||||
<h3> {{log.reason_text }} </h3>
|
|
||||||
{% else %}
|
|
||||||
<h3> {{log.event_log_id }} - {{log.reason_text }} </h3>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<div class="info row-fluid detail">
|
|
||||||
<h4>{% trans "Info" %}</h4>
|
|
||||||
<hr class="header_rule">
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Log UUID" %}</dt>
|
|
||||||
<dd>{{ log.uuid }}</dd>
|
|
||||||
{% if log.event_log_id != '' and log.event_log_id != ' ' %}
|
|
||||||
<dt>{% trans "Log ID" %}</dt>
|
|
||||||
<dd>{{ log.event_log_id }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>{% trans "Severity" %}</dt>
|
|
||||||
<dd>{{ log.severity }}</dd>
|
|
||||||
<dt>{% trans "Log Type" %}</dt>
|
|
||||||
<dd>{{ log.event_log_type }}</dd>
|
|
||||||
<dt>{% trans "Timestamp" %}</dt>
|
|
||||||
<dd>{{ log.timestamp|parse_isotime }}</dd>
|
|
||||||
</dl>
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Entity Instance ID" %}</dt>
|
|
||||||
<dd>{{ log.entity_instance_id }}</dd>
|
|
||||||
{% if log.entity_type_id != '' and log.entity_type_id != ' ' %}
|
|
||||||
<dt>{% trans "Entity Type ID" %}</dt>
|
|
||||||
<dd>{{ log.entity_type_id }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
<dt>{% trans "Probable Cause" %}</dt>
|
|
||||||
<dd>{{ log.probable_cause }}</dd>
|
|
||||||
<dt>{% trans "Service Affecting" %}</dt>
|
|
||||||
<dd>{{ log.service_affecting }}</dd>
|
|
||||||
{% if log.reason_text != '' and log.reason_text != ' ' %}
|
|
||||||
<dt>{% trans "Reason" %}</dt>
|
|
||||||
<dd>{{ log.reason_text }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
|
@ -1,52 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load i18n breadcrumb_nav %}
|
|
||||||
{% block title %}{% trans "Alarm Details" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<h3> {{alarm.alarm_id }} - {{alarm.reason_text }}</h3>
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
<div class="info row-fluid detail">
|
|
||||||
<h4>{% trans "Info" %}</h4>
|
|
||||||
<hr class="header_rule">
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Alarm UUID" %}</dt>
|
|
||||||
<dd>{{ alarm.uuid }}</dd>
|
|
||||||
<dt>{% trans "Alarm ID" %}</dt>
|
|
||||||
<dd>{{ alarm.alarm_id }}</dd>
|
|
||||||
<dt>{% trans "Severity" %}</dt>
|
|
||||||
<dd>{{ alarm.severity }}</dd>
|
|
||||||
<dt>{% trans "Alarm State" %}</dt>
|
|
||||||
<dd>{{ alarm.alarm_state }}</dd>
|
|
||||||
<dt>{% trans "Alarm Type" %}</dt>
|
|
||||||
<dd>{{ alarm.alarm_type }}</dd>
|
|
||||||
<dt>{% trans "Timestamp" %}</dt>
|
|
||||||
<dd>{{ alarm.timestamp|parse_isotime }}</dd>
|
|
||||||
<dt>{% trans "Suppression" %}</dt>
|
|
||||||
<dd>{{ alarm.suppression }}</dd>
|
|
||||||
</dl>
|
|
||||||
<dl>
|
|
||||||
<dt>{% trans "Entity Instance ID" %}</dt>
|
|
||||||
<dd>{{ alarm.entity_instance_id }}</dd>
|
|
||||||
<dt>{% trans "Entity Type ID" %}</dt>
|
|
||||||
<dd>{{ alarm.entity_type_id }}</dd>
|
|
||||||
<dt>{% trans "Probable Cause" %}</dt>
|
|
||||||
<dd>{{ alarm.probable_cause }}</dd>
|
|
||||||
<dt>{% trans "Proposed Repair Action" %}</dt>
|
|
||||||
<dd>{{ alarm.proposed_repair_action }}</dd>
|
|
||||||
<dt>{% trans "Service Affecting" %}</dt>
|
|
||||||
<dd>{{ alarm.service_affecting }}</dd>
|
|
||||||
<dt>{% trans "Management Affecting" %}</dt>
|
|
||||||
<dd>{{ alarm.mgmt_affecting }}</dd>
|
|
||||||
{% if alarm.reason_text != '' and alarm.reason_text != ' ' %}
|
|
||||||
<dt>{% trans "Reason" %}</dt>
|
|
||||||
<dd>{{ alarm.reason_text }}</dd>
|
|
||||||
{% endif %}
|
|
||||||
</dl>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
|
@ -1,5 +0,0 @@
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
{{ table.render }}
|
|
||||||
{% endblock %}
|
|
|
@ -1,29 +0,0 @@
|
||||||
{% extends 'base.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
{% block title %}{% trans "Fault Management" %}{% endblock %}
|
|
||||||
|
|
||||||
{% block page_header %}
|
|
||||||
{% include "horizon/common/_page_header.html" with title=_("Fault Management")%}
|
|
||||||
{% endblock page_header %}
|
|
||||||
|
|
||||||
{% block main %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-12">
|
|
||||||
{{ tab_group.render }}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
|
|
||||||
{% block js %}
|
|
||||||
{{ block.super }}
|
|
||||||
<script type="text/javascript" charset="utf-8">
|
|
||||||
horizon.refresh.addRefreshFunction(function (html) {
|
|
||||||
var $old_stats = $('#active-alarm-stats');
|
|
||||||
var $new_stats = $(html).find('#active-alarm-stats');
|
|
||||||
if ($new_stats.html() != $old_stats.html()) {
|
|
||||||
$old_stats.replaceWith($new_stats);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{% endblock %}
|
|
|
@ -1,35 +0,0 @@
|
||||||
# Copyright 2012 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Copyright 2012 Nebula, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2015 Wind River Systems, Inc.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
from django.conf.urls import url # noqa
|
|
||||||
|
|
||||||
from starlingx_dashboard.dashboards.admin.fault_management import views
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
url(r'^$', views.IndexView.as_view(), name='index'),
|
|
||||||
url(r'^(?P<id>[^/]+)/detail/$',
|
|
||||||
views.DetailView.as_view(), name='detail'),
|
|
||||||
url(r'^(?P<id>[^/]+)/eventlogdetail/$',
|
|
||||||
views.EventLogDetailView.as_view(), name='eventlogdetail'),
|
|
||||||
url(r'^banner/$', views.BannerView.as_view(),
|
|
||||||
name='banner')
|
|
||||||
]
|
|
|
@ -1,175 +0,0 @@
|
||||||
# Copyright 2012 United States Government as represented by the
|
|
||||||
# Administrator of the National Aeronautics and Space Administration.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Copyright 2012 Nebula, Inc.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
|
||||||
# not use this file except in compliance with the License. You may obtain
|
|
||||||
# a copy of the License at
|
|
||||||
#
|
|
||||||
# http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
#
|
|
||||||
# Unless required by applicable law or agreed to in writing, software
|
|
||||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
|
||||||
# License for the specific language governing permissions and limitations
|
|
||||||
# under the License.
|
|
||||||
#
|
|
||||||
# Copyright (c) 2013-2018 Wind River Systems, Inc.
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from django.core.urlresolvers import reverse
|
|
||||||
from django.utils.translation import ugettext_lazy as _ # noqa
|
|
||||||
from django.views.generic import TemplateView
|
|
||||||
|
|
||||||
from horizon import exceptions
|
|
||||||
from horizon import tabs
|
|
||||||
from horizon import views
|
|
||||||
from openstack_dashboard.api.base import is_service_enabled
|
|
||||||
from starlingx_dashboard.api import dc_manager
|
|
||||||
from starlingx_dashboard.api import fm
|
|
||||||
|
|
||||||
from starlingx_dashboard.dashboards.admin.fault_management import \
|
|
||||||
tabs as project_tabs
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class IndexView(tabs.TabbedTableView):
|
|
||||||
tab_group_class = project_tabs.AlarmsTabs
|
|
||||||
template_name = 'admin/fault_management/index.html'
|
|
||||||
page_title = _("Fault Management")
|
|
||||||
|
|
||||||
|
|
||||||
class DetailView(views.HorizonTemplateView):
|
|
||||||
template_name = 'admin/fault_management/_detail_overview.html'
|
|
||||||
page_title = 'Alarm Details'
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super(DetailView, self).get_context_data(**kwargs)
|
|
||||||
context["alarm"] = self.get_data()
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_data(self):
|
|
||||||
if not hasattr(self, "_alarm"):
|
|
||||||
alarm_uuid = self.kwargs['id']
|
|
||||||
try:
|
|
||||||
alarm = fm.alarm_get(self.request, alarm_uuid)
|
|
||||||
|
|
||||||
except Exception:
|
|
||||||
redirect = reverse('horizon:admin:fault_management:index')
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve details for '
|
|
||||||
'alarm "%s".') % alarm_uuid,
|
|
||||||
redirect=redirect)
|
|
||||||
|
|
||||||
self._alarm = alarm
|
|
||||||
return self._alarm
|
|
||||||
|
|
||||||
|
|
||||||
class EventLogDetailView(views.HorizonTemplateView):
|
|
||||||
# Strategy behind this event log detail view is to
|
|
||||||
# first retrieve the event_log data, then examine the event's
|
|
||||||
# state property, and from that, determine if it should use
|
|
||||||
# the _detail_history.html (alarmhistory) template or
|
|
||||||
# or use the _detail_log.html (customer log) template
|
|
||||||
|
|
||||||
def get_template_names(self):
|
|
||||||
if self.type == "alarmhistory":
|
|
||||||
template_name = 'admin/fault_management/_detail_history.html'
|
|
||||||
else:
|
|
||||||
template_name = 'admin/fault_management/_detail_log.html'
|
|
||||||
return template_name
|
|
||||||
|
|
||||||
def _detectEventLogType(self):
|
|
||||||
if hasattr(self, "type"):
|
|
||||||
return self.type
|
|
||||||
if not self._eventlog:
|
|
||||||
raise Exception("Cannot determine Event Log type for "
|
|
||||||
"EventLogDetailView. First retrieve "
|
|
||||||
"Eventlog data")
|
|
||||||
if self._eventlog.state == "log":
|
|
||||||
self.type = "log"
|
|
||||||
elif self._eventlog.state in ["set", "clear"]:
|
|
||||||
self.type = "alarmhistory"
|
|
||||||
else:
|
|
||||||
raise Exception("Invalid state = '{}'. Cannot "
|
|
||||||
"determine Event log type for "
|
|
||||||
"event log".format(self._eventlog.state))
|
|
||||||
return self.type
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super(EventLogDetailView, self).get_context_data(**kwargs)
|
|
||||||
data = self.get_data()
|
|
||||||
if self.type == "alarmhistory":
|
|
||||||
self.page_title = 'Historical Alarm Details'
|
|
||||||
self.template_name = 'admin/fault_management/_detail_history.html'
|
|
||||||
context["history"] = data
|
|
||||||
else:
|
|
||||||
self.page_title = 'Customer Log Detail'
|
|
||||||
self.template_name = 'admin/fault_management/_detail_log.html'
|
|
||||||
context["log"] = data
|
|
||||||
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_data(self):
|
|
||||||
if not hasattr(self, "_eventlog"):
|
|
||||||
uuid = self.kwargs['id']
|
|
||||||
try:
|
|
||||||
self._eventlog = fm.event_log_get(self.request, uuid)
|
|
||||||
self._detectEventLogType()
|
|
||||||
except Exception:
|
|
||||||
redirect = reverse('horizon:admin:fault_management:index')
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve details for '
|
|
||||||
'event log "%s".') % uuid,
|
|
||||||
redirect=redirect)
|
|
||||||
return self._eventlog
|
|
||||||
|
|
||||||
|
|
||||||
class BannerView(TemplateView):
|
|
||||||
template_name = 'header/_alarm_banner.html'
|
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
|
||||||
context = super(BannerView, self).get_context_data(**kwargs)
|
|
||||||
|
|
||||||
if not self.request.is_ajax():
|
|
||||||
raise exceptions.NotFound()
|
|
||||||
|
|
||||||
if (not self.request.user.is_authenticated() or
|
|
||||||
not self.request.user.is_superuser):
|
|
||||||
context["alarmbanner"] = False
|
|
||||||
elif 'dc_admin' in self.request.META.get('HTTP_REFERER'):
|
|
||||||
summaries = self.get_subcloud_data()
|
|
||||||
central_summary = self.get_data()
|
|
||||||
summaries.append(central_summary)
|
|
||||||
context["dc_admin"] = True
|
|
||||||
context["alarmbanner"] = True
|
|
||||||
context["OK"] = len(
|
|
||||||
[s for s in summaries if s.status == 'OK'])
|
|
||||||
context["degraded"] = len(
|
|
||||||
[s for s in summaries if s.status == 'degraded'])
|
|
||||||
context["critical"] = len(
|
|
||||||
[s for s in summaries if s.status == 'critical'])
|
|
||||||
context["disabled"] = len(
|
|
||||||
[s for s in summaries if s.status == 'disabled'])
|
|
||||||
elif is_service_enabled(self.request, 'platform'):
|
|
||||||
context["summary"] = self.get_data()
|
|
||||||
context["alarmbanner"] = True
|
|
||||||
return context
|
|
||||||
|
|
||||||
def get_data(self):
|
|
||||||
summary = None
|
|
||||||
try:
|
|
||||||
summary = fm.alarm_summary_get(self.request)
|
|
||||||
except Exception:
|
|
||||||
exceptions.handle(self.request,
|
|
||||||
_('Unable to retrieve alarm summary.'))
|
|
||||||
return summary
|
|
||||||
|
|
||||||
def get_subcloud_data(self):
|
|
||||||
return dc_manager.alarm_summary_list(self.request)
|
|
|
@ -1,15 +1,16 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2016-2018 Wind River Systems, Inc.
|
# Copyright (c) 2016-2019 Wind River Systems, Inc.
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: Apache-2.0
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
#
|
#
|
||||||
|
|
||||||
|
from horizon import tables
|
||||||
|
from horizon.utils import filters as utils_filters
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
|
from django.utils.translation import pgettext_lazy
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from starlingx_dashboard.dashboards.admin.fault_management import \
|
|
||||||
tables as fm_tables
|
|
||||||
from starlingx_dashboard.dashboards.admin.inventory.interfaces import \
|
from starlingx_dashboard.dashboards.admin.inventory.interfaces import \
|
||||||
tables as if_tables
|
tables as if_tables
|
||||||
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||||
|
@ -17,6 +18,19 @@ from starlingx_dashboard.dashboards.admin.providernets.providernets.ranges \
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
SUPPRESSION_STATUS_CHOICES = (
|
||||||
|
("suppressed", False),
|
||||||
|
("unsuppressed", True),
|
||||||
|
("None", True),
|
||||||
|
)
|
||||||
|
SUPPRESSION_STATUS_DISPLAY_CHOICES = (
|
||||||
|
("suppressed", pgettext_lazy("Indicates this type of alarm \
|
||||||
|
is suppressed", "suppressed")),
|
||||||
|
("unsuppressed", pgettext_lazy("Indicates this type of alarm \
|
||||||
|
is unsuppressed", "unsuppressed")),
|
||||||
|
("None", pgettext_lazy("Indicates an event type", "None")),
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class ProviderNetworkRangeTable(sr_tables.ProviderNetworkRangeTable):
|
class ProviderNetworkRangeTable(sr_tables.ProviderNetworkRangeTable):
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
|
@ -26,7 +40,34 @@ class ProviderNetworkRangeTable(sr_tables.ProviderNetworkRangeTable):
|
||||||
row_actions = ()
|
row_actions = ()
|
||||||
|
|
||||||
|
|
||||||
class AlarmsTable(fm_tables.AlarmsTable):
|
def get_alarm_link_url(alarm):
|
||||||
|
return "/ngdetails/OS::StarlingX::ActiveAlarms/" + alarm.uuid
|
||||||
|
|
||||||
|
|
||||||
|
class AlarmsTable(tables.DataTable):
|
||||||
|
alarm_id = tables.Column('alarm_id',
|
||||||
|
verbose_name=_('Alarm ID'),
|
||||||
|
link=get_alarm_link_url)
|
||||||
|
reason_text = tables.Column('reason_text',
|
||||||
|
verbose_name=_('Reason Text'))
|
||||||
|
entity_instance_id = tables.Column('entity_instance_id',
|
||||||
|
verbose_name=_('Entity Instance ID'))
|
||||||
|
suppression_status = \
|
||||||
|
tables.Column('suppression_status',
|
||||||
|
verbose_name=_('Suppression Status'),
|
||||||
|
status=True,
|
||||||
|
status_choices=SUPPRESSION_STATUS_CHOICES,
|
||||||
|
display_choices=SUPPRESSION_STATUS_DISPLAY_CHOICES)
|
||||||
|
severity = tables.Column('severity',
|
||||||
|
verbose_name=_('Severity'))
|
||||||
|
timestamp = tables.Column('timestamp',
|
||||||
|
attrs={'data-type': 'timestamp'},
|
||||||
|
filters=(utils_filters.parse_isotime,),
|
||||||
|
verbose_name=_('Timestamp'))
|
||||||
|
|
||||||
|
def get_object_id(self, obj):
|
||||||
|
return obj.uuid
|
||||||
|
|
||||||
class Meta(object):
|
class Meta(object):
|
||||||
name = "alarms"
|
name = "alarms"
|
||||||
verbose_name = _("Related Alarms")
|
verbose_name = _("Related Alarms")
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (c) 2017 Wind River Systems, Inc.
|
* Copyright (c) 2017-2019 Wind River Systems, Inc.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
/////////////
|
/////////////
|
||||||
|
|
||||||
function goToCentralAlarmDetails(cloud) {
|
function goToCentralAlarmDetails(cloud) {
|
||||||
$window.location.href = "/auth/switch_services_region/RegionOne/?next=/admin/fault_management/";
|
$window.location.href = "/auth/switch_services_region/RegionOne/?next=/admin/active_alarms/";
|
||||||
}
|
}
|
||||||
|
|
||||||
function goToCentralHostDetails(cloud) {
|
function goToCentralHostDetails(cloud) {
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/**
|
/**
|
||||||
* Copyright (c) 2017 Wind River Systems, Inc.
|
* Copyright (c) 2017-2019 Wind River Systems, Inc.
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*
|
*
|
||||||
|
@ -386,7 +386,7 @@
|
||||||
keystone.getCurrentUserSession().success(function(session){
|
keystone.getCurrentUserSession().success(function(session){
|
||||||
session.available_services_regions.indexOf(cloud.name)
|
session.available_services_regions.indexOf(cloud.name)
|
||||||
if (session.available_services_regions.indexOf(cloud.name) > -1) {
|
if (session.available_services_regions.indexOf(cloud.name) > -1) {
|
||||||
$window.location.href = "/auth/switch_services_region/"+ cloud.name + "/?next=/admin/fault_management/";
|
$window.location.href = "/auth/switch_services_region/"+ cloud.name + "/?next=/admin/active_alarms/";
|
||||||
} else {
|
} else {
|
||||||
toast.add('error', ctrl.endpointErrorMsg);
|
toast.add('error', ctrl.endpointErrorMsg);
|
||||||
// TODO(tsmith) should we force a logout here with an reason message?
|
// TODO(tsmith) should we force a logout here with an reason message?
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
/**
|
|
||||||
* Copyright (c) 2018 Wind River Systems, Inc.
|
|
||||||
*
|
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
'use strict';
|
|
||||||
|
|
||||||
angular
|
|
||||||
.module('horizon.app.core.openstack-service-api')
|
|
||||||
.factory('horizon.app.core.openstack-service-api.fm', FmAPI);
|
|
||||||
|
|
||||||
FmAPI.$inject = [
|
|
||||||
'$q',
|
|
||||||
'horizon.framework.util.http.service',
|
|
||||||
'horizon.framework.widgets.toast.service',
|
|
||||||
'$http'
|
|
||||||
];
|
|
||||||
|
|
||||||
function FmAPI($q, apiService, toastService, $http) {
|
|
||||||
var service = {
|
|
||||||
getAlarmSummary: getAlarmSummary
|
|
||||||
};
|
|
||||||
|
|
||||||
var csrf_token = $('input[name=csrfmiddlewaretoken]').val();
|
|
||||||
$http.defaults.headers.post['X-CSRFToken'] = csrf_token;
|
|
||||||
$http.defaults.headers.common['X-CSRFToken'] = csrf_token;
|
|
||||||
$http.defaults.headers.put['X-CSRFToken'] = csrf_token;
|
|
||||||
|
|
||||||
return service;
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////
|
|
||||||
// Alarm Summary //
|
|
||||||
///////////////////
|
|
||||||
|
|
||||||
function getAlarmSummary() {
|
|
||||||
return apiService.get('/api/fm/alarm_summary/')
|
|
||||||
.error(function () {
|
|
||||||
toastService.clearErrors();
|
|
||||||
toastService.add('error', gettext("Unable to retrieve the System Controller's alarm summary."));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}());
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# A list of applications to be added to INSTALLED_APPS.
|
||||||
|
ADD_INSTALLED_APPS = ['starlingx_dashboard']
|
||||||
|
|
||||||
|
FEATURE = ['starlingx_dashboard']
|
||||||
|
|
||||||
|
AUTO_DISCOVER_STATIC_FILES = True
|
|
@ -0,0 +1,18 @@
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
|
# The slug of the panel group to be added to HORIZON_CONFIG. Required.
|
||||||
|
PANEL_GROUP = 'fault_management'
|
||||||
|
# The display name of the PANEL_GROUP. Required.
|
||||||
|
PANEL_GROUP_NAME = _('Fault Management')
|
||||||
|
# The slug of the dashboard the PANEL_GROUP associated with. Required.
|
||||||
|
PANEL_GROUP_DASHBOARD = 'admin'
|
||||||
|
|
||||||
|
ADD_ANGULAR_MODULES = [
|
||||||
|
'horizon.dashboard.fault_management'
|
||||||
|
]
|
||||||
|
|
||||||
|
ADD_SCSS_FILES = [
|
||||||
|
'dashboard/fault_management/fault_management.scss'
|
||||||
|
]
|
||||||
|
|
||||||
|
AUTO_DISCOVER_STATIC_FILES = True
|
|
@ -1,10 +1,10 @@
|
||||||
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||||
PANEL = 'fault_management'
|
PANEL = 'active_alarms'
|
||||||
|
# The slug of the panel group the PANEL is associated with.
|
||||||
|
PANEL_GROUP = 'fault_management'
|
||||||
# The slug of the dashboard the PANEL associated with. Required.
|
# The slug of the dashboard the PANEL associated with. Required.
|
||||||
PANEL_DASHBOARD = 'admin'
|
PANEL_DASHBOARD = 'admin'
|
||||||
# The slug of the panel group the PANEL is associated with.
|
|
||||||
PANEL_GROUP = 'platform'
|
|
||||||
|
|
||||||
# Python panel class of the PANEL to be added.
|
# Python panel class of the PANEL to be added.
|
||||||
ADD_PANEL = 'starlingx_dashboard.dashboards.admin.' \
|
ADD_PANEL = 'starlingx_dashboard.dashboards.admin.' \
|
||||||
'fault_management.panel.FaultManagement'
|
'active_alarms.panel.ActiveAlarms'
|
|
@ -0,0 +1,9 @@
|
||||||
|
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||||
|
PANEL = 'events'
|
||||||
|
# The slug of the panel group the PANEL is associated with.
|
||||||
|
PANEL_GROUP = 'fault_management'
|
||||||
|
# The slug of the dashboard the PANEL associated with. Required.
|
||||||
|
PANEL_DASHBOARD = 'admin'
|
||||||
|
|
||||||
|
# Python panel class of the PANEL to be added.
|
||||||
|
ADD_PANEL = 'starlingx_dashboard.dashboards.admin.events.panel.Events'
|
|
@ -0,0 +1,10 @@
|
||||||
|
# The slug of the panel to be added to HORIZON_CONFIG. Required.
|
||||||
|
PANEL = 'events_suppression'
|
||||||
|
# The slug of the panel group the PANEL is associated with.
|
||||||
|
PANEL_GROUP = 'fault_management'
|
||||||
|
# The slug of the dashboard the PANEL associated with. Required.
|
||||||
|
PANEL_DASHBOARD = 'admin'
|
||||||
|
|
||||||
|
# Python panel class of the PANEL to be added.
|
||||||
|
ADD_PANEL = 'starlingx_dashboard.dashboards.admin.events_suppression.panel.' \
|
||||||
|
'EventsSuppression'
|
|
@ -0,0 +1,116 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2018-2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.app.core.openstack-service-api')
|
||||||
|
.factory('horizon.app.core.openstack-service-api.fm', FmAPI);
|
||||||
|
|
||||||
|
FmAPI.$inject = [
|
||||||
|
'$q',
|
||||||
|
'horizon.framework.util.http.service',
|
||||||
|
'horizon.framework.widgets.toast.service',
|
||||||
|
'$http'
|
||||||
|
];
|
||||||
|
|
||||||
|
function FmAPI($q, apiService, toastService, $http) {
|
||||||
|
var service = {
|
||||||
|
getAlarmSummary: getAlarmSummary,
|
||||||
|
getAlarms: getAlarms,
|
||||||
|
getAlarm: getAlarm,
|
||||||
|
getEvents: getEvents,
|
||||||
|
getEvent: getEvent,
|
||||||
|
getEventsSuppression: getEventsSuppression,
|
||||||
|
updateEventSuppression: updateEventSuppression
|
||||||
|
};
|
||||||
|
|
||||||
|
var csrf_token = $('input[name=csrfmiddlewaretoken]').val();
|
||||||
|
$http.defaults.headers.post['X-CSRFToken'] = csrf_token;
|
||||||
|
$http.defaults.headers.common['X-CSRFToken'] = csrf_token;
|
||||||
|
$http.defaults.headers.put['X-CSRFToken'] = csrf_token;
|
||||||
|
|
||||||
|
return service;
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// Alarms
|
||||||
|
|
||||||
|
function getAlarmSummary() {
|
||||||
|
return apiService.get('/api/fm/alarm_summary/')
|
||||||
|
.error(function () {
|
||||||
|
toastService.clearErrors();
|
||||||
|
toastService.add('error', gettext("Unable to retrieve alarm summary."));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAlarms() {
|
||||||
|
var results = apiService.get('/api/fm/alarm_list/?include_suppress=True')
|
||||||
|
return results
|
||||||
|
.error(function () {
|
||||||
|
toastService.clearErrors();
|
||||||
|
toastService.add('error', gettext("Unable to retrieve alarms."));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getAlarm(uuid) {
|
||||||
|
var results = apiService.get('/api/fm/alarm_get/' + uuid)
|
||||||
|
return results
|
||||||
|
.error(function() {
|
||||||
|
var msg = gettext("Unable to retrieve alarm with uuid: %(uuid)s.");
|
||||||
|
toastService.add('error', interpolate(msg, {uuid: uuid}, true));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// Events
|
||||||
|
|
||||||
|
function getEvents() {
|
||||||
|
var results = apiService.get('/api/fm/event_log_list/')
|
||||||
|
return results
|
||||||
|
.error(function () {
|
||||||
|
toastService.clearErrors();
|
||||||
|
toastService.add('error', gettext("Unable to retrieve events."));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getEvent(uuid) {
|
||||||
|
var results = apiService.get('/api/fm/event_log_get/' + uuid)
|
||||||
|
return results
|
||||||
|
.error(function() {
|
||||||
|
var msg = gettext("Unable to retrieve event with uuid: %(uuid)s.");
|
||||||
|
toastService.add('error', interpolate(msg, {uuid: uuid}, true));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////////////////////////
|
||||||
|
// Events Suppression
|
||||||
|
|
||||||
|
function getEventsSuppression(include_unsuppressed) {
|
||||||
|
var query_string = '/api/fm/events_suppression_list/'
|
||||||
|
if (include_unsuppressed) {
|
||||||
|
query_string = query_string + '?include_unsuppressed'
|
||||||
|
}
|
||||||
|
|
||||||
|
var results = apiService.get(query_string);
|
||||||
|
|
||||||
|
return results
|
||||||
|
.error(function () {
|
||||||
|
toastService.clearErrors();
|
||||||
|
toastService.add('error', gettext("Unable to retrieve events suppression."));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateEventSuppression(uuid, params) {
|
||||||
|
var results = apiService.patch('/api/fm/event_suppression/' + uuid, params)
|
||||||
|
// Errors are expected to be processed by the caller, just return
|
||||||
|
return results;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}());
|
|
@ -0,0 +1,194 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @name horizon.dashboard.fault_management.active_alarms
|
||||||
|
* @ngModule
|
||||||
|
* @description
|
||||||
|
* Provides all the services and widgets require to display the Alarm
|
||||||
|
* panel
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.active_alarms', [
|
||||||
|
'ngRoute',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.details'
|
||||||
|
])
|
||||||
|
.constant('horizon.dashboard.fault_management.active_alarms.resourceType', 'OS::StarlingX::ActiveAlarms')
|
||||||
|
.run(run)
|
||||||
|
.config(config);
|
||||||
|
|
||||||
|
run.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.service',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.basePath',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
function run(registry, service, basePath, resourceType) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setNames(gettext('Active Alarm'), gettext('Active Alarms'))
|
||||||
|
|
||||||
|
// for detail summary view on table row
|
||||||
|
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
||||||
|
|
||||||
|
// set default url for index view. this will be used for reproducing
|
||||||
|
// sidebar and breadcrumb when refreshing or accessing directly
|
||||||
|
// details view.
|
||||||
|
// TODO(kbujold): Uncomment when we rebase to Stein, to fix upstream bug 1746706
|
||||||
|
//.setDefaultIndexUrl('/admin/fault_management/')
|
||||||
|
|
||||||
|
// specify items for table row items, summary view and details view
|
||||||
|
.setProperties(properties())
|
||||||
|
|
||||||
|
// get items for table
|
||||||
|
.setListFunction(service.getPromise)
|
||||||
|
|
||||||
|
// specify table columns
|
||||||
|
.tableColumns
|
||||||
|
.append({
|
||||||
|
id: 'alarm_id',
|
||||||
|
priority: 1,
|
||||||
|
urlFunction: service.urlFunction
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'reason_text',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'entity_instance_id',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'severity',
|
||||||
|
priority: 1,
|
||||||
|
sortDefault: 'true'
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'suppression_status',
|
||||||
|
priority: 1,
|
||||||
|
allowed: service.suppressColAllowedPromiseFunction
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'timestamp',
|
||||||
|
priority: 1
|
||||||
|
});
|
||||||
|
|
||||||
|
// for magic-search
|
||||||
|
registry.getResourceType(resourceType).filterFacets
|
||||||
|
.append({
|
||||||
|
'label': gettext('Alarm ID'),
|
||||||
|
'name': 'alarm_id',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Entity Instance ID'),
|
||||||
|
'name': 'entity_instance_id',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Reason Text'),
|
||||||
|
'name': 'reason_text',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Severity'),
|
||||||
|
'name': 'severity',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('critical'), key: 'critical'},
|
||||||
|
{label: gettext('major'), key: 'major'},
|
||||||
|
{label: gettext('minor'), key: 'minor'},
|
||||||
|
{label: gettext('warning'), key: 'warning'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Timestamp'),
|
||||||
|
'name': 'timestamp',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Management Affecting'),
|
||||||
|
'name': 'mgmt_affecting',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('True'), key: 'True'},
|
||||||
|
{label: gettext('False'), key: 'False'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('UUID'),
|
||||||
|
'name': 'uuid',
|
||||||
|
'singleton': true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function properties() {
|
||||||
|
return {
|
||||||
|
uuid: { label: gettext('Alarm UUID'), filters: ['noValue'] },
|
||||||
|
alarm_id: { label: gettext('Alarm ID'), filters: ['noValue'] },
|
||||||
|
reason_text: { label: gettext('Reason Text'), filters: ['noValue'] },
|
||||||
|
entity_instance_id: { label: gettext('Entity Instance ID'), filters: ['noValue'] },
|
||||||
|
severity: { label: gettext('Severity'), filters: ['noValue'] },
|
||||||
|
timestamp: { label: gettext('Timestamp'), filters: ['noValue'] },
|
||||||
|
mgmt_affecting: { label: gettext('Management Affecting'), filters: ['noValue'] },
|
||||||
|
suppression_status: { label: gettext('Suppression Status'), filters: ['noValue'] },
|
||||||
|
alarm_state: { label: gettext('Alarm State'), filters: ['noValue'] },
|
||||||
|
service_affecting: { label: gettext('Service Affecting'), filters: ['noValue'] },
|
||||||
|
alarm_type: { label: gettext('Alarm Type'), filters: ['noValue'] },
|
||||||
|
probable_cause: { label: gettext('Probable Cause'), filters: ['noValue'] },
|
||||||
|
entity_type_id: { label: gettext('Entity Type ID'), filters: ['noValue'] },
|
||||||
|
proposed_repair_action: { label: gettext('Proposed Repair Action'), filters: ['noValue'] },
|
||||||
|
is_suppressed: { label: gettext('IsSuppressed'), filters: ['noValue'] },
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.$inject = [
|
||||||
|
'$provide',
|
||||||
|
'$windowProvider',
|
||||||
|
'$routeProvider'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name config
|
||||||
|
* @param {Object} $provide
|
||||||
|
* @param {Object} $windowProvider
|
||||||
|
* @param {Object} $routeProvider
|
||||||
|
* @description Routes used by this module.
|
||||||
|
* @returns {undefined} Returns nothing
|
||||||
|
*/
|
||||||
|
|
||||||
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/fault_management/active_alarms/';
|
||||||
|
$provide.constant('horizon.dashboard.fault_management.active_alarms.basePath', path);
|
||||||
|
$routeProvider.when('/admin/active_alarms', {
|
||||||
|
templateUrl: path + 'panel.html',
|
||||||
|
resolve: {
|
||||||
|
searchResults: ['horizon.dashboard.fault_management.active_alarms.service', function (searchService) {
|
||||||
|
return searchService.getSuppressionList();
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('horizon.dashboard.fault_management.active_alarms', function() {
|
||||||
|
it('should exist', function() {
|
||||||
|
expect(angular.module('horizon.dashboard.fault_management.active_alarms')).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
|
@ -0,0 +1,136 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
angular.module('horizon.dashboard.fault_management.active_alarms')
|
||||||
|
.factory('horizon.dashboard.fault_management.active_alarms.service',
|
||||||
|
service);
|
||||||
|
|
||||||
|
service.$inject = [
|
||||||
|
'$filter',
|
||||||
|
'horizon.app.core.detailRoute',
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'$q',
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @ngdoc factory
|
||||||
|
* @name horizon.dashboard.fault_management.active_alarms.service
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* This service provides functions that are used through the Alarms
|
||||||
|
* features. These are primarily used in the module registrations
|
||||||
|
* but do not need to be restricted to such use. Each exposed function
|
||||||
|
* is documented below.
|
||||||
|
*/
|
||||||
|
function service($filter, detailRoute, api, $q, registry, resourceType) {
|
||||||
|
|
||||||
|
var showSuppressColumn = null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
getPromise: getPromise,
|
||||||
|
urlFunction: urlFunction,
|
||||||
|
suppressColAllowedPromiseFunction: suppressColAllowedPromiseFunction,
|
||||||
|
getSuppressionList: getSuppressionList
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function getPromise(params) {
|
||||||
|
return api.getAlarms(params).then(modifyResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyResponse(response) {
|
||||||
|
return {data: {items: response.data.items.map(modifyItem)}};
|
||||||
|
|
||||||
|
function modifyItem(item) {
|
||||||
|
|
||||||
|
item.trackBy = item.uuid;
|
||||||
|
|
||||||
|
if (item.suppression_status == 'suppressed') {
|
||||||
|
item.is_suppressed = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.is_suppressed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function urlFunction(item) {
|
||||||
|
return detailRoute + 'OS::StarlingX::ActiveAlarms/' + item.uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSuppressionList() {
|
||||||
|
var include_unsuppressed = false;
|
||||||
|
return api.getEventsSuppression(include_unsuppressed).then(modifyResponseSupp);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyResponseSupp(response) {
|
||||||
|
if (response.data.items.length == 0) {
|
||||||
|
showSuppressColumn = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
showSuppressColumn = true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name suppressColAllowedPromiseFunction
|
||||||
|
* @description
|
||||||
|
* If there are no unsuppressed events then we do not show the Suppression
|
||||||
|
* Status column. We also do show the the filter associated with that column.
|
||||||
|
*/
|
||||||
|
function suppressColAllowedPromiseFunction() {
|
||||||
|
var filters = registry.getResourceType(resourceType).filterFacets;
|
||||||
|
var index = filters.findIndex(obj => obj['id'] === 'suppression_status');
|
||||||
|
|
||||||
|
if (showSuppressColumn === false) {
|
||||||
|
if (index >= 0) {
|
||||||
|
filters.remove('suppression_status')
|
||||||
|
}
|
||||||
|
return $q.reject();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (index < 0) {
|
||||||
|
filters.append({
|
||||||
|
'label': gettext('Suppression Status'),
|
||||||
|
'id': 'suppression_status',
|
||||||
|
'name': 'is_suppressed',
|
||||||
|
'singleton': false,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('suppressed'), key: 'true'},
|
||||||
|
{label: gettext('unsuppressed'), key: 'false'}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return $q.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe('Active Alarms service', function() {
|
||||||
|
var service;
|
||||||
|
beforeEach(module('horizon.app.core.openstack-service-api'));
|
||||||
|
beforeEach(module('horizon.dashboard.fault_management.active_alarms'));
|
||||||
|
beforeEach(inject(function($injector) {
|
||||||
|
service = $injector.get('horizon.dashboard.fault_management.active_alarms.service');
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('getPromise', function() {
|
||||||
|
it("provides a promise", inject(function($q, $injector, $timeout) {
|
||||||
|
var api = $injector.get('horizon.app.core.openstack-service-api.fm');
|
||||||
|
var deferred = $q.defer();
|
||||||
|
spyOn(api, 'getAlarms').and.returnValue(deferred.promise);
|
||||||
|
var result = service.getPromise({});
|
||||||
|
deferred.resolve({
|
||||||
|
data:{
|
||||||
|
items: [{uuid: '123abc', reason_text: 'resource1'}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$timeout.flush();
|
||||||
|
expect(api.getAlarms).toHaveBeenCalled();
|
||||||
|
expect(result.$$state.value.data.items[0].reason_text).toBe('resource1');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('urlFunction', function() {
|
||||||
|
it("get url", inject(function($injector) {
|
||||||
|
var detailRoute = $injector.get('horizon.app.core.detailRoute');
|
||||||
|
var result = service.urlFunction({uuid:"123abc"});
|
||||||
|
expect(result).toBe(detailRoute + "OS::StarlingX::ActiveAlarms/123abc");
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @ngname horizon.dashboard.fault_management.active_alarms.details
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides details features for Alarm.
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.active_alarms.details', [
|
||||||
|
'horizon.app.core',
|
||||||
|
'horizon.framework.conf'
|
||||||
|
])
|
||||||
|
.run(registerDetails);
|
||||||
|
|
||||||
|
registerDetails.$inject = [
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.basePath',
|
||||||
|
'horizon.dashboard.fault_management.active_alarms.resourceType',
|
||||||
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerDetails(
|
||||||
|
api,
|
||||||
|
basePath,
|
||||||
|
resourceType,
|
||||||
|
registry
|
||||||
|
) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setLoadFunction(loadFunction)
|
||||||
|
.detailsViews.append({
|
||||||
|
id: 'alarmsDetailsOverview',
|
||||||
|
name: gettext('Overview'),
|
||||||
|
template: basePath + 'details/overview.html'
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function loadFunction(uuid) {
|
||||||
|
return api.getAlarm(uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,5 @@
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::StarlingX::ActiveAlarms"
|
||||||
|
item="item"
|
||||||
|
property-groups="[['uuid', 'mgmt_affecting']]">
|
||||||
|
</hz-resource-property-list>
|
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the 'License');
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an 'AS IS' BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.active_alarms')
|
||||||
|
.controller('horizon.dashboard.fault_management.active_alarms.OverviewController', controller);
|
||||||
|
|
||||||
|
controller.$inject = [
|
||||||
|
'$scope'
|
||||||
|
];
|
||||||
|
|
||||||
|
function controller(
|
||||||
|
$scope
|
||||||
|
) {
|
||||||
|
var ctrl = this;
|
||||||
|
ctrl.alarm = {};
|
||||||
|
|
||||||
|
$scope.context.loadPromise.then(onGetAlarm);
|
||||||
|
|
||||||
|
function onGetAlarm(item) {
|
||||||
|
ctrl.alarm = item.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,17 @@
|
||||||
|
<div ng-controller="horizon.dashboard.fault_management.active_alarms.OverviewController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12 detail">
|
||||||
|
<h3> {$ ctrl.alarm.alarm_id $} - {$ ctrl.alarm.reason_text $} </h3>
|
||||||
|
<hr>
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::StarlingX::ActiveAlarms"
|
||||||
|
cls="dl-horizontal"
|
||||||
|
item="ctrl.alarm"
|
||||||
|
property-groups="[['uuid', 'alarm_id', 'severity', 'alarm_state', 'alarm_type', 'timestamp',
|
||||||
|
'suppression_status', 'entity_instance_id', 'entity_type_id',
|
||||||
|
'probable_cause', 'proposed_repair_action', 'service_affecting',
|
||||||
|
'mgmt_affecting', 'reason_text']]">
|
||||||
|
</hz-resource-property-list>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<hz-resource-panel resource-type-name="OS::StarlingX::ActiveAlarms">
|
||||||
|
<hz-resource-table resource-type-name="OS::StarlingX::ActiveAlarms"
|
||||||
|
track-by="trackBy">
|
||||||
|
</hz-resource-table>
|
||||||
|
</hz-resource-panel>
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @ngname horizon.dashboard.fault_management.events.details
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides details features for Event.
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.events.details', [
|
||||||
|
'horizon.app.core',
|
||||||
|
'horizon.framework.conf'
|
||||||
|
])
|
||||||
|
.run(registerDetails);
|
||||||
|
|
||||||
|
registerDetails.$inject = [
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'horizon.dashboard.fault_management.events.basePath',
|
||||||
|
'horizon.dashboard.fault_management.events.resourceType',
|
||||||
|
'horizon.framework.conf.resource-type-registry.service'
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerDetails(
|
||||||
|
api,
|
||||||
|
basePath,
|
||||||
|
resourceType,
|
||||||
|
registry
|
||||||
|
) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setLoadFunction(loadFunction)
|
||||||
|
.detailsViews.append({
|
||||||
|
id: 'eventsDetailsOverview',
|
||||||
|
name: gettext('Overview'),
|
||||||
|
template: basePath + 'details/overview.html'
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
function loadFunction(uuid) {
|
||||||
|
return api.getEvent(uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,5 @@
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::StarlingX::Events"
|
||||||
|
item="item"
|
||||||
|
property-groups="[['uuid', 'event_type']]">
|
||||||
|
</hz-resource-property-list>
|
|
@ -0,0 +1,48 @@
|
||||||
|
/*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the 'License');
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an 'AS IS' BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.events')
|
||||||
|
.controller('horizon.dashboard.fault_management.events.OverviewController', controller);
|
||||||
|
|
||||||
|
controller.$inject = [
|
||||||
|
'$scope',
|
||||||
|
'horizon.dashboard.fault_management.events.service'
|
||||||
|
];
|
||||||
|
|
||||||
|
function controller(
|
||||||
|
$scope, eventService
|
||||||
|
) {
|
||||||
|
var ctrl = this;
|
||||||
|
ctrl.event = {};
|
||||||
|
|
||||||
|
$scope.context.loadPromise.then(onGetEvent);
|
||||||
|
|
||||||
|
function onGetEvent(item) {
|
||||||
|
|
||||||
|
eventService.setEventType(item.data);
|
||||||
|
|
||||||
|
ctrl.event = item.data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,17 @@
|
||||||
|
<div ng-controller="horizon.dashboard.fault_management.events.OverviewController as ctrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12 detail">
|
||||||
|
<h3> {$ ctrl.event.state $} - {$ ctrl.event.event_log_id $} - {$ctrl.event.reason_text $} </h3>
|
||||||
|
<hr>
|
||||||
|
<hz-resource-property-list
|
||||||
|
resource-type-name="OS::StarlingX::Events"
|
||||||
|
cls="dl-horizontal"
|
||||||
|
item="ctrl.event"
|
||||||
|
property-groups="[['uuid', 'event_log_id', 'severity', 'state', 'event_log_type', 'timestamp',
|
||||||
|
'suppression', 'entity_instance_id', 'entity_type_id',
|
||||||
|
'probable_cause', 'proposed_repair_action', 'service_affecting',
|
||||||
|
'reason_text', 'event_type']]">
|
||||||
|
</hz-resource-property-list>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,208 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @name horizon.dashboard.fault_management.events
|
||||||
|
* @ngModule
|
||||||
|
* @description
|
||||||
|
* Provides all the services and widgets require to display the Event panel
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.events', [
|
||||||
|
'ngRoute',
|
||||||
|
'horizon.dashboard.fault_management.events.details'
|
||||||
|
])
|
||||||
|
.constant('horizon.dashboard.fault_management.events.resourceType', 'OS::StarlingX::Events')
|
||||||
|
.run(run)
|
||||||
|
.config(config);
|
||||||
|
|
||||||
|
run.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.dashboard.fault_management.events.service',
|
||||||
|
'horizon.dashboard.fault_management.events.basePath',
|
||||||
|
'horizon.dashboard.fault_management.events.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
function run(registry, service, basePath, resourceType) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setNames(gettext('Event'), gettext('Events'))
|
||||||
|
|
||||||
|
// for detail summary view on table row
|
||||||
|
.setSummaryTemplateUrl(basePath + 'details/drawer.html')
|
||||||
|
|
||||||
|
// set default url for index view. this will be used for reproducing
|
||||||
|
// sidebar and breadcrumb when refreshing or accessing directly
|
||||||
|
// details view.
|
||||||
|
// TODO(kbujold): Uncomment when we rebase to Stein, to fix upstream bug 1746706
|
||||||
|
//.setDefaultIndexUrl('/admin/fault_management/')
|
||||||
|
|
||||||
|
// specify items for table row items, summary view and details view
|
||||||
|
.setProperties(properties())
|
||||||
|
|
||||||
|
// get items for table
|
||||||
|
.setListFunction(service.getPromise)
|
||||||
|
|
||||||
|
// specify table columns
|
||||||
|
.tableColumns
|
||||||
|
.append({
|
||||||
|
id: 'timestamp',
|
||||||
|
priority: 1,
|
||||||
|
sortDefault: 'reverse'
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'state',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'event_log_id',
|
||||||
|
priority: 1,
|
||||||
|
urlFunction: service.urlFunction
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'reason_text',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'entity_instance_id',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'suppression_status',
|
||||||
|
priority: 1,
|
||||||
|
allowed: service.suppressColAllowedPromiseFunction
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'severity',
|
||||||
|
priority: 2
|
||||||
|
});
|
||||||
|
|
||||||
|
// for magic-search
|
||||||
|
registry.getResourceType(resourceType).filterFacets
|
||||||
|
.append({
|
||||||
|
'label': gettext('Event Type'),
|
||||||
|
'name': 'event_type',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('log'), key: 'log'},
|
||||||
|
{label: gettext('alarm'), key: 'alarm'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('ID'),
|
||||||
|
'name': 'event_log_id',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Entity Instance ID'),
|
||||||
|
'name': 'entity_instance_id',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Reason Text'),
|
||||||
|
'name': 'reason_text',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('State'),
|
||||||
|
'name': 'state',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('clear'), key: 'clear'},
|
||||||
|
{label: gettext('log'), key: 'log'},
|
||||||
|
{label: gettext('set'), key: 'set'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Severity'),
|
||||||
|
'name': 'severity',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('critical'), key: 'critical'},
|
||||||
|
{label: gettext('major'), key: 'major'},
|
||||||
|
{label: gettext('minor'), key: 'minor'},
|
||||||
|
{label: gettext('warning'), key: 'warning'},
|
||||||
|
{label: gettext('not-applicable'), key: 'not-applicable'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Timestamp'),
|
||||||
|
'name': 'timestamp',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('UUID'),
|
||||||
|
'name': 'uuid',
|
||||||
|
'singleton': true
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function properties() {
|
||||||
|
return {
|
||||||
|
uuid: { label: gettext('Event UUID'), filters: ['noValue'] },
|
||||||
|
event_log_id: { label: gettext('ID'), filters: ['noValue'] },
|
||||||
|
reason_text: { label: gettext('Reason Text'), filters: ['noValue'] },
|
||||||
|
entity_instance_id: { label: gettext('Entity Instance ID'), filters: ['noValue'] },
|
||||||
|
severity: { label: gettext('Severity'), filters: ['noValue'] },
|
||||||
|
timestamp: { label: gettext('Timestamp'), filters: ['noValue'] },
|
||||||
|
suppression_status: { label: gettext('Suppression Status'), filters: ['noValue'] },
|
||||||
|
suppression: { label: gettext('Suppression'), filters: ['noValue'] },
|
||||||
|
state: { label: gettext('State'), filters: ['noValue'] },
|
||||||
|
service_affecting: { label: gettext('Service Affecting'), filters: ['noValue'] },
|
||||||
|
event_log_type: { label: gettext('Alarm Type'), filters: ['noValue'] },
|
||||||
|
probable_cause: { label: gettext('Probable Cause'), filters: ['noValue'] },
|
||||||
|
entity_type_id: { label: gettext('Entity Type ID'), filters: ['noValue'] },
|
||||||
|
proposed_repair_action: { label: gettext('Proposed Repair Action'), filters: ['noValue'] },
|
||||||
|
event_type: { label: gettext('Event Type'), filters: ['noValue'] },
|
||||||
|
_suppression_status: { label: gettext('_suppression_status'), filters: ['noValue'] }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.$inject = [
|
||||||
|
'$provide',
|
||||||
|
'$windowProvider',
|
||||||
|
'$routeProvider'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name config
|
||||||
|
* @param {Object} $provide
|
||||||
|
* @param {Object} $windowProvider
|
||||||
|
* @param {Object} $routeProvider
|
||||||
|
* @description Routes used by this module.
|
||||||
|
* @returns {undefined} Returns nothing
|
||||||
|
*/
|
||||||
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/fault_management/events/';
|
||||||
|
$provide.constant('horizon.dashboard.fault_management.events.basePath', path);
|
||||||
|
|
||||||
|
$routeProvider.when('/admin/events', {
|
||||||
|
templateUrl: path + 'panel.html',
|
||||||
|
resolve: {
|
||||||
|
searchResults: ['horizon.dashboard.fault_management.events.service', function (searchService) {
|
||||||
|
return searchService.getSuppressionList();
|
||||||
|
}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('horizon.dashboard.fault_management.events', function() {
|
||||||
|
it('should exist', function() {
|
||||||
|
expect(angular.module('horizon.dashboard.fault_management.events')).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
|
@ -0,0 +1,157 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
angular.module('horizon.dashboard.fault_management.events')
|
||||||
|
.factory('horizon.dashboard.fault_management.events.service',
|
||||||
|
service);
|
||||||
|
|
||||||
|
service.$inject = [
|
||||||
|
'$filter',
|
||||||
|
'horizon.app.core.detailRoute',
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'$q',
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.dashboard.fault_management.events.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @ngdoc factory
|
||||||
|
* @name horizon.dashboard.fault_management.events.service
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* This service provides functions that are used through the Events
|
||||||
|
* features. These are primarily used in the module registrations
|
||||||
|
* but do not need to be restricted to such use. Each exposed function
|
||||||
|
* is documented below.
|
||||||
|
*/
|
||||||
|
function service($filter, detailRoute, api, $q, registry, resourceType) {
|
||||||
|
|
||||||
|
var showSuppressColumn = null;
|
||||||
|
|
||||||
|
return {
|
||||||
|
getPromise: getPromise,
|
||||||
|
urlFunction: urlFunction,
|
||||||
|
suppressColAllowedPromiseFunction: suppressColAllowedPromiseFunction,
|
||||||
|
getSuppressionList: getSuppressionList,
|
||||||
|
setEventType: setEventType
|
||||||
|
};
|
||||||
|
|
||||||
|
function getPromise(params) {
|
||||||
|
return api.getEvents(params).then(modifyResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyResponse(response) {
|
||||||
|
return {data: {items: response.data.items.map(modifyItem)}};
|
||||||
|
|
||||||
|
function modifyItem(item) {
|
||||||
|
var timestamp = item.updated_at ? item.updated_at : item.created_at;
|
||||||
|
item.trackBy = item.uuid + timestamp;
|
||||||
|
|
||||||
|
setEventType(item);
|
||||||
|
|
||||||
|
if (item.suppression_status == 'suppressed') {
|
||||||
|
item._suppression_status = 'True';
|
||||||
|
}
|
||||||
|
else if (item.suppression_status == 'unsuppressed') {
|
||||||
|
item._suppression_status = 'False';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item._suppression_status = 'None';
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function urlFunction(item) {
|
||||||
|
return detailRoute + 'OS::StarlingX::Events/' + item.uuid;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getSuppressionList() {
|
||||||
|
var include_unsuppressed = false;
|
||||||
|
return api.getEventsSuppression(include_unsuppressed).then(modifyResponseSupp);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyResponseSupp(response) {
|
||||||
|
if (response.data.items.length == 0) {
|
||||||
|
showSuppressColumn = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
showSuppressColumn = true;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name suppressColAllowedPromiseFunction
|
||||||
|
* @description
|
||||||
|
* If there are no unsuppressed events then we do not show the Suppression
|
||||||
|
* Status column. We also do show the the filter associated with that column.
|
||||||
|
*/
|
||||||
|
function suppressColAllowedPromiseFunction() {
|
||||||
|
|
||||||
|
var filters = registry.getResourceType(resourceType).filterFacets;
|
||||||
|
var index = filters.findIndex(obj => obj['id'] === 'suppression_status');
|
||||||
|
|
||||||
|
if (showSuppressColumn === false) {
|
||||||
|
if (index >= 0) {
|
||||||
|
filters.remove('suppression_status')
|
||||||
|
}
|
||||||
|
return $q.reject();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (index < 0) {
|
||||||
|
filters.append({
|
||||||
|
'label': gettext('Suppression Status'),
|
||||||
|
'id': 'suppression_status',
|
||||||
|
'name': '_suppression_status',
|
||||||
|
'singleton': false,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('suppressed'), key: 'True'},
|
||||||
|
{label: gettext('unsuppressed'), key: 'False'},
|
||||||
|
{label: gettext('None'), key: 'None'}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return $q.resolve();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
///////////
|
||||||
|
// Utils //
|
||||||
|
///////////
|
||||||
|
|
||||||
|
function setEventType(item) {
|
||||||
|
if (item.state == "clear" || item.state == "set") {
|
||||||
|
item.event_type = "alarm"
|
||||||
|
}
|
||||||
|
else if (item.state == "log" ) {
|
||||||
|
item.event_type = "log"
|
||||||
|
}
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe('Event service', function() {
|
||||||
|
var service;
|
||||||
|
beforeEach(module('horizon.app.core.openstack-service-api'));
|
||||||
|
beforeEach(module('horizon.dashboard.fault_management.events'));
|
||||||
|
beforeEach(inject(function($injector) {
|
||||||
|
service = $injector.get('horizon.dashboard.fault_management.events.service');
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('getPromise', function() {
|
||||||
|
it("provides a promise", inject(function($q, $injector, $timeout) {
|
||||||
|
var api = $injector.get('horizon.app.core.openstack-service-api.fm');
|
||||||
|
var deferred = $q.defer();
|
||||||
|
spyOn(api, 'getEvents').and.returnValue(deferred.promise);
|
||||||
|
var result = service.getPromise({});
|
||||||
|
deferred.resolve({
|
||||||
|
data:{
|
||||||
|
items: [{uuid: '123abc', reason_text: 'resource1'}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$timeout.flush();
|
||||||
|
expect(api.getEvents).toHaveBeenCalled();
|
||||||
|
expect(result.$$state.value.data.items[0].reason_text).toBe('resource1');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('urlFunction', function() {
|
||||||
|
it("get url", inject(function($injector) {
|
||||||
|
var detailRoute = $injector.get('horizon.app.core.detailRoute');
|
||||||
|
var result = service.urlFunction({uuid:"123abc"});
|
||||||
|
expect(result).toBe(detailRoute + "OS::StarlingX::Events/123abc");
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
<hz-resource-panel resource-type-name="OS::StarlingX::Events">
|
||||||
|
<hz-resource-table resource-type-name="OS::StarlingX::Events"
|
||||||
|
track-by="trackBy">
|
||||||
|
</hz-resource-table>
|
||||||
|
</hz-resource-panel>
|
||||||
|
|
|
@ -0,0 +1,76 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @ngname horizon.dashboard.fault_management.events_suppression.actions
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* Provides all of the actions for Events Suppression.
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.events_suppression.actions', [
|
||||||
|
'horizon.framework',
|
||||||
|
'horizon.dashboard.fault_management'
|
||||||
|
])
|
||||||
|
.run(registerEventsSuppressionActions);
|
||||||
|
|
||||||
|
registerEventsSuppressionActions.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.framework.util.i18n.gettext',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.suppress_event.service',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.unsuppress_event.service',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
function registerEventsSuppressionActions (
|
||||||
|
registry,
|
||||||
|
gettext,
|
||||||
|
suppressEventService,
|
||||||
|
unsuppressEventService,
|
||||||
|
resourceType
|
||||||
|
) {
|
||||||
|
var eventSuppressionResourceType = registry.getResourceType(resourceType);
|
||||||
|
|
||||||
|
eventSuppressionResourceType.itemActions
|
||||||
|
.append({
|
||||||
|
id: 'suppressEventAction',
|
||||||
|
service: suppressEventService,
|
||||||
|
template: {
|
||||||
|
type: 'danger',
|
||||||
|
text: gettext('Suppress Event')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
eventSuppressionResourceType.itemActions
|
||||||
|
.append({
|
||||||
|
id: 'unsuppressEventAction',
|
||||||
|
service: unsuppressEventService,
|
||||||
|
template: {
|
||||||
|
type: 'danger',
|
||||||
|
text: gettext('Unsuppress Event')
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,88 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management')
|
||||||
|
.factory('horizon.dashboard.fault_management.events_suppression.suppress_event.service', updateService);
|
||||||
|
|
||||||
|
updateService.$inject = [
|
||||||
|
'$location',
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'horizon.framework.widgets.modal.simple-modal.service',
|
||||||
|
'horizon.framework.widgets.toast.service',
|
||||||
|
'horizon.framework.util.q.extensions'
|
||||||
|
];
|
||||||
|
|
||||||
|
function updateService($location, api, simpleModalService, toastService, $qExtensions) {
|
||||||
|
|
||||||
|
var scope;
|
||||||
|
|
||||||
|
var service = {
|
||||||
|
perform: perform,
|
||||||
|
allowed: allowed
|
||||||
|
};
|
||||||
|
|
||||||
|
var suppressedText = "Suppress Event";
|
||||||
|
var suppressed = "suppressed";
|
||||||
|
|
||||||
|
return service;
|
||||||
|
|
||||||
|
function perform(selected, newScope) {
|
||||||
|
|
||||||
|
var alarm_id = selected.alarm_id;
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
title: 'Confirm ' + suppressedText,
|
||||||
|
body: 'You have selected: "' + alarm_id +
|
||||||
|
'". Please confirm your selection. Events with selected Alarm ID will be ' +
|
||||||
|
suppressed + '.',
|
||||||
|
submit: suppressedText,
|
||||||
|
cancel: 'Cancel'
|
||||||
|
};
|
||||||
|
|
||||||
|
selected = angular.isArray(selected) ? selected : [selected];
|
||||||
|
|
||||||
|
return simpleModalService.modal(options).result.then(onModalSubmit);
|
||||||
|
|
||||||
|
function onModalSubmit() {
|
||||||
|
return $qExtensions.allSettled(selected.map(updateEntityPromise)).then(notify);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateEntityPromise(selected) {
|
||||||
|
var status = {'suppression_status': suppressed};
|
||||||
|
return {promise: api.updateEventSuppression(selected.uuid, status)};
|
||||||
|
}
|
||||||
|
|
||||||
|
function notify(result) {
|
||||||
|
if (result.pass.length > 0) {
|
||||||
|
var msg = gettext("Events %(suppressed)s for Alarm ID: %(alarm_id)s");
|
||||||
|
toastService.add('success', interpolate(msg, {suppressed: suppressed, alarm_id: alarm_id}, true));
|
||||||
|
$location.path('/admin/events_suppression');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.fail.length > 0) {
|
||||||
|
var msg = gettext("Failed to %(suppressed)s events for Alarm ID: %(alarm_id)s");
|
||||||
|
toastService.add('error', interpolate(msg, {suppressed: suppressed, alarm_id: alarm_id}, true));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function allowed($scope) {
|
||||||
|
if ($scope.suppression_status == suppressed) {
|
||||||
|
return $qExtensions.booleanAsPromise(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return $qExtensions.booleanAsPromise(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,88 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management')
|
||||||
|
.factory('horizon.dashboard.fault_management.events_suppression.unsuppress_event.service', updateService);
|
||||||
|
|
||||||
|
updateService.$inject = [
|
||||||
|
'$location',
|
||||||
|
'horizon.app.core.openstack-service-api.fm',
|
||||||
|
'horizon.framework.widgets.modal.simple-modal.service',
|
||||||
|
'horizon.framework.widgets.toast.service',
|
||||||
|
'horizon.framework.util.q.extensions'
|
||||||
|
];
|
||||||
|
|
||||||
|
function updateService($location, api, simpleModalService, toastService, $qExtensions) {
|
||||||
|
|
||||||
|
var scope;
|
||||||
|
|
||||||
|
var service = {
|
||||||
|
perform: perform,
|
||||||
|
allowed: allowed
|
||||||
|
};
|
||||||
|
|
||||||
|
var unsuppressedText = "Unsuppress Event";
|
||||||
|
var unsuppressed = "unsuppressed";
|
||||||
|
|
||||||
|
return service;
|
||||||
|
|
||||||
|
function perform(selected, newScope) {
|
||||||
|
|
||||||
|
var alarm_id = selected.alarm_id;
|
||||||
|
|
||||||
|
var options = {
|
||||||
|
title: 'Confirm ' + unsuppressedText,
|
||||||
|
body: 'You have selected: "' + alarm_id +
|
||||||
|
'". Please confirm your selection. Events with selected Alarm ID will be ' +
|
||||||
|
unsuppressed + '.',
|
||||||
|
submit: unsuppressedText,
|
||||||
|
cancel: 'Cancel'
|
||||||
|
};
|
||||||
|
|
||||||
|
selected = angular.isArray(selected) ? selected : [selected];
|
||||||
|
|
||||||
|
return simpleModalService.modal(options).result.then(onModalSubmit);
|
||||||
|
|
||||||
|
function onModalSubmit() {
|
||||||
|
return $qExtensions.allSettled(selected.map(updateEntityPromise)).then(notify);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateEntityPromise(selected) {
|
||||||
|
var status = {'suppression_status': unsuppressed};
|
||||||
|
return {promise: api.updateEventSuppression(selected.uuid, status)};
|
||||||
|
}
|
||||||
|
|
||||||
|
function notify(result) {
|
||||||
|
if (result.pass.length > 0) {
|
||||||
|
var msg = gettext("Events %(unsuppressed)s for Alarm ID: %(alarm_id)s");
|
||||||
|
toastService.add('success', interpolate(msg, {unsuppressed: unsuppressed, alarm_id: alarm_id}, true));
|
||||||
|
$location.path('/admin/events_suppression');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.fail.length > 0) {
|
||||||
|
var msg = gettext("Failed to %(unsuppressed)s events for Alarm ID: %(alarm_id)s");
|
||||||
|
toastService.add('error', interpolate(msg, {unsuppressed: unsuppressed, alarm_id: alarm_id}, true));
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function allowed($scope) {
|
||||||
|
if ($scope.suppression_status == unsuppressed) {
|
||||||
|
return $qExtensions.booleanAsPromise(false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return $qExtensions.booleanAsPromise(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,131 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @name horizon.dashboard.fault_management.events_suppression
|
||||||
|
* @ngModule
|
||||||
|
* @description
|
||||||
|
* Provides all the services and widgets require to display the Events Suppression
|
||||||
|
* panel
|
||||||
|
*/
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management.events_suppression', [
|
||||||
|
'ngRoute',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.actions'
|
||||||
|
])
|
||||||
|
.constant('horizon.dashboard.fault_management.events_suppression.resourceType', 'OS::StarlingX::EventsSuppression')
|
||||||
|
.run(run)
|
||||||
|
.config(config);
|
||||||
|
|
||||||
|
|
||||||
|
run.$inject = [
|
||||||
|
'horizon.framework.conf.resource-type-registry.service',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.service',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.basePath',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression.resourceType'
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
function run(registry, service, basePath, resourceType) {
|
||||||
|
registry.getResourceType(resourceType)
|
||||||
|
.setNames(gettext('Events Suppression'), gettext('Events Suppression'))
|
||||||
|
|
||||||
|
// specify items for table row items, summary view and details view
|
||||||
|
.setProperties(properties())
|
||||||
|
|
||||||
|
// get items for table
|
||||||
|
.setListFunction(service.getPromise)
|
||||||
|
|
||||||
|
// specify table columns
|
||||||
|
.tableColumns
|
||||||
|
.append({
|
||||||
|
id: 'alarm_id',
|
||||||
|
priority: 1,
|
||||||
|
sortDefault: true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'description',
|
||||||
|
priority: 1
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
id: 'suppression_status',
|
||||||
|
priority: 1
|
||||||
|
});
|
||||||
|
// for magic-search
|
||||||
|
registry.getResourceType(resourceType).filterFacets
|
||||||
|
.append({
|
||||||
|
'label': gettext('Event ID'),
|
||||||
|
'name': 'alarm_id',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Description'),
|
||||||
|
'name': 'description',
|
||||||
|
'singleton': true
|
||||||
|
})
|
||||||
|
.append({
|
||||||
|
'label': gettext('Status'),
|
||||||
|
'name': 'is_suppressed',
|
||||||
|
'singleton': true,
|
||||||
|
'options': [
|
||||||
|
{label: gettext('suppressed'), key: 'true'},
|
||||||
|
{label: gettext('unsuppressed'), key: 'false'}
|
||||||
|
]
|
||||||
|
})
|
||||||
|
;
|
||||||
|
}
|
||||||
|
|
||||||
|
function properties() {
|
||||||
|
return {
|
||||||
|
alarm_id: { label: gettext('Event ID'), filters: ['noValue'] },
|
||||||
|
description: { label: gettext('Description'), filters: ['noValue'] },
|
||||||
|
uuid: { label: gettext('Event UUID'), filters: ['noValue'] },
|
||||||
|
suppression_status: { label: gettext('Status'), filters: ['noValue'] },
|
||||||
|
links: { label: gettext('Links'), filters: ['noValue'] },
|
||||||
|
is_suppressed: { label: gettext('IsSuppressed'), filters: ['noValue'] }
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
config.$inject = [
|
||||||
|
'$provide',
|
||||||
|
'$windowProvider',
|
||||||
|
'$routeProvider'
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name config
|
||||||
|
* @param {Object} $provide
|
||||||
|
* @param {Object} $windowProvider
|
||||||
|
* @param {Object} $routeProvider
|
||||||
|
* @description Routes used by this module.
|
||||||
|
* @returns {undefined} Returns nothing
|
||||||
|
*/
|
||||||
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/fault_management/events_suppression/';
|
||||||
|
$provide.constant('horizon.dashboard.fault_management.events_suppression.basePath', path);
|
||||||
|
$routeProvider.when('/admin/events_suppression', {
|
||||||
|
templateUrl: path + 'panel.html'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
})();
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('horizon.dashboard.fault_management.events_suppression', function() {
|
||||||
|
it('should exist', function() {
|
||||||
|
expect(angular.module('horizon.dashboard.fault_management.events_suppression')).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
|
@ -0,0 +1,4 @@
|
||||||
|
// This enables \n to render properly, we use this for the description col
|
||||||
|
[resource-type-name="OS::StarlingX::EventsSuppression"] table hz-field.ng-scope.ng-isolate-scope {
|
||||||
|
white-space: pre-wrap;
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
angular.module('horizon.dashboard.fault_management.events_suppression')
|
||||||
|
.factory('horizon.dashboard.fault_management.events_suppression.service',
|
||||||
|
service);
|
||||||
|
|
||||||
|
service.$inject = [
|
||||||
|
'$filter',
|
||||||
|
'horizon.app.core.detailRoute',
|
||||||
|
'horizon.app.core.openstack-service-api.fm'
|
||||||
|
];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* @ngdoc factory
|
||||||
|
* @name horizon.dashboard.fault_management.events_suppression.service
|
||||||
|
*
|
||||||
|
* @description
|
||||||
|
* This service provides functions that are used through the Events Suppression
|
||||||
|
* features. These are primarily used in the module registrations
|
||||||
|
* but do not need to be restricted to such use. Each exposed function
|
||||||
|
* is documented below.
|
||||||
|
*/
|
||||||
|
function service($filter, detailRoute, api) {
|
||||||
|
return {
|
||||||
|
getPromise: getPromise
|
||||||
|
};
|
||||||
|
|
||||||
|
function getPromise(params) {
|
||||||
|
var include_unsuppressed = true;
|
||||||
|
return api.getEventsSuppression(include_unsuppressed).then(modifyResponse);
|
||||||
|
}
|
||||||
|
|
||||||
|
function modifyResponse(response) {
|
||||||
|
return {data: {items: response.data.items.map(modifyItem)}};
|
||||||
|
|
||||||
|
function modifyItem(item) {
|
||||||
|
|
||||||
|
// This enables the items to be updated on the view
|
||||||
|
item.trackBy = [
|
||||||
|
item.uuid,
|
||||||
|
item.suppression_status,
|
||||||
|
item.alarm_id
|
||||||
|
].join('/');
|
||||||
|
|
||||||
|
if (item.suppression_status == 'suppressed') {
|
||||||
|
item.is_suppressed = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
item.is_suppressed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return item;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
describe('Events Suppression service', function() {
|
||||||
|
var service;
|
||||||
|
beforeEach(module('horizon.app.core.openstack-service-api'));
|
||||||
|
beforeEach(module('horizon.dashboard.fault_management.events_suppression'));
|
||||||
|
beforeEach(inject(function($injector) {
|
||||||
|
service = $injector.get('horizon.dashboard.fault_management.events_suppression.service');
|
||||||
|
}));
|
||||||
|
|
||||||
|
describe('getPromise', function() {
|
||||||
|
it("provides a promise", inject(function($q, $injector, $timeout) {
|
||||||
|
var api = $injector.get('horizon.app.core.openstack-service-api.fm');
|
||||||
|
var deferred = $q.defer();
|
||||||
|
spyOn(api, 'getEventsSuppression').and.returnValue(deferred.promise);
|
||||||
|
var result = service.getPromise({});
|
||||||
|
deferred.resolve({
|
||||||
|
data:{
|
||||||
|
items: [{uuid: '123abc', description: 'resource1'}]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$timeout.flush();
|
||||||
|
expect(api.getEventsSuppression).toHaveBeenCalled();
|
||||||
|
expect(result.$$state.value.data.items[0].description).toBe('resource1');
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('urlFunction', function() {
|
||||||
|
it("get url", inject(function($injector) {
|
||||||
|
var detailRoute = $injector.get('horizon.app.core.detailRoute');
|
||||||
|
var result = service.urlFunction({id:"123abc"});
|
||||||
|
expect(result).toBe(detailRoute + "OS::StarlingX::EventsSuppression/123abc");
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
<hz-resource-panel resource-type-name="OS::StarlingX::EventsSuppression">
|
||||||
|
<hz-resource-table resource-type-name="OS::StarlingX::EventsSuppression"
|
||||||
|
track-by="trackBy">
|
||||||
|
</hz-resource-table>
|
||||||
|
</hz-resource-panel>
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @ngdoc overview
|
||||||
|
* @name horizon.dashboard.fault_management
|
||||||
|
* @description
|
||||||
|
* Dashboard module to host various platform panels.
|
||||||
|
*/
|
||||||
|
// fixme: if ngRoute and $routeProvider are unnecessary, remove them
|
||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
angular
|
||||||
|
.module('horizon.dashboard.fault_management', [
|
||||||
|
'horizon.dashboard.fault_management.active_alarms',
|
||||||
|
'horizon.dashboard.fault_management.events',
|
||||||
|
'horizon.dashboard.fault_management.events_suppression',
|
||||||
|
'ngRoute'
|
||||||
|
])
|
||||||
|
.config(config);
|
||||||
|
|
||||||
|
config.$inject = ['$provide', '$windowProvider', '$routeProvider'];
|
||||||
|
|
||||||
|
function config($provide, $windowProvider, $routeProvider) {
|
||||||
|
var path = $windowProvider.$get().STATIC_URL + 'dashboard/fault_management/';
|
||||||
|
$provide.constant('horizon.dashboard.fault_management.basePath', path);
|
||||||
|
}
|
||||||
|
/* eslint-disable no-unused-vars */
|
||||||
|
})();
|
|
@ -0,0 +1,30 @@
|
||||||
|
/**
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||||
|
* not use this file except in compliance with the License. You may obtain
|
||||||
|
* a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
|
* License for the specific language governing permissions and limitations
|
||||||
|
* under the License.
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
describe('horizon.dashboard.fault_management', function() {
|
||||||
|
it('should exist', function() {
|
||||||
|
expect(angular.module('horizon.dashboard.fault_management')).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
|
@ -0,0 +1 @@
|
||||||
|
@import "events_suppression/events_suppression";
|
|
@ -1,3 +1,10 @@
|
||||||
|
/**
|
||||||
|
* Copyright (c) 2019 Wind River Systems, Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
/* Core functionality related to alam-banner. */
|
/* Core functionality related to alam-banner. */
|
||||||
horizon.alarmbanner = {
|
horizon.alarmbanner = {
|
||||||
|
|
||||||
|
@ -6,7 +13,7 @@ horizon.alarmbanner = {
|
||||||
|
|
||||||
var $old = $(location).attr('pathname');
|
var $old = $(location).attr('pathname');
|
||||||
var $url = $(location).attr('href');
|
var $url = $(location).attr('href');
|
||||||
$url = $url.replace($old, "/admin/fault_management/banner");
|
$url = $url.replace($old, "/admin/active_alarms/banner");
|
||||||
|
|
||||||
horizon.ajax.queue({
|
horizon.ajax.queue({
|
||||||
url: $url,
|
url: $url,
|
||||||
|
@ -49,7 +56,7 @@ horizon.alarmbanner = {
|
||||||
},
|
},
|
||||||
|
|
||||||
onclick: function() {
|
onclick: function() {
|
||||||
var $fm = "/admin/fault_management";
|
var $fm = "/admin/active_alarms";
|
||||||
var $dc = "/dc_admin/";
|
var $dc = "/dc_admin/";
|
||||||
var $cur = document.location.href;
|
var $cur = document.location.href;
|
||||||
var $path = document.location.pathname;
|
var $path = document.location.pathname;
|
||||||
|
|
Loading…
Reference in New Issue