From: Zhang Rong(Jon) Date: Thu, 24 Nov 2022 01:43:42 +0000 (+0800) Subject: Fix INF-371 and INF-372 notification post data does not comply to spec X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=commitdiff_plain;h=a97503249662025d0591d79614612ff630bf5817;p=pti%2Fo2.git Fix INF-371 and INF-372 notification post data does not comply to spec Issue-ID: INF-371 Issue-ID: INF-372 Signed-off-by: Zhang Rong(Jon) Change-Id: Ibdab721bd784471471cd24f84fa052ec326d6373 --- diff --git a/o2ims/domain/subscription_obj.py b/o2ims/domain/subscription_obj.py index a5afd9f..c23a9ea 100644 --- a/o2ims/domain/subscription_obj.py +++ b/o2ims/domain/subscription_obj.py @@ -32,9 +32,9 @@ class Subscription(AgRoot, Serializer): class NotificationEventEnum(str, Enum): - CREATE = 'CREATE' - MODIFY = 'MODIFY' - DELETE = 'DELETE' + CREATE = 0 + MODIFY = 1 + DELETE = 2 class Message2SMO(Serializer): diff --git a/o2ims/service/command/notify_alarm_handler.py b/o2ims/service/command/notify_alarm_handler.py index 8ee4dd8..ac5bb39 100644 --- a/o2ims/service/command/notify_alarm_handler.py +++ b/o2ims/service/command/notify_alarm_handler.py @@ -18,7 +18,7 @@ import ssl import json from urllib.parse import urlparse -# from o2common.config import config +from o2common.config import conf from o2common.domain.filter import gen_orm_filter from o2common.service.unit_of_work import AbstractUnitOfWork from o2common.service.command.handler import get_https_conn_default @@ -41,49 +41,67 @@ def notify_alarm_to_smo( logger.debug('In notify_alarm_to_smo') data = cmd.data with uow: + alarm = uow.alarm_event_records.get(data.id) + if alarm is None: + logger.debug('Alarm Event {} does not exists.'.format(data.id)) + return + subs = uow.alarm_subscriptions.list() for sub in subs: sub_data = sub.serialize() logger.debug('Alarm Subscription: {}'.format( sub_data['alarmSubscriptionId'])) - alarm = uow.alarm_event_records.get(data.id) - if alarm is None: - logger.debug('Alarm Event {} does not exists.'.format(data.id)) + if not sub_data.get('filter', None): + callback_smo(sub, data, alarm) continue - if sub_data.get('filter', None): - try: - args = gen_orm_filter(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(sub, data) - continue - args.append(AlarmEventRecord.alarmEventRecordId == data.id) - ret = uow.alarm_event_records.list_with_count(*args) - if ret[0] != 0: - logger.debug( - 'Alarm Event {} skip for subscription {} because of ' - 'the filter.' - .format(data.id, sub_data['alarmSubscriptionId'])) - continue - - callback_smo(sub, data) + try: + args = gen_orm_filter(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(sub, data, alarm) + continue + args.append(AlarmEventRecord.alarmEventRecordId == data.id) + ret = uow.alarm_event_records.list_with_count(*args) + if ret[0] != 0: + logger.debug( + 'Alarm Event {} skip for subscription {} because of ' + 'the filter.' + .format(data.id, sub_data['alarmSubscriptionId'])) + continue + callback_smo(sub, data, alarm) -def callback_smo(sub: AlarmSubscription, msg: AlarmEvent2SMO): +def callback_smo(sub: AlarmSubscription, msg: AlarmEvent2SMO, + alarm: AlarmEventRecord): sub_data = sub.serialize() - callback_data = json.dumps({ + alarm_data = alarm.serialize() + callback = { + 'globalCloudID': conf.DEFAULT.ocloud_global_id, 'consumerSubscriptionId': sub_data['consumerSubscriptionId'], 'notificationEventType': msg.notificationEventType, 'objectRef': msg.objectRef, - 'updateTime': msg.updatetime - }) + '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': '' + } + # logger.warning(callback) + callback_data = json.dumps(callback) logger.info('URL: {}, data: {}'.format( sub_data['callback'], callback_data)) + o = urlparse(sub_data['callback']) if o.scheme == 'https': conn = get_https_conn_default(o.netloc) diff --git a/o2ims/service/command/notify_handler.py b/o2ims/service/command/notify_handler.py index e7b41e1..50c4099 100644 --- a/o2ims/service/command/notify_handler.py +++ b/o2ims/service/command/notify_handler.py @@ -44,63 +44,60 @@ def notify_change_to_smo( logger.debug('In notify_change_to_smo') data = cmd.data with uow: + resource = uow.resources.get(data.id) + if resource is None: + logger.debug('Resource {} does not exists.'.format(data.id)) + return + res_pool_id = resource.serialize()['resourcePoolId'] + logger.debug('res pool id is {}'.format(res_pool_id)) + subs = uow.subscriptions.list() for sub in subs: sub_data = sub.serialize() logger.debug('Subscription: {}'.format(sub_data['subscriptionId'])) - resource = uow.resources.get(data.id) - if resource is None: - logger.debug('Resource {} does not exists.'.format(data.id)) + if not sub_data.get('filter', None): + callback_smo(sub, data) + continue + try: + args = gen_orm_filter(ocloud.Resource, sub_data['filter']) + except KeyError: + logger.error( + 'Subscription {} filter {} has wrong attribute name ' + 'or value. Ignore the filter.'.format( + sub_data['subscriptionId'], sub_data['filter'])) + callback_smo(sub, data) + continue + args.append(ocloud.Resource.resourceId == data.id) + ret = uow.resources.list_with_count(res_pool_id, *args) + if ret[0] != 0: + logger.debug( + 'Resource {} skip for subscription {} because of the ' + 'filter.' + .format(data.id, sub_data['subscriptionId'])) continue - res_pool_id = resource.serialize()['resourcePoolId'] - logger.debug('res pool id is {}'.format(res_pool_id)) - if sub_data.get('filter', None): - try: - args = gen_orm_filter(ocloud.Resource, sub_data['filter']) - except KeyError: - logger.error( - 'Subscription {} filter {} has wrong attribute name ' - 'or value. Ignore the filter.'.format( - sub_data['subscriptionId'], sub_data['filter'])) - callback_smo(sub, data) - continue - args.append(ocloud.Resource.resourceId == data.id) - ret = uow.resources.list_with_count(res_pool_id, *args) - if ret[0] != 0: - logger.debug( - 'Resource {} skip for subscription {} because of the ' - 'filter.' - .format(data.id, sub_data['subscriptionId'])) - continue - callback_smo(sub, data) def callback_smo(sub: Subscription, msg: Message2SMO): sub_data = sub.serialize() - callback_data = json.dumps({ + callback = { 'consumerSubscriptionId': sub_data['consumerSubscriptionId'], 'notificationEventType': msg.notificationEventType, 'objectRef': msg.objectRef, 'updateTime': msg.updatetime - }) + } + # if msg.notificationEventType in [NotificationEventEnum.DELETE, + # NotificationEventEnum.MODIFY]: + # callback['priorObjectState'] = {} + # if msg.notificationEventType in [NotificationEventEnum.CREATE, + # NotificationEventEnum.MODIFY]: + # callback['postObjectState'] = {} + # logger.warning(callback) + callback_data = json.dumps(callback) logger.info('URL: {}, data: {}'.format( sub_data['callback'], callback_data)) - # r.publish(sub_data['subscriptionId'], json.dumps({ - # 'consumerSubscriptionId': sub_data['consumerSubscriptionId'], - # 'notificationEventType': msg.notificationEventType, - # 'objectRef': msg.objectRef - # })) - # try: - # headers = {'User-Agent': 'Mozilla/5.0'} - # resp = requests.post(sub_data['callback'], data=callback_data, - # headers=headers) - # if resp.status_code == 202 or resp.status_code == 200: - # logger.info('Notify to SMO successed') - # return - # logger.error('Response code is: {}'.format(resp.status_code)) - # except requests.exceptions.HTTPError as err: - # logger.error('request smo error: {}'.format(err)) + + # Call SMO through the SMO callback url o = urlparse(sub_data['callback']) if o.scheme == 'https': conn = get_https_conn_default(o.netloc) diff --git a/requirements-test.txt b/requirements-test.txt index d60633c..e5e572c 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,4 +1,4 @@ -flake8 +flake8==5.0.4 pylint mypy requests