Fix INF-359 and INF-352 about the alarm event record
[pti/o2.git] / o2ims / adapter / clients / fault_client.py
index 45a27ff..78bd7bb 100644 (file)
 from typing import List  # Optional,  Set
 import uuid as uuid
 
-# from dcmanagerclient.api import client
-# 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 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 o2common.service.client.base_client import BaseClient
+from o2app.adapter import unit_of_work
 from o2common.config import config
+from o2common.service.client.base_client import BaseClient
 from o2ims.domain import alarm_obj as alarmModel
-from o2app.adapter import unit_of_work
 
 from o2common.helper import o2logging
 logger = o2logging.get_logger(__name__)
@@ -47,7 +46,6 @@ class StxAlarmClient(BaseClient):
         return self.driver.getAlarmInfo(id)
 
     def _list(self, **filters) -> List[alarmModel.FaultGenericModel]:
-        # filters['resourcetypeid']
         newmodels = self.driver.getAlarmList(**filters)
         uow = self.uow
         exist_alarms = {}
@@ -81,13 +79,18 @@ class StxAlarmClient(BaseClient):
             if exist_alarms[alarm]:
                 # exist alarm is active
                 continue
-            event = self._get(alarm)
+            try:
+                event = self._get(alarm)
+            except HTTPNotFound:
+                logger.debug('alarm {} not in this resource pool {}'
+                             .format(alarm, self._pool_id))
+                continue
             ret.append(event)
 
         return ret
 
     def _set_stx_client(self):
-        pass
+        self.driver.setFaultClient(self._pool_id)
 
 
 class StxEventClient(BaseClient):
@@ -102,22 +105,83 @@ class StxEventClient(BaseClient):
         return self.driver.getEventList(**filters)
 
     def _set_stx_client(self):
-        pass
+        self.driver.setFaultClient(self._pool_id)
 
 
 # internal driver which implement client call to Stx Fault Management instance
 class StxFaultClientImp(object):
-    def __init__(self, fm_client=None):
+    def __init__(self, fm_client=None, stx_client=None, dc_client=None):
         super().__init__()
         self.fmclient = fm_client if fm_client else self.getFmClient()
-        # if subcloud_id is not None:
-        # self.stxclient = self.getSubcloudClient(subcloud_id)
+        self.stxclient = stx_client if stx_client else self.getStxClient()
+        self.dcclient = dc_client if dc_client else self.getDcmanagerClient()
+
+    def getStxClient(self):
+        os_client_args = config.get_stx_access_info()
+        config_client = get_stx_client(**os_client_args)
+        return config_client
+
+    def getDcmanagerClient(self):
+        os_client_args = config.get_dc_access_info()
+        config_client = get_dc_client(**os_client_args)
+        return config_client
 
     def getFmClient(self):
         os_client_args = config.get_fm_access_info()
         config_client = get_fm_client(1, **os_client_args)
         return config_client
 
+    def getSubcloudList(self):
+        subs = self.dcclient.subcloud_manager.list_subclouds()
+        known_subs = [sub for sub in subs if sub.sync_status != 'unknown']
+        return known_subs
+
+    def getSubcloudFaultClient(self, subcloud_id):
+        subcloud = self.dcclient.subcloud_manager.\
+            subcloud_additional_details(subcloud_id)
+        logger.debug('subcloud name: %s, oam_floating_ip: %s' %
+                     (subcloud[0].name, subcloud[0].oam_floating_ip))
+        try:
+            sub_is_https = False
+            os_client_args = config.get_stx_access_info(
+                region_name=subcloud[0].name,
+                subcloud_hostname=subcloud[0].oam_floating_ip)
+            stx_client = get_stx_client(**os_client_args)
+        except EndpointException as e:
+            msg = e.format_message()
+            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,
+                    subcloud_hostname=subcloud[0].oam_floating_ip)
+                stx_client = get_stx_client(**os_client_args)
+            else:
+                raise ValueError('Stx endpoint exception: %s' % msg)
+        except Exception:
+            raise ValueError('cgtsclient get subcloud client failed')
+
+        os_client_args = config.get_fm_access_info(
+            sub_is_https=sub_is_https,
+            subcloud_hostname=subcloud[0].oam_floating_ip)
+        fm_client = get_fm_client(1, **os_client_args)
+
+        return stx_client, fm_client
+
+    def setFaultClient(self, resource_pool_id):
+        systems = self.stxclient.isystem.list()
+        if resource_pool_id == systems[0].uuid:
+            logger.debug('Fault Client not change: %s' % resource_pool_id)
+            self.fmclient = self.getFmClient()
+            return
+
+        subclouds = self.getSubcloudList()
+        for subcloud in subclouds:
+            substxclient, subfaultclient = self.getSubcloudFaultClient(
+                subcloud.subcloud_id)
+            systems = substxclient.isystem.list()
+            if resource_pool_id == systems[0].uuid:
+                self.fmclient = subfaultclient
+
     def getAlarmList(self, **filters) -> List[alarmModel.FaultGenericModel]:
         alarms = self.fmclient.alarm.list(expand=True)
         if len(alarms) == 0:
@@ -132,7 +196,6 @@ class StxFaultClientImp(object):
         try:
             alarm = self.fmclient.alarm.get(id)
             logger.debug('get alarm id ' + id + ':' + str(alarm.to_dict()))
-            # print(alarm.to_dict())
         except HTTPNotFound:
             event = self.fmclient.event_log.get(id)
             return alarmModel.FaultGenericModel(
@@ -152,7 +215,6 @@ class StxFaultClientImp(object):
     def getEventInfo(self, id) -> alarmModel.FaultGenericModel:
         event = self.fmclient.event_log.get(id)
         logger.debug('get event id ' + id + ':' + str(event.to_dict()))
-        # print(event.to_dict())
         return alarmModel.FaultGenericModel(
             alarmModel.EventTypeEnum.EVENT, self._eventconverter(event))