Adding algorithm for Pdp registration 45/86545/5
authorramverma <ram.krishna.verma@est.tech>
Tue, 30 Apr 2019 08:53:31 +0000 (08:53 +0000)
committerRam Krishna Verma <ram.krishna.verma@est.tech>
Tue, 30 Apr 2019 11:17:17 +0000 (11:17 +0000)
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 <ram.krishna.verma@est.tech>
main/src/main/java/org/onap/policy/pap/main/comm/PdpStatusMessageHandler.java
main/src/main/resources/PapDb.json

index c0a78fa..7ef9c59 100644 (file)
@@ -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<PdpSubGroup> 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<Integer, PdpGroup> selectedPdpGroups = new TreeMap<>();
         final List<PdpGroup> 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<Integer, PdpGroup> selectedPdpGroups, final List<PdpGroup> 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<PdpSubGroup> 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,
index 6df3fc9..2967f3d 100644 (file)
           "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"
             }
           ],
           "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"
             }
           ],