Make PAP stateless 94/116894/3
authorJim Hahn <jrh3@att.com>
Mon, 11 Jan 2021 15:53:54 +0000 (10:53 -0500)
committerJim Hahn <jrh3@att.com>
Fri, 15 Jan 2021 18:26:05 +0000 (13:26 -0500)
Removed old code that tracked the status using a cache.  Modified the
code to use the status found in the DB instead.

Issue-ID: POLICY-2648
Change-Id: I4f1f5201eff7b3352631f50d67c40349ac7f2014
Signed-off-by: Jim Hahn <jrh3@att.com>
40 files changed:
main/src/main/java/org/onap/policy/pap/main/comm/PdpModifyRequestMap.java
main/src/main/java/org/onap/policy/pap/main/comm/msgdata/UpdateReq.java
main/src/main/java/org/onap/policy/pap/main/notification/DeploymentStatus.java
main/src/main/java/org/onap/policy/pap/main/notification/DeploymentTracker.java
main/src/main/java/org/onap/policy/pap/main/notification/PolicyCommonTracker.java [deleted file]
main/src/main/java/org/onap/policy/pap/main/notification/PolicyDeployTracker.java [deleted file]
main/src/main/java/org/onap/policy/pap/main/notification/PolicyNotifier.java
main/src/main/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationData.java [deleted file]
main/src/main/java/org/onap/policy/pap/main/notification/PolicyTrackerData.java [deleted file]
main/src/main/java/org/onap/policy/pap/main/notification/PolicyUndeployTracker.java [deleted file]
main/src/main/java/org/onap/policy/pap/main/rest/PdpGroupCreateOrUpdateProvider.java
main/src/main/java/org/onap/policy/pap/main/rest/PdpGroupDeleteProvider.java
main/src/main/java/org/onap/policy/pap/main/rest/PdpGroupDeployProvider.java
main/src/main/java/org/onap/policy/pap/main/rest/PolicyStatusControllerV1.java
main/src/main/java/org/onap/policy/pap/main/rest/PolicyStatusProvider.java [new file with mode: 0644]
main/src/main/java/org/onap/policy/pap/main/rest/PolicyUndeployerImpl.java
main/src/main/java/org/onap/policy/pap/main/rest/ProviderBase.java
main/src/main/java/org/onap/policy/pap/main/rest/SessionData.java
main/src/main/java/org/onap/policy/pap/main/startstop/Main.java
main/src/main/resources/META-INF/persistence.xml
main/src/test/java/org/onap/policy/pap/main/comm/PdpModifyRequestMapTest.java
main/src/test/java/org/onap/policy/pap/main/comm/msgdata/UpdateReqTest.java
main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonSupport.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonTrackerTest.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/notification/PolicyDeployTrackerTest.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/notification/PolicyNotifierTest.java
main/src/test/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationDataTest.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/notification/PolicyTrackerDataTest.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/notification/PolicyUndeployTrackerTest.java [deleted file]
main/src/test/java/org/onap/policy/pap/main/rest/ProviderSuper.java
main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupCreateOrUpdateProvider.java
main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupDeleteProvider.java
main/src/test/java/org/onap/policy/pap/main/rest/TestPdpGroupDeployProvider.java
main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyStatusProvider.java [new file with mode: 0644]
main/src/test/java/org/onap/policy/pap/main/rest/TestProviderBase.java
main/src/test/java/org/onap/policy/pap/main/rest/TestSessionData.java
main/src/test/java/org/onap/policy/pap/main/rest/e2e/End2EndBase.java
main/src/test/java/org/onap/policy/pap/main/rest/e2e/PolicyStatusTest.java
main/src/test/resources/META-INF/persistence.xml
main/src/test/resources/e2e/policyStatus.json

index 85038de..fb19b01 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -30,6 +30,7 @@ import java.util.List;
 import java.util.Map;
 import lombok.Setter;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
@@ -45,6 +46,7 @@ import org.onap.policy.pap.main.comm.msgdata.Request;
 import org.onap.policy.pap.main.comm.msgdata.RequestListener;
 import org.onap.policy.pap.main.comm.msgdata.StateChangeReq;
 import org.onap.policy.pap.main.comm.msgdata.UpdateReq;
+import org.onap.policy.pap.main.notification.DeploymentStatus;
 import org.onap.policy.pap.main.notification.PolicyNotifier;
 import org.onap.policy.pap.main.parameters.PdpModifyRequestMapParams;
 import org.onap.policy.pap.main.parameters.RequestParams;
@@ -264,9 +266,13 @@ public class PdpModifyRequestMap {
             List<PdpGroup> groups = dao.getFilteredPdpGroups(filter);
             List<PdpGroup> updates = new ArrayList<>(1);
 
+            DeploymentStatus status = new DeploymentStatus(dao);
+
             for (PdpGroup group : groups) {
                 if (removeFromGroup(pdpName, group)) {
                     updates.add(group);
+                    status.loadByGroup(group.getName());
+                    status.deleteDeployment(pdpName);
                 }
             }
 
@@ -275,6 +281,12 @@ public class PdpModifyRequestMap {
 
             } else {
                 dao.updatePdpGroups(updates);
+
+                PolicyNotification notification = new PolicyNotification();
+                status.flush(notification);
+
+                policyNotifier.publish(notification);
+
                 return true;
             }
         }
@@ -448,8 +460,6 @@ public class PdpModifyRequestMap {
 
             logger.warn("removing {}", pdpName);
 
-            policyNotifier.removePdp(pdpName);
-
             // remove the PDP from all groups
             try {
                 removeFromGroups(pdpName);
index ada9d19..4b5b7f0 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -77,9 +77,6 @@ public class UpdateReq extends RequestImpl {
             return reason;
         }
 
-        Set<ToscaConceptIdentifier> actualSet = new HashSet<>(alwaysList(response.getPolicies()));
-        getNotifier().processResponse(response.getName(), actualSet);
-
         PdpUpdate message = getMessage();
 
         if (!StringUtils.equals(message.getPdpGroup(), response.getPdpGroup())) {
@@ -94,11 +91,14 @@ public class UpdateReq extends RequestImpl {
             return null;
         }
 
-        // see if the policies match
-
+        Set<ToscaConceptIdentifier> actualSet = new HashSet<>(alwaysList(response.getPolicies()));
         Set<ToscaConceptIdentifier> expectedSet = new HashSet<>(alwaysList(message.getPolicies()).stream()
                         .map(ToscaPolicy::getIdentifier).collect(Collectors.toSet()));
 
+        getNotifier().processResponse(response.getName(), message.getPdpGroup(), expectedSet, actualSet);
+
+        // see if the policies match
+
         if (!actualSet.equals(expectedSet)) {
             // need to undeploy the policies that are expected, but missing from the
             // response
index ef97fae..7b62780 100644 (file)
@@ -41,7 +41,14 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.pap.main.notification.StatusAction.Action;
 
 /**
- * Collection of Policy Deployment Status records.
+ * Collection of Policy Deployment Status records. The sequence of method invocations
+ * should be as follows:
+ * <ol>
+ * <li>{@link #loadByGroup(String)}</li>
+ * <li>various other methods</li>
+ * <li>repeat the previous steps as appropriate</li>
+ * <li>{@link #flush(PolicyNotification)}</li>
+ * </ol>
  */
 public class DeploymentStatus {
     /**
@@ -115,6 +122,7 @@ public class DeploymentStatus {
      * @param notif notification to which to add policy status
      */
     public void flush(PolicyNotification notif) {
+        // must add notifications BEFORE deleting undeployments
         addNotifications(notif);
         deleteUndeployments();
         flush();
index cef70a3..4522deb 100644 (file)
@@ -146,6 +146,14 @@ public class DeploymentTracker {
             newStatus.setPolicyTypeId(status.getPolicyTypeId());
             newStatus.setPolicyTypeVersion(status.getPolicyTypeVersion());
 
+            /*
+             * Adding the status to the "added" set may be a bit unexpected, but when all
+             * status records are deleted from the group, we don't actually undeploy the
+             * policy from the subgroup. Instead, we leave it in the subgroup so that as
+             * soon as a PDP registers, we immediately deploy the policy to the PDP and
+             * continue on; the client can always undeploy the policy when it receives the
+             * notification, if so desired.
+             */
             notif.getAdded().add(newStatus);
         }
     }
diff --git a/main/src/main/java/org/onap/policy/pap/main/notification/PolicyCommonTracker.java b/main/src/main/java/org/onap/policy/pap/main/notification/PolicyCommonTracker.java
deleted file mode 100644 (file)
index 3529ccb..0000000
+++ /dev/null
@@ -1,245 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiPredicate;
-import java.util.stream.Collectors;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Common super class for deploy and undeploy trackers.
- */
-public abstract class PolicyCommonTracker {
-
-    /**
-     * Maps a policy id to its deployment data. The subclass determines when an entry is
-     * removed.
-     *
-     * <p/>
-     * Use a LinkedHashMap, because we'll be doing lots of iteration over the map, and
-     * iteration over a LinkedHashMap is faster than over a plain HashMap.
-     */
-    private final Map<ToscaConceptIdentifier, PolicyTrackerData> policy2data = new LinkedHashMap<>();
-
-
-    /**
-     * Constructs the object.
-     */
-    protected PolicyCommonTracker() {
-        super();
-    }
-
-    /**
-     * Gets the status of all policies being tracked.
-     *
-     * @return the status of all policies
-     */
-    public List<PolicyStatus> getStatus() {
-        return policy2data.entrySet().stream().map(this::makeStatus).collect(Collectors.toList());
-    }
-
-    /**
-     * Gets the status of all versions of a policy.
-     *
-     * @param policyId ID of the policy of interest, without the version
-     * @return the status of all versions of the policy having the given ID
-     */
-    public List<PolicyStatus> getStatus(String policyId) {
-        // version is not specified - have to scan the whole list
-        return policy2data.entrySet().stream().filter(ent -> ent.getKey().getName().equals(policyId))
-                        .map(this::makeStatus).collect(Collectors.toList());
-    }
-
-    /**
-     * Gets the status of a particular policy.
-     *
-     * @param ident identifier of the policy of interest
-     * @return the status of the given policy, or empty if the policy is not found
-     */
-    public Optional<PolicyStatus> getStatus(ToscaConceptIdentifier ident) {
-        ToscaConceptIdentifier ident2 = new ToscaConceptIdentifier(ident.getName(), ident.getVersion());
-        PolicyTrackerData data = policy2data.get(ident2);
-        return Optional.ofNullable(data == null ? null : makeStatus(ident2, data));
-    }
-
-    /**
-     * Adds data to the tracker.
-     *
-     * @param data data to be added to the tracker
-     */
-    public void addData(PolicyPdpNotificationData data) {
-        policy2data.computeIfAbsent(data.getPolicyId(), policyId -> new PolicyTrackerData(data.getPolicyType()))
-                        .addPdps(data.getPdps());
-    }
-
-    /**
-     * Removes a set of PDPs from all policies within the tracker.
-     *
-     * @param notifyData data identifying the policy and the PDPs to be removed from it
-     */
-    public void removeData(PolicyPdpNotificationData notifyData) {
-
-        policy2data.computeIfPresent(notifyData.getPolicyId(), (policyId, data) -> {
-
-            if (!data.removePdps(notifyData.getPdps())) {
-                // not complete yet
-                return data;
-            }
-
-            // this policy is complete
-            return (shouldRemove(data) ? null : data);
-        });
-    }
-
-    /**
-     * Removes a PDP from all policies within the tracker.
-     *
-     * @param pdp PDP to be removed
-     * @param statusList status messages are added here if policies become complete as a
-     *        result of this operation
-     */
-    public void removePdp(String pdp, List<PolicyStatus> statusList) {
-        updateMap(statusList, (policyId, data) -> data.removePdp(pdp));
-    }
-
-    /**
-     * Processes a response from a PDP.
-     *
-     * @param pdp PDP of interest
-     * @param activePolicies policies that are still active on the PDP, as specified in
-     *        the response
-     * @param statusList status messages are added here if policies become complete as a
-     *        result of this operation
-     */
-    public void processResponse(String pdp, Collection<ToscaConceptIdentifier> activePolicies,
-                    List<PolicyStatus> statusList) {
-        processResponse(pdp, new HashSet<>(activePolicies), statusList);
-    }
-
-    /**
-     * Processes a response from a PDP.
-     *
-     * @param pdp PDP of interest
-     * @param activePolicies policies that are still active on the PDP, as specified in
-     *        the response
-     * @param statusList status messages are added here if policies become complete as a
-     *        result of this operation
-     */
-    public void processResponse(String pdp, Set<ToscaConceptIdentifier> activePolicies, List<PolicyStatus> statusList) {
-        updateMap(statusList, (policyId, data) -> updateData(pdp, data, activePolicies.contains(policyId)));
-    }
-
-    /**
-     * Updates the map.
-     *
-     * <p/>
-     * Note: this iterates through the whole map. While it may be more efficient to
-     * iterate through just the policies relevant to the PDP, that would complicate the
-     * code and complicate the testing. In addition, this should still perform well
-     * enough, but if not, it can always be enhanced.
-     *
-     * @param statusList status messages are added here if policies become complete as a
-     *        result of this operation
-     * @param updater function to update a policy's data. Returns {@code true} if the
-     *        policy is complete (i.e., no longer awaiting any responses)
-     */
-    private void updateMap(List<PolicyStatus> statusList,
-                    BiPredicate<ToscaConceptIdentifier, PolicyTrackerData> updater) {
-
-        Iterator<Entry<ToscaConceptIdentifier, PolicyTrackerData>> iter = policy2data.entrySet().iterator();
-        while (iter.hasNext()) {
-            Entry<ToscaConceptIdentifier, PolicyTrackerData> ent = iter.next();
-
-            ToscaConceptIdentifier policyId = ent.getKey();
-            PolicyTrackerData data = ent.getValue();
-
-            if (!updater.test(policyId, data)) {
-                // not complete yet
-                continue;
-            }
-
-            // this policy is complete - notify
-            statusList.add(makeStatus(ent));
-
-            if (shouldRemove(data)) {
-                iter.remove();
-            }
-        }
-    }
-
-    /**
-     * Updates the policy data, based on a response from a PDP.
-     *
-     * @param pdp PDP whose response was just received
-     * @param data data associated with the policy of interest
-     * @param stillActive {@code true} if the policy is still active for the PDP,
-     *        {@code false} otherwise
-     * @return {@code true} if the policy is complete (i.e., no longer awaiting any
-     *         responses), {@code false} otherwise
-     */
-    protected abstract boolean updateData(String pdp, PolicyTrackerData data, boolean stillActive);
-
-    /**
-     * Determines if a policy should be removed from the tracker, based on the state of
-     * its data.
-     *
-     * @param data data associated with the policy of interest
-     * @return {@code true} if the policy should be removed from the tracker,
-     *         {@code false} otherwise
-     */
-    protected abstract boolean shouldRemove(PolicyTrackerData data);
-
-    /**
-     * Makes a status notification for the given policy entry.
-     *
-     * @param entry policy entry
-     * @return a new status notification
-     */
-    private PolicyStatus makeStatus(Map.Entry<ToscaConceptIdentifier, PolicyTrackerData> entry) {
-        return makeStatus(entry.getKey(), entry.getValue());
-    }
-
-    /**
-     * Makes a status notification for the given policy.
-     *
-     * @param policyId policy ID
-     * @param data data to be used to set the status fields
-     * @return a new status notification
-     */
-    private PolicyStatus makeStatus(ToscaConceptIdentifier policyId, PolicyTrackerData data) {
-
-        PolicyStatus status = new PolicyStatus(data.getPolicyType(), policyId);
-        data.putValuesInto(status);
-        return status;
-    }
-}
diff --git a/main/src/main/java/org/onap/policy/pap/main/notification/PolicyDeployTracker.java b/main/src/main/java/org/onap/policy/pap/main/notification/PolicyDeployTracker.java
deleted file mode 100644 (file)
index 17a5e21..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-/**
- * Tracker for policy deployments to PDPs.
- *
- * <p/>
- * Policies are not removed from the internal map until all of the sets contained within
- * the data are empty. This may be the result of a PDP being removed from the system
- * because it is no longer responsive, or because the PDP Subgroup that contained it is
- * deleted.
- */
-public class PolicyDeployTracker extends PolicyCommonTracker {
-
-    /**
-     * Constructs the object.
-     */
-    public PolicyDeployTracker() {
-        super();
-    }
-
-    @Override
-    protected boolean updateData(String pdp, PolicyTrackerData data, boolean stillActive) {
-        return (stillActive ? data.success(pdp) : data.fail(pdp));
-    }
-
-    /**
-     * Returns {@code true} only when the data is <i>completely empty</i> (i.e., it has no
-     * more PDPs)
-     */
-    @Override
-    protected boolean shouldRemove(PolicyTrackerData data) {
-        return data.isEmpty();
-    }
-}
index c13e9b7..66b83cc 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.policy.pap.main.notification;
 
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
 import java.util.Set;
-import java.util.stream.Collectors;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.pap.concepts.PolicyNotification;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.pdp.concepts.Pdp;
-import org.onap.policy.models.pdp.concepts.PdpGroup;
-import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.provider.PolicyModelsProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
 import org.onap.policy.pap.main.PolicyModelsProviderFactoryWrapper;
 import org.onap.policy.pap.main.comm.Publisher;
 import org.onap.policy.pap.main.comm.QueueToken;
@@ -56,15 +43,7 @@ public class PolicyNotifier {
      */
     private final Publisher<PolicyNotification> publisher;
 
-    /**
-     * Deployment tracker.
-     */
-    private final PolicyDeployTracker deployTracker = makeDeploymentTracker();
-
-    /**
-     * Undeployment tracker.
-     */
-    private final PolicyUndeployTracker undeployTracker = makeUndeploymentTracker();
+    private final PolicyModelsProviderFactoryWrapper daoFactory;
 
 
     /**
@@ -72,170 +51,38 @@ public class PolicyNotifier {
      *
      * @param publisher notification publisher
      * @param daoFactory factory used to load policy deployment data from the DB
-     * @throws PfModelException if a DB error occurs
      */
-    public PolicyNotifier(Publisher<PolicyNotification> publisher, PolicyModelsProviderFactoryWrapper daoFactory)
-                    throws PfModelException {
+    public PolicyNotifier(Publisher<PolicyNotification> publisher, PolicyModelsProviderFactoryWrapper daoFactory) {
 
         this.publisher = publisher;
-
-        try (PolicyModelsProvider dao = daoFactory.create()) {
-            Map<ToscaConceptIdentifier, ToscaConceptIdentifier> id2type = loadPolicyTypes(dao);
-            loadPolicies(dao, id2type);
-        }
-    }
-
-    /**
-     * Loads policy types from the DB.
-     *
-     * @param dao provider used to retrieve policies from the DB
-     * @return a mapping from policy id to policy type
-     * @throws PfModelException if a DB error occurs
-     */
-    private Map<ToscaConceptIdentifier, ToscaConceptIdentifier> loadPolicyTypes(PolicyModelsProvider dao)
-                    throws PfModelException {
-
-        Map<ToscaConceptIdentifier, ToscaConceptIdentifier> id2type = new HashMap<>();
-
-        for (ToscaPolicy policy : dao.getFilteredPolicyList(ToscaPolicyFilter.builder().build())) {
-            id2type.put(policy.getIdentifier(), policy.getTypeIdentifier());
-        }
-
-        return id2type;
-    }
-
-    /**
-     * Loads deployed policies.
-     *
-     * @param id2type mapping from policy id to policy type
-     * @param dao provider used to retrieve policies from the DB
-     * @throws PfModelException if a DB error occurs
-     */
-    private void loadPolicies(PolicyModelsProvider dao, Map<ToscaConceptIdentifier, ToscaConceptIdentifier> id2type)
-                    throws PfModelException {
-        for (PdpGroup group : dao.getPdpGroups(null)) {
-            for (PdpSubGroup subgrp : group.getPdpSubgroups()) {
-                loadPolicies(id2type, group, subgrp);
-            }
-        }
-    }
-
-    /**
-     * Loads a subgroup's deployed policies.
-     *
-     * @param id2type maps a policy id to its type
-     * @param group group containing the subgroup
-     * @param subgrp subgroup whose policies are to be loaded
-     */
-    private void loadPolicies(Map<ToscaConceptIdentifier, ToscaConceptIdentifier> id2type, PdpGroup group,
-                    PdpSubGroup subgrp) {
-
-        for (ToscaConceptIdentifier policyId : subgrp.getPolicies()) {
-
-            ToscaConceptIdentifier type = id2type.get(policyId);
-            if (type == null) {
-                logger.error("group {}:{} refers to non-existent policy {}", group.getName(), subgrp.getPdpType(),
-                                policyId);
-                continue;
-            }
-
-            PolicyPdpNotificationData data = new PolicyPdpNotificationData(policyId, type);
-            data.addAll(subgrp.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toList()));
-            deployTracker.addData(data);
-        }
-    }
-
-    /**
-     * Gets the status of all deployed policies.
-     *
-     * @return the status of all deployed policies
-     */
-    public synchronized List<PolicyStatus> getStatus() {
-        return deployTracker.getStatus();
-    }
-
-    /**
-     * Gets the status of a particular deployed policy.
-     *
-     * @param policyId ID of the policy of interest, without the version
-     * @return the status of all deployed policies matching the given identifier
-     */
-    public synchronized List<PolicyStatus> getStatus(String policyId) {
-        return deployTracker.getStatus(policyId);
-    }
-
-    /**
-     * Gets the status of a particular deployed policy.
-     *
-     * @param ident identifier of the policy of interest
-     * @return the status of the given policy, or empty if the policy is not found
-     */
-    public synchronized Optional<PolicyStatus> getStatus(ToscaConceptIdentifier ident) {
-        return deployTracker.getStatus(ident);
-    }
-
-    /**
-     * Adds data to the deployment tracker. If a PDP appears within the undeployment
-     * tracker, then it's removed from there.
-     *
-     * @param data data to be added
-     */
-    public synchronized void addDeploymentData(PolicyPdpNotificationData data) {
-        undeployTracker.removeData(data);
-        deployTracker.addData(data);
-    }
-
-    /**
-     * Adds data to the undeployment tracker. If a PDP appears within the deployment
-     * tracker, then it's removed from there.
-     *
-     * @param data data to be added
-     */
-    public synchronized void addUndeploymentData(PolicyPdpNotificationData data) {
-        deployTracker.removeData(data);
-        undeployTracker.addData(data);
-    }
-
-    /**
-     * Processes a response from a PDP.
-     *
-     * @param pdp PDP of interest
-     * @param activePolicies policies that are still active on the PDP, as specified in
-     *        the response
-     */
-    public synchronized void processResponse(String pdp, Collection<ToscaConceptIdentifier> activePolicies) {
-        processResponse(pdp, new HashSet<>(activePolicies));
+        this.daoFactory = daoFactory;
     }
 
     /**
      * Processes a response from a PDP.
      *
      * @param pdp PDP of interest
-     * @param activePolicies policies that are still active on the PDP, as specified in
+     * @param pdpGroup name of the PdpGroup containing the PDP
+     * @param expectedPolicies policies that expected to be deployed on the PDP
+     * @param actualPolicies policies that are still active on the PDP, as specified in
      *        the response
      */
-    public synchronized void processResponse(String pdp, Set<ToscaConceptIdentifier> activePolicies) {
-        PolicyNotification notification = new PolicyNotification();
+    public synchronized void processResponse(String pdp, String pdpGroup, Set<ToscaConceptIdentifier> expectedPolicies,
+                    Set<ToscaConceptIdentifier> actualPolicies) {
 
-        undeployTracker.processResponse(pdp, activePolicies, notification.getDeleted());
-        deployTracker.processResponse(pdp, activePolicies, notification.getAdded());
+        try (PolicyModelsProvider dao = daoFactory.create()) {
+            DeploymentStatus status = makeDeploymentTracker(dao);
+            status.loadByGroup(pdpGroup);
+            status.completeDeploy(pdp, expectedPolicies, actualPolicies);
 
-        publish(notification);
-    }
+            PolicyNotification notification = new PolicyNotification();
+            status.flush(notification);
 
-    /**
-     * Removes a PDP from any policies still awaiting responses from it, generating
-     * notifications for any of those policies that become complete as a result.
-     *
-     * @param pdp PDP to be removed
-     */
-    public synchronized void removePdp(String pdp) {
-        PolicyNotification notification = new PolicyNotification();
+            publish(notification);
 
-        undeployTracker.removePdp(pdp, notification.getDeleted());
-        deployTracker.removePdp(pdp, notification.getAdded());
-
-        publish(notification);
+        } catch (PfModelException e) {
+            logger.warn("cannot update deployment status", e);
+        }
     }
 
     /**
@@ -243,7 +90,7 @@ public class PolicyNotifier {
      *
      * @param notification notification to be published
      */
-    private void publish(PolicyNotification notification) {
+    public synchronized void publish(PolicyNotification notification) {
         if (!notification.isEmpty()) {
             publisher.enqueue(new QueueToken<>(notification));
         }
@@ -252,11 +99,7 @@ public class PolicyNotifier {
 
     // the following methods may be overridden by junit tests
 
-    protected PolicyDeployTracker makeDeploymentTracker() {
-        return new PolicyDeployTracker();
-    }
-
-    protected PolicyUndeployTracker makeUndeploymentTracker() {
-        return new PolicyUndeployTracker();
+    protected DeploymentStatus makeDeploymentTracker(PolicyModelsProvider dao) {
+        return new DeploymentStatus(dao);
     }
 }
diff --git a/main/src/main/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationData.java b/main/src/main/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationData.java
deleted file mode 100644 (file)
index b93f893..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import lombok.Getter;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Data used to track deploy/undeploy of a policy to PDPs.
- */
-@Getter
-public class PolicyPdpNotificationData {
-    private final ToscaConceptIdentifier policyId;
-    private final ToscaConceptIdentifier policyType;
-    private final Set<String> pdps = new HashSet<>();
-
-
-    /**
-     * Constructs the object.
-     *
-     * @param policyId ID of the policy being deployed/undeployed
-     * @param policyType type of the associated policy
-     */
-    public PolicyPdpNotificationData(ToscaConceptIdentifier policyId, ToscaConceptIdentifier policyType) {
-        this.policyId = policyId;
-        this.policyType = policyType;
-    }
-
-    /**
-     * Determines if there are any PDPs in the data.
-     *
-     * @return {@code true} if the data contains at least one PDP, {@code false} otherwise
-     */
-    public boolean isEmpty() {
-        return pdps.isEmpty();
-    }
-
-    /**
-     * Adds a PDP to the set of PDPs.
-     *
-     * @param pdp PDP to be added
-     */
-    public void add(String pdp) {
-        pdps.add(pdp);
-    }
-
-    /**
-     * Adds PDPs to the set of PDPs.
-     *
-     * @param pdps PDPs to be added
-     */
-    public void addAll(Collection<String> pdps) {
-        this.pdps.addAll(pdps);
-    }
-
-    /**
-     * Removes PDPs from the set of PDPs.
-     *
-     * @param pdps PDPs to be removed
-     */
-    public void removeAll(Collection<String> pdps) {
-        this.pdps.removeAll(pdps);
-    }
-}
diff --git a/main/src/main/java/org/onap/policy/pap/main/notification/PolicyTrackerData.java b/main/src/main/java/org/onap/policy/pap/main/notification/PolicyTrackerData.java
deleted file mode 100644 (file)
index 7dfb378..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-import lombok.Getter;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Data associated with a policy, used by PolicyTracker. PDPs start in
- * {@link #incompletePdps} and are moved to either {@link #successPdps} or
- * {@link #failPdps}, depending on their response. Objects of this type are not
- * multi-thread safe.
- */
-public class PolicyTrackerData {
-    /**
-     * The policy type associated with the policy.
-     */
-    @Getter
-    private final ToscaConceptIdentifier policyType;
-
-    /**
-     * PDPs that have successfully completed an update of the policy.
-     */
-    private final Set<String> successPdps = new HashSet<>();
-
-    /**
-     * PDPs that have failed to complete an update of the policy.
-     */
-    private final Set<String> failPdps = new HashSet<>();
-
-    /**
-     * PDPs for which we're still awaiting a response.
-     */
-    private final Set<String> incompletePdps = new HashSet<>();
-
-
-    /**
-     * Constructs the object.
-     *
-     * @param policyType policy type
-     */
-    public PolicyTrackerData(ToscaConceptIdentifier policyType) {
-        this.policyType = policyType;
-    }
-
-    /**
-     * Determines if this is complete (i.e., it is not waiting for responses from any
-     * other PDPs).
-     *
-     * @return {@code true} if this is complete, {@code false} otherwise
-     */
-    public boolean isComplete() {
-        return incompletePdps.isEmpty();
-    }
-
-    /**
-     * Determines if everything has succeeded.
-     *
-     * @return {@code true} if this is complete <i>and</i> nothing has failed,
-     *         {@code false} otherwise
-     */
-    public boolean allSucceeded() {
-        return (failPdps.isEmpty() && incompletePdps.isEmpty());
-    }
-
-    /**
-     * Determines if all of the sets within the data are empty (i.e., contain no PDPs).
-     *
-     * @return {@code true} if the data is completely empty, {@code false} otherwise
-     */
-    public boolean isEmpty() {
-        return (successPdps.isEmpty() && failPdps.isEmpty() && incompletePdps.isEmpty());
-    }
-
-    /**
-     * Puts the values from this data into the given status object.
-     *
-     * @param status object whose values are to be set
-     */
-    public void putValuesInto(PolicyStatus status) {
-        status.setFailureCount(failPdps.size());
-        status.setIncompleteCount(incompletePdps.size());
-        status.setSuccessCount(successPdps.size());
-    }
-
-    /**
-     * Adds PDPs to {@link #incompletePdps}, removing them from any other sets in which
-     * they appear.
-     *
-     * @param pdps PDPs to be added
-     */
-    public void addPdps(Collection<String> pdps) {
-        successPdps.removeAll(pdps);
-        failPdps.removeAll(pdps);
-
-        incompletePdps.addAll(pdps);
-    }
-
-    /**
-     * Removes PDPs from the sets.
-     *
-     * @param pdps PDPs to be removed
-     * @return {@code true} if anything changed and the policy is now complete, {@code false} otherwise
-     */
-    public boolean removePdps(Collection<String> pdps) {
-        boolean changed = successPdps.removeAll(pdps);
-        changed = failPdps.removeAll(pdps) || changed;
-        changed = incompletePdps.removeAll(pdps) || changed;
-
-        return (changed && incompletePdps.isEmpty());
-    }
-
-    /**
-     * Removes a PDP from all sets.
-     *
-     * @param pdp PDP to be removed
-     * @return {@code true} if anything changed and the policy is now complete, {@code false} otherwise
-     */
-    public boolean removePdp(String pdp) {
-        boolean changed = successPdps.remove(pdp);
-        changed = failPdps.remove(pdp) || changed;
-        changed = incompletePdps.remove(pdp) || changed;
-
-        return (changed && incompletePdps.isEmpty());
-    }
-
-    /**
-     * Indicates that a PDP has successfully processed this policy.
-     *
-     * @param pdp the PDP of interest
-     * @return {@code true} if the policy is now complete, {@code false} otherwise
-     */
-    public boolean success(String pdp) {
-        return complete(pdp, successPdps, failPdps);
-    }
-
-    /**
-     * Indicates that a PDP has processed this policy, but was unsuccessful.
-     *
-     * @param pdp the PDP of interest
-     * @return {@code true} if the policy is now complete, {@code false} otherwise
-     */
-    public boolean fail(String pdp) {
-        return complete(pdp, failPdps, successPdps);
-    }
-
-    /**
-     * Indicates that a PDP has processed this policy, either successfully or
-     * unsuccessfully.
-     *
-     * @param pdp the PDP of interest
-     * @param addSet set to which the PDP should be added
-     * @param removeSet set from which the PDP should be removed
-     * @return {@code true} if the policy is now complete, {@code false} otherwise
-     */
-    private boolean complete(String pdp, Set<String> addSet, Set<String> removeSet) {
-        if (incompletePdps.remove(pdp) || removeSet.remove(pdp)) {
-            // successfully removed from one of the sets
-            addSet.add(pdp);
-            return incompletePdps.isEmpty();
-        }
-
-        /*
-         * Else: wasn't in either set, thus it's already in the "addSet" or it isn't
-         * relevant to this policy. Either way, just discard it without triggering any new
-         * notification.
-         */
-        return false;
-    }
-}
diff --git a/main/src/main/java/org/onap/policy/pap/main/notification/PolicyUndeployTracker.java b/main/src/main/java/org/onap/policy/pap/main/notification/PolicyUndeployTracker.java
deleted file mode 100644 (file)
index af2f0b6..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-/**
- * Tracker for policy undeployments from PDPs.
- *
- * <p/>
- * Policies are removed from the internal map when they are no longer waiting for
- * responses from any PDPs.
- */
-public class PolicyUndeployTracker extends PolicyCommonTracker {
-
-    /**
-     * Constructs the object.
-     */
-    public PolicyUndeployTracker() {
-        super();
-    }
-
-    @Override
-    protected boolean updateData(String pdp, PolicyTrackerData data, boolean stillActive) {
-        // note: still active means the policy wasn't undeployed, thus it's a failure
-        return (stillActive ? data.fail(pdp) : data.success(pdp));
-    }
-
-    /**
-     * Returns {@code true} only when the data is all successful.
-     */
-    @Override
-    protected boolean shouldRemove(PolicyTrackerData data) {
-        return data.allSucceeded();
-    }
-}
index 00db7cc..39608cd 100644 (file)
@@ -3,7 +3,7 @@
  * ONAP PAP
  * ================================================================================
  * Copyright (C) 2019-2021 Nordix Foundation.
- * Modifications Copyright (C) 2019 AT&T Intellectual Property.
+ * Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -303,7 +303,7 @@ public class PdpGroupCreateOrUpdateProvider extends ProviderBase {
                 // this subgroup no longer appears - notify its PDPs
                 updated = true;
                 notifyPdpsDelSubGroup(data, subgrp);
-                trackPdpsDelSubGroup(data, subgrp);
+                trackPdpsDelSubGroup(data, dbgroup.getName(), subgrp);
             }
         }
 
@@ -337,14 +337,15 @@ public class PdpGroupCreateOrUpdateProvider extends ProviderBase {
      * Tracks PDP responses when their subgroup is removed.
      *
      * @param data session data
+     * @param pdpGroup PdpGroup name
      * @param subgrp subgroup that is being removed
      * @throws PfModelException if an error occurred
      */
-    private void trackPdpsDelSubGroup(SessionData data, PdpSubGroup subgrp) throws PfModelException {
+    private void trackPdpsDelSubGroup(SessionData data, String pdpGroup, PdpSubGroup subgrp) throws PfModelException {
         Set<String> pdps = subgrp.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
 
         for (ToscaConceptIdentifier policyId : subgrp.getPolicies()) {
-            data.trackUndeploy(policyId, pdps);
+            data.trackUndeploy(policyId, pdps, pdpGroup, subgrp.getPdpType());
         }
     }
 
index 38851cd..0170197 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -158,7 +158,7 @@ public class PdpGroupDeleteProvider extends ProviderBase {
                     logger.info("remove policy {} from subgroup {} {} count={}", ident,
                                     group.getName(), subgroup.getPdpType(), subgroup.getPolicies().size());
 
-                    data.trackUndeploy(ident, pdps);
+                    data.trackUndeploy(ident, pdps, group.getName(), subgroup.getPdpType());
                 }
             }
 
index c30ee8f..3c8ce4c 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -202,14 +202,14 @@ public class PdpGroupDeployProvider extends ProviderBase {
 
         switch (subgrp.getAction()) {
             case POST:
-                updated = addPolicies(data, dbsub, subgrp);
+                updated = addPolicies(data, dbgroup.getName(), dbsub, subgrp);
                 break;
             case DELETE:
-                updated = deletePolicies(data, dbsub, subgrp);
+                updated = deletePolicies(data, dbgroup.getName(), dbsub, subgrp);
                 break;
             case PATCH:
             default:
-                updated = updatePolicies(data, dbsub, subgrp);
+                updated = updatePolicies(data, dbgroup.getName(), dbsub, subgrp);
                 break;
         }
 
@@ -222,7 +222,7 @@ public class PdpGroupDeployProvider extends ProviderBase {
         return false;
     }
 
-    private boolean addPolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+    private boolean addPolicies(SessionData data, String pdpGroup, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
                     throws PfModelException {
 
         Set<ToscaConceptIdentifier> policies = new LinkedHashSet<>(dbsub.getPolicies());
@@ -232,10 +232,10 @@ public class PdpGroupDeployProvider extends ProviderBase {
         subgrp2.getPolicies().clear();
         subgrp2.getPolicies().addAll(policies);
 
-        return updatePolicies(data, dbsub, subgrp2);
+        return updatePolicies(data, pdpGroup, dbsub, subgrp2);
     }
 
-    private boolean deletePolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+    private boolean deletePolicies(SessionData data, String pdpGroup, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
                     throws PfModelException {
 
         Set<ToscaConceptIdentifier> policies = new LinkedHashSet<>(dbsub.getPolicies());
@@ -245,10 +245,10 @@ public class PdpGroupDeployProvider extends ProviderBase {
         subgrp2.getPolicies().clear();
         subgrp2.getPolicies().addAll(policies);
 
-        return updatePolicies(data, dbsub, subgrp2);
+        return updatePolicies(data, pdpGroup, dbsub, subgrp2);
     }
 
-    private boolean updatePolicies(SessionData data, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
+    private boolean updatePolicies(SessionData data, String pdpGroup, PdpSubGroup dbsub, DeploymentSubGroup subgrp)
                     throws PfModelException {
 
         Set<ToscaConceptIdentifier> undeployed = new HashSet<>(dbsub.getPolicies());
@@ -266,11 +266,11 @@ public class PdpGroupDeployProvider extends ProviderBase {
         Set<String> pdps = dbsub.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
 
         for (ToscaConceptIdentifier policyId : deployed) {
-            data.trackDeploy(policyId, pdps);
+            data.trackDeploy(policyId, pdps, pdpGroup, dbsub.getPdpType());
         }
 
         for (ToscaConceptIdentifier policyId : undeployed) {
-            data.trackUndeploy(policyId, pdps);
+            data.trackUndeploy(policyId, pdps, pdpGroup, dbsub.getPdpType());
         }
 
         dbsub.setPolicies(new ArrayList<>(subgrp.getPolicies()));
@@ -443,7 +443,7 @@ public class PdpGroupDeployProvider extends ProviderBase {
                             subgroup.getPdpType(), subgroup.getPolicies().size());
 
             Set<String> pdps = subgroup.getPdpInstances().stream().map(Pdp::getInstanceId).collect(Collectors.toSet());
-            data.trackDeploy(desiredIdent, pdps);
+            data.trackDeploy(desiredIdent, pdps, group.getName(), subgroup.getPdpType());
 
             return true;
         };
index bc83862..ec7c00a 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,30 +29,30 @@ import io.swagger.annotations.Authorization;
 import io.swagger.annotations.Extension;
 import io.swagger.annotations.ExtensionProperty;
 import io.swagger.annotations.ResponseHeader;
-import java.util.List;
-import java.util.Optional;
+import java.util.Collection;
 import java.util.UUID;
 import javax.ws.rs.GET;
 import javax.ws.rs.HeaderParam;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.core.Response;
-import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.pap.main.PapConstants;
-import org.onap.policy.pap.main.notification.PolicyNotifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to provide REST end points for PAP component to retrieve the status of deployed
  * policies.
  */
 public class PolicyStatusControllerV1 extends PapRestControllerV1 {
-    private final PolicyNotifier notifier;
+    private static final String GET_DEPLOYMENTS_FAILED = "get deployments failed";
 
-    public PolicyStatusControllerV1() {
-        this.notifier = Registry.get(PapConstants.REG_POLICY_NOTIFIER, PolicyNotifier.class);
-    }
+    private static final Logger logger = LoggerFactory.getLogger(PolicyStatusControllerV1.class);
+
+    private final PolicyStatusProvider provider = new PolicyStatusProvider();
 
     /**
      * Queries status of all deployed policies.
@@ -88,8 +88,15 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
     public Response queryAllDeployedPolicies(
                     @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
 
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                        .entity(notifier.getStatus()).build();
+        try {
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                            .entity(provider.getStatus()).build();
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).entity(e.getErrorResponse().getErrorMessage()).build();
+        }
     }
 
 
@@ -128,13 +135,20 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
                     @ApiParam(value = "Policy Id", required = true) @PathParam("name") String name,
                     @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
 
-        List<PolicyStatus> result = notifier.getStatus(name);
-        if (result.isEmpty()) {
-            return makeNotFoundResponse(requestId);
+        try {
+            Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, null));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
 
-        } else {
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                            .entity(result).build();
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                                .entity(result).build();
+            }
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).entity(e.getErrorResponse().getErrorMessage()).build();
         }
     }
 
@@ -174,14 +188,20 @@ public class PolicyStatusControllerV1 extends PapRestControllerV1 {
                     @ApiParam(value = "Policy Version", required = true) @PathParam("version") String version,
                     @HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) final UUID requestId) {
 
-        ToscaConceptIdentifier ident = new ToscaConceptIdentifier(name, version);
-        Optional<PolicyStatus> result = notifier.getStatus(ident);
-        if (result.isPresent()) {
-            return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
-                            .entity(result.get()).build();
+        try {
+            Collection<PolicyStatus> result = provider.getStatus(new ToscaConceptIdentifierOptVersion(name, version));
+            if (result.isEmpty()) {
+                return makeNotFoundResponse(requestId);
+
+            } else {
+                return addLoggingHeaders(addVersionControlHeaders(Response.status(Response.Status.OK)), requestId)
+                                .entity(result.iterator().next()).build();
+            }
 
-        } else {
-            return makeNotFoundResponse(requestId);
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn(GET_DEPLOYMENTS_FAILED, e);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                requestId).entity(e.getErrorResponse().getErrorMessage()).build();
         }
     }
 
diff --git a/main/src/main/java/org/onap/policy/pap/main/rest/PolicyStatusProvider.java b/main/src/main/java/org/onap/policy/pap/main/rest/PolicyStatusProvider.java
new file mode 100644 (file)
index 0000000..98cf47b
--- /dev/null
@@ -0,0 +1,95 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.main.rest;
+
+import java.util.Collection;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.provider.PolicyModelsProvider;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
+import org.onap.policy.pap.main.PapConstants;
+import org.onap.policy.pap.main.PolicyModelsProviderFactoryWrapper;
+import org.onap.policy.pap.main.notification.DeploymentTracker;
+
+/**
+ * Provider for PAP component to query policy deployment status.
+ */
+public class PolicyStatusProvider {
+
+    /**
+     * Factory for PAP DAO.
+     */
+    private final PolicyModelsProviderFactoryWrapper daoFactory;
+
+
+    /**
+     * Constructs the object. Loads all deployed policies into the internal cache.
+     */
+    public PolicyStatusProvider() {
+        this.daoFactory = Registry.get(PapConstants.REG_PAP_DAO_FACTORY, PolicyModelsProviderFactoryWrapper.class);
+    }
+
+    /**
+     * Gets the deployment status of all policies.
+     *
+     * @return the deployment status of all policies
+     * @throws PfModelException if a DB error occurs
+     */
+    public Collection<PolicyStatus> getStatus() throws PfModelException {
+        try (PolicyModelsProvider dao = daoFactory.create()) {
+            return accumulate(dao.getAllPolicyStatus());
+        }
+    }
+
+    /**
+     * Gets the deployment status of a policy.
+     *
+     * @param policy policy of interest
+     * @return the deployment status of all policies
+     * @throws PfModelException if a DB error occurs
+     */
+    public Collection<PolicyStatus> getStatus(ToscaConceptIdentifierOptVersion policy) throws PfModelException {
+        try (PolicyModelsProvider dao = daoFactory.create()) {
+            return accumulate(dao.getAllPolicyStatus(policy));
+        }
+    }
+
+    /**
+     * Accumulates the deployment status of individual PDP/policy pairs into a status for
+     * a policy.
+     *
+     * @param source PDP/policy pairs
+     * @return the deployment status of the policies
+     */
+    private Collection<PolicyStatus> accumulate(Collection<PdpPolicyStatus> source) {
+        DeploymentTracker tracker = new DeploymentTracker();
+
+        for (PdpPolicyStatus status : source) {
+            if (status.isDeploy()) {
+                tracker.add(status);
+            }
+        }
+
+        return tracker.getDeploymentStatus();
+    }
+}
index 1e7c788..c3dd505 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -93,7 +93,7 @@ public class PolicyUndeployerImpl extends ProviderBase implements PolicyUndeploy
                     subgroup.getPdpType(), subgroup.getPolicies().size());
 
             updated = true;
-            data.trackUndeploy(ident, pdps);
+            data.trackUndeploy(ident, pdps, policyInfo.group, policyInfo.subgroup);
         }
 
         // push the updates
index 0de7a6c..7f013ac 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
@@ -28,6 +28,7 @@ import javax.ws.rs.core.Response.Status;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
@@ -95,6 +96,7 @@ public abstract class ProviderBase {
 
         synchronized (updateLock) {
             SessionData data;
+            PolicyNotification notif = new PolicyNotification();
 
             try (PolicyModelsProvider dao = daoFactory.create()) {
 
@@ -102,7 +104,7 @@ public abstract class ProviderBase {
                 processor.accept(data, request);
 
                 // make all of the DB updates
-                data.updateDb();
+                data.updateDb(notif);
 
             } catch (PfModelException | PfModelRuntimeException e) {
                 throw e;
@@ -111,12 +113,11 @@ public abstract class ProviderBase {
                 throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "request failed", e);
             }
 
-            // track responses for notification purposes
-            data.getDeployData().forEach(notifier::addDeploymentData);
-            data.getUndeployData().forEach(notifier::addUndeploymentData);
-
             // publish the requests
             data.getPdpRequests().forEach(pair -> requestMap.addRequest(pair.getLeft(), pair.getRight()));
+
+            // publish the notifications
+            notifier.publish(notif);
         }
     }
 
index cdcc51c..930302a 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -25,13 +25,12 @@ import com.google.re2j.Pattern;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.stream.Collectors;
 import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroupFilter;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
@@ -44,7 +43,7 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter.ToscaPolicyFilterBuilder;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
-import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
+import org.onap.policy.pap.main.notification.DeploymentStatus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -93,16 +92,9 @@ public class SessionData {
     private final Map<ToscaConceptIdentifier, ToscaPolicyType> typeCache = new HashMap<>();
 
     /**
-     * Policies to be deployed. This is just used to build up the data, which is then
-     * passed to the notifier once the update is "committed".
+     * Tracks policy deployment status so notifications can be generated.
      */
-    private final Map<ToscaConceptIdentifier, PolicyPdpNotificationData> deploy = new HashMap<>();
-
-    /**
-     * Policies to be undeployed. This is just used to build up the data, which is then
-     * passed to the notifier once the update is "committed".
-     */
-    private final Map<ToscaConceptIdentifier, PolicyPdpNotificationData> undeploy = new HashMap<>();
+    private final DeploymentStatus deployStatus;
 
 
     /**
@@ -112,6 +104,7 @@ public class SessionData {
      */
     public SessionData(PolicyModelsProvider dao) {
         this.dao = dao;
+        this.deployStatus = makeDeploymentStatus(dao);
     }
 
     /**
@@ -332,6 +325,8 @@ public class SessionData {
             data = new GroupData(lst.get(0));
             groupCache.put(name, data);
 
+            deployStatus.loadByGroup(name);
+
         } else {
             logger.info("use cached group {}", name);
         }
@@ -352,7 +347,7 @@ public class SessionData {
          * exception and handling that would obfuscate the code too much, thus disabling
          * the sonar.
          */
-        List<GroupData> data = type2groups.get(type);   // NOSONAR
+        List<GroupData> data = type2groups.get(type); // NOSONAR
         if (data == null) {
             PdpGroupFilter filter = PdpGroupFilter.builder().policyTypeList(Collections.singletonList(type))
                             .groupState(PdpState.ACTIVE).build();
@@ -388,10 +383,11 @@ public class SessionData {
 
     /**
      * Update the DB with the changes.
+     * @param notification notification to which to add policy status
      *
      * @throws PfModelException if an error occurred
      */
-    public void updateDb() throws PfModelException {
+    public void updateDb(PolicyNotification notification) throws PfModelException {
         // create new groups
         List<GroupData> created = groupCache.values().stream().filter(GroupData::isNew).collect(Collectors.toList());
         if (!created.isEmpty()) {
@@ -410,6 +406,9 @@ public class SessionData {
             }
             dao.updatePdpGroups(updated.stream().map(GroupData::getGroup).collect(Collectors.toList()));
         }
+
+        // flush deployment status records to the DB
+        deployStatus.flush(notification);
     }
 
     /**
@@ -429,32 +428,13 @@ public class SessionData {
      *
      * @param policyId ID of the policy being deployed
      * @param pdps PDPs to which the policy is being deployed
+     * @param pdpGroup PdpGroup containing the PDP of interest
+     * @param pdpType PDP type (i.e., PdpSubGroup) containing the PDP of interest
      * @throws PfModelException if an error occurred
      */
-    protected void trackDeploy(ToscaConceptIdentifier policyId, Collection<String> pdps) throws PfModelException {
-        trackDeploy(policyId, new HashSet<>(pdps));
-    }
-
-    /**
-     * Adds policy deployment data.
-     *
-     * @param policyId ID of the policy being deployed
-     * @param pdps PDPs to which the policy is being deployed
-     * @throws PfModelException if an error occurred
-     */
-    protected void trackDeploy(ToscaConceptIdentifier policyId, Set<String> pdps) throws PfModelException {
-        addData(policyId, pdps, deploy, undeploy);
-    }
-
-    /**
-     * Adds policy undeployment data.
-     *
-     * @param policyId ID of the policy being undeployed
-     * @param pdps PDPs to which the policy is being undeployed
-     * @throws PfModelException if an error occurred
-     */
-    protected void trackUndeploy(ToscaConceptIdentifier policyId, Collection<String> pdps) throws PfModelException {
-        trackUndeploy(policyId, new HashSet<>(pdps));
+    protected void trackDeploy(ToscaConceptIdentifier policyId, Collection<String> pdps, String pdpGroup,
+                    String pdpType) throws PfModelException {
+        addData(policyId, pdps, pdpGroup, pdpType, true);
     }
 
     /**
@@ -462,10 +442,13 @@ public class SessionData {
      *
      * @param policyId ID of the policy being undeployed
      * @param pdps PDPs to which the policy is being undeployed
+     * @param pdpGroup PdpGroup containing the PDP of interest
+     * @param pdpType PDP type (i.e., PdpSubGroup) containing the PDP of interest
      * @throws PfModelException if an error occurred
      */
-    protected void trackUndeploy(ToscaConceptIdentifier policyId, Set<String> pdps) throws PfModelException {
-        addData(policyId, pdps, undeploy, deploy);
+    protected void trackUndeploy(ToscaConceptIdentifier policyId, Collection<String> pdps, String pdpGroup,
+                    String pdpType) throws PfModelException {
+        addData(policyId, pdps, pdpGroup, pdpType, false);
     }
 
     /**
@@ -473,40 +456,29 @@ public class SessionData {
      *
      * @param policyId ID of the policy being deployed/undeployed
      * @param pdps PDPs to which the policy is being deployed/undeployed
-     * @param addMap map to which it should be added
-     * @param removeMap map from which it should be removed
+     * @param deploy {@code true} if the policy is being deployed, {@code false} if
+     *        undeployed
+     * @param pdpGroup PdpGroup containing the PDP of interest
+     * @param pdpType PDP type (i.e., PdpSubGroup) containing the PDP of interest
      * @throws PfModelException if an error occurred
      */
-    private void addData(ToscaConceptIdentifier policyId, Set<String> pdps,
-                    Map<ToscaConceptIdentifier, PolicyPdpNotificationData> addMap,
-                    Map<ToscaConceptIdentifier, PolicyPdpNotificationData> removeMap) throws PfModelException {
+    private void addData(ToscaConceptIdentifier policyId, Collection<String> pdps, String pdpGroup, String pdpType,
+                    boolean deploy) throws PfModelException {
 
-        PolicyPdpNotificationData removeData = removeMap.get(policyId);
-        if (removeData != null) {
-            removeData.removeAll(pdps);
-        }
+        // delete all records whose "deploy" flag is the opposite of what we want
+        deployStatus.deleteDeployment(policyId, !deploy);
 
         ToscaConceptIdentifierOptVersion optid = new ToscaConceptIdentifierOptVersion(policyId);
         ToscaConceptIdentifier policyType = getPolicy(optid).getTypeIdentifier();
 
-        addMap.computeIfAbsent(policyId, key -> new PolicyPdpNotificationData(policyId, policyType)).addAll(pdps);
+        for (String pdp : pdps) {
+            deployStatus.deploy(pdp, policyId, policyType, pdpGroup, pdpType, deploy);
+        }
     }
 
-    /**
-     * Gets the policies to be deployed.
-     *
-     * @return the policies to be deployed
-     */
-    public Collection<PolicyPdpNotificationData> getDeployData() {
-        return deploy.values();
-    }
+    // these may be overridden by junit tests
 
-    /**
-     * Gets the policies to be undeployed.
-     *
-     * @return the policies to be undeployed
-     */
-    public Collection<PolicyPdpNotificationData> getUndeployData() {
-        return undeploy.values();
+    protected DeploymentStatus makeDeploymentStatus(PolicyModelsProvider dao) {
+        return new DeploymentStatus(dao);
     }
 }
index 4ccfb11..a351e6f 100644 (file)
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix Foundation.
- *  Modifications Copyright (C) 2019 AT&T Intellectual Property.
+ *  Modifications Copyright (C) 2019, 2021 AT&T Intellectual Property.
  *  Modifications Copyright (C) 2020 Bell Canada. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -78,7 +78,13 @@ public class Main {
 
             // Start the activator
             activator.start();
-        } catch (Exception exp) {
+        } catch (Exception exp) { // NOSONAR
+            /*
+             * Disabled sonar on the above line, because we want to capture the stack
+             * trace via the logger while still reporting the exception message on stdout
+             * when the JVM exits.
+             */
+            LOGGER.error("failed to start Main", exp);
             if (null != activator) {
                 Registry.unregister(PapConstants.REG_PAP_ACTIVATOR);
             }
index 8c385f8..a9624f3 100644 (file)
@@ -2,6 +2,7 @@
 <!--
   ============LICENSE_START=======================================================
    Copyright (C) 2019-2020 Nordix Foundation.
+   Modifications Copyright (C) 2021 AT&T Intellectual Property.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -28,6 +29,7 @@
         <class>org.onap.policy.models.dao.converters.Uuid2String</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpPolicyStatus</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
         <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
index 114d50e..65708aa 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +21,7 @@
 
 package org.onap.policy.pap.main.comm;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -51,9 +52,13 @@ import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
+import org.onap.policy.models.pap.concepts.PolicyStatus;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpMessage;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
 import org.onap.policy.models.pdp.concepts.PdpStatus;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
@@ -82,6 +87,9 @@ public class PdpModifyRequestMapTest extends CommonRequestBase {
     @Captor
     private ArgumentCaptor<List<PdpGroup>> updateCaptor;
 
+    @Captor
+    private ArgumentCaptor<PolicyNotification> notificationCaptor;
+
     /**
      * Used to capture input to undeployer.undeploy().
      */
@@ -360,7 +368,22 @@ public class PdpModifyRequestMapTest extends CommonRequestBase {
         PdpGroup group = makeGroup(MY_GROUP);
         group.setPdpSubgroups(Arrays.asList(makeSubGroup(MY_SUBGROUP, PDP1)));
 
+        final ToscaConceptIdentifier policy1 = new ToscaConceptIdentifier("MyPolicy", "10.20.30");
+        final ToscaConceptIdentifier policyType = new ToscaConceptIdentifier("MyPolicyType", "10.20.30");
+
+        // @formatter:off
         when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group));
+        when(dao.getGroupPolicyStatus(any())).thenReturn(Arrays.asList(
+                        PdpPolicyStatus.builder()
+                            .pdpGroup(MY_GROUP)
+                            .pdpType(MY_SUBGROUP)
+                            .pdpId(PDP1)
+                            .policy(policy1)
+                            .policyType(policyType)
+                            .deploy(true)
+                            .state(State.SUCCESS)
+                            .build()));
+        // @formatter:on
 
         // indicate retries exhausted
         invokeLastRetryHandler(1);
@@ -368,8 +391,17 @@ public class PdpModifyRequestMapTest extends CommonRequestBase {
         // should have stopped publishing
         verify(requests).stopPublishing();
 
-        // should have generated a notification
-        verify(notifier).removePdp(PDP1);
+        // should have generated a notification; yes, it should go into the "added" set
+        verify(notifier).publish(notificationCaptor.capture());
+        assertThat(notificationCaptor.getValue().getDeleted()).isEmpty();
+        assertThat(notificationCaptor.getValue().getAdded()).hasSize(1);
+
+        PolicyStatus status = notificationCaptor.getValue().getAdded().get(0);
+        assertThat(status.getPolicy()).isEqualTo(policy1);
+        assertThat(status.getPolicyType()).isEqualTo(policyType);
+        assertThat(status.getFailureCount()).isZero();
+        assertThat(status.getIncompleteCount()).isZero();
+        assertThat(status.getSuccessCount()).isZero();
 
         // should have removed from the group
         List<PdpGroup> groups = getGroupUpdates();
@@ -390,6 +422,9 @@ public class PdpModifyRequestMapTest extends CommonRequestBase {
 
         // should not have done any updates
         verify(dao, never()).updatePdpGroups(any());
+
+        // and no publishes
+        verify(notifier, never()).publish(any());
     }
 
     @Test
index db95515..ca6a62c 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -115,7 +115,7 @@ public class UpdateReqTest extends CommonRequestBase {
 
         assertEquals("group does not match", data.checkResponse(response));
         assertTrue(data.getUndeployPolicies().isEmpty());
-        verifyResponse();
+        verifyNoResponse();
     }
 
     @Test
@@ -124,7 +124,7 @@ public class UpdateReqTest extends CommonRequestBase {
 
         assertEquals("subgroup does not match", data.checkResponse(response));
         assertTrue(data.getUndeployPolicies().isEmpty());
-        verifyResponse();
+        verifyNoResponse();
     }
 
     @Test
@@ -137,7 +137,7 @@ public class UpdateReqTest extends CommonRequestBase {
 
         assertEquals(null, data.checkResponse(response));
         assertTrue(data.getUndeployPolicies().isEmpty());
-        verifyResponse();
+        verifyNoResponse();
     }
 
     @Test
@@ -277,12 +277,12 @@ public class UpdateReqTest extends CommonRequestBase {
 
     @SuppressWarnings("unchecked")
     private void verifyResponse() {
-        verify(notifier).processResponse(any(), any(Set.class));
+        verify(notifier).processResponse(any(), any(), any(Set.class), any(Set.class));
     }
 
     @SuppressWarnings("unchecked")
     private void verifyNoResponse() {
-        verify(notifier, never()).processResponse(any(), any(Set.class));
+        verify(notifier, never()).processResponse(any(), any(), any(Set.class), any(Set.class));
     }
 
     /**
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonSupport.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonSupport.java
deleted file mode 100644 (file)
index de1848d..0000000
+++ /dev/null
@@ -1,94 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Before;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Super class for policy notification test classes.
- */
-public class PolicyCommonSupport {
-    protected static final String MAP_FIELD = "policy2data";
-    protected static final String PDP1 = "pdp-1";
-    protected static final String PDP2 = "pdp-2";
-    protected static final String PDP3 = "pdp-3";
-    protected static final String PDP4 = "pdp-4";
-
-    protected ToscaConceptIdentifier type;
-    protected ToscaConceptIdentifier policy1;
-    protected ToscaConceptIdentifier policy2;
-    protected ToscaConceptIdentifier policy3;
-    protected ToscaConceptIdentifier policy4;
-
-    /**
-     * Creates various objects.
-     */
-    @Before
-    public void setUp() {
-        type = new ToscaConceptIdentifier("my-type", "3.2.1");
-        policy1 = new ToscaConceptIdentifier("my-id-a", "1.2.0");
-        policy2 = new ToscaConceptIdentifier("my-id-b", "1.2.1");
-        policy3 = new ToscaConceptIdentifier("my-id-c", "1.2.2");
-        policy4 = new ToscaConceptIdentifier("my-id-d", "1.2.3");
-    }
-
-    /**
-     * Makes notification data.
-     *
-     * @param policyId ID of the policy with which the data should be associated
-     * @param pdps PDPs to be included within the data
-     * @return a new notification data structure
-     */
-    protected PolicyPdpNotificationData makeData(ToscaConceptIdentifier policyId, String... pdps) {
-        PolicyPdpNotificationData data = new PolicyPdpNotificationData(policyId, type);
-        data.addAll(Arrays.asList(pdps));
-        return data;
-    }
-
-    /**
-     * Extracts the counts from the sets contained within tracker data.
-     *
-     * @param data data from which to extract the sets
-     * @return a list containing the number of successes, failures, and incomplete PDPs,
-     *         in that order
-     */
-    protected List<Integer> getCounts(PolicyTrackerData data) {
-        PolicyStatus status = new PolicyStatus();
-        data.putValuesInto(status);
-        return getCounts(status);
-    }
-
-    /**
-     * Extracts the counts from within a status notification.
-     *
-     * @param status status from which to extract the counts
-     * @return a list containing the number of successes, failures, and incomplete PDPs,
-     *         in that order
-     */
-    protected List<Integer> getCounts(PolicyStatus status) {
-        return Arrays.asList(status.getSuccessCount(), status.getFailureCount(), status.getIncompleteCount());
-    }
-}
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonTrackerTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyCommonTrackerTest.java
deleted file mode 100644 (file)
index b80b80d..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNotSame;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.powermock.reflect.Whitebox;
-
-public class PolicyCommonTrackerTest extends PolicyCommonSupport {
-
-    private MyTracker tracker;
-    private Map<ToscaConceptIdentifier, PolicyTrackerData> map;
-
-    /**
-     * Creates various objects, including {@link #tracker}.
-     */
-    @Override
-    @Before
-    public void setUp() {
-        super.setUp();
-
-        tracker = new MyTracker();
-    }
-
-    @Test
-    public void testGetStatus() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP2));
-
-        List<PolicyStatus> statusList = tracker.getStatus();
-        assertEquals(2, statusList.size());
-
-        Set<String> names = statusList.stream().map(PolicyStatus::getPolicyId).collect(Collectors.toSet());
-        assertTrue(names.contains(policy1.getName()));
-        assertTrue(names.contains(policy2.getName()));
-    }
-
-    @Test
-    public void testGetStatusString() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP2));
-
-        policy3 = new ToscaConceptIdentifier(policy1.getName(), policy1.getVersion() + "0");
-        tracker.addData(makeData(policy3, PDP3));
-
-        List<PolicyStatus> statusList = tracker.getStatus(policy1.getName());
-        assertEquals(2, statusList.size());
-
-        Set<ToscaConceptIdentifier> idents =
-                        statusList.stream().map(PolicyStatus::getPolicy).collect(Collectors.toSet());
-        assertTrue(idents.contains(policy1));
-        assertTrue(idents.contains(policy3));
-    }
-
-    @Test
-    public void testGetStatusToscaConceptIdentifier() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP2));
-
-        policy3 = new ToscaConceptIdentifier(policy1.getName(), policy1.getVersion() + "0");
-        tracker.addData(makeData(policy3, PDP3));
-
-        Optional<PolicyStatus> status = tracker.getStatus(policy1);
-        assertTrue(status.isPresent());
-
-        assertEquals(policy1, status.get().getPolicy());
-
-        // check not-found case
-        status = tracker.getStatus(policy4);
-        assertFalse(status.isPresent());
-    }
-
-    @Test
-    public void testAddData() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        assertEquals(1, map.size());
-
-        PolicyTrackerData data = map.get(policy1);
-        assertNotNull(data);
-        assertFalse(data.isComplete());
-
-        // add same policy - should still have the same data object
-        tracker.addData(makeData(policy1, PDP1, PDP3));
-        assertEquals(1, map.size());
-        assertSame(data, map.get(policy1));
-        assertFalse(data.isComplete());
-
-        // add another policy
-        tracker.addData(makeData(policy2, PDP2));
-        assertEquals(2, map.size());
-
-        // data for policy 1 is unchanged
-        assertSame(data, map.get(policy1));
-        assertFalse(data.isComplete());
-
-        // policy 2 should have its own data
-        assertNotSame(data, map.get(policy2));
-        data = map.get(policy2);
-        assertNotNull(data);
-        assertFalse(data.isComplete());
-    }
-
-    /**
-     * Tests removeData() when the policy isn't in the map.
-     */
-    @Test
-    public void testRemoveDataUnknownPolicy() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-
-        // remove a policy that isn't in the map
-        tracker.removeData(makeData(policy3, PDP1));
-        assertEquals(2, map.size());
-    }
-
-    /**
-     * Tests removeData() when only some PDPs are removed from the policy.
-     */
-    @Test
-    public void testRemoveDataRemoveSomePdps() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-
-        // remove some PDPs from a policy - no changes to the map
-        tracker.removeData(makeData(policy2, PDP1));
-        assertTrue(map.containsKey(policy1));
-        assertTrue(map.containsKey(policy2));
-    }
-
-    /**
-     * Tests removeData() when the subclass indicates that the policy should NOT be
-     * removed.
-     */
-    @Test
-    public void testRemoveDataDoNotRemovePolicy() {
-        tracker = new MyTracker() {
-            @Override
-            protected boolean shouldRemove(PolicyTrackerData data) {
-                return false;
-            }
-        };
-
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-
-        // remove all the PDPs from one policy, but do NOT remove the policy
-        tracker.removeData(makeData(policy2, PDP1, PDP3));
-        assertTrue(map.containsKey(policy1));
-        assertTrue(map.containsKey(policy2));
-    }
-
-    /**
-     * Tests removeData() when the subclass indicates that the policy should be removed.
-     */
-    @Test
-    public void testRemoveDataRemovePolicy() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-
-        // remove all the PDPs from one policy, and remove the policy
-        tracker.removeData(makeData(policy1, PDP1, PDP2, PDP3));
-        assertFalse(map.containsKey(policy1));
-        assertTrue(map.containsKey(policy2));
-    }
-
-    @Test
-    public void testRemovePdp() {
-        tracker.addData(makeData(policy1, PDP1));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-        tracker.addData(makeData(policy3, PDP1, PDP2, PDP3));
-        tracker.addData(makeData(policy4, PDP4, PDP2, PDP3));
-
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.removePdp(PDP1, statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-
-        assertEquals(3, map.size());
-        assertFalse(map.containsKey(policy1));
-        assertEquals("[0, 0, 1]", getCounts(map.get(policy2)).toString());
-        assertEquals("[0, 0, 2]", getCounts(map.get(policy3)).toString());
-        assertEquals("[0, 0, 3]", getCounts(map.get(policy4)).toString());
-    }
-
-    @Test
-    public void testProcessResponse() {
-        tracker.addData(makeData(policy1, PDP1));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-        tracker.addData(makeData(policy3, PDP1, PDP2, PDP3));
-        tracker.addData(makeData(policy4, PDP4, PDP2, PDP3));
-
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy3), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-
-        assertEquals(3, map.size());
-        assertFalse(map.containsKey(policy1));
-        assertEquals("[0, 1, 1]", getCounts(map.get(policy2)).toString());
-        assertEquals("[1, 0, 2]", getCounts(map.get(policy3)).toString());
-        assertEquals("[0, 0, 3]", getCounts(map.get(policy4)).toString());
-    }
-
-    @Test
-    public void testUpdateMap() {
-        tracker.addData(makeData(policy1, PDP1));
-        tracker.addData(makeData(policy2, PDP1, PDP3));
-        tracker.addData(makeData(policy3, PDP1, PDP2, PDP3));
-        tracker.addData(makeData(policy4, PDP4, PDP2, PDP3));
-
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy3), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-
-        assertEquals(3, map.size());
-        assertFalse(map.containsKey(policy1));
-        assertEquals("[0, 1, 1]", getCounts(map.get(policy2)).toString());
-        assertEquals("[1, 0, 2]", getCounts(map.get(policy3)).toString());
-        assertEquals("[0, 0, 3]", getCounts(map.get(policy4)).toString());
-    }
-
-    /**
-     * Tests updateMap() when the policy should NOT be removed.
-     */
-    @Test
-    public void testUpdateMapDoNotRemove() {
-        tracker = new MyTracker() {
-            @Override
-            protected boolean shouldRemove(PolicyTrackerData data) {
-                return false;
-            }
-        };
-
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has succeeded
-        tracker.processResponse(PDP2, Arrays.asList(policy1), new ArrayList<>(0));
-
-        // indicate that PDP1 has succeeded
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-
-        assertEquals(1, map.size());
-        assertTrue(map.containsKey(policy1));
-        assertEquals("[2, 0, 0]", getCounts(map.get(policy1)).toString());
-    }
-
-    /**
-     * Tests updateMap() when the policy SHOULD be removed.
-     */
-    @Test
-    public void testUpdateMapRemovePolicy() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has succeeded
-        tracker.processResponse(PDP2, Arrays.asList(policy1), new ArrayList<>(0));
-
-        // indicate that PDP1 has succeeded
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[2, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        assertTrue(map.isEmpty());
-    }
-
-    @Test
-    public void testMakeStatus() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has succeeded
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP2, Arrays.asList(policy1), statusList);
-        assertTrue(statusList.isEmpty());
-
-        // indicate that PDP1 has failed
-        tracker.processResponse(PDP1, Arrays.asList(policy2), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[1, 1, 0]", getCounts(statusList.get(0)).toString());
-    }
-
-    private class MyTracker extends PolicyCommonTracker {
-
-        public MyTracker() {
-            map = Whitebox.getInternalState(this, MAP_FIELD);
-        }
-
-        @Override
-        protected boolean updateData(String pdp, PolicyTrackerData data, boolean stillActive) {
-            return (stillActive ? data.success(pdp) : data.fail(pdp));
-        }
-
-        @Override
-        protected boolean shouldRemove(PolicyTrackerData data) {
-            return data.isComplete();
-        }
-    }
-}
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyDeployTrackerTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyDeployTrackerTest.java
deleted file mode 100644 (file)
index 742d87d..0000000
+++ /dev/null
@@ -1,250 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-
-public class PolicyDeployTrackerTest extends PolicyCommonSupport {
-
-    @Mock
-    private PolicyTrackerData data;
-
-    private PolicyDeployTracker tracker;
-
-    /**
-     * Creates various objects, including {@link #tracker}.
-     */
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        super.setUp();
-
-        tracker = new PolicyDeployTracker();
-    }
-
-    /**
-     * Simple test with one PDP that immediately responds with success.
-     */
-    @Test
-    public void testSimpleImmediateSuccess() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // indicate that PDP1 has succeeded
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has succeeded again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate failure
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[0, 1, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has failed again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate that PDP1 has succeeded again
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-    }
-
-    /**
-     * Simple test with one PDP that immediately responds with success.
-     */
-    @Test
-    public void testSimpleImmediateFail() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // indicate that PDP1 has failed
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[0, 1, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has failed again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate success
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has succeeded again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-    }
-
-    /**
-     * Simple test where PDP is removed and then it responds.
-     */
-    @Test
-    public void testSimpleRemove() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // remove the PDP
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.removePdp(PDP1, statusList);
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[0, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        /*
-         * indicate that PDP1 has succeeded - should be no message since PDP was removed
-         * from the policy
-         */
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        /*
-         * indicate that PDP1 has failed - should be no message since PDP was removed
-         * from the policy
-         */
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-    }
-
-    /**
-     * Test with multiple PDPs.
-     */
-    @Test
-    public void testMulti() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has succeeded
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP2, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate that PDP1 has succeeded
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[2, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has failed - should get a notification
-        statusList.clear();
-        tracker.processResponse(PDP1, Collections.emptyList(), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 1, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has succeeded
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[2, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // remove PDP2 - expect message
-        statusList.clear();
-        tracker.removePdp(PDP2, statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // re-add PDP2
-        tracker.addData(makeData(policy1, PDP2));
-
-        // indicate that PDP2 has succeeded; PDP1 should still be ok
-        statusList.clear();
-        tracker.processResponse(PDP2, Arrays.asList(policy1), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[2, 0, 0]", getCounts(statusList.get(0)).toString());
-    }
-
-    @Test
-    public void testUpdateData() {
-        // when success returns false
-        assertFalse(tracker.updateData(PDP1, data, true));
-        verify(data).success(PDP1);
-        verify(data, never()).fail(any());
-
-        // when inactive
-        assertFalse(tracker.updateData(PDP1, data, false));
-        verify(data).success(PDP1);
-        verify(data).fail(any());
-
-        // when success & fail return true
-        when(data.success(PDP1)).thenReturn(true);
-        when(data.fail(PDP1)).thenReturn(true);
-        assertTrue(tracker.updateData(PDP1, data, true));
-        verify(data, times(2)).success(PDP1);
-        verify(data, times(1)).fail(PDP1);
-
-        // when inactive
-        assertTrue(tracker.updateData(PDP1, data, false));
-        verify(data, times(2)).success(PDP1);
-        verify(data, times(2)).fail(PDP1);
-    }
-
-    @Test
-    public void testShouldRemove() {
-        // when data is complete, but not empty
-        when(data.isComplete()).thenReturn(true);
-        when(data.isEmpty()).thenReturn(false);
-        assertFalse(tracker.shouldRemove(data));
-
-        // when data is empty
-        when(data.isEmpty()).thenReturn(true);
-        assertTrue(tracker.shouldRemove(data));
-    }
-}
index 5e64c93..a366595 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package org.onap.policy.pap.main.notification;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
+import static org.assertj.core.api.Assertions.assertThatCode;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
-import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
+import java.util.Set;
+import javax.ws.rs.core.Response.Status;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
-import org.mockito.stubbing.Answer;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.pdp.concepts.Pdp;
-import org.onap.policy.models.pdp.concepts.PdpGroup;
-import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.provider.PolicyModelsProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.pap.main.PolicyModelsProviderFactoryWrapper;
 import org.onap.policy.pap.main.PolicyPapRuntimeException;
 import org.onap.policy.pap.main.comm.Publisher;
 import org.onap.policy.pap.main.comm.QueueToken;
 
-public class PolicyNotifierTest extends PolicyCommonSupport {
+public class PolicyNotifierTest {
+    private static final String GROUP_A = "groupA";
+    private static final String PDP1 = "pdp-1";
+    private static final ToscaConceptIdentifier policy1 = new ToscaConceptIdentifier("policy1", "1.2.3");
+    private static final ToscaConceptIdentifier policy2 = new ToscaConceptIdentifier("policy2", "1.2.3");
 
     @Mock
     private Publisher<PolicyNotification> publisher;
@@ -70,10 +65,7 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
     private PolicyModelsProvider dao;
 
     @Mock
-    private PolicyDeployTracker deploy;
-
-    @Mock
-    private PolicyUndeployTracker undeploy;
+    private DeploymentStatus tracker;
 
     @Mock
     private PolicyStatus status1;
@@ -95,16 +87,13 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
     /**
      * Creates various objects, including {@link #notifier}.
      */
-    @Override
     @Before
     public void setUp() {
         MockitoAnnotations.initMocks(this);
 
-        super.setUp();
-
         try {
             when(daoFactory.create()).thenReturn(dao);
-            when(dao.getPdpGroups(null)).thenReturn(Collections.emptyList());
+            when(dao.getGroupPolicyStatus(anyString())).thenReturn(Collections.emptyList());
 
             notifier = new MyNotifier(publisher);
 
@@ -114,154 +103,31 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
     }
 
     @Test
-    public void testLoadPoliciesPolicyModelsProviderFactoryWrapper() throws PfModelException {
-        final PdpGroup group1 = makeGroup("my group #1", makeSubGroup("sub #1 A", 2, policy1, policy4),
-                        makeSubGroup("sub #1 B", 1, policy2));
-
-        // one policy is a duplicate
-        final PdpGroup group2 = makeGroup("my group #2", makeSubGroup("sub #2 A", 1, policy1, policy3));
-
-        when(dao.getPdpGroups(null)).thenReturn(Arrays.asList(group1, group2));
-
-        ToscaConceptIdentifier type2 = new ToscaConceptIdentifier("my other type", "8.8.8");
-
-        // note: no mapping for policy4
-        when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(makePolicy(policy1, type),
-                        makePolicy(policy2, type2), makePolicy(policy3, type)));
-
-        // load it
-        notifier = new MyNotifier(publisher);
-
-        ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-
-        // should have added policy1, policy2, policy1 (duplicate), policy3, but not
-        // policy4
-        verify(deploy, times(4)).addData(captor.capture());
-
-        Iterator<PolicyPdpNotificationData> iter = captor.getAllValues().iterator();
-        PolicyPdpNotificationData data = iter.next();
-        assertEquals(policy1, data.getPolicyId());
-        assertEquals(type, data.getPolicyType());
-        assertEquals("[sub #1 A 0, sub #1 A 1]", data.getPdps().toString());
-
-        data = iter.next();
-        assertEquals(policy2, data.getPolicyId());
-        assertEquals(type2, data.getPolicyType());
-        assertEquals("[sub #1 B 0]", data.getPdps().toString());
-
-        data = iter.next();
-        assertEquals(policy1, data.getPolicyId());
-        assertEquals(type, data.getPolicyType());
-        assertEquals("[sub #2 A 0]", data.getPdps().toString());
-
-        data = iter.next();
-        assertEquals(policy3, data.getPolicyId());
-        assertEquals(type, data.getPolicyType());
-        assertEquals("[sub #2 A 0]", data.getPdps().toString());
-    }
-
-    private ToscaPolicy makePolicy(ToscaConceptIdentifier policyId, ToscaConceptIdentifier type) {
-        ToscaPolicy policy = new ToscaPolicy();
-
-        policy.setName(policyId.getName());
-        policy.setVersion(policyId.getVersion());
-        policy.setType(type.getName());
-        policy.setTypeVersion(type.getVersion());
-
-        return policy;
-    }
-
-    private PdpGroup makeGroup(String name, PdpSubGroup... subgrps) {
-        final PdpGroup group = new PdpGroup();
-        group.setName(name);
-
-        group.setPdpSubgroups(Arrays.asList(subgrps));
-
-        return group;
-    }
-
-    private PdpSubGroup makeSubGroup(String name, int numPdps, ToscaConceptIdentifier... policies) {
-        final PdpSubGroup subgrp = new PdpSubGroup();
-        subgrp.setPdpType(name);
-        subgrp.setPdpInstances(new ArrayList<>(numPdps));
-
-        for (int x = 0; x < numPdps; ++x) {
-            Pdp pdp = new Pdp();
-            pdp.setInstanceId(name + " " + x);
-
-            subgrp.getPdpInstances().add(pdp);
-        }
-
-        subgrp.setPolicies(Arrays.asList(policies));
-
-        return subgrp;
-    }
-
-    @Test
-    public void testGetStatus() {
-        List<PolicyStatus> statusList = Arrays.asList(status1);
-        when(deploy.getStatus()).thenReturn(statusList);
-
-        assertSame(statusList, notifier.getStatus());
-    }
-
-    @Test
-    public void testGetStatusString() {
-        List<PolicyStatus> statusList = Arrays.asList(status1);
-        when(deploy.getStatus("a policy")).thenReturn(statusList);
-
-        assertSame(statusList, notifier.getStatus("a policy"));
-    }
-
-    @Test
-    public void testGetStatusToscaConceptIdentifier() {
-        Optional<PolicyStatus> status = Optional.of(status1);
-        when(deploy.getStatus(policy1)).thenReturn(status);
-
-        assertSame(status, notifier.getStatus(policy1));
-    }
-
-    @Test
-    public void testAddDeploymentData() {
-        PolicyPdpNotificationData data = makeData(policy1, PDP1, PDP2);
-        notifier.addDeploymentData(data);
-
-        verify(deploy).addData(data);
-        verify(undeploy).removeData(eq(data));
-    }
-
-    @Test
-    public void testAddUndeploymentData() {
-        PolicyPdpNotificationData data = makeData(policy1, PDP1, PDP2);
-        notifier.addUndeploymentData(data);
-
-        verify(undeploy).addData(data);
-        verify(deploy).removeData(eq(data));
-    }
+    public void testProcessResponseString() throws PfModelException {
+        Set<ToscaConceptIdentifier> expected = Set.of(policy1);
+        Set<ToscaConceptIdentifier> actual = Set.of(policy2);
+
+        // add a status to the notification when tracker.flush(notif) is called
+        doAnswer(invocation -> {
+            PolicyNotification notif = invocation.getArgument(0);
+            notif.getAdded().add(new PolicyStatus());
+            return null;
+        }).when(tracker).flush(any());
 
-    @Test
-    public void testProcessResponseString() {
-        doAnswer(addStatus(2, status1, status2)).when(deploy).processResponse(eq(PDP1), any(), any());
-        doAnswer(addStatus(2, status3, status4)).when(undeploy).processResponse(eq(PDP1), any(), any());
+        notifier.processResponse(PDP1, GROUP_A, expected, actual);
 
-        List<ToscaConceptIdentifier> activePolicies = Arrays.asList(policy1, policy2);
-        notifier.processResponse(PDP1, activePolicies);
+        verify(tracker).loadByGroup(GROUP_A);
+        verify(tracker).completeDeploy(PDP1, expected, actual);
+        verify(tracker).flush(any());
 
-        PolicyNotification notification = getNotification();
-        assertEquals(Arrays.asList(status1, status2), notification.getAdded());
-        assertEquals(Arrays.asList(status3, status4), notification.getDeleted());
+        verify(publisher).enqueue(any());
     }
 
     @Test
-    public void testRemovePdp() {
-        doAnswer(addStatus(1, status1, status2)).when(deploy).removePdp(eq(PDP1), any());
-        doAnswer(addStatus(1, status3, status4)).when(undeploy).removePdp(eq(PDP1), any());
-
-        notifier.removePdp(PDP1);
+    public void testProcessResponseString_Ex() throws PfModelException {
+        doThrow(new PfModelException(Status.BAD_REQUEST, "expected exception")).when(tracker).loadByGroup(anyString());
 
-        PolicyNotification notification = getNotification();
-        assertEquals(Arrays.asList(status1, status2), notification.getAdded());
-        assertEquals(Arrays.asList(status3, status4), notification.getDeleted());
+        assertThatCode(() -> notifier.processResponse(PDP1, GROUP_A, Set.of(), Set.of())).doesNotThrowAnyException();
     }
 
     /**
@@ -269,8 +135,7 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
      */
     @Test
     public void testPublishEmpty() {
-        notifier.removePdp(PDP1);
-
+        notifier.publish(new PolicyNotification());
         verify(publisher, never()).enqueue(any());
     }
 
@@ -279,45 +144,20 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
      */
     @Test
     public void testPublishNotEmpty() {
-        doAnswer(addStatus(1, status1, status2)).when(deploy).removePdp(eq(PDP1), any());
+        PolicyNotification notif = new PolicyNotification();
+        notif.getAdded().add(new PolicyStatus());
 
-        notifier.removePdp(PDP1);
+        notifier.publish(notif);
 
         verify(publisher).enqueue(any());
     }
 
     @Test
-    public void testMakeDeploymentTracker_testMakeUndeploymentTracker() throws PfModelException {
+    public void testMakeDeploymentTracker() throws PfModelException {
         // make real object, which will invoke the real makeXxx() methods
-        new PolicyNotifier(publisher, daoFactory).removePdp(PDP1);
+        new PolicyNotifier(publisher, daoFactory).processResponse(PDP1, GROUP_A, Set.of(), Set.of());
 
-        verify(publisher, never()).enqueue(any());
-    }
-
-    /**
-     * Creates an answer that adds status updates to a status list.
-     *
-     * @param listIndex index of the status list within the argument list
-     * @param status status updates to be added
-     * @return an answer that adds the given status updates
-     */
-    private Answer<Void> addStatus(int listIndex, PolicyStatus... status) {
-        return invocation -> {
-            @SuppressWarnings("unchecked")
-            List<PolicyStatus> statusList = invocation.getArgument(listIndex, List.class);
-            statusList.addAll(Arrays.asList(status));
-            return null;
-        };
-    }
-
-    /**
-     * Gets the notification that was published.
-     *
-     * @return the notification that was published
-     */
-    private PolicyNotification getNotification() {
-        verify(publisher).enqueue(notifyCaptor.capture());
-        return notifyCaptor.getValue().get();
+        verify(dao).getGroupPolicyStatus(GROUP_A);
     }
 
 
@@ -328,13 +168,8 @@ public class PolicyNotifierTest extends PolicyCommonSupport {
         }
 
         @Override
-        protected PolicyDeployTracker makeDeploymentTracker() {
-            return deploy;
-        }
-
-        @Override
-        protected PolicyUndeployTracker makeUndeploymentTracker() {
-            return undeploy;
+        protected DeploymentStatus makeDeploymentTracker(PolicyModelsProvider dao) {
+            return tracker;
         }
     }
 }
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationDataTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyPdpNotificationDataTest.java
deleted file mode 100644 (file)
index 67a3cb1..0000000
+++ /dev/null
@@ -1,121 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.TreeSet;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-/**
- * Note: this wraps the PDPs in a TreeSet so that the content can be verified without
- * worrying about order.
- */
-public class PolicyPdpNotificationDataTest {
-    private static final String PDP1 = "pdp-1";
-    private static final String PDP2 = "pdp-2";
-    private static final String PDP3 = "pdp-3";
-    private static final String PDP4 = "pdp-4";
-
-    private ToscaConceptIdentifier policyId;
-    private ToscaConceptIdentifier policyType;
-    private PolicyPdpNotificationData data;
-
-    /**
-     * Creates various objects, including {@link #data}.
-     */
-    @Before
-    public void setUp() {
-        policyId = new ToscaConceptIdentifier("my-id", "1.2.3");
-        policyType = new ToscaConceptIdentifier("my-type", "3.2.1");
-
-        data = new PolicyPdpNotificationData(policyId, policyType);
-    }
-
-    @Test
-    public void testPolicyPdpNotificationData() {
-        assertSame(policyId, data.getPolicyId());
-        assertSame(policyType, data.getPolicyType());
-        assertTrue(data.getPdps().isEmpty());
-    }
-
-    @Test
-    public void testIsEmpty() {
-        assertTrue(data.isEmpty());
-
-        data.add(PDP1);
-        assertFalse(data.isEmpty());
-
-        data.add(PDP2);
-        data.add(PDP3);
-        assertFalse(data.isEmpty());
-
-        data.removeAll(Arrays.asList(PDP1, PDP3));
-        assertFalse(data.isEmpty());
-
-        data.removeAll(Arrays.asList(PDP2));
-        assertTrue(data.isEmpty());
-    }
-
-    @Test
-    public void testAdd() {
-        data.add(PDP1);
-        assertEquals("[pdp-1]", new TreeSet<>(data.getPdps()).toString());
-
-        data.add(PDP3);
-        assertEquals("[pdp-1, pdp-3]", new TreeSet<>(data.getPdps()).toString());
-    }
-
-    @Test
-    public void testAddAll() {
-        // verify we can add an empty list
-        data.addAll(Collections.emptyList());
-        assertTrue(data.getPdps().isEmpty());
-
-        // try a non-empty list
-        data.addAll(Arrays.asList(PDP1, PDP3));
-        assertEquals("[pdp-1, pdp-3]", new TreeSet<>(data.getPdps()).toString());
-    }
-
-    @Test
-    public void testRemoveAll() {
-        // verify we can remove an empty list
-        data.removeAll(Collections.emptyList());
-        assertTrue(data.getPdps().isEmpty());
-
-        // now test with non-empty lists
-        data.addAll(Arrays.asList(PDP1, PDP2, PDP3, PDP4));
-
-        data.removeAll(Arrays.asList(PDP1, PDP3));
-        assertEquals("[pdp-2, pdp-4]", new TreeSet<>(data.getPdps()).toString());
-
-        data.removeAll(Arrays.asList(PDP2, PDP4));
-        assertEquals("[]", new TreeSet<>(data.getPdps()).toString());
-    }
-}
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyTrackerDataTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyTrackerDataTest.java
deleted file mode 100644 (file)
index 2d27b75..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * Modifications Copyright (C) 2021 Nordix Foundation.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
-
-public class PolicyTrackerDataTest {
-
-    private static final ToscaConceptIdentifier TYPE = new ToscaConceptIdentifier("my-type", "1.2.3");
-    private static final String PDP1 = "pdp-1";
-    private static final String PDP2 = "pdp-2";
-    private static final String PDP3 = "pdp-3";
-    private static final String PDP4 = "pdp-4";
-    private static final String PDP5 = "pdp-5";
-    private static final String PDP6 = "pdp-6";
-
-    private Collection<String> fullSet;
-    private PolicyTrackerData data;
-
-    @Before
-    public void setUp() {
-        fullSet = Arrays.asList(PDP1, PDP2, PDP3, PDP4, PDP5, PDP6);
-        data = new PolicyTrackerData(TYPE);
-    }
-
-    @Test
-    public void testPolicyTrackerData_testGetPolicyType() {
-        assertSame(TYPE, data.getPolicyType());
-    }
-
-    @Test
-    public void testIsComplete() {
-        assertTrue(data.isComplete());
-
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        assertFalse(data.isComplete());
-
-        data.success(PDP1);
-        assertFalse(data.isComplete());
-
-        data.fail(PDP2);
-        assertTrue(data.isComplete());
-    }
-
-    @Test
-    public void testAllSucceeded() {
-        assertTrue(data.allSucceeded());
-
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        assertFalse(data.allSucceeded());
-
-        data.success(PDP1);
-        assertFalse(data.allSucceeded());
-
-        data.fail(PDP2);
-        assertFalse(data.allSucceeded());
-
-        data.success(PDP2);
-        assertTrue(data.allSucceeded());
-
-        data.fail(PDP2);
-        assertFalse(data.allSucceeded());
-
-        data.success(PDP2);
-        assertTrue(data.allSucceeded());
-    }
-
-    @Test
-    public void testIsEmpty() {
-        assertTrue(data.isEmpty());
-
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        assertFalse(data.isEmpty());
-
-        data.success(PDP1);
-        assertFalse(data.isEmpty());
-
-        data.fail(PDP2);
-        assertFalse(data.isEmpty());
-
-        data.removePdp(PDP1);
-        assertFalse(data.isEmpty());
-
-        data.removePdp(PDP2);
-        assertTrue(data.isEmpty());
-    }
-
-    @Test
-    public void testPutValuesInto() {
-        data.addPdps(fullSet);
-        data.success(PDP1);
-        data.fail(PDP2);
-        data.fail(PDP3);
-
-        PolicyStatus status = new PolicyStatus();
-        data.putValuesInto(status);
-
-        assertEquals(1, status.getSuccessCount());
-        assertEquals(2, status.getFailureCount());
-        assertEquals(3, status.getIncompleteCount());
-    }
-
-    @Test
-    public void testAddPdps_testSuccess_testFail() {
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3, PDP4));
-        assertEquals("[0, 0, 4]", getCounts().toString());
-
-        data.success(PDP1);
-        assertEquals("[1, 0, 3]", getCounts().toString());
-
-        data.success(PDP2);
-        assertEquals("[2, 0, 2]", getCounts().toString());
-
-        // repeat
-        data.success(PDP2);
-        assertEquals("[2, 0, 2]", getCounts().toString());
-
-        data.fail(PDP3);
-        assertEquals("[2, 1, 1]", getCounts().toString());
-
-        // repeat
-        data.fail(PDP3);
-        assertEquals("[2, 1, 1]", getCounts().toString());
-
-        data.addPdps(Arrays.asList(PDP2, PDP3, PDP4, PDP5));
-
-        // PDP1 is still success
-        assertEquals("[1, 0, 4]", getCounts().toString());
-    }
-
-    @Test
-    public void testRemovePdps() {
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3, PDP4, PDP5, PDP6));
-        data.success(PDP1);
-        data.success(PDP2);
-        data.fail(PDP3);
-        data.fail(PDP4);
-        assertFalse(data.removePdps(Arrays.asList(PDP1, PDP3, PDP5)));
-        assertEquals("[1, 1, 1]", getCounts().toString());
-
-        assertTrue(data.removePdps(Arrays.asList(PDP6)));
-        assertEquals("[1, 1, 0]", getCounts().toString());
-    }
-
-    /**
-     * Tests removePdps(), where nothing is removed from the "incomplete" set.
-     */
-    @Test
-    public void testRemovePdpsNoIncompleteRemove() {
-        assertFalse(data.removePdps(Arrays.asList(PDP1, PDP2)));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-    }
-
-    /**
-     * Tests removePdps(), where remaining incomplete items are removed.
-     */
-    @Test
-    public void testRemovePdpsAllComplete() {
-        data.addPdps(Arrays.asList(PDP1));
-        assertTrue(data.removePdps(Arrays.asList(PDP1)));
-
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3));
-        assertFalse(data.removePdps(Arrays.asList(PDP1)));
-        assertTrue(data.removePdps(Arrays.asList(PDP2, PDP3)));
-    }
-
-    /**
-     * Tests removePdps() with more variations.
-     */
-    @Test
-    public void testRemovePdpsVariations() {
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3));
-        data.success(PDP1);
-        data.fail(PDP2);
-        assertEquals("[1, 1, 1]", getCounts().toString());
-
-        // remove PDP1, which checks removal from "success" set, while incomplete
-        assertFalse(data.removePdps(Arrays.asList(PDP1)));
-        assertEquals("[0, 1, 1]", getCounts().toString());
-
-        // remove PDP2, which checks removal from "failure" set, while incomplete
-        assertFalse(data.removePdps(Arrays.asList(PDP2)));
-        assertEquals("[0, 0, 1]", getCounts().toString());
-
-        // re-add 1 & 2
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        data.success(PDP1);
-        data.fail(PDP2);
-        assertEquals("[1, 1, 1]", getCounts().toString());
-
-        // remove PDP3, which checks removal from "incomplete" set
-        assertTrue(data.removePdps(Arrays.asList(PDP3)));
-        assertEquals("[1, 1, 0]", getCounts().toString());
-
-        // remove PDP1, which checks removal from "success" set, while complete
-        assertTrue(data.removePdps(Arrays.asList(PDP1)));
-        assertEquals("[0, 1, 0]", getCounts().toString());
-
-        // remove PDP2, which checks removal from "failure" set, while complete
-        assertTrue(data.removePdps(Arrays.asList(PDP2)));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-
-        // re-add 1 and then remove it again
-        data.addPdps(Arrays.asList(PDP1));
-        assertTrue(data.removePdps(Arrays.asList(PDP1)));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-    }
-
-    @Test
-    public void testRemovePdp() {
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3, PDP4, PDP5, PDP6));
-        data.success(PDP1);
-        data.success(PDP2);
-        data.fail(PDP3);
-        data.fail(PDP4);
-
-        assertFalse(data.removePdp(PDP1));
-        assertEquals("[1, 2, 2]", getCounts().toString());
-
-        assertFalse(data.removePdp(PDP2));
-        assertEquals("[0, 2, 2]", getCounts().toString());
-
-        assertFalse(data.removePdp(PDP3));
-        assertEquals("[0, 1, 2]", getCounts().toString());
-
-        assertFalse(data.removePdp(PDP4));
-        assertEquals("[0, 0, 2]", getCounts().toString());
-
-        assertFalse(data.removePdp(PDP5));
-        assertEquals("[0, 0, 1]", getCounts().toString());
-
-        assertTrue(data.removePdp(PDP6));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-    }
-
-    /**
-     * Tests removePdps(), where nothing is removed from the "incomplete" set.
-     */
-    @Test
-    public void testRemovePdpNoIncompleteRemove() {
-        assertFalse(data.removePdp(PDP1));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-    }
-
-    /**
-     * Tests removePdps(), where remaining incomplete items are removed.
-     */
-    @Test
-    public void testRemovePdpAllComplete() {
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        assertFalse(data.removePdp(PDP1));
-
-        assertTrue(data.removePdp(PDP2));
-    }
-
-    /**
-     * Tests removePdp() with more variations.
-     */
-    @Test
-    public void testRemovePdpVariations() {
-        data.addPdps(Arrays.asList(PDP1, PDP2, PDP3));
-        data.success(PDP1);
-        data.fail(PDP2);
-        assertEquals("[1, 1, 1]", getCounts().toString());
-
-        // remove PDP1, which checks removal from "success" set, while incomplete
-        assertFalse(data.removePdp(PDP1));
-        assertEquals("[0, 1, 1]", getCounts().toString());
-
-        // remove PDP2, which checks removal from "failure" set, while incomplete
-        assertFalse(data.removePdp(PDP2));
-        assertEquals("[0, 0, 1]", getCounts().toString());
-
-        // re-add 1 & 2
-        data.addPdps(Arrays.asList(PDP1, PDP2));
-        data.success(PDP1);
-        data.fail(PDP2);
-        assertEquals("[1, 1, 1]", getCounts().toString());
-
-        // remove PDP3, which checks removal from "incomplete" set
-        assertTrue(data.removePdp(PDP3));
-        assertEquals("[1, 1, 0]", getCounts().toString());
-
-        // remove PDP1, which checks removal from "success" set, while complete
-        assertTrue(data.removePdp(PDP1));
-        assertEquals("[0, 1, 0]", getCounts().toString());
-
-        // remove PDP2, which checks removal from "failure" set, while complete
-        assertTrue(data.removePdp(PDP2));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-
-        // re-add 1 and then remove it again
-        data.addPdps(Arrays.asList(PDP1));
-        assertTrue(data.removePdp(PDP1));
-        assertEquals("[0, 0, 0]", getCounts().toString());
-    }
-
-    @Test
-    public void testComplete() {
-        // attempt to remove a PDP that isn't in the data
-        assertFalse(data.success(PDP1));
-
-        // remove one that was incomplete
-        data.addPdps(Arrays.asList(PDP1));
-        assertTrue(data.success(PDP1));
-
-        // move from one set to the other
-        assertTrue(data.fail(PDP1));
-
-        // already in the correct set
-        assertFalse(data.fail(PDP1));
-    }
-
-    private List<Integer> getCounts() {
-        PolicyStatus status = new PolicyStatus();
-        data.putValuesInto(status);
-
-        return Arrays.asList(status.getSuccessCount(), status.getFailureCount(), status.getIncompleteCount());
-    }
-}
diff --git a/main/src/test/java/org/onap/policy/pap/main/notification/PolicyUndeployTrackerTest.java b/main/src/test/java/org/onap/policy/pap/main/notification/PolicyUndeployTrackerTest.java
deleted file mode 100644 (file)
index 7d3f54f..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP PAP
- * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-
-package org.onap.policy.pap.main.notification;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.onap.policy.models.pap.concepts.PolicyStatus;
-
-public class PolicyUndeployTrackerTest extends PolicyCommonSupport {
-
-    @Mock
-    private PolicyTrackerData data;
-
-    private PolicyUndeployTracker tracker;
-
-    /**
-     * Creates various objects, including {@link #tracker}.
-     */
-    @Before
-    public void setUp() {
-        MockitoAnnotations.initMocks(this);
-
-        super.setUp();
-
-        tracker = new PolicyUndeployTracker();
-    }
-
-    /**
-     * Simple test with one PDP that immediately responds with success.
-     */
-    @Test
-    public void testSimpleImmediateSuccess() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // indicate that PDP1 has succeeded (i.e., undeployed)
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has succeeded again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate failure (i.e., still deployed) - no output, because no longer tracked
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate that PDP1 has failed again - still no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate that PDP1 has succeeded again - still no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-    }
-
-    /**
-     * Simple test with one PDP that immediately responds with success.
-     */
-    @Test
-    public void testSimpleImmediateFail() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // indicate that PDP1 has failed (i.e., still deployed)
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[0, 1, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has failed again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate success (i.e., undeployed)
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // indicate that PDP1 has succeeded again - should be no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-
-        // indicate that PDP1 has failed again - still no output
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-    }
-
-    /**
-     * Simple test where PDP is removed and then it responds.
-     */
-    @Test
-    public void testSimpleRemove() {
-        tracker.addData(makeData(policy1, PDP1));
-
-        // remove the PDP
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.removePdp(PDP1, statusList);
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[0, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        /*
-         * indicate that PDP1 has succeeded (i.e., undeployed) - should be no message
-         * since PDP was removed from the policy
-         */
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(0, statusList.size());
-
-        /*
-         * indicate that PDP1 has failed (i.e., still deployed) - should be no message
-         * since PDP was removed from the policy
-         */
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertEquals(0, statusList.size());
-    }
-
-    /**
-     * Test with multiple PDPs.
-     */
-    @Test
-    public void testMulti() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has been undeployed
-        tracker.processResponse(PDP2, Collections.emptyList(), new ArrayList<>(0));
-
-        // indicate that PDP1 has been undeployed
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Collections.emptyList(), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[2, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        /*
-         * indicate that PDP1 has been re-deployed - should not get a notification,
-         * because policy is gone
-         */
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-        assertTrue(statusList.isEmpty());
-    }
-
-    /**
-     * Test with multiple PDPs, and one is removed while it is in a failure state.
-     */
-    @Test
-    public void testMultiRemove() {
-        tracker.addData(makeData(policy1, PDP1, PDP2));
-
-        // indicate that PDP2 has been undeployed
-        tracker.processResponse(PDP2, Collections.emptyList(), new ArrayList<>(0));
-
-        // indicate that PDP1 has failed (i.e., still deployed)
-        List<PolicyStatus> statusList = new ArrayList<>();
-        tracker.processResponse(PDP1, Arrays.asList(policy1), statusList);
-
-        assertEquals(1, statusList.size());
-        assertEquals(policy1, statusList.get(0).getPolicy());
-        assertEquals(type, statusList.get(0).getPolicyType());
-        assertEquals("[1, 1, 0]", getCounts(statusList.get(0)).toString());
-
-        // remove PDP1 - expect message AND policy should be removed
-        statusList.clear();
-        tracker.removePdp(PDP1, statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-
-        // re-add PDP1
-        tracker.addData(makeData(policy1, PDP1));
-
-        // indicate that PDP1 has succeeded; policy is now new, so doesn't include PDP2
-        statusList.clear();
-        tracker.processResponse(PDP1, Arrays.asList(), statusList);
-        assertEquals(1, statusList.size());
-        assertEquals("[1, 0, 0]", getCounts(statusList.get(0)).toString());
-    }
-
-    @Test
-    public void testUpdateData() {
-        // when success returns false
-        assertFalse(tracker.updateData(PDP1, data, false));
-        verify(data).success(PDP1);
-        verify(data, never()).fail(any());
-
-        // when inactive
-        assertFalse(tracker.updateData(PDP1, data, true));
-        verify(data).success(PDP1);
-        verify(data).fail(any());
-
-        // when success & fail return true
-        when(data.success(PDP1)).thenReturn(true);
-        when(data.fail(PDP1)).thenReturn(true);
-        assertTrue(tracker.updateData(PDP1, data, false));
-        verify(data, times(2)).success(PDP1);
-        verify(data, times(1)).fail(PDP1);
-
-        // when inactive
-        assertTrue(tracker.updateData(PDP1, data, true));
-        verify(data, times(2)).success(PDP1);
-        verify(data, times(2)).fail(PDP1);
-    }
-
-    @Test
-    public void testShouldRemove() {
-        // when data is not complete
-        assertFalse(tracker.shouldRemove(data));
-
-        // when data has succeeded
-        when(data.allSucceeded()).thenReturn(true);
-        assertTrue(tracker.shouldRemove(data));
-    }
-}
index a0fa196..4241b41 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -20,6 +20,7 @@
 
 package org.onap.policy.pap.main.rest;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.mock;
@@ -42,6 +43,7 @@ import org.onap.policy.common.utils.coder.CoderException;
 import org.onap.policy.common.utils.coder.StandardCoder;
 import org.onap.policy.common.utils.resources.ResourceUtils;
 import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
@@ -266,6 +268,15 @@ public class ProviderSuper {
         }
     }
 
+    /**
+     * Verifies that an empty notification was published.
+     */
+    protected void checkEmptyNotification() {
+        ArgumentCaptor<PolicyNotification> captor = ArgumentCaptor.forClass(PolicyNotification.class);
+        verify(notifier).publish(captor.capture());
+        assertThat(captor.getValue().isEmpty()).isTrue();
+    }
+
     /**
      * Wraps a list of policies. The decoder doesn't work with generic lists, so we wrap
      * the list and decode it into the wrapper before extracting the list contents.
index a753db1..6453453 100644 (file)
@@ -3,6 +3,7 @@
  * ONAP PAP
  * ================================================================================
  * Copyright (C) 2019-2021 Nordix Foundation.
+ * Modifications Copyright (C) 2021 AT&T Intellectual Property.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -284,7 +285,7 @@ public class TestPdpGroupCreateOrUpdateProvider extends ProviderSuper {
         assertEquals(newgrp.toString(), dbgroup.toString());
 
         // no deployment notifications
-        verify(notifier, never()).addDeploymentData(any());
+        checkEmptyNotification();
 
         // this requires a PDP UPDATE message
         List<PdpUpdate> pdpUpdates = getUpdateRequests(2);
@@ -519,8 +520,7 @@ public class TestPdpGroupCreateOrUpdateProvider extends ProviderSuper {
         assertEquals(newgrp.toString(), group.toString());
 
         // no notifications
-        verify(notifier, never()).addDeploymentData(any());
-        verify(notifier, never()).addUndeploymentData(any());
+        checkEmptyNotification();
 
         // no group updates
         assertNoGroupAction();
index 99aa354..fc71c62 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2020-2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -242,7 +242,7 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
         assertEquals(origSize - 1, subgroup.getPolicies().size());
         assertFalse(subgroup.getPolicies().contains(ident));
 
-        verify(session).trackUndeploy(eq(ident), pdpCaptor.capture());
+        verify(session).trackUndeploy(eq(ident), pdpCaptor.capture(), eq(group.getName()), eq(subgroup.getPdpType()));
         assertEquals("[pdpA]", pdpCaptor.getValue().toString());
     }
 
index b676300..a7f48ff 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +27,6 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -35,13 +34,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.TreeSet;
 import java.util.stream.Collectors;
 import javax.ws.rs.core.Response.Status;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
@@ -56,7 +53,6 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.concepts.PdpUpdate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
-import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
 
 public class TestPdpGroupDeployProvider extends ProviderSuper {
     private static final String EXPECTED_EXCEPTION = "expected exception";
@@ -164,7 +160,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
     }
 
     /**
-     * Tests updateGroupPolicies when policies are being added and deleted in the same subgroup.
+     * Tests updateGroupPolicies when policies are being added and deleted in the same
+     * subgroup.
      */
     @Test
     public void testUpdateGroupPoliciesAddAndDelete() throws Exception {
@@ -353,14 +350,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         assertEquals(newgrp.toString(), group.toString());
 
-        // should have notified of added policy/PDPs
-        ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-        verify(notifier, times(2)).addDeploymentData(captor.capture());
-        assertDeploymentData(captor.getAllValues().get(0), policyId2, "[pdpA]");
-        assertDeploymentData(captor.getAllValues().get(1), policyId3, "[pdpA]");
-
-        // should NOT have notified of any deleted policy/PDPs
-        verify(notifier, never()).addUndeploymentData(any());
+        // nothing is complete - notification should be empty
+        checkEmptyNotification();
 
         // this requires a PDP UPDATE message
         assertGroupUpdate(newgrp, subgrp);
@@ -426,8 +417,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         assertEquals(newgrp.toString(), group.toString());
 
         // no notifications
-        verify(notifier, never()).addDeploymentData(any());
-        verify(notifier, never()).addUndeploymentData(any());
+        checkEmptyNotification();
 
         // no group updates
         assertNoGroupAction();
@@ -472,8 +462,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"));
 
-        assertThatThrownBy(() -> prov.updateGroupPolicies(groups))
-                        .isInstanceOf(PfModelException.class)
+        assertThatThrownBy(() -> prov.updateGroupPolicies(groups)).isInstanceOf(PfModelException.class)
                         .hasMessageContaining(newgrp.getPdpSubgroups().get(0).getPolicies().get(0).getName())
                         .hasMessageContaining("not a supported policy for the subgroup");
 
@@ -511,13 +500,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         List<PdpUpdate> requests = getUpdateRequests(1);
         assertUpdate(requests, GROUP1_NAME, PDP2_TYPE, PDP2);
 
-        // should have notified of added policy/PDPs
-        ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-        verify(notifier).addDeploymentData(captor.capture());
-        assertDeploymentData(captor.getValue(), policy1.getIdentifier(), "[pdpB]");
-
-        // no undeployment notifications
-        verify(notifier, never()).addUndeploymentData(any());
+        // nothing is complete - notification should be empty
+        checkEmptyNotification();
     }
 
     @Test
@@ -581,13 +565,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         assertUpdate(requests, GROUP1_NAME, PDP2_TYPE, PDP2);
         assertUpdate(requests, GROUP1_NAME, PDP4_TYPE, PDP4);
 
-        // should have notified of added policy/PDPs
-        ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-        verify(notifier).addDeploymentData(captor.capture());
-        assertDeploymentData(captor.getValue(), policy1.getIdentifier(), "[pdpB, pdpD]");
-
-        // no undeployment notifications
-        verify(notifier, never()).addUndeploymentData(any());
+        // nothing is complete - notification should be empty
+        checkEmptyNotification();
     }
 
     @Test
@@ -661,13 +640,6 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         assertEquals(Arrays.asList(group), updates);
     }
 
-    private void assertDeploymentData(PolicyPdpNotificationData data, ToscaConceptIdentifier policyId,
-                    String expectedPdps) {
-        assertEquals(policyId, data.getPolicyId());
-        assertEquals(policy1.getTypeIdentifier(), data.getPolicyType());
-        assertEquals(expectedPdps, new TreeSet<>(data.getPdps()).toString());
-    }
-
     /**
      * Loads a standard request.
      *
diff --git a/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyStatusProvider.java b/main/src/test/java/org/onap/policy/pap/main/rest/TestPolicyStatusProvider.java
new file mode 100644 (file)
index 0000000..44c8d82
--- /dev/null
@@ -0,0 +1,152 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2021 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.pap.main.rest;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import lombok.NonNull;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.Test;
+import org.onap.policy.common.utils.services.Registry;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.PdpPolicyStatusBuilder;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus.State;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
+import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
+
+public class TestPolicyStatusProvider extends ProviderSuper {
+    private static final String MY_GROUP = "MyGroup";
+    private static final String MY_PDP_TYPE = "MySubGroup";
+    private static final @NonNull String VERSION = "1.2.3";
+    private static final String PDP_A = "pdpA";
+    private static final String PDP_B = "pdpB";
+    private static final String PDP_C = "pdpC";
+    private static final ToscaConceptIdentifier POLICY_TYPE = new ToscaConceptIdentifier("MyPolicyType", VERSION);
+    private static final ToscaConceptIdentifier POLICY_A = new ToscaConceptIdentifier("MyPolicyA", VERSION);
+    private static final ToscaConceptIdentifier POLICY_B = new ToscaConceptIdentifier("MyPolicyB", VERSION);
+    private static final ToscaConceptIdentifier POLICY_C = new ToscaConceptIdentifier("MyPolicyC", VERSION);
+
+    private PolicyStatusProvider prov;
+
+
+    @AfterClass
+    public static void tearDownAfterClass() {
+        Registry.newRegistry();
+    }
+
+    /**
+     * Configures mocks and objects.
+     *
+     * @throws Exception if an error occurs
+     */
+    @Override
+    @Before
+    public void setUp() throws Exception {
+
+        super.setUp();
+
+        prov = new PolicyStatusProvider();
+    }
+
+    @Test
+    public void testGetStatus_testAccumulate() throws PfModelException {
+
+        PdpPolicyStatusBuilder builder = PdpPolicyStatus.builder().pdpGroup(MY_GROUP).pdpType(MY_PDP_TYPE)
+                        .policyType(POLICY_TYPE).state(State.WAITING);
+
+        PdpPolicyStatus notDeployed = builder.deploy(false).policy(POLICY_B).pdpId(PDP_A).build();
+
+        // remaining policies are deployed
+        builder.deploy(true);
+
+        // @formatter:off
+        when(dao.getAllPolicyStatus()).thenReturn(List.of(
+                        builder.policy(POLICY_A).pdpId(PDP_A).build(),
+                        builder.policy(POLICY_A).pdpId(PDP_B).build(),
+                        notDeployed,
+                        builder.policy(POLICY_C).pdpId(PDP_A).build()
+                        ));
+        // @formatter:on
+
+        List<PolicyStatus> result = new ArrayList<>(prov.getStatus());
+        Collections.sort(result, (rec1, rec2) -> rec1.getPolicy().compareTo(rec2.getPolicy()));
+
+        assertThat(result).hasSize(2);
+
+        Iterator<PolicyStatus> iter = result.iterator();
+
+        PolicyStatus status = iter.next();
+        assertThat(status.getPolicy()).isEqualTo(POLICY_A);
+        assertThat(status.getPolicyType()).isEqualTo(POLICY_TYPE);
+        assertThat(status.getIncompleteCount()).isEqualTo(2);
+        assertThat(status.getFailureCount()).isZero();
+        assertThat(status.getSuccessCount()).isZero();
+
+        status = iter.next();
+        assertThat(status.getPolicy()).isEqualTo(POLICY_C);
+        assertThat(status.getPolicyType()).isEqualTo(POLICY_TYPE);
+        assertThat(status.getIncompleteCount()).isEqualTo(1);
+        assertThat(status.getFailureCount()).isZero();
+        assertThat(status.getSuccessCount()).isZero();
+    }
+
+    @Test
+    public void testGetStatusToscaConceptIdentifierOptVersion() throws PfModelException {
+
+        PdpPolicyStatusBuilder builder = PdpPolicyStatus.builder().pdpGroup(MY_GROUP).pdpType(MY_PDP_TYPE)
+                        .policy(POLICY_A).policyType(POLICY_TYPE);
+
+        PdpPolicyStatus notDeployed = builder.deploy(false).pdpId(PDP_B).state(State.FAILURE).build();
+
+        // remaining policies are deployed
+        builder.deploy(true).state(State.WAITING);
+
+        ToscaConceptIdentifierOptVersion optIdent = new ToscaConceptIdentifierOptVersion(POLICY_A);
+
+        // @formatter:off
+        when(dao.getAllPolicyStatus(optIdent)).thenReturn(List.of(
+                        builder.policy(POLICY_A).pdpId(PDP_A).build(),
+                        notDeployed,
+                        builder.policy(POLICY_A).pdpId(PDP_C).build()
+                        ));
+        // @formatter:on
+
+        List<PolicyStatus> result = new ArrayList<>(prov.getStatus(optIdent));
+        assertThat(result).hasSize(1);
+
+        Iterator<PolicyStatus> iter = result.iterator();
+
+        PolicyStatus status = iter.next();
+        assertThat(status.getPolicy()).isEqualTo(POLICY_A);
+        assertThat(status.getPolicyType()).isEqualTo(POLICY_TYPE);
+        assertThat(status.getIncompleteCount()).isEqualTo(2);
+        assertThat(status.getFailureCount()).isZero();
+        assertThat(status.getSuccessCount()).isZero();
+    }
+}
index 060173b..b2c67c9 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019-2020 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019-2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -27,7 +27,6 @@ import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -36,12 +35,10 @@ import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Queue;
-import java.util.TreeSet;
 import javax.ws.rs.core.Response.Status;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.Test;
-import org.mockito.ArgumentCaptor;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.base.PfModelRuntimeException;
@@ -52,7 +49,6 @@ import org.onap.policy.models.pdp.concepts.PdpUpdate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
-import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
 import org.powermock.reflect.Whitebox;
 
 public class TestProviderBase extends ProviderSuper {
@@ -110,23 +106,7 @@ public class TestProviderBase extends ProviderSuper {
 
         assertUpdate(getUpdateRequests(1), GROUP1_NAME, PDP1_TYPE, PDP1);
 
-        ArgumentCaptor<PolicyPdpNotificationData> captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-        verify(notifier, times(2)).addDeploymentData(captor.capture());
-        assertNotifier(captor, PDP1, PDP3);
-
-        captor = ArgumentCaptor.forClass(PolicyPdpNotificationData.class);
-        verify(notifier, times(2)).addUndeploymentData(captor.capture());
-        assertNotifier(captor, PDP2, PDP4);
-    }
-
-    private void assertNotifier(ArgumentCaptor<PolicyPdpNotificationData> captor, String firstPdp, String secondPdp) {
-        assertEquals(1, captor.getAllValues().get(0).getPdps().size());
-        assertEquals(1, captor.getAllValues().get(1).getPdps().size());
-
-        // ensure the order by using a TreeSet
-        TreeSet<String> pdps = new TreeSet<>(captor.getAllValues().get(0).getPdps());
-        pdps.addAll(captor.getAllValues().get(1).getPdps());
-        assertEquals("[" + firstPdp + ", " + secondPdp + "]", pdps.toString());
+        checkEmptyNotification();
     }
 
     @Test
@@ -376,15 +356,17 @@ public class TestProviderBase extends ProviderSuper {
 
             return (group, subgroup) -> {
                 if (shouldUpdate.remove()) {
+                    ToscaConceptIdentifier ident1 = policy.getIdentifier();
+
                     // queue indicated that the update should succeed
-                    subgroup.getPolicies().add(policy.getIdentifier());
+                    subgroup.getPolicies().add(ident1);
 
-                    data.trackDeploy(policy.getIdentifier(), Collections.singleton(PDP1));
-                    data.trackUndeploy(policy.getIdentifier(), Collections.singleton(PDP2));
+                    data.trackDeploy(ident1, Collections.singleton(PDP1), GROUP1_NAME, PDP1_TYPE);
+                    data.trackUndeploy(ident1, Collections.singleton(PDP2), GROUP1_NAME, PDP2_TYPE);
 
                     ToscaConceptIdentifier ident2 = new ToscaConceptIdentifier(POLICY1_NAME, "9.9.9");
-                    data.trackDeploy(ident2, Collections.singleton(PDP3));
-                    data.trackUndeploy(ident2, Collections.singleton(PDP4));
+                    data.trackDeploy(ident2, Collections.singleton(PDP3), GROUP1_NAME, PDP3_TYPE);
+                    data.trackUndeploy(ident2, Collections.singleton(PDP4), GROUP1_NAME, PDP4_TYPE);
                     return true;
 
                 } else {
index a2914cf..3fbe478 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2021 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -21,6 +21,7 @@
 
 package org.onap.policy.pap.main.rest;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
 import static org.assertj.core.api.Assertions.assertThatIllegalStateException;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
@@ -30,6 +31,8 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
+import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -42,26 +45,27 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
-import java.util.TreeSet;
-import java.util.function.Supplier;
 import javax.ws.rs.core.Response.Status;
 import org.apache.commons.lang3.tuple.Pair;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.ArgumentCaptor;
 import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.pap.concepts.PolicyNotification;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
 import org.onap.policy.models.pdp.concepts.PdpUpdate;
+import org.onap.policy.models.provider.PolicyModelsProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaConceptIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyFilter;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyType;
-import org.onap.policy.pap.main.notification.PolicyPdpNotificationData;
+import org.onap.policy.pap.main.notification.DeploymentStatus;
 
 public class TestSessionData extends ProviderSuper {
     private static final String GROUP_NAME = "groupA";
+    private static final String PDP_TYPE = "MySubGroup";
     private static final String PDP1 = "pdp_1";
     private static final String PDP2 = "pdp_2";
     private static final String PDP3 = "pdp_3";
@@ -505,7 +509,9 @@ public class TestSessionData extends ProviderSuper {
         session.update(newgrp5);
 
         // push the changes to the DB
-        session.updateDb();
+        PolicyNotification notif = new PolicyNotification();
+        session.updateDb(notif);
+        assertThat(notif.getAdded()).isEmpty();
 
         // expect one create for groups 4 & 5 (group5 replaced by newgrp5)
         List<PdpGroup> creates = getGroupCreates();
@@ -526,7 +532,10 @@ public class TestSessionData extends ProviderSuper {
         when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group1, group2));
         session.getActivePdpGroupsByPolicyType(type);
 
-        session.updateDb();
+        PolicyNotification notif = new PolicyNotification();
+        session.updateDb(notif);
+        assertThat(notif.getAdded()).isEmpty();
+
         verify(dao, never()).createPdpGroups(any());
         verify(dao, never()).updatePdpGroups(any());
     }
@@ -540,38 +549,26 @@ public class TestSessionData extends ProviderSuper {
 
     @Test
     public void testTrackDeploy() throws PfModelException {
-        testTrack(session::getDeployData, session::getUndeployData, session::trackDeploy);
-    }
-
-    /**
-     * Tests trackDeploy() when there is something in the undeployed list.
-     *
-     * @throws PfModelException if an error occurs
-     */
-    @Test
-    public void testTrackDeployRemoveUndeploy() throws PfModelException {
-        testTrack(session::getDeployData, session::getUndeployData, session::trackUndeploy, session::trackDeploy);
+        testTrack(true);
     }
 
     @Test
     public void testTrackUndeploy() throws PfModelException {
-        testTrack(session::getUndeployData, session::getDeployData, session::trackUndeploy);
+        testTrack(false);
     }
 
-    /**
-     * Tests trackUndeploy() when there is something in the deployed list.
-     *
-     * @throws PfModelException if an error occurs
-     */
-    @Test
-    public void testTrackUndeployRemoveUndeploy() throws PfModelException {
-        testTrack(session::getUndeployData, session::getDeployData, session::trackDeploy, session::trackUndeploy);
-    }
-
-    protected void testTrack(Supplier<Collection<PolicyPdpNotificationData>> expected,
-                    Supplier<Collection<PolicyPdpNotificationData>> unexpected, TrackEx... trackFuncs)
+    protected void testTrack(boolean deploy)
                     throws PfModelException {
 
+        DeploymentStatus status = mock(DeploymentStatus.class);
+
+        session = new SessionData(dao) {
+            @Override
+            protected DeploymentStatus makeDeploymentStatus(PolicyModelsProvider dao) {
+                return status;
+            }
+        };
+
         ToscaPolicy policy = makePolicy(POLICY_NAME, POLICY_VERSION);
         policy.setType(POLICY_TYPE);
         policy.setTypeVersion(POLICY_TYPE_VERSION);
@@ -581,25 +578,20 @@ public class TestSessionData extends ProviderSuper {
         ToscaConceptIdentifier policyId = new ToscaConceptIdentifier(POLICY_NAME, POLICY_VERSION);
         List<String> pdps = Arrays.asList(PDP1, PDP2);
 
-        for (TrackEx trackFunc : trackFuncs) {
-            trackFunc.accept(policyId, pdps);
+        if (deploy) {
+            session.trackDeploy(policyId, pdps, GROUP_NAME, PDP_TYPE);
+        } else {
+            session.trackUndeploy(policyId, pdps, GROUP_NAME, PDP_TYPE);
         }
 
-        // "unexpected" list should be empty of any PDPs
-        Collection<PolicyPdpNotificationData> dataList = unexpected.get();
-        assertTrue(dataList.size() <= 1);
-        if (!dataList.isEmpty()) {
-            PolicyPdpNotificationData data = dataList.iterator().next();
-            assertTrue(data.getPdps().isEmpty());
-        }
-
-        dataList = expected.get();
-        assertEquals(1, dataList.size());
+        // should be called just once
+        verify(status).deleteDeployment(any(), anyBoolean());
+        verify(status).deleteDeployment(policyId, !deploy);
 
-        PolicyPdpNotificationData data = dataList.iterator().next();
-        assertEquals(policyId, data.getPolicyId());
-        assertEquals(type, data.getPolicyType());
-        assertEquals("[pdp_1, pdp_2]", new TreeSet<>(data.getPdps()).toString());
+        // should be called for each PDP
+        verify(status, times(2)).deploy(any(), any(), any(), any(), any(), anyBoolean());
+        verify(status).deploy(PDP1, policyId, policy.getTypeIdentifier(), GROUP_NAME, PDP_TYPE, deploy);
+        verify(status).deploy(PDP2, policyId, policy.getTypeIdentifier(), GROUP_NAME, PDP_TYPE, deploy);
     }
 
     private PdpUpdate makeUpdate(String pdpName) {
@@ -655,9 +647,4 @@ public class TestSessionData extends ProviderSuper {
     private String getName(Pair<PdpUpdate, PdpStateChange> pair) {
         return (pair.getKey() != null ? pair.getKey().getName() : pair.getValue().getName());
     }
-
-    @FunctionalInterface
-    private static interface TrackEx {
-        public void accept(ToscaConceptIdentifier policyId, Collection<String> pdps) throws PfModelException;
-    }
 }
index 3f4015b..1ecea07 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019-2020 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -37,6 +37,7 @@ import org.onap.policy.common.utils.resources.ResourceUtils;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
+import org.onap.policy.models.pdp.concepts.PdpPolicyStatus;
 import org.onap.policy.models.pdp.concepts.PdpStatistics;
 import org.onap.policy.models.provider.PolicyModelsProvider;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaServiceTemplate;
@@ -77,17 +78,7 @@ public class End2EndBase extends CommonPapRestServer {
      */
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        setUpBeforeClass(true);
-    }
-
-    /**
-     * Starts Main, if specified, and connects to the DB.
-     *
-     * @param shouldStart {@code true} if Main should be started, {@code false} otherwise
-     * @throws Exception if an error occurs
-     */
-    public static void setUpBeforeClass(final boolean shouldStart) throws Exception {
-        CommonPapRestServer.setUpBeforeClass(shouldStart);
+        CommonPapRestServer.setUpBeforeClass(true);
 
         final PapParameterGroup params = new StandardCoder().decode(new File(CONFIG_FILE), PapParameterGroup.class);
         daoFactory = new PolicyModelsProviderFactoryWrapper(params.getDatabaseProviderParameters());
@@ -194,6 +185,17 @@ public class End2EndBase extends CommonPapRestServer {
         return dbConn.getFilteredPdpStatistics(instanceId, groupName, subGroupName, null, null, null, 0);
     }
 
+    /**
+     * Adds PdpPolicyStatus records to the DB.
+     *
+     * @param jsonFile name of the JSON file specifying the data to be loaded
+     * @throws PfModelException if a DAO error occurs
+     */
+    public static void addPdpPolicyStatus(final String jsonFile) throws PfModelException {
+        final PolicyStatusRecords data = loadJsonFile(jsonFile, PolicyStatusRecords.class);
+        dbConn.cudPolicyStatus(data.records, null, null);
+    }
+
     /**
      * Loads an object from a YAML file.
      *
@@ -246,4 +248,8 @@ public class End2EndBase extends CommonPapRestServer {
             throw new RuntimeException(e);
         }
     }
+
+    public class PolicyStatusRecords {
+        private List<PdpPolicyStatus> records;
+    }
 }
index afabb89..19a5f99 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * ONAP PAP
  * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2019, 2021 AT&T Intellectual Property. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -40,14 +40,8 @@ public class PolicyStatusTest extends End2EndBase {
      */
     @BeforeClass
     public static void setUpBeforeClass() throws Exception {
-        // don't start Main until AFTER we add the policies to the DB
-        End2EndBase.setUpBeforeClass(false);
-
-        addToscaPolicyTypes("monitoring.policy-type.yaml");
-        addToscaPolicies("monitoring.policy.yaml");
-        addGroups("policyStatus.json");
-
-        startMain();
+        End2EndBase.setUpBeforeClass();
+        addPdpPolicyStatus("policyStatus.json");
     }
 
     @Test
index 47ee9fd..e49dafa 100644 (file)
@@ -2,6 +2,7 @@
 <!--
   ============LICENSE_START=======================================================
    Copyright (C) 2019-2020 Nordix Foundation.
+   Modifications Copyright (C) 2021 AT&T Intellectual Property.
   ================================================================================
   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
@@ -28,6 +29,7 @@
         <class>org.onap.policy.models.dao.converters.Uuid2String</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdp</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpGroup</class>
+        <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpPolicyStatus</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpStatistics</class>
         <class>org.onap.policy.models.pdp.persistence.concepts.JpaPdpSubGroup</class>
         <class>org.onap.policy.models.tosca.simple.concepts.JpaToscaCapabilityAssignment</class>
index 973e2c0..185f332 100644 (file)
@@ -1,56 +1,19 @@
 {
-    "groups": [
+    "records": [
         {
-            "name": "policyStatus",
-            "pdpGroupState": "ACTIVE",
-            "pdpSubgroups": [
-                {
-                    "pdpType": "pdpTypeA",
-                    "desiredInstanceCount": 2,
-                    "pdpInstances": [
-                        {
-                            "instanceId": "pdpA_1",
-                            "pdpState": "ACTIVE",
-                            "healthy": "HEALTHY"
-                        },
-                        {
-                            "instanceId": "pdpA_2",
-                            "pdpState": "ACTIVE",
-                            "healthy": "HEALTHY"
-                        }
-                    ],
-                    "supportedPolicyTypes": [
-                        {
-                            "name": "onap.policies.monitoring.cdap.tca.hi.lo.app",
-                            "version": "1.0.0"
-                        }
-                    ],
-                    "policies": []
-                },
-                {
-                    "pdpType": "pdpTypeB",
-                    "desiredInstanceCount": 1,
-                    "pdpInstances": [
-                        {
-                            "instanceId": "pdpB_1",
-                            "pdpState": "ACTIVE",
-                            "healthy": "HEALTHY"
-                        }
-                    ],
-                    "supportedPolicyTypes": [
-                        {
-                            "name": "onap.policies.monitoring.cdap.tca.hi.lo.app",
-                            "version": "1.0.0"
-                        }
-                    ],
-                    "policies": [
-                        {
-                            "name": "onap.restart.tca",
-                            "version": "1.0.0"
-                        }
-                    ]
-                }
-            ]
+            "pdpGroup": "policyStatus",
+            "pdpType": "pdpTypeB",
+            "pdpId": "pdpB_1",
+            "policy": {
+                "name": "onap.restart.tca",
+                "version": "1.0.0"
+            },
+            "policyType": {
+                "name": "onap.policies.monitoring.cdap.tca.hi.lo.app",
+                "version": "1.0.0"
+            },
+            "deploy": true,
+            "state": "WAITING"
         }
     ]
 }