X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=osm_policy_module%2Fautoscaling%2Fservice.py;h=fb3ecafbf20733f20f15c346e754cb2aa6ab8a5c;hb=refs%2Ftags%2Frelease-v9.0-start;hp=b840acbf0b6ad5cbef49f3b3b3f71ed721947915;hpb=8ba99ff372d2d8ef13b2c6865b16c0869fa04069;p=osm%2FPOL.git diff --git a/osm_policy_module/autoscaling/service.py b/osm_policy_module/autoscaling/service.py index b840acb..fb3ecaf 100644 --- a/osm_policy_module/autoscaling/service.py +++ b/osm_policy_module/autoscaling/service.py @@ -26,7 +26,6 @@ import asyncio import datetime import json import logging -from typing import List from osm_policy_module.common.common_db_client import CommonDbClient from osm_policy_module.common.lcm_client import LcmClient @@ -36,7 +35,6 @@ from osm_policy_module.core.config import Config from osm_policy_module.core.database import ScalingGroup, ScalingAlarm, ScalingPolicy, ScalingCriteria, \ ScalingAlarmRepository, ScalingGroupRepository, ScalingPolicyRepository, ScalingCriteriaRepository from osm_policy_module.core.exceptions import VdurNotFound -from osm_policy_module.utils.vnfd import VnfdUtils log = logging.getLogger(__name__) @@ -69,16 +67,21 @@ class AutoscalingService: for vnfr in vnfrs: log.debug("Processing vnfr: %s", vnfr) vnfd = self.db_client.get_vnfd(vnfr['vnfd-id']) - if 'scaling-group-descriptor' not in vnfd: - log.debug("No scaling group present in vnfd") + # TODO: Change for multiple DF support + df = vnfd.get('df', [{}])[0] + if 'scaling-aspect' not in df: + log.debug("No scaling aspect present in vnfd") continue - scaling_groups = vnfd['scaling-group-descriptor'] - vnf_monitoring_params = vnfd['monitoring-param'] - for scaling_group in scaling_groups: + # TODO: Change for multiple instantiation levels support + instantiation_level = df.get('instantiation-level', [{}])[0] + scaling_aspects = df['scaling-aspect'] + all_vnfd_monitoring_params = self._get_all_vnfd_monitoring_params(vnfd) + for scaling_aspect in scaling_aspects: scaling_group_record = self._get_or_create_scaling_group(nsr_id, vnfr['member-vnf-index-ref'], - scaling_group) - for scaling_policy in scaling_group['scaling-policy']: + scaling_aspect) + vdurs = self._get_monitored_vdurs(scaling_aspect, vnfr['vdur']) + for scaling_policy in scaling_aspect.get('scaling-policy', ()): if scaling_policy['scaling-type'] != 'automatic': continue scaling_policy_record = self._get_or_create_scaling_policy(nsr_id, @@ -91,15 +94,11 @@ class AutoscalingService: scaling_criteria, scaling_policy_record ) - vnf_monitoring_param = next( - filter( - lambda param: param['id'] == scaling_criteria[ - 'vnf-monitoring-param-ref' - ], - vnf_monitoring_params) - ) - vdurs = self._get_monitored_vdurs(vnf_monitoring_param, vnfr['vdur'], vnfd) + monitoring_param_ref = scaling_criteria.get('vnf-monitoring-param-ref') + vnf_monitoring_param = all_vnfd_monitoring_params[monitoring_param_ref] + for vdur in vdurs: + vdu_id = vdur['vdu-id-ref'] log.debug("Creating alarm for vdur %s ", vdur) try: ScalingAlarmRepository.get(ScalingAlarm.vdu_name == vdur['name'], @@ -113,17 +112,19 @@ class AutoscalingService: continue except ScalingAlarm.DoesNotExist: pass - metric_name = self._get_metric_name(vnf_monitoring_param, vdur, vnfd) + metric_name = self._get_metric_name(vnf_monitoring_param) db_nsr = self.db_client.get_nsr(nsr_id) nb_scale_op = 0 if db_nsr["_admin"].get("scaling-group"): db_nsr_admin = db_nsr["_admin"]["scaling-group"] for admin_scale_index, admin_scale_info in enumerate(db_nsr_admin): - if admin_scale_info["name"] == scaling_group["name"]: + if admin_scale_info["name"] == scaling_aspect["name"]: nb_scale_op = admin_scale_info.get("nb-scale-op", 0) break - min_instance_count = int(scaling_group["min-instance-count"]) + for vdu_level in instantiation_level.get('vdu-level', ()): + if vdu_level.get('vdu-id') == vdu_id: + min_instance_count = int(vdu_level['number-of-instances']) if nb_scale_op > min_instance_count: alarm_uuid = await self.mon_client.create_alarm( metric_name=metric_name, @@ -131,8 +132,7 @@ class AutoscalingService: vdu_name=vdur['name'], vnf_member_index=vnfr['member-vnf-index-ref'], threshold=scaling_criteria['scale-in-threshold'], - operation=scaling_criteria['scale-in-relational-operation'], - statistic=vnf_monitoring_param['aggregation-type'] + operation=scaling_criteria['scale-in-relational-operation'] ) alarm = ScalingAlarmRepository.create( alarm_uuid=alarm_uuid, @@ -148,8 +148,7 @@ class AutoscalingService: vdu_name=vdur['name'], vnf_member_index=vnfr['member-vnf-index-ref'], threshold=scaling_criteria['scale-out-threshold'], - operation=scaling_criteria['scale-out-relational-operation'], - statistic=vnf_monitoring_param['aggregation-type'] + operation=scaling_criteria['scale-out-relational-operation'] ) alarm = ScalingAlarmRepository.create( alarm_uuid=alarm_uuid, @@ -293,12 +292,28 @@ class AutoscalingService: finally: database.db.close() - def _get_or_create_scaling_group(self, nsr_id: str, vnf_member_index: str, scaling_group: dict): + def _get_all_vnfd_monitoring_params(self, vnfd): + all_monitoring_params = {} + for ivld in vnfd.get("int-virtual-link-desc", ()): + for mp in ivld.get("monitoring-parameters", ()): + all_monitoring_params[mp.get("id")] = mp + + for vdu in vnfd.get("vdu", ()): + for mp in vdu.get("monitoring-parameter", ()): + all_monitoring_params[mp.get("id")] = mp + + for df in vnfd.get("df", ()): + for mp in df.get("monitoring-parameter", ()): + all_monitoring_params[mp.get("id")] = mp + + return all_monitoring_params + + def _get_or_create_scaling_group(self, nsr_id: str, vnf_member_index: str, scaling_aspect: dict): try: scaling_group_record = ScalingGroupRepository.get( ScalingGroup.nsr_id == nsr_id, ScalingGroup.vnf_member_index == vnf_member_index, - ScalingGroup.name == scaling_group['name'] + ScalingGroup.name == scaling_aspect['name'] ) log.debug("Found existing scaling group record in DB...") except ScalingGroup.DoesNotExist: @@ -306,8 +321,8 @@ class AutoscalingService: scaling_group_record = ScalingGroupRepository.create( nsr_id=nsr_id, vnf_member_index=vnf_member_index, - name=scaling_group['name'], - content=json.dumps(scaling_group) + name=scaling_aspect['name'], + content=json.dumps(scaling_aspect) ) log.debug( "Created scaling group record in DB : nsr_id=%s, vnf_member_index=%s, name=%s", @@ -333,11 +348,9 @@ class AutoscalingService: scaling_group=scaling_group_record, ) if 'scale-in-operation-type' in scaling_policy: - scaling_policy_record.scale_in_operation = scaling_policy[ - 'scale-in-operation-type'] + scaling_policy_record.scale_in_operation = scaling_policy['scale-in-operation-type'] if 'scale-out-operation-type' in scaling_policy: - scaling_policy_record.scale_out_operation = scaling_policy[ - 'scale-out-operation-type'] + scaling_policy_record.scale_out_operation = scaling_policy['scale-out-operation-type'] if 'enabled' in scaling_policy: scaling_policy_record.enabled = scaling_policy['enabled'] scaling_policy_record.save() @@ -368,54 +381,21 @@ class AutoscalingService: scaling_criteria_record.scaling_policy.name) return scaling_criteria_record - def _get_monitored_vdurs(self, vnf_monitoring_param: dict, vdurs: List[dict], vnfd: dict): - monitored_vdurs = [] - if 'vdu-monitoring-param' in vnf_monitoring_param: - monitored_vdurs = list( - filter( - lambda vdur: vdur['vdu-id-ref'] == vnf_monitoring_param - ['vdu-monitoring-param'] - ['vdu-ref'], - vdurs - ) - ) - elif 'vdu-metric' in vnf_monitoring_param: - monitored_vdurs = list( - filter( - lambda vdur: vdur['vdu-id-ref'] == vnf_monitoring_param - ['vdu-metric'] - ['vdu-ref'], - vdurs - ) - ) - elif 'vnf-metric' in vnf_monitoring_param: - vdu = VnfdUtils.get_mgmt_vdu(vnfd) - monitored_vdurs = list( - filter( - lambda vdur: vdur['vdu-id-ref'] == vdu['id'], - vdurs - ) - ) - else: + def _get_monitored_vdurs(self, scaling_aspect: dict, vdurs): + all_monitored_vdus = set() + for delta in scaling_aspect.get('aspect-delta-details', {}).get('deltas', ()): + for vdu_delta in delta.get('vdu-delta', ()): + all_monitored_vdus.add(vdu_delta.get('id')) + + monitored_vdurs = list(filter(lambda vdur: vdur['vdu-id-ref'] in all_monitored_vdus, vdurs)) + + if not monitored_vdurs: log.warning( "Scaling criteria is referring to a vnf-monitoring-param that does not " "contain a reference to a vdu or vnf metric.") return monitored_vdurs - def _get_metric_name(self, vnf_monitoring_param: dict, vdur: dict, vnfd: dict): - vdu = next( - filter(lambda vdu: vdu['id'] == vdur['vdu-id-ref'], vnfd['vdu']) - ) - if 'vdu-monitoring-param' in vnf_monitoring_param: - vdu_monitoring_param = next(filter( - lambda param: param['id'] == vnf_monitoring_param['vdu-monitoring-param'][ - 'vdu-monitoring-param-ref'], vdu['monitoring-param'])) - nfvi_metric = vdu_monitoring_param['nfvi-metric'] - return nfvi_metric - if 'vdu-metric' in vnf_monitoring_param: - vnf_metric_name = vnf_monitoring_param['vdu-metric']['vdu-metric-name-ref'] - return vnf_metric_name - if 'vnf-metric' in vnf_monitoring_param: - vnf_metric_name = vnf_monitoring_param['vnf-metric']['vnf-metric-name-ref'] - return vnf_metric_name + def _get_metric_name(self, vnf_monitoring_param: dict): + if 'performance-metric' in vnf_monitoring_param: + return vnf_monitoring_param['performance-metric'] raise ValueError('No metric name found for vnf_monitoring_param %s' % vnf_monitoring_param['id'])