X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=o2ims%2Fservice%2Fcommand%2Fpurge_alarm_handler.py;h=335488a3bfea5facd9491aef80ff9eb42ae3ceba;hb=76a2f103ef57cc47973f0e7914ff5b7036f49800;hp=390cfe2cca475260370bf0d31951841b9e0b9480;hpb=b533c03e9233171cbd114339f98bd428688998a7;p=pti%2Fo2.git diff --git a/o2ims/service/command/purge_alarm_handler.py b/o2ims/service/command/purge_alarm_handler.py index 390cfe2..335488a 100644 --- a/o2ims/service/command/purge_alarm_handler.py +++ b/o2ims/service/command/purge_alarm_handler.py @@ -14,13 +14,13 @@ import json -from o2common.service.unit_of_work import AbstractUnitOfWork from o2common.adapter.notifications import AbstractNotifications - -from o2ims.adapter.clients.fault_client import StxEventClient -from o2ims.domain import commands, alarm_obj - +from o2common.config import conf +from o2common.domain.filter import gen_orm_filter from o2common.helper import o2logging +from o2common.service.unit_of_work import AbstractUnitOfWork +from o2ims.adapter.clients.fault_client import StxAlarmClient +from o2ims.domain import commands, alarm_obj logger = o2logging.get_logger(__name__) @@ -29,23 +29,104 @@ def purge_alarm_event( uow: AbstractUnitOfWork, notifications: AbstractNotifications, ): - logger.debug('In purge_alarm_event') - fault_client = StxEventClient(uow) + """ + Purges an alarm event and notifies relevant subscribers. + + This method performs the following steps: + 1. Retrieves data from the command object and initializes the fault client. + 2. Uses the Unit of Work pattern to find and delete the corresponding + alarm event record. + 3. Updates the alarm event record's hash, extensions, changed time, + and perceived severity. + 4. Commits the changes to the database. + 5. Finds and processes all alarm subscriptions, deciding whether to + send notifications based on subscription filters. + + Parameters: + - cmd (commands.PubAlarm2SMO): Command object containing the alarm + event data. + - uow (AbstractUnitOfWork): Unit of Work object for managing + database transactions. + - notifications (AbstractNotifications): Abstract notifications + object for sending notifications. + + Exceptions: + - Any exceptions that might occur during database operations or + notification sending. + """ + fault_client = StxAlarmClient(uow) data = cmd.data with uow: alarm_event_record = uow.alarm_event_records.get(data.id) - alarm_id = json.loads(alarm_event_record.extensions).get('alarm_id') - - events = fault_client.suppression_list(alarm_id) - for event_id in events: - event = fault_client.suppress(event_id.id) - alarm_event_record.hash = event.hash - alarm_event_record.extensions = json.dumps(event.filtered) - alarm_event_record.alarmChangedTime = event.updatetime.\ - strftime("%Y-%m-%dT%H:%M:%S") - alarm_event_record.perceivedSeverity = \ - alarm_obj.PerceivedSeverityEnum.CLEARED - - uow.alarm_event_records.update(alarm_event_record) - break + alarm = fault_client.delete(alarm_event_record.alarmEventRecordId) + alarm_event_record.hash = alarm.hash + alarm_event_record.extensions = json.dumps(alarm.filtered) + alarm_event_record.alarmChangedTime = alarm.updatetime.\ + strftime("%Y-%m-%dT%H:%M:%S") + alarm_event_record.perceivedSeverity = \ + alarm_obj.PerceivedSeverityEnum.CLEARED + + uow.alarm_event_records.update(alarm_event_record) + uow.commit() + + alarm = uow.alarm_event_records.get(data.id) + subs = uow.alarm_subscriptions.list() + for sub in subs: + sub_data = sub.serialize() + logger.debug('Alarm Subscription: {}'.format( + sub_data['alarmSubscriptionId'])) + + if not sub_data.get('filter', None): + callback_smo(notifications, sub, data, alarm) + continue + try: + args = gen_orm_filter(alarm_obj.AlarmEventRecord, + sub_data['filter']) + except KeyError: + logger.warning( + 'Alarm Subscription {} filter {} has wrong attribute ' + 'name or value. Ignore the filter'.format( + sub_data['alarmSubscriptionId'], + sub_data['filter'])) + callback_smo(notifications, sub, data, alarm) + continue + args.append(alarm_obj.AlarmEventRecord. + alarmEventRecordId == data.id) + count, _ = uow.alarm_event_records.list_with_count(*args) + if count != 0: + logger.debug( + 'Alarm Event {} skip for subscription {} because of ' + 'the filter.' + .format(data.id, sub_data['alarmSubscriptionId'])) + continue + callback_smo(notifications, sub, data, alarm) + + +def callback_smo(notifications: AbstractNotifications, + sub: alarm_obj.AlarmSubscription, + msg: alarm_obj.AlarmEvent2SMO, + alarm: alarm_obj.AlarmEventRecord): + sub_data = sub.serialize() + alarm_data = alarm.serialize() + callback = { + 'globalCloudID': conf.DEFAULT.ocloud_global_id, + 'consumerSubscriptionId': sub_data['consumerSubscriptionId'], + 'notificationEventType': msg.notificationEventType, + 'objectRef': msg.objectRef, + 'alarmEventRecordId': alarm_data['alarmEventRecordId'], + 'resourceTypeID': alarm_data['resourceTypeId'], + 'resourceID': alarm_data['resourceId'], + 'alarmDefinitionID': alarm_data['alarmDefinitionId'], + 'probableCauseID': alarm_data['probableCauseId'], + 'alarmRaisedTime': alarm_data['alarmRaisedTime'], + 'alarmChangedTime': alarm_data['alarmChangedTime'], + 'alarmAcknowledgeTime': alarm_data['alarmAcknowledgeTime'], + 'alarmAcknowledged': alarm_data['alarmAcknowledged'], + 'perceivedSeverity': alarm_data['perceivedSeverity'], + 'extensions': json.loads(alarm_data['extensions']) + } + logger.info('callback URL: {}'.format(sub_data['callback'])) + logger.debug('callback data: {}'.format(json.dumps(callback))) + + return notifications.send(sub_data['callback'], callback)