support for alarm and RCA history

add new history api and pagination in current alarm list api

Change-Id: Ie5ee407855b6aae6e34f316dce12669cfc1c025c
Story: 2002670
Task:  23216
This commit is contained in:
Anna Reznikov 2018-07-19 11:53:14 +00:00 committed by Ifat Afek
parent 87b5abdef0
commit 76e7198fe9
8 changed files with 210 additions and 6 deletions

View File

@ -722,7 +722,10 @@ Alarms Examples
---------------
Note: To see complete usage: 'vitrage help' and 'vitrage help <command>'
alarm list::
alarm list
^^^^^^^^^^
A list of all alarms (default limit of 1000 alarms)::
vitrage alarm list
+--------------------------------------+---------+----------------------------------------+---------------+--------------------------------------+----------+----------------------+
@ -735,7 +738,52 @@ alarm list::
| 608366ed-a737-4aab-a58f-8673a589e3aa | vitrage | VM network problem 2 | nova.instance | 786efe03-55ff-41b2-bdc1-6cd94bc355ad | CRITICAL | 2018-01-03T07:52:06Z |
+--------------------------------------+---------+----------------------------------------+---------------+--------------------------------------+----------+----------------------+
alarm show::
A list of all alarms on the given resource::
vitrage alarm list 52b466ba-ef98-4bf5-93d8-5c3ca680fe01
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------+
| ID | Type | Name | Resource Type | Resource ID | Severity | Update Time |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------+
| 3c1dda08-2c95-49f1-9155-35e5512a6f38 | vitrage | Instance down | nova.instance | 52b466ba-ef98-4bf5-93d8-5c3ca680fe01 | CRITICAL | 2018-07-22T11:42:57Z |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------+
A list of ``limit`` number of alarms::
vitrage alarm list --limit 2
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
| ID | Type | Name | Resource Type | Resource ID | Severity | Update Time |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
| f85ed0d2-3e28-47f9-9231-6fa72d6c882d | vitrage | Instance down | nova.instance | 52b466ba-ef98-4bf5-93d8-5c3ca680fe01 | CRITICAL | 2018-07-19 14:53:24.741108 |
| 868b252a-4053-431c-a6d3-7cdabd91edd8 | vitrage | Instance down | nova.instance | 4ac47cef-419f-4e4b-9590-22c10bbd21fd | CRITICAL | 2018-07-19 14:53:24.773490 |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
Paging. Get next alarms, from ``marker`` which is a vitrage_id::
vitrage alarm list --limit 2 --marker 868b252a-4053-431c-a6d3-7cdabd91edd8
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
| ID | Type | Name | Resource Type | Resource ID | Severity | Update Time |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
| c1ab17d4-8b6b-4d12-a4ec-3150bb89a5a5 | vitrage | Instance down | nova.instance | 52b466ba-ef98-4bf5-93d8-5c3ca680fe01 | CRITICAL | 2018-07-19 14:53:24.801490 |
| 7468b7f5-5a89-49ee-b408-3cfafd68290a | vitrage | Instance down | nova.instance | 4ac47cef-419f-4e4b-9590-22c10bbd21fd | CRITICAL | 2018-07-19 14:53:24.828359 |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+
alarm history
^^^^^^^^^^^^^
A list of all alarms that were active during the time frame of ``start`` and ``end``::
vitrage alarm history --start '2018-07-22 14:10:40.087709' --end '2018-07-23 16:10:41.354102' --limit 3
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+----------------------------+
| ID | Type | Name | Resource Type | Resource ID | Severity | Start Time | End Time |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+----------------------------+
| f85ed0d2-3e28-47f9-9231-6fa72d6c882d | vitrage | Instance down | nova.instance | 4ac47cef-419f-4e4b-9590-22c10bbd21fd | CRITICAL | 2018-07-19 14:53:24.741108 | 2018-07-22 14:53:24.741108 |
| 868b252a-4053-431c-a6d3-7cdabd91edd8 | vitrage | Instance down | nova.instance | 786efe03-55ff-41b2-bdc1-6cd94bc355ad | CRITICAL | 2018-07-19 14:53:24.773490 | |
| c1ab17d4-8b6b-4d12-a4ec-3150bb89a5a5 | vitrage | Instance down | nova.instance | 52b466ba-ef98-4bf5-93d8-5c3ca680fe01 | CRITICAL | 2018-07-23 02:10:41.354102 |
+--------------------------------------+---------+---------------+---------------+--------------------------------------+----------+----------------------------+----------------------------+
alarm show
^^^^^^^^^^
::
vitrage alarm show f85ed0d2-3e28-47f9-9231-6fa72d6c882d
+------------------------------+--------------------------------------+
@ -758,9 +806,12 @@ alarm show::
| vitrage_type | vitrage |
+------------------------------+--------------------------------------+
alarm count::
alarm count
^^^^^^^^^^^
::
vitrage alarm count
{
"WARNING": 2,
"SEVERE": 0,

View File

@ -0,0 +1,4 @@
---
features:
- Added pagination support for ``vitrage alarm list``

View File

@ -0,0 +1,5 @@
---
features:
- Added alarm histroy API. ``vitrage alarm history`` can be called with
``--start`` or ``--start`` and ``--end`` parameters to show alarms
that were active on a specific time period

View File

@ -43,6 +43,7 @@ openstack.rca.v1 =
rca_show = vitrageclient.v1.cli.rca:RcaShow
rca_topology_show = vitrageclient.v1.cli.topology:TopologyShow
rca_alarm_list = vitrageclient.v1.cli.alarm:AlarmList
rca_alarm_history = vitrageclient.v1.cli.alarm:AlarmHistory
rca_alarm_show = vitrageclient.v1.cli.alarm:AlarmShow
rca_alarm_count = vitrageclient.v1.cli.alarm:AlarmCount
rca_resource_list = vitrageclient.v1.cli.resource:ResourceList

View File

@ -7,7 +7,8 @@ _vitrage()
# Command data:
cmds='alarm complete event healthcheck help rca resource template topology'
cmds_alarm='list show count'
cmds_alarm_list='-h --help -f --format -c --column --max-width --print-empty --noindent --quote --all-tenants'
cmds_alarm_list='-h --help -f --format -c --column --max-width --print-empty --noindent --quote --limit --marker --all-tenants'
cmds_alarm_history='-h --help -f --format -c --column --max-width --print-empty --noindent --quote --limit --marker --start --end --all-tenants'
cmds_alarm_count='-h --help -f --format -c --column --max-width --print-empty --noindent --quote --all-tenants'
cmds_alarm_show='-h --help'
cmds_complete='-h --help --name --shell'

View File

@ -52,6 +52,7 @@ class VitrageCommandManager(commandmanager.CommandManager):
'resource show': resource.ResourceShow,
'resource list': resource.ResourceList,
'alarm list': alarm.AlarmList,
'alarm history': alarm.AlarmHistory,
'alarm show': alarm.AlarmShow,
'alarm count': alarm.AlarmCount,
'rca show': rca.RcaShow,

View File

@ -17,16 +17,84 @@ class Alarm(object):
def __init__(self, api):
self.api = api
def list(self, vitrage_id, all_tenants=False):
def list(self, vitrage_id, all_tenants=False,
limit=1000,
sort_by=['start_timestamp', 'vitrage_id'],
sort_dirs=['asc', 'asc'],
filter_by=None,
filter_vals=None,
next_page=True,
marker=None):
"""Get a all alarms on entity
:param all_tenants: should return all tenants alarms
:param vitrage_id: the id for the entity
:param limit: number of rows in page.
:param sort_by: array of attributes by which results should be sorted
:param sort_dirs: per-column array of sort_dirs,
corresponding to sort_keys ('asc' or 'desc')
:param filter_by: array of attributes by which results will be filtered
:param filter_vals: array of filter values corresponding to filter_by
:param next_page: True if next page was requested, False if previouse
:param marker: if next_page is True,
vitrage_id of last row in current page is needed,
else, vitrage_id of first row in current page.
marker=None if the request is for the first page.
"""
params = dict(vitrage_id=vitrage_id,
all_tenants=all_tenants)
all_tenants=all_tenants,
limit=limit,
sort_by=sort_by,
sort_dirs=sort_dirs,
filter_by=filter_by,
filter_vals=filter_vals,
next_page=next_page,
marker=marker
)
return self.api.get(self.url, params=params).json()
def history(self, all_tenants=False,
start=None,
end=None,
limit=1000,
sort_by=['start_timestamp', 'vitrage_id'],
sort_dirs=['asc', 'asc'],
filter_by=None,
filter_vals=None,
next_page=True,
marker=None):
"""Get the alarm history
:param all_tenants: should return all tenants alarms
:param start: start of time frame.
:param end: end of time frame.
:param limit: number of rows in page.
:param sort_by: array of attributes by which results should be sorted
:param sort_dirs: per-column array of sort_dirs,
corresponding to sort_keys ('asc' or 'desc')
:param filter_by: array of attributes by which results will be filtered
:param filter_vals: array of filter values corresponding to filter_by
:param next_page: True if next page was requested, False if previouse
:param marker: if next_page is True,
vitrage_id of last row in current page is needed,
else, vitrage_id of first row in current page.
marker=None if the request is for the first page.
"""
params = dict(all_tenants=all_tenants,
start=start,
end=end,
limit=limit,
sort_by=sort_by,
sort_dirs=sort_dirs,
filter_by=filter_by,
filter_vals=filter_vals,
next_page=next_page,
marker=marker
)
return self.api.get(self.url + 'history/', params=params).json()
def get(self, vitrage_id):
"""Get an alarm

View File

@ -14,6 +14,7 @@ from cliff import lister
from cliff import show
from vitrageclient.common import utils
from vitrageclient import exceptions as exc
class AlarmList(lister.Lister):
@ -34,13 +35,26 @@ class AlarmList(lister.Lister):
help='Shows alarms of all the tenants in the '
'entity graph')
parser.add_argument('--limit',
dest='limit',
help='Maximal number of alarms to show. Default '
'is 1000')
parser.add_argument('--marker',
dest='marker',
help='Marker for the next page')
return parser
def take_action(self, parsed_args):
vitrage_id = parsed_args.vitrage_id
all_tenants = parsed_args.all_tenants
limit = parsed_args.limit
marker = parsed_args.marker
alarms = utils.get_client(self).alarm.list(vitrage_id=vitrage_id,
limit=limit,
marker=marker,
all_tenants=all_tenants)
return utils.list2cols_with_rename(
(
@ -54,6 +68,65 @@ class AlarmList(lister.Lister):
), alarms)
class AlarmHistory(lister.Lister):
"""List the alarm history"""
def get_parser(self, prog_name):
parser = super(AlarmHistory, self).get_parser(prog_name)
parser.add_argument('--all-tenants',
default=False,
dest='all_tenants',
action='store_true',
help='Shows alarms of all the tenants in the '
'entity graph')
parser.add_argument('--limit',
dest='limit',
help='Maximal number of alarms to show. Default '
'is 1000')
parser.add_argument('--marker',
dest='marker',
help='Marker for the next page')
parser.add_argument('--start',
dest='start',
help='list alarm from this date')
parser.add_argument('--end',
dest='end',
help='list alarm until this date')
return parser
def take_action(self, parsed_args):
all_tenants = parsed_args.all_tenants
limit = parsed_args.limit
marker = parsed_args.marker
start = parsed_args.start
end = parsed_args.end
if end and not start:
raise exc.CommandError("--end argument must be used with --start")
alarms = utils.get_client(self).alarm.history(limit=limit,
marker=marker,
start=start,
end=end,
all_tenants=all_tenants)
return utils.list2cols_with_rename(
(
('ID', 'vitrage_id'),
('Type', 'vitrage_type'),
('Name', 'name'),
('Resource Type', 'vitrage_resource_type'),
('Resource ID', 'vitrage_resource_id'),
('Severity', 'vitrage_operational_severity'),
('Start Time', 'start_timestamp'),
('End Time', 'end_timestamp'),
), alarms)
class AlarmShow(show.ShowOne):
"""Show an alarm"""