X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=o2ims%2Fservice%2Fcommand%2Fpurge_alarm_handler.py;fp=o2ims%2Fservice%2Fcommand%2Fpurge_alarm_handler.py;h=335488a3bfea5facd9491aef80ff9eb42ae3ceba;hb=54ca64640ce149364fcfa91666c01edfe5c02e72;hp=0000000000000000000000000000000000000000;hpb=874ff786f1180878d74de7c4d85034247703112b;p=pti%2Fo2.git diff --git a/o2ims/service/command/purge_alarm_handler.py b/o2ims/service/command/purge_alarm_handler.py new file mode 100644 index 0000000..335488a --- /dev/null +++ b/o2ims/service/command/purge_alarm_handler.py @@ -0,0 +1,132 @@ +# Copyright (C) 2024 Wind River Systems, 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. + +import json + +from o2common.adapter.notifications import AbstractNotifications +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__) + + +def purge_alarm_event( + cmd: commands.PubAlarm2SMO, + uow: AbstractUnitOfWork, + notifications: AbstractNotifications, +): + """ + 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 = 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)