X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_policy_module%2Fhealing%2Fservice.py;h=b36f8676de769ba895a4573bbcb29afe02fff2ad;hb=refs%2Fchanges%2F96%2F13296%2F3;hp=7c6739cbe3e174bbaf728f36ff0d2af3bbe7403e;hpb=d37c54c64eec65c9a3c490a31eef3a02a76cb474;p=osm%2FPOL.git diff --git a/osm_policy_module/healing/service.py b/osm_policy_module/healing/service.py index 7c6739c..b36f867 100644 --- a/osm_policy_module/healing/service.py +++ b/osm_policy_module/healing/service.py @@ -24,6 +24,8 @@ ## import logging import datetime +import functools +import operator from osm_policy_module.common.common_db_client import CommonDbClient from osm_policy_module.common.lcm_client import LcmClient @@ -51,17 +53,23 @@ class HealingService: self.lcm_client = LcmClient(config) log.info("Constructor created for HealingService") - async def configure_healing_alarms(self, nsr_id: str): + async def configure_healing_alarms(self, nsr_id: str, vnf_member_index=None): """ Configuring the Healing alarms :param nsr_id: Network service record id + :param vnf_member_index: Member VNF Index of VNF """ log.info("Configuring Healing alarm for NS %s", nsr_id) alarms_created = [] database.db.connect() try: with database.db.atomic(): - vnfrs = self.db_client.get_vnfrs(nsr_id) + if vnf_member_index is None: + vnfrs = self.db_client.get_vnfrs(nsr_id) + else: + vnfrs = [] + vnfr = self.db_client.get_vnfr(nsr_id, vnf_member_index) + vnfrs.append(vnfr) for vnfr in vnfrs: vnfd = self.db_client.get_vnfd(vnfr["vnfd-id"]) df = vnfd.get("df", [{}])[0] @@ -178,18 +186,25 @@ class HealingService: finally: database.db.close() - async def delete_healing_alarms(self, nsr_id): + async def delete_healing_alarms(self, nsr_id, vnf_member_index=None): """ Deleting the healing alarms :param nsr_id: Network service record id + :param vnf_member_index: Member VNF Index of VNF """ log.info("Deleting healing vnf alarms for network service %s", nsr_id) database.db.connect() try: with database.db.atomic(): - for alarm in HealingActionRepository.list( - HealingAction.nsr_id == nsr_id - ): + if vnf_member_index is None: + heal_conditions = HealingAction.nsr_id == nsr_id + else: + query_list = [ + HealingAction.nsr_id == nsr_id, + HealingAction.vnf_member_index == vnf_member_index, + ] + heal_conditions = functools.reduce(operator.and_, query_list) + for alarm in HealingActionRepository.list(heal_conditions): try: await self.mon_client.delete_alarm( alarm.nsr_id, @@ -238,45 +253,48 @@ class HealingService: database.db.connect() try: if status == "alarm": - with database.db.atomic(): - alarm = HealingActionRepository.get( - HealingAction.alarm_uuid == alarm_uuid - ) - vnf_member_index = alarm.vnf_member_index - vdur_name = alarm.vdur_name - vdu_id = alarm.vdu_id - nsr_id = alarm.nsr_id - heal_type = alarm.recovery_action - cooldown_time = alarm.cooldown_time - count_index = alarm.count_index - last_heal = alarm.last_heal - day1 = alarm.day1 - vnfinstance_id = alarm.vnfinstance_id - alarms = HealingActionRepository.list( - HealingAction.vnf_member_index == vnf_member_index, - HealingAction.vdur_name == vdur_name, - ) - statuses = [] + if self.conf.get("autoheal", "enabled") == "True": + with database.db.atomic(): + alarm = HealingActionRepository.get( + HealingAction.alarm_uuid == alarm_uuid + ) + vnf_member_index = alarm.vnf_member_index + vdur_name = alarm.vdur_name + vdu_id = alarm.vdu_id + nsr_id = alarm.nsr_id + heal_type = alarm.recovery_action + cooldown_time = alarm.cooldown_time + count_index = alarm.count_index + last_heal = alarm.last_heal + day1 = alarm.day1 + vnfinstance_id = alarm.vnfinstance_id + alarms = HealingActionRepository.list( + HealingAction.vnf_member_index == vnf_member_index, + HealingAction.vdur_name == vdur_name, + ) + statuses = [] - for alarm in alarms: - statuses.append(alarm.last_status) - if (set(statuses) == {"alarm"}) or ("alarm" in statuses): - delta = datetime.datetime.now() - last_heal - if delta.total_seconds() > cooldown_time: - await self.lcm_client.heal( - nsr_id, - vnfinstance_id, - vdur_name, - vdu_id, - vnf_member_index, - heal_type, - day1, - count_index, - ) - last_heal = datetime.datetime.now() - log.info("datetime.datetime.now %s", datetime.datetime.now) - alarm.last_heal = last_heal - alarm.save() + for alarm in alarms: + statuses.append(alarm.last_status) + if (set(statuses) == {"alarm"}) or ("alarm" in statuses): + delta = datetime.datetime.now() - last_heal + if delta.total_seconds() > cooldown_time: + await self.lcm_client.heal( + nsr_id, + vnfinstance_id, + vdur_name, + vdu_id, + vnf_member_index, + heal_type, + day1, + count_index, + ) + last_heal = datetime.datetime.now() + log.info( + "datetime.datetime.now %s", datetime.datetime.now + ) + alarm.last_heal = last_heal + alarm.save() except HealingAction.DoesNotExist: log.info("There is no healing action configured for alarm %s.", alarm_uuid)