Fix periodic notifications for webhooks

- Removes the hard-coded magic number of 60 seconds allowing users to
  choose the period that they require.
- Standardise on strings for DictOpt dict keys. When loaded from a config
  file, the DictOpt keys are parsed as strings, which was conflicting with
  the default integer dict keys. This caused the periodic engine to silently
  fail to load when configured via a config file.
- Remove unused variable

Story: 2006783
Task: 37313
Change-Id: Ibd61c45fc1ade37022150d34a5b00c56fdf69814
This commit is contained in:
Doug Szumski 2019-11-12 10:38:15 +00:00
parent f062546cba
commit efc6e28edc
9 changed files with 15 additions and 16 deletions

@ -22,7 +22,7 @@ _DEFAULT_ALARM_TOPIC = 'alarm-state-transitions'
_DEFAULT_NOTIFICATION_TOPIC = 'alarm-notifications'
_DEFAULT_RETRY_TOPIC = 'retry-notifications'
_DEFAULT_PERIODIC_TOPICS = {
60: '60-seconds-notifications'
'60': '60-seconds-notifications'
}
_DEFAULT_MAX_OFFSET_LAG = 600

@ -20,7 +20,7 @@ _DEFAULT_URL = '127.0.0.1:2181'
_DEFAULT_NOTIFICATION_PATH = '/notification/alarms'
_DEFAULT_RETRY_PATH = '/notification/retry'
_DEFAULT_PERIODIC_PATH = {
60: '/notification/60_seconds'
'60': '/notification/60_seconds'
}
zookeeper_group = cfg.OptGroup('zookeeper',

@ -108,10 +108,10 @@ def main(argv=None):
args=(retry_engine.RetryEngine,))
)
if 60 in CONF.kafka.periodic:
for notification_period in CONF.kafka.periodic.keys():
processors.append(multiprocessing.Process(
target=start_process,
args=(periodic_engine.PeriodicEngine, 60))
args=(periodic_engine.PeriodicEngine, int(notification_period)))
)
try:

@ -39,7 +39,6 @@ class Notification(object):
'retry_count',
'raw_alarm',
'period',
'periodic_topic'
)
def __init__(self, id, type, name, address, period, retry_count, alarm):
@ -77,8 +76,6 @@ class Notification(object):
# to be updated on actual notification send time
self.notification_timestamp = None
# set periodic topic
self.periodic_topic = period
self.period = period
def __eq__(self, other):
@ -115,7 +112,6 @@ class Notification(object):
'lifecycle_state',
'tenant_id',
'period',
'periodic_topic'
]
notification_data = {name: getattr(self, name)
for name in notification_fields}

@ -46,10 +46,10 @@ class NotificationEngine(object):
def _add_periodic_notifications(self, notifications):
for notification in notifications:
topic = notification.periodic_topic
if topic in CONF.kafka.periodic and notification.type == "webhook":
period = str(notification.period)
if period in CONF.kafka.periodic.keys() and notification.type == "webhook":
notification.notification_timestamp = time.time()
self._producer.publish(CONF.kafka.periodic[topic],
self._producer.publish(CONF.kafka.periodic[period],
[notification.to_json()])
def run(self):

@ -33,7 +33,7 @@ CONF = cfg.CONF
class PeriodicEngine(object):
def __init__(self, period):
self._topic_name = CONF.kafka.periodic[period]
self._topic_name = CONF.kafka.periodic[str(period)]
self._statsd = get_statsd_client()
@ -42,7 +42,7 @@ class PeriodicEngine(object):
CONF.kafka.group,
self._topic_name,
CONF.zookeeper.url,
CONF.zookeeper.periodic_path[period],
CONF.zookeeper.periodic_path[str(period)],
CONF.kafka.legacy_kafka_client_enabled)
self._producer = client_factory.get_kafka_producer(
CONF.kafka.url,

@ -22,7 +22,6 @@ jira_format:
# notification.retry_count
# notification.raw_alarm
# notification.period
# notification.periodic_topic
# Please include alarm_id in summary as it is used for searching the issues
summary: Alaram created for {{ notification.alarm_name }} with severity {{ notification.state }} for {{ notification.alarm_id }}

@ -0,0 +1,6 @@
---
features:
- Supports setting arbitrary notification periods.
fixes:
- Issue with periodic notification processor failing to load when using Oslo
config.

@ -51,7 +51,6 @@ def test_json():
u'address': u'address',
u'message': u'stateChangeReason',
u'period': 0,
u'periodic_topic': 0,
u'retry_count': 0,
u'raw_alarm': {
u'alarmId': u'alarmId',
@ -101,7 +100,6 @@ def test_json_non_zero_period():
u'address': u'address',
u'message': u'stateChangeReason',
u'period': 60,
u'periodic_topic': 60,
u'retry_count': 0,
u'raw_alarm': {
u'alarmId': u'alarmId',