Feature 10986: Autoheal switch and Autoscale switch
[osm/POL.git] / osm_policy_module / autoscaling / service.py
index d195bb7..5869785 100644 (file)
@@ -22,7 +22,6 @@
 # For those usages not covered by the Apache License, Version 2.0 please
 # contact: bdiaz@whitestack.com or glavado@whitestack.com
 ##
-import asyncio
 import datetime
 import json
 import logging
@@ -50,14 +49,11 @@ log = logging.getLogger(__name__)
 
 
 class AutoscalingService:
-    def __init__(self, config: Config, loop=None):
+    def __init__(self, config: Config):
         self.conf = config
-        if not loop:
-            loop = asyncio.get_event_loop()
-        self.loop = loop
         self.db_client = CommonDbClient(config)
-        self.mon_client = MonClient(config, loop=self.loop)
-        self.lcm_client = LcmClient(config, loop=self.loop)
+        self.mon_client = MonClient(config)
+        self.lcm_client = LcmClient(config)
 
     async def configure_scaling_groups(self, nsr_id: str, vnf_member_index=None):
         """
@@ -198,7 +194,7 @@ class AutoscalingService:
                                                     operation=scaling_criteria[
                                                         "scale-in-relational-operation"
                                                     ],
-                                                    action="scale_in"
+                                                    action="scale_in",
                                                 )
                                             )
                                             alarm = ScalingAlarmRepository.create(
@@ -262,8 +258,10 @@ class AutoscalingService:
                     if vnf_member_index is None:
                         scale_conditions = ScalingGroup.nsr_id == nsr_id
                     else:
-                        query_list = [ScalingGroup.nsr_id == nsr_id,
-                                      ScalingGroup.vnf_member_index == vnf_member_index]
+                        query_list = [
+                            ScalingGroup.nsr_id == nsr_id,
+                            ScalingGroup.vnf_member_index == vnf_member_index,
+                        ]
                         scale_conditions = functools.reduce(operator.and_, query_list)
                     for scaling_group in ScalingGroupRepository.list(scale_conditions):
                         for scaling_policy in scaling_group.scaling_policies:
@@ -360,48 +358,49 @@ class AutoscalingService:
     async def evaluate_policy(self, alarm_uuid):
         database.db.connect()
         try:
-            with database.db.atomic():
-                alarm = ScalingAlarmRepository.get(
-                    ScalingAlarm.alarm_uuid == alarm_uuid
-                )
-                vnf_member_index = alarm.vnf_member_index
-                action = alarm.action
-                scaling_policy = alarm.scaling_criteria.scaling_policy
-                if not scaling_policy.enabled:
-                    return
-                if action == "scale_in":
-                    operation = scaling_policy.scale_in_operation
-                elif action == "scale_out":
-                    operation = scaling_policy.scale_out_operation
-                else:
-                    raise Exception("Unknown alarm action {}".format(alarm.action))
-                alarms = ScalingAlarmRepository.list(
-                    ScalingAlarm.scaling_criteria == alarm.scaling_criteria,
-                    ScalingAlarm.action == alarm.action,
-                    ScalingAlarm.vnf_member_index == vnf_member_index,
-                    ScalingAlarm.vdu_name == alarm.vdu_name,
-                )
-                statuses = []
-                for alarm in alarms:
-                    statuses.append(alarm.last_status)
-                if (operation == "AND" and set(statuses) == {"alarm"}) or (
-                    operation == "OR" and "alarm" in statuses
-                ):
-                    delta = datetime.datetime.now() - scaling_policy.last_scale
-                    if delta.total_seconds() > scaling_policy.cooldown_time:
-                        log.info(
-                            "Sending %s action message for ns: %s",
-                            alarm.action,
-                            scaling_policy.scaling_group.nsr_id,
-                        )
-                        await self.lcm_client.scale(
-                            scaling_policy.scaling_group.nsr_id,
-                            scaling_policy.scaling_group.name,
-                            vnf_member_index,
-                            action,
-                        )
-                        scaling_policy.last_scale = datetime.datetime.now()
-                        scaling_policy.save()
+            if self.conf.get("autoscale", "enabled") == "True":
+                with database.db.atomic():
+                    alarm = ScalingAlarmRepository.get(
+                        ScalingAlarm.alarm_uuid == alarm_uuid
+                    )
+                    vnf_member_index = alarm.vnf_member_index
+                    action = alarm.action
+                    scaling_policy = alarm.scaling_criteria.scaling_policy
+                    if not scaling_policy.enabled:
+                        return
+                    if action == "scale_in":
+                        operation = scaling_policy.scale_in_operation
+                    elif action == "scale_out":
+                        operation = scaling_policy.scale_out_operation
+                    else:
+                        raise Exception("Unknown alarm action {}".format(alarm.action))
+                    alarms = ScalingAlarmRepository.list(
+                        ScalingAlarm.scaling_criteria == alarm.scaling_criteria,
+                        ScalingAlarm.action == alarm.action,
+                        ScalingAlarm.vnf_member_index == vnf_member_index,
+                        ScalingAlarm.vdu_name == alarm.vdu_name,
+                    )
+                    statuses = []
+                    for alarm in alarms:
+                        statuses.append(alarm.last_status)
+                    if (operation == "AND" and set(statuses) == {"alarm"}) or (
+                        operation == "OR" and "alarm" in statuses
+                    ):
+                        delta = datetime.datetime.now() - scaling_policy.last_scale
+                        if delta.total_seconds() > scaling_policy.cooldown_time:
+                            log.info(
+                                "Sending %s action message for ns: %s",
+                                alarm.action,
+                                scaling_policy.scaling_group.nsr_id,
+                            )
+                            await self.lcm_client.scale(
+                                scaling_policy.scaling_group.nsr_id,
+                                scaling_policy.scaling_group.name,
+                                vnf_member_index,
+                                action,
+                            )
+                            scaling_policy.last_scale = datetime.datetime.now()
+                            scaling_policy.save()
 
         except ScalingAlarm.DoesNotExist:
             log.debug(