X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=o2ims%2Fadapter%2Fclients%2Ffault_client.py;h=74abe57c7c3c5b8e9e4e1464ded1ba0826eb6682;hb=54ca64640ce149364fcfa91666c01edfe5c02e72;hp=53602b44ddb066487dbbfed2f27964a4b9f3ed2c;hpb=1dd2947529e5910d37c55472bfc81915d3caa38b;p=pti%2Fo2.git diff --git a/o2ims/adapter/clients/fault_client.py b/o2ims/adapter/clients/fault_client.py index 53602b4..74abe57 100644 --- a/o2ims/adapter/clients/fault_client.py +++ b/o2ims/adapter/clients/fault_client.py @@ -1,4 +1,4 @@ -# Copyright (C) 2022 Wind River Systems, Inc. +# Copyright (C) 2022-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. @@ -21,7 +21,7 @@ from cgtsclient.client import get_client as get_stx_client from cgtsclient.exc import EndpointException from dcmanagerclient.api.client import client as get_dc_client from fmclient.client import get_client as get_fm_client -from fmclient.common.exceptions import HTTPNotFound +from fmclient.common.exceptions import HTTPNotFound, HttpServerError from o2app.adapter import unit_of_work from o2common.config import config @@ -85,6 +85,11 @@ class StxAlarmClient(BaseClient): logger.debug('alarm {} not in this resource pool {}' .format(alarm, self._pool_id)) continue + except HttpServerError: + # TODO(jon): This exception needs to be removed when the + # INF-457 related FM client upgrade and issue fix occur. + logger.debug('alarm {} query failed'.format(alarm)) + continue ret.append(event) return ret @@ -92,11 +97,15 @@ class StxAlarmClient(BaseClient): def _set_stx_client(self): self.driver.setFaultClient(self._pool_id) + def delete(self, id) -> alarmModel.FaultGenericModel: + return self.driver.deleteAlarm(id) + class StxEventClient(BaseClient): - def __init__(self, driver=None): + def __init__(self, uow: unit_of_work.AbstractUnitOfWork, driver=None): super().__init__() self.driver = driver if driver else StxFaultClientImp() + self.uow = uow def _get(self, id) -> alarmModel.FaultGenericModel: return self.driver.getEventInfo(id) @@ -107,6 +116,12 @@ class StxEventClient(BaseClient): def _set_stx_client(self): self.driver.setFaultClient(self._pool_id) + def suppression_list(self, alarm_id) -> List[alarmModel.FaultGenericModel]: + return self.driver.getSuppressionList(alarm_id) + + def suppress(self, id) -> alarmModel.FaultGenericModel: + return self.driver.suppressEvent(id) + # internal driver which implement client call to Stx Fault Management instance class StxFaultClientImp(object): @@ -145,7 +160,7 @@ class StxFaultClientImp(object): try: sub_is_https = False os_client_args = config.get_stx_access_info( - region_name=subcloud[0].name, + region_name=subcloud[0].region_name, subcloud_hostname=subcloud[0].oam_floating_ip) stx_client = get_stx_client(**os_client_args) except EndpointException as e: @@ -153,7 +168,8 @@ class StxFaultClientImp(object): if CGTSCLIENT_ENDPOINT_ERROR_MSG in msg: sub_is_https = True os_client_args = config.get_stx_access_info( - region_name=subcloud[0].name, sub_is_https=sub_is_https, + region_name=subcloud[0].region_name, + sub_is_https=sub_is_https, subcloud_hostname=subcloud[0].oam_floating_ip) stx_client = get_stx_client(**os_client_args) else: @@ -187,8 +203,8 @@ class StxFaultClientImp(object): alarms = self.fmclient.alarm.list(expand=True) if len(alarms) == 0: return [] - logger.debug('alarm 1:' + str(alarms[0].to_dict())) - # [print('alarm:' + str(alarm.to_dict())) for alarm in alarms if alarm] + [logger.debug( + 'alarm:' + str(alarm.to_dict())) for alarm in alarms if alarm] return [alarmModel.FaultGenericModel( alarmModel.EventTypeEnum.ALARM, self._alarmconverter(alarm)) for alarm in alarms if alarm] @@ -196,7 +212,8 @@ class StxFaultClientImp(object): def getAlarmInfo(self, id) -> alarmModel.FaultGenericModel: try: alarm = self.fmclient.alarm.get(id) - logger.debug('get alarm id ' + id + ':' + str(alarm.to_dict())) + logger.debug( + 'get alarm id: ' + id + ', result:' + str(alarm.to_dict())) except HTTPNotFound: event = self.fmclient.event_log.get(id) return alarmModel.FaultGenericModel( @@ -205,10 +222,16 @@ class StxFaultClientImp(object): return alarmModel.FaultGenericModel( alarmModel.EventTypeEnum.ALARM, self._alarmconverter(alarm)) + def deleteAlarm(self, id) -> alarmModel.FaultGenericModel: + alarm = self.fmclient.alarm.delete(id) + logger.debug('delete alarm id ' + id + ':' + str(alarm.to_dict())) + return alarmModel.FaultGenericModel( + alarmModel.EventTypeEnum.ALARM, self._alarmconverter(alarm)) + def getEventList(self, **filters) -> List[alarmModel.FaultGenericModel]: events = self.fmclient.event_log.list(alarms=True, expand=True) - logger.debug('event 1:' + str(events[0].to_dict())) - # [print('alarm:' + str(event.to_dict())) for event in events if event] + [logger.debug( + 'alarm:' + str(event.to_dict())) for event in events if event] return [alarmModel.FaultGenericModel( alarmModel.EventTypeEnum.EVENT, self._eventconverter(event)) for event in events if event] @@ -219,6 +242,27 @@ class StxFaultClientImp(object): return alarmModel.FaultGenericModel( alarmModel.EventTypeEnum.EVENT, self._eventconverter(event)) + def suppressEvent(self, id) -> alarmModel.FaultGenericModel: + patch = [dict(path='/' + 'suppression_status', value='suppressed', + op='replace')] + event = self.fmclient.event_suppression.update(id, patch) + logger.debug('suppressed event id ' + id + ':' + str(event.to_dict())) + return alarmModel.FaultGenericModel( + alarmModel.EventTypeEnum.EVENT, self._suppression_converter(event)) + + def getSuppressionList(self, alarm_id) -> alarmModel.FaultGenericModel: + suppression_list = [] + query_as_array = [] + events = self.fmclient.event_suppression.list(q=query_as_array) + for event in events: + if event.alarm_id == alarm_id: + # logger.debug('suppression event:' + str(event.to_dict())) + suppression_list.append( + alarmModel.FaultGenericModel( + alarmModel.EventTypeEnum.EVENT, + self._suppression_converter(event))) + return suppression_list + @ staticmethod def _alarmconverter(alarm): selected_keys = [ @@ -264,6 +308,27 @@ class StxFaultClientImp(object): uuid.NAMESPACE_URL, event.probable_cause))) return event + @ staticmethod + def _suppression_converter(event, clear=False): + selected_keys = [ + 'alarm_id', 'description', 'suppression_status', + 'links' + ] + content = event.to_dict() + filtered = dict( + filter(lambda item: item[0] in selected_keys, content.items())) + setattr(event, 'filtered', filtered) + setattr(event, 'uuid', event.uuid) + setattr(event, 'alarm_id', event.alarm_id) + setattr(event, 'description', event.description) + setattr(event, 'suppression_status', event.suppression_status) + setattr(event, 'alarm_type', None) + setattr(event, 'alarm_def_id', None) + setattr(event, 'probable_cause_id', None) + setattr(event, 'state', None) + setattr(event, 'timestamp', None) + return event + @ staticmethod def _alarmeventhasher(event, state=''): # The event model and the alarm model have different parameter name