- content['operationState'])
-
- async def _configure_scaling_groups(self, nsr_id: str):
- log.debug("_configure_scaling_groups: %s", nsr_id)
- alarms_created = []
- with database.db.atomic() as tx:
- try:
- vnfrs = self.db_client.get_vnfrs(nsr_id)
- for vnfr in vnfrs:
- log.info("Processing vnfr: %s", vnfr)
- vnfd = self.db_client.get_vnfd(vnfr['vnfd-id'])
- log.info("Looking for vnfd %s", vnfr['vnfd-id'])
- if 'scaling-group-descriptor' not in vnfd:
- continue
- scaling_groups = vnfd['scaling-group-descriptor']
- vnf_monitoring_params = vnfd['monitoring-param']
- for scaling_group in scaling_groups:
- try:
- scaling_group_record = ScalingGroup.select().where(
- ScalingGroup.nsr_id == nsr_id,
- ScalingGroup.vnf_member_index == int(vnfr['member-vnf-index-ref']),
- ScalingGroup.name == scaling_group['name']
- ).get()
- log.info("Found existing scaling group record in DB...")
- except ScalingGroup.DoesNotExist:
- log.info("Creating scaling group record in DB...")
- scaling_group_record = ScalingGroup.create(
- nsr_id=nsr_id,
- vnf_member_index=vnfr['member-vnf-index-ref'],
- name=scaling_group['name'],
- content=json.dumps(scaling_group)
- )
- log.info(
- "Created scaling group record in DB : nsr_id=%s, vnf_member_index=%s, name=%s",
- scaling_group_record.nsr_id,
- scaling_group_record.vnf_member_index,
- scaling_group_record.name)
- for scaling_policy in scaling_group['scaling-policy']:
- if scaling_policy['scaling-type'] != 'automatic':
- continue
- try:
- scaling_policy_record = ScalingPolicy.select().join(ScalingGroup).where(
- ScalingPolicy.name == scaling_policy['name'],
- ScalingGroup.id == scaling_group_record.id
- ).get()
- log.info("Found existing scaling policy record in DB...")
- except ScalingPolicy.DoesNotExist:
- log.info("Creating scaling policy record in DB...")
- scaling_policy_record = ScalingPolicy.create(
- nsr_id=nsr_id,
- name=scaling_policy['name'],
- cooldown_time=scaling_policy['cooldown-time'],
- scaling_group=scaling_group_record
- )
- log.info("Created scaling policy record in DB : name=%s, scaling_group.name=%s",
- scaling_policy_record.name,
- scaling_policy_record.scaling_group.name)
-
- for scaling_criteria in scaling_policy['scaling-criteria']:
- try:
- scaling_criteria_record = ScalingCriteria.select().join(ScalingPolicy).where(
- ScalingPolicy.id == scaling_policy_record.id,
- ScalingCriteria.name == scaling_criteria['name']
- ).get()
- log.info("Found existing scaling criteria record in DB...")
- except ScalingCriteria.DoesNotExist:
- log.info("Creating scaling criteria record in DB...")
- scaling_criteria_record = ScalingCriteria.create(
- nsr_id=nsr_id,
- name=scaling_criteria['name'],
- scaling_policy=scaling_policy_record
- )
- log.info(
- "Created scaling criteria record in DB : name=%s, scaling_policy.name=%s",
- scaling_criteria_record.name,
- scaling_criteria_record.scaling_policy.name)
-
- vnf_monitoring_param = next(
- filter(
- lambda param: param['id'] == scaling_criteria[
- 'vnf-monitoring-param-ref'
- ],
- vnf_monitoring_params)
- )
- if 'vdu-monitoring-param' in vnf_monitoring_param:
- vdurs = list(
- filter(
- lambda vdur: vdur['vdu-id-ref'] == vnf_monitoring_param
- ['vdu-monitoring-param']
- ['vdu-ref'],
- vnfr['vdur']
- )
- )
- elif 'vdu-metric' in vnf_monitoring_param:
- vdurs = list(
- filter(
- lambda vdur: vdur['vdu-id-ref'] == vnf_monitoring_param
- ['vdu-metric']
- ['vdu-ref'],
- vnfr['vdur']
- )
- )
- elif 'vnf-metric' in vnf_monitoring_param:
- vdu = VnfdUtils.get_mgmt_vdu(vnfd)
- vdurs = list(
- filter(
- lambda vdur: vdur['vdu-id-ref'] == vdu['id'],
- vnfr['vdur']
- )
- )
- else:
- log.warning(
- "Scaling criteria is referring to a vnf-monitoring-param that does not "
- "contain a reference to a vdu or vnf metric.")
- continue
- for vdur in vdurs:
- log.info("Creating alarm for vdur %s ", vdur)
- try:
- (ScalingAlarm.select()
- .join(ScalingCriteria)
- .join(ScalingPolicy)
- .join(ScalingGroup)
- .where(
- ScalingAlarm.vdu_name == vdur['name'],
- ScalingCriteria.name == scaling_criteria['name'],
- ScalingPolicy.name == scaling_policy['name'],
- ScalingGroup.nsr_id == nsr_id
- ).get())
- log.debug("vdu %s already has an alarm configured", vdur['name'])
- continue
- except ScalingAlarm.DoesNotExist:
- pass
- alarm_uuid = await self.mon_client.create_alarm(
- metric_name=vnf_monitoring_param['id'],
- ns_id=nsr_id,
- 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']
- )
- alarm = ScalingAlarm.create(
- alarm_uuid=alarm_uuid,
- action='scale_in',
- vnf_member_index=int(vnfr['member-vnf-index-ref']),
- vdu_name=vdur['name'],
- scaling_criteria=scaling_criteria_record
- )
- alarms_created.append(alarm)
- alarm_uuid = await self.mon_client.create_alarm(
- metric_name=vnf_monitoring_param['id'],
- ns_id=nsr_id,
- 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']
- )
- alarm = ScalingAlarm.create(
- alarm_uuid=alarm_uuid,
- action='scale_out',
- vnf_member_index=int(vnfr['member-vnf-index-ref']),
- vdu_name=vdur['name'],
- scaling_criteria=scaling_criteria_record
- )
- alarms_created.append(alarm)
-
- except Exception as e:
- log.exception("Error configuring scaling groups:")
- tx.rollback()
- if len(alarms_created) > 0:
- log.info("Cleaning alarm resources in MON")
- for alarm in alarms_created:
- await self.mon_client.delete_alarm(alarm.scaling_criteria.scaling_policy.scaling_group.nsr_id,
- alarm.vnf_member_index,
- alarm.vdu_name,
- alarm.alarm_uuid)
- raise e
-
- async def _delete_scaling_groups(self, nsr_id: str):
- with database.db.atomic() as tx:
- try:
- for scaling_group in ScalingGroup.select().where(ScalingGroup.nsr_id == nsr_id):
- for scaling_policy in scaling_group.scaling_policies:
- for scaling_criteria in scaling_policy.scaling_criterias:
- for alarm in scaling_criteria.scaling_alarms:
- try:
- await self.mon_client.delete_alarm(
- alarm.scaling_criteria.scaling_policy.scaling_group.nsr_id,
- alarm.vnf_member_index,
- alarm.vdu_name,
- alarm.alarm_uuid)
- except ValueError:
- log.exception("Error deleting alarm in MON %s", alarm.alarm_uuid)
- alarm.delete_instance()
- scaling_criteria.delete_instance()
- scaling_policy.delete_instance()
- scaling_group.delete_instance()
-
- except Exception as e:
- log.exception("Error deleting scaling groups and alarms:")
- tx.rollback()
- raise e
-
- async def _delete_orphaned_alarms(self, nsr_id):
- with database.db.atomic() as tx:
- try:
- for scaling_group in ScalingGroup.select().where(ScalingGroup.nsr_id == nsr_id):
- for scaling_policy in scaling_group.scaling_policies:
- for scaling_criteria in scaling_policy.scaling_criterias:
- for alarm in scaling_criteria.scaling_alarms:
- try:
- self.db_client.get_vdur(nsr_id, alarm.vnf_member_index, alarm.vdu_name)
- except VdurNotFound:
- log.info("Deleting orphaned alarm %s", alarm.alarm_uuid)
- try:
- await self.mon_client.delete_alarm(
- alarm.scaling_criteria.scaling_policy.scaling_group.nsr_id,
- alarm.vnf_member_index,
- alarm.vdu_name,
- alarm.alarm_uuid)
- except ValueError:
- log.exception("Error deleting alarm in MON %s", alarm.alarm_uuid)
- alarm.delete_instance()
-
- except Exception as e:
- log.exception("Error deleting orphaned alarms:")
- tx.rollback()
- raise e
+ content["operationState"],
+ )
+
+ async def _handle_policy_update(self, content):
+ log.info("_handle_policy_update: %s", content)
+ nsr_id = content["nsr_id"]
+ vnf_member_index = content["vnf_member_index"]
+ if (
+ content["operationState"] == "COMPLETED"
+ or content["operationState"] == "PARTIALLY_COMPLETED"
+ ):
+ log.info(
+ "Updating policies of VNF with nsr_id: %s and vnf-member-index: %s"
+ % (nsr_id, vnf_member_index)
+ )
+ await self.autoscaling_service.delete_scaling_groups(
+ nsr_id, vnf_member_index
+ )
+ await self.alarming_service.delete_vnf_alarms(nsr_id, vnf_member_index)
+ await self.healing_service.delete_healing_alarms(nsr_id, vnf_member_index)
+ await self.autoscaling_service.configure_scaling_groups(
+ nsr_id, vnf_member_index
+ )
+ await self.alarming_service.configure_vnf_alarms(nsr_id, vnf_member_index)
+ await self.healing_service.configure_healing_alarms(
+ nsr_id, vnf_member_index
+ )
+ else:
+ log.info(
+ "Network service is not in COMPLETED or PARTIALLY_COMPLETED state. "
+ "Current state is %s. Skipping...",
+ content["operationState"],
+ )
+
+ async def _handle_vnf_terminated(self, content):
+ nsr_id = content["nsr_id"]
+ vnf_member_index = content["vnf_member_index"]
+ if (
+ content["operationState"] == "COMPLETED"
+ or content["operationState"] == "PARTIALLY_COMPLETED"
+ ):
+ log.info(
+ "Deleting policies of VNF with nsr_id: %s and vnf-member-index: %s"
+ % (nsr_id, vnf_member_index)
+ )
+ await self.autoscaling_service.delete_scaling_groups(
+ nsr_id, vnf_member_index
+ )
+ await self.alarming_service.delete_vnf_alarms(nsr_id, vnf_member_index)
+ else:
+ log.info(
+ "Network service is not in COMPLETED or PARTIALLY_COMPLETED state. "
+ "Current state is %s. Skipping...",
+ content["operationState"],
+ )