From 7cab98ba7db4ae718124c762e5ea1fb25f8d447e Mon Sep 17 00:00:00 2001 From: ramverma Date: Tue, 30 Apr 2019 08:53:31 +0000 Subject: Adding algorithm for Pdp registration 1) Adding algorithm for improving Pdp registration. The flow is: When a new Pdp comes for registration, PAP will shortlist a list of PdpGroups based on the supportedPolicyTypes reported by PdpStatus message and the supportedPolicyTypes in the PdpSubGroup. Then PAP will find the PdpGroup which needs the Pdp most in two ways: 1) If there is a subgroup with no Pdp's then that takes the priority. 2) Otherwise the Pdp is allocated to the PdpGroup with highest difference value of desiredInstanceCount - currentInstanceCount. 2) Changing the preconfigured TosaPolicyType for apex to avoid interference with legacy operational policies of drools. Change-Id: I77584c3c030bc27903c11689acaca33148e27e3c Issue-ID: POLICY-1630 Signed-off-by: ramverma --- .../pap/main/comm/PdpStatusMessageHandler.java | 75 +++++++++++++++------ main/src/main/resources/PapDb.json | 78 +++++++++++++++++++++- 2 files changed, 129 insertions(+), 24 deletions(-) diff --git a/main/src/main/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandler.java b/main/src/main/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandler.java index c0a78fa0..7ef9c594 100644 --- a/main/src/main/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandler.java +++ b/main/src/main/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandler.java @@ -23,7 +23,10 @@ package org.onap.policy.pap.main.comm; import java.util.ArrayList; import java.util.List; +import java.util.Map; import java.util.Optional; +import java.util.TreeMap; + import org.apache.commons.lang3.builder.EqualsBuilder; import org.onap.policy.common.utils.services.Registry; import org.onap.policy.models.base.PfModelException; @@ -111,23 +114,54 @@ public class PdpStatusMessageHandler { private boolean findAndUpdatePdpGroup(final PdpStatus message, final PolicyModelsProvider databaseProvider) throws PfModelException { boolean pdpGroupFound = false; - Optional subGroup = null; - final PdpGroupFilter filter = PdpGroupFilter.builder().pdpType(message.getPdpType()) - .policyTypeList(message.getSupportedPolicyTypes()).matchPolicyTypesExactly(true) - .groupState(PdpState.ACTIVE).build(); + PdpGroup emptyPdpGroup = null; + final PdpGroupFilter filter = + PdpGroupFilter.builder().pdpType(message.getPdpType()).groupState(PdpState.ACTIVE).build(); + + final TreeMap selectedPdpGroups = new TreeMap<>(); final List pdpGroups = databaseProvider.getFilteredPdpGroups(filter); + emptyPdpGroup = selectPdpGroupsForRegistration(message, selectedPdpGroups, pdpGroups); + if (emptyPdpGroup != null) { + pdpGroupFound = registerPdp(message, databaseProvider, emptyPdpGroup); + } else if (!selectedPdpGroups.isEmpty()) { + final PdpGroup finalizedPdpGroup = selectedPdpGroups.lastEntry().getValue(); + pdpGroupFound = registerPdp(message, databaseProvider, finalizedPdpGroup); + } + return pdpGroupFound; + } + + private PdpGroup selectPdpGroupsForRegistration(final PdpStatus message, + final Map selectedPdpGroups, final List pdpGroups) { + PdpGroup emptyPdpGroup = null; for (final PdpGroup pdpGroup : pdpGroups) { - subGroup = findPdpSubGroup(message, pdpGroup); - if (subGroup.isPresent()) { - LOGGER.debug("Found pdpGroup - {}, going for registration of PDP - {}", pdpGroup, message); - if (!findPdpInstance(message, subGroup.get()).isPresent()) { - updatePdpSubGroup(pdpGroup, subGroup.get(), message, databaseProvider); + for (final PdpSubGroup pdpSubGroup : pdpGroup.getPdpSubgroups()) { + if (message.getSupportedPolicyTypes().containsAll(pdpSubGroup.getSupportedPolicyTypes())) { + if (pdpSubGroup.getCurrentInstanceCount() == 0) { + emptyPdpGroup = pdpGroup; + } else { + selectedPdpGroups.put( + pdpSubGroup.getDesiredInstanceCount() - pdpSubGroup.getCurrentInstanceCount(), + pdpGroup); + } } - sendPdpMessage(pdpGroup.getName(), subGroup.get(), message.getName(), null, databaseProvider); - pdpGroupFound = true; - break; } } + return emptyPdpGroup; + } + + private boolean registerPdp(final PdpStatus message, final PolicyModelsProvider databaseProvider, + final PdpGroup finalizedPdpGroup) throws PfModelException { + Optional subGroup; + boolean pdpGroupFound = false; + subGroup = findPdpSubGroup(message, finalizedPdpGroup); + if (subGroup.isPresent()) { + LOGGER.debug("Found pdpGroup - {}, going for registration of PDP - {}", finalizedPdpGroup, message); + if (!findPdpInstance(message, subGroup.get()).isPresent()) { + updatePdpSubGroup(finalizedPdpGroup, subGroup.get(), message, databaseProvider); + } + sendPdpMessage(finalizedPdpGroup.getName(), subGroup.get(), message.getName(), null, databaseProvider); + pdpGroupFound = true; + } return pdpGroupFound; } @@ -222,19 +256,18 @@ public class PdpStatusMessageHandler { } private boolean validatePdpDetails(final PdpStatus message, final PdpGroup pdpGroup, final PdpSubGroup subGroup, - final Pdp pdpInstanceDetails) { + final Pdp pdpInstanceDetails) { /* - * "EqualsBuilder" is a bit of a misnomer, as it uses containsAll() to check - * supported policy types. Nevertheless, it does the job and provides a convenient - * way to build a bunch of comparisons. + * "EqualsBuilder" is a bit of a misnomer, as it uses containsAll() to check supported policy types. + * Nevertheless, it does the job and provides a convenient way to build a bunch of comparisons. */ return new EqualsBuilder().append(message.getPdpGroup(), pdpGroup.getName()) - .append(message.getPdpSubgroup(), subGroup.getPdpType()) - .append(message.getPdpType(), subGroup.getPdpType()) - .append(message.getState(), pdpInstanceDetails.getPdpState()) - .append(message.getSupportedPolicyTypes().containsAll(subGroup.getSupportedPolicyTypes()), true) - .build(); + .append(message.getPdpSubgroup(), subGroup.getPdpType()) + .append(message.getPdpType(), subGroup.getPdpType()) + .append(message.getState(), pdpInstanceDetails.getPdpState()) + .append(message.getSupportedPolicyTypes().containsAll(subGroup.getSupportedPolicyTypes()), true) + .build(); } private void updatePdpHealthStatus(final PdpStatus message, final PdpSubGroup pdpSubgroup, final Pdp pdpInstance, diff --git a/main/src/main/resources/PapDb.json b/main/src/main/resources/PapDb.json index 6df3fc9f..2967f3db 100644 --- a/main/src/main/resources/PapDb.json +++ b/main/src/main/resources/PapDb.json @@ -10,7 +10,19 @@ "pdpType": "xacml", "supportedPolicyTypes": [ { - "name": "onap.policies.controlloop.Guard", + "name": "onap.policies.controlloop.guard.FrequencyLimiter", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.MinMax", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.Blacklist", + "version": "1.0.0" + }, + { + "name": "onap.policies.controlloop.guard.coordination.FirstBlocksSecond", "version": "1.0.0" } ], @@ -34,7 +46,7 @@ "pdpType": "apex", "supportedPolicyTypes": [ { - "name": "onap.policies.controlloop.Operational", + "name": "onap.policies.controlloop.operational.Apex", "version": "1.0.0" } ], @@ -54,7 +66,67 @@ "pdpType": "xacml", "supportedPolicyTypes": [ { - "name": "onap.policies.Monitoring", + "name": "onap.Monitoring", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.cdap.tca.hi.lo.app", + "version": "1.0.0" + }, + { + "name": "onap.policies.monitoring.dcaegen2.collectors.datafile.datafile-app-server", + "version": "1.0.0" + } + ], + "currentInstanceCount": 0, + "desiredInstanceCount": 1, + "policies": [] + } + ] + }, + { + "name": "optimization", + "version": "1.0.0", + "description": "This group should be used for managing all optimization related policies and pdps", + "pdpGroupState": "ACTIVE", + "pdpSubgroups": [ + { + "pdpType": "xacml", + "supportedPolicyTypes": [ + { + "name": "onap.policies.optimization.AffinityPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.DistancePolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.HpaPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.OptimizationPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.PciPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.QueryPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.SubscriberPolicy", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.Vim_fit", + "version": "1.0.0" + }, + { + "name": "onap.policies.optimization.VnfPolicy", "version": "1.0.0" } ], -- cgit 1.2.3-korg