Return appropriate HTTP status code 75/86075/3
authorJim Hahn <jrh3@att.com>
Tue, 23 Apr 2019 15:43:50 +0000 (11:43 -0400)
committerJim Hahn <jrh3@att.com>
Tue, 23 Apr 2019 16:41:54 +0000 (12:41 -0400)
Return 404 instead of 500 when items are not found.  Bubble up other
HTTP error codes instead of changing them all to 500.

Change-Id: Ib614bb83f28cfb1ce2384679398f0a45058fc455
Issue-ID: POLICY-1686
Signed-off-by: Jim Hahn <jrh3@att.com>
15 files changed:
main/src/main/java/org/onap/policy/pap/main/comm/PdpModifyRequestMap.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteControllerV1.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeleteProvider.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployControllerV1.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/PdpGroupDeployProvider.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/ProviderBase.java
main/src/main/java/org/onap/policy/pap/main/rest/depundep/SessionData.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteControllerV1.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeleteProvider.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeployControllerV1.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestPdpGroupDeployProvider.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestProviderBase.java
main/src/test/java/org/onap/policy/pap/main/rest/depundep/TestSessionData.java
main/src/test/java/org/onap/policy/pap/main/rest/e2e/PdpGroupDeleteTest.java
main/src/test/java/org/onap/policy/pap/main/rest/e2e/PdpGroupDeployTest.java

index 04bab74..3f0b5c1 100644 (file)
@@ -221,7 +221,7 @@ public class PdpModifyRequestMap {
      * @param pdpName name of the PDP to be removed
      * @return {@code true} if the PDP was removed from a group, {@code false} if it was
      *         not assigned to a group
-     * @throws PfModelException if an error occurs
+     * @throws PfModelException if an error occurred
      */
     public boolean removeFromGroups(String pdpName) throws PfModelException {
 
index 0878185..ad8b508 100644 (file)
@@ -35,15 +35,19 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
-import org.apache.commons.lang3.tuple.Pair;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PdpGroupDeleteResponse;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
 import org.onap.policy.pap.main.rest.PapRestControllerV1;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to provide REST end points for PAP component to delete a PDP group.
  */
 public class PdpGroupDeleteControllerV1 extends PapRestControllerV1 {
+    private static final Logger logger = LoggerFactory.getLogger(PdpGroupDeleteControllerV1.class);
 
     private final PdpGroupDeleteProvider provider = new PdpGroupDeleteProvider();
 
@@ -82,10 +86,18 @@ public class PdpGroupDeleteControllerV1 extends PapRestControllerV1 {
     public Response deleteGroup(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
                     @ApiParam(value = "PDP Group Name", required = true) @PathParam("name") String groupName) {
 
-        Pair<Status, PdpGroupDeleteResponse> pair = provider.deleteGroup(groupName);
-
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(pair.getLeft())), requestId)
-                        .entity(pair.getRight()).build();
+        try {
+            provider.deleteGroup(groupName);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                            .entity(new PdpGroupDeleteResponse()).build();
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn("delete group failed", e);
+            PdpGroupDeleteResponse resp = new PdpGroupDeleteResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                            requestId).entity(resp).build();
+        }
     }
 
     /**
@@ -123,11 +135,18 @@ public class PdpGroupDeleteControllerV1 extends PapRestControllerV1 {
     public Response deletePolicy(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
                     @ApiParam(value = "PDP Policy Name", required = true) @PathParam("name") String policyName) {
 
-        Pair<Status, PdpGroupDeleteResponse> pair =
-                        provider.undeploy(new ToscaPolicyIdentifierOptVersion(policyName, null));
-
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(pair.getLeft())), requestId)
-                        .entity(pair.getRight()).build();
+        try {
+            provider.undeploy(new ToscaPolicyIdentifierOptVersion(policyName, null));
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                            .entity(new PdpGroupDeleteResponse()).build();
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn("undeploy policy failed", e);
+            PdpGroupDeleteResponse resp = new PdpGroupDeleteResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                            requestId).entity(resp).build();
+        }
     }
 
     /**
@@ -168,10 +187,17 @@ public class PdpGroupDeleteControllerV1 extends PapRestControllerV1 {
                     @ApiParam(value = "PDP Policy Name", required = true) @PathParam("name") String policyName,
                     @ApiParam(value = "PDP Policy Version", required = true) @PathParam("version") String version) {
 
-        Pair<Status, PdpGroupDeleteResponse> pair =
-                        provider.undeploy(new ToscaPolicyIdentifierOptVersion(policyName, version));
-
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(pair.getLeft())), requestId)
-                        .entity(pair.getRight()).build();
+        try {
+            provider.undeploy(new ToscaPolicyIdentifierOptVersion(policyName, version));
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                            .entity(new PdpGroupDeleteResponse()).build();
+
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn("undeploy policy failed", e);
+            PdpGroupDeleteResponse resp = new PdpGroupDeleteResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                            requestId).entity(resp).build();
+        }
     }
 }
index c64a0ef..6df713d 100644 (file)
 package org.onap.policy.pap.main.rest.depundep;
 
 import java.util.function.BiFunction;
-import javax.ws.rs.core.Response;
-import org.apache.commons.lang3.tuple.Pair;
+import javax.ws.rs.core.Response.Status;
 import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.pap.concepts.PdpGroupDeleteResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.enums.PdpState;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Provider for PAP component to delete PDP groups.
  */
-public class PdpGroupDeleteProvider extends ProviderBase<PdpGroupDeleteResponse> {
+public class PdpGroupDeleteProvider extends ProviderBase {
     private static final Logger logger = LoggerFactory.getLogger(PdpGroupDeleteProvider.class);
 
 
@@ -53,11 +50,10 @@ public class PdpGroupDeleteProvider extends ProviderBase<PdpGroupDeleteResponse>
      * Deletes a PDP group.
      *
      * @param groupName name of the PDP group to be deleted
-     * @return a pair containing the status and the response
+     * @throws PfModelException if an error occurred
      */
-    public Pair<Response.Status, PdpGroupDeleteResponse> deleteGroup(String groupName) {
-
-        return process(groupName, this::deleteGroup);
+    public void deleteGroup(String groupName) throws PfModelException {
+        process(groupName, this::deleteGroup);
     }
 
     /**
@@ -65,27 +61,23 @@ public class PdpGroupDeleteProvider extends ProviderBase<PdpGroupDeleteResponse>
      *
      * @param data session data
      * @param groupName name of the PDP group to be deleted
+     * @throws PfModelException if an error occurred
      */
-    private void deleteGroup(SessionData data, String groupName) {
+    private void deleteGroup(SessionData data, String groupName) throws PfModelException {
         try {
             PdpGroup group = data.getGroup(groupName);
             if (group == null) {
-                throw new PolicyPapRuntimeException("group not found");
+                throw new PfModelException(Status.NOT_FOUND, "group not found");
             }
 
             if (group.getPdpGroupState() == PdpState.ACTIVE) {
-                throw new PolicyPapRuntimeException("group is still " + PdpState.ACTIVE);
+                throw new PfModelException(Status.BAD_REQUEST, "group is still " + PdpState.ACTIVE);
             }
 
             data.deleteGroupFromDb(group);
 
-        } catch (PfModelException e) {
-            // no need to log the error here, as it will be logged by the invoker
-            logger.warn("failed to delete group: {}", groupName);
-            throw new PolicyPapRuntimeException(DB_ERROR_MSG, e);
-
-        } catch (RuntimeException e) {
-            // no need to log the error here, as it will be logged by the invoker
+        } catch (PfModelException | RuntimeException e) {
+            // no need to log the error object here, as it will be logged by the invoker
             logger.warn("failed to delete group: {}", groupName);
             throw e;
         }
@@ -95,11 +87,10 @@ public class PdpGroupDeleteProvider extends ProviderBase<PdpGroupDeleteResponse>
      * Undeploys a policy.
      *
      * @param policyIdent identifier of the policy to be undeployed
-     * @return a pair containing the status and the response
+     * @throws PfModelException if an error occurred
      */
-    public Pair<Response.Status, PdpGroupDeleteResponse> undeploy(ToscaPolicyIdentifierOptVersion policyIdent) {
-
-        return process(policyIdent, this::undeployPolicy);
+    public void undeploy(ToscaPolicyIdentifierOptVersion policyIdent) throws PfModelException {
+        process(policyIdent, this::undeployPolicy);
     }
 
     /**
@@ -107,30 +98,19 @@ public class PdpGroupDeleteProvider extends ProviderBase<PdpGroupDeleteResponse>
      *
      * @param data session data
      * @param ident identifier of the policy to be deleted
+     * @throws PfModelException if an error occurred
      */
-    private void undeployPolicy(SessionData data, ToscaPolicyIdentifierOptVersion ident) {
+    private void undeployPolicy(SessionData data, ToscaPolicyIdentifierOptVersion ident) throws PfModelException {
         try {
             processPolicy(data, ident);
 
-        } catch (PfModelException e) {
-            // no need to log the error here, as it will be logged by the invoker
-            logger.warn("failed to undeploy policy: {}", ident);
-            throw new PolicyPapRuntimeException(DB_ERROR_MSG, e);
-
-        } catch (RuntimeException e) {
-            // no need to log the error here, as it will be logged by the invoker
+        } catch (PfModelException | RuntimeException e) {
+            // no need to log the error object here, as it will be logged by the invoker
             logger.warn("failed to undeploy policy: {}", ident);
             throw e;
         }
     }
 
-    @Override
-    public PdpGroupDeleteResponse makeResponse(String errorMsg) {
-        PdpGroupDeleteResponse resp = new PdpGroupDeleteResponse();
-        resp.setErrorDetails(errorMsg);
-        return resp;
-    }
-
     /**
      * Returns a function that will remove the specified policy from a subgroup.
      */
index bdec356..d3e6c00 100644 (file)
@@ -34,16 +34,20 @@ import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
-import org.apache.commons.lang3.tuple.Pair;
+import org.onap.policy.models.base.PfModelException;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PdpDeployPolicies;
 import org.onap.policy.models.pap.concepts.PdpGroupDeployResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
 import org.onap.policy.pap.main.rest.PapRestControllerV1;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * Class to provide REST end points for PAP component to deploy a PDP group.
  */
 public class PdpGroupDeployControllerV1 extends PapRestControllerV1 {
+    private static final Logger logger = LoggerFactory.getLogger(PdpGroupDeployControllerV1.class);
 
     private final PdpGroupDeployProvider provider = new PdpGroupDeployProvider();
 
@@ -82,10 +86,18 @@ public class PdpGroupDeployControllerV1 extends PapRestControllerV1 {
     public Response deployGroup(@HeaderParam(REQUEST_ID_NAME) @ApiParam(REQUEST_ID_PARAM_DESCRIPTION) UUID requestId,
                     @ApiParam(value = "List of PDP Group Configuration", required = true) PdpGroups groups) {
 
-        Pair<Status, PdpGroupDeployResponse> pair = provider.createOrUpdateGroups(groups);
+        try {
+            provider.createOrUpdateGroups(groups);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                            .entity(new PdpGroupDeployResponse()).build();
 
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(pair.getLeft())), requestId)
-                        .entity(pair.getRight()).build();
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn("create groups failed", e);
+            PdpGroupDeployResponse resp = new PdpGroupDeployResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                            requestId).entity(resp).build();
+        }
     }
 
     /**
@@ -124,9 +136,17 @@ public class PdpGroupDeployControllerV1 extends PapRestControllerV1 {
                     @ApiParam(value = "PDP Policies; only the name is required",
                                     required = true) PdpDeployPolicies policies) {
 
-        Pair<Status, PdpGroupDeployResponse> pair = provider.deployPolicies(policies);
+        try {
+            provider.deployPolicies(policies);
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(Status.OK)), requestId)
+                            .entity(new PdpGroupDeployResponse()).build();
 
-        return addLoggingHeaders(addVersionControlHeaders(Response.status(pair.getLeft())), requestId)
-                        .entity(pair.getRight()).build();
+        } catch (PfModelException | PfModelRuntimeException e) {
+            logger.warn("deploy policies failed", e);
+            PdpGroupDeployResponse resp = new PdpGroupDeployResponse();
+            resp.setErrorDetails(e.getErrorResponse().getErrorMessage());
+            return addLoggingHeaders(addVersionControlHeaders(Response.status(e.getErrorResponse().getResponseCode())),
+                            requestId).entity(resp).build();
+        }
     }
 }
index 5fd1213..ee66b35 100644 (file)
@@ -30,16 +30,15 @@ import java.util.Map;
 import java.util.Set;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
-import javax.ws.rs.core.Response;
-import org.apache.commons.lang3.tuple.Pair;
+import javax.ws.rs.core.Response.Status;
 import org.onap.policy.common.parameters.BeanValidationResult;
 import org.onap.policy.common.parameters.ObjectValidationResult;
 import org.onap.policy.common.parameters.ValidationResult;
 import org.onap.policy.common.parameters.ValidationStatus;
 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.PdpDeployPolicies;
-import org.onap.policy.models.pap.concepts.PdpGroupDeployResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
@@ -48,7 +47,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +59,7 @@ import org.slf4j.LoggerFactory;
  * <li>PAP DAO Factory</li>
  * </ul>
  */
-public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse> {
+public class PdpGroupDeployProvider extends ProviderBase {
     private static final Logger logger = LoggerFactory.getLogger(PdpGroupDeployProvider.class);
 
 
@@ -76,18 +74,18 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * Creates or updates PDP groups.
      *
      * @param groups PDP group configurations to be created or updated
-     * @return a pair containing the status and the response
+     * @throws PfModelException if an error occurred
      */
-    public Pair<Response.Status, PdpGroupDeployResponse> createOrUpdateGroups(PdpGroups groups) {
+    public void createOrUpdateGroups(PdpGroups groups) throws PfModelException {
         ValidationResult result = groups.validatePapRest();
 
         if (!result.isValid()) {
             String msg = result.getResult().trim();
             logger.warn(msg);
-            return Pair.of(Response.Status.INTERNAL_SERVER_ERROR, makeResponse(msg));
+            throw new PfModelException(Status.BAD_REQUEST, msg);
         }
 
-        return process(groups, this::createOrUpdate);
+        process(groups, this::createOrUpdate);
     }
 
     /**
@@ -95,8 +93,9 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      *
      * @param data session data
      * @param groups PDP group configurations
+     * @throws PfModelException if an error occurred
      */
-    private void createOrUpdate(SessionData data, PdpGroups groups) {
+    private void createOrUpdate(SessionData data, PdpGroups groups) throws PfModelException {
         BeanValidationResult result = new BeanValidationResult("groups", groups);
 
         for (PdpGroup group : groups.getGroups()) {
@@ -111,7 +110,7 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
         }
 
         if (!result.isValid()) {
-            throw new PolicyPapRuntimeException(result.getResult().trim());
+            throw new PfModelException(Status.BAD_REQUEST, result.getResult().trim());
         }
     }
 
@@ -121,8 +120,9 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param data session data
      * @param group the group to be added
      * @return the validation result
+     * @throws PfModelException if an error occurred
      */
-    private ValidationResult addGroup(SessionData data, PdpGroup group) {
+    private ValidationResult addGroup(SessionData data, PdpGroup group) throws PfModelException {
         BeanValidationResult result = new BeanValidationResult(group.getName(), group);
 
         validateGroupOnly(group, result);
@@ -176,8 +176,9 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param dbgroup the group, as it appears within the DB
      * @param group the group to be added
      * @return the validation result
+     * @throws PfModelException if an error occurred
      */
-    private ValidationResult updateGroup(SessionData data, PdpGroup dbgroup, PdpGroup group) {
+    private ValidationResult updateGroup(SessionData data, PdpGroup dbgroup, PdpGroup group) throws PfModelException {
         BeanValidationResult result = new BeanValidationResult(group.getName(), group);
 
         if (!ObjectUtils.equals(dbgroup.getProperties(), group.getProperties())) {
@@ -242,8 +243,9 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param data session data
      * @param subgrp the subgroup to be added
      * @return the validation result
+     * @throws PfModelException if an error occurred
      */
-    private ValidationResult addSubGroup(SessionData data, PdpSubGroup subgrp) {
+    private ValidationResult addSubGroup(SessionData data, PdpSubGroup subgrp) throws PfModelException {
         subgrp.setCurrentInstanceCount(0);
         subgrp.setPdpInstances(Collections.emptyList());
 
@@ -264,9 +266,10 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param container container for additional validation results
      * @return {@code true} if the subgroup content was changed, {@code false} if there
      *         were no changes
+     * @throws PfModelException if an error occurred
      */
     private boolean updateSubGroup(SessionData data, PdpGroup dbgroup, PdpSubGroup dbsub, PdpSubGroup subgrp,
-                    BeanValidationResult container) {
+                    BeanValidationResult container) throws PfModelException {
 
         // perform additional validations first
         if (!validateSubGroup(data, dbsub, subgrp, container)) {
@@ -301,9 +304,10 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param subgrp the subgroup to be validated
      * @param container container for additional validation results
      * @return {@code true} if the subgroup is valid, {@code false} otherwise
+     * @throws PfModelException if an error occurred
      */
     private boolean validateSubGroup(SessionData data, PdpSubGroup dbsub, PdpSubGroup subgrp,
-                    BeanValidationResult container) {
+                    BeanValidationResult container) throws PfModelException {
 
         BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
 
@@ -346,16 +350,27 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param data session data
      * @param subgrp the subgroup to be validated
      * @param result the validation result
+     * @throws PfModelException if an error occurred
      */
-    private ValidationResult validatePolicies(SessionData data, PdpSubGroup subgrp) {
+    private ValidationResult validatePolicies(SessionData data, PdpSubGroup subgrp) throws PfModelException {
         BeanValidationResult result = new BeanValidationResult(subgrp.getPdpType(), subgrp);
 
         for (ToscaPolicyIdentifier ident : subgrp.getPolicies()) {
-            ToscaPolicy policy = data.getPolicy(new ToscaPolicyIdentifierOptVersion(ident));
+            try {
+                ToscaPolicy policy = data.getPolicy(new ToscaPolicyIdentifierOptVersion(ident));
+
+                if (!subgrp.getSupportedPolicyTypes().contains(policy.getTypeIdentifier())) {
+                    result.addResult(new ObjectValidationResult("policy", ident, ValidationStatus.INVALID,
+                                    "not a supported policy for the subgroup"));
+                }
+
+            } catch (PfModelException e) {
+                if (e.getErrorResponse().getResponseCode() != Status.NOT_FOUND) {
+                    throw e;
+                }
 
-            if (!subgrp.getSupportedPolicyTypes().contains(policy.getTypeIdentifier())) {
                 result.addResult(new ObjectValidationResult("policy", ident, ValidationStatus.INVALID,
-                                "not a supported policy for the subgroup"));
+                                "unknown policy"));
             }
         }
 
@@ -366,10 +381,10 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * Deploys or updates PDP policies using the simple API.
      *
      * @param policies PDP policies
-     * @return a pair containing the status and the response
+     * @throws PfModelException if an error occurred
      */
-    public Pair<Response.Status, PdpGroupDeployResponse> deployPolicies(PdpDeployPolicies policies) {
-        return process(policies, this::deploySimplePolicies);
+    public void deployPolicies(PdpDeployPolicies policies) throws PfModelException {
+        process(policies, this::deploySimplePolicies);
     }
 
     /**
@@ -379,20 +394,16 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
      * @param data session data
      * @param extPolicies external PDP policies
      * @return a list of requests that should be sent to configure the PDPs
+     * @throws PfModelException if an error occurred
      */
-    private void deploySimplePolicies(SessionData data, PdpDeployPolicies policies) {
+    private void deploySimplePolicies(SessionData data, PdpDeployPolicies policies) throws PfModelException {
 
         for (ToscaPolicyIdentifierOptVersion desiredPolicy : policies.getPolicies()) {
 
             try {
                 processPolicy(data, desiredPolicy);
 
-            } catch (PfModelException e) {
-                // no need to log the error here, as it will be logged by the invoker
-                logger.warn("failed to deploy policy: {}", desiredPolicy);
-                throw new PolicyPapRuntimeException(DB_ERROR_MSG, e);
-
-            } catch (RuntimeException e) {
+            } catch (PfModelException | RuntimeException e) {
                 // no need to log the error here, as it will be logged by the invoker
                 logger.warn("failed to deploy policy: {}", desiredPolicy);
                 throw e;
@@ -421,8 +432,8 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
             }
 
             if (subgroup.getPdpInstances().isEmpty()) {
-                throw new PolicyPapRuntimeException("group " + group.getName() + " subgroup " + subgroup.getPdpType()
-                                + " has no active PDPs");
+                throw new PfModelRuntimeException(Status.BAD_REQUEST, "group " + group.getName() + " subgroup "
+                                + subgroup.getPdpType() + " has no active PDPs");
             }
 
 
@@ -431,11 +442,4 @@ public class PdpGroupDeployProvider extends ProviderBase<PdpGroupDeployResponse>
             return true;
         };
     }
-
-    @Override
-    public PdpGroupDeployResponse makeResponse(String errorMsg) {
-        PdpGroupDeployResponse resp = new PdpGroupDeployResponse();
-        resp.setErrorDetails(errorMsg);
-        return resp;
-    }
 }
index 07d04c2..a66b03d 100644 (file)
@@ -22,14 +22,13 @@ package org.onap.policy.pap.main.rest.depundep;
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.stream.Collectors;
-import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
 import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.common.utils.services.Registry;
 import org.onap.policy.models.base.PfModelException;
-import org.onap.policy.models.pap.concepts.SimpleResponse;
+import org.onap.policy.models.base.PfModelRuntimeException;
 import org.onap.policy.models.pdp.concepts.Pdp;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpStateChange;
@@ -41,7 +40,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOp
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
 import org.onap.policy.pap.main.PapConstants;
 import org.onap.policy.pap.main.PolicyModelsProviderFactoryWrapper;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 import org.onap.policy.pap.main.comm.PdpModifyRequestMap;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -54,10 +52,8 @@ import org.slf4j.LoggerFactory;
  * <li>PDP Modify Request Map</li>
  * <li>PAP DAO Factory</li>
  * </ul>
- *
- * @param <R> the response type
  */
-public abstract class ProviderBase<R extends SimpleResponse> {
+public abstract class ProviderBase {
     private static final String DEPLOY_FAILED = "failed to deploy/undeploy policies";
     public static final String DB_ERROR_MSG = "DB error";
 
@@ -93,9 +89,9 @@ public abstract class ProviderBase<R extends SimpleResponse> {
      *
      * @param request PDP policy request
      * @param processor function that processes the request
-     * @return a pair containing the status and the response
+     * @throws PfModelException if an error occurred
      */
-    protected <T> Pair<Response.Status, R> process(T request, BiConsumer<SessionData, T> processor) {
+    protected <T> void process(T request, BiConsumerWithEx<SessionData, T> processor) throws PfModelException {
 
         synchronized (updateLock) {
             // list of requests to be published to the PDPs
@@ -111,49 +107,19 @@ public abstract class ProviderBase<R extends SimpleResponse> {
 
                 requests = data.getPdpRequests();
 
-            } catch (PfModelException e) {
-                logger.warn(DEPLOY_FAILED, e);
-                return Pair.of(Response.Status.INTERNAL_SERVER_ERROR, makeResponse(DB_ERROR_MSG));
-
-            } catch (PolicyPapRuntimeException e) {
+            } catch (PfModelException | PfModelRuntimeException e) {
                 logger.warn(DEPLOY_FAILED, e);
-                return Pair.of(Response.Status.INTERNAL_SERVER_ERROR, makeResponse(e.getMessage()));
+                throw e;
 
             } catch (RuntimeException e) {
                 logger.warn(DEPLOY_FAILED, e);
-                return Pair.of(Response.Status.INTERNAL_SERVER_ERROR, makeResponse("request failed"));
+                throw new PfModelException(Status.INTERNAL_SERVER_ERROR, "request failed", e);
             }
 
 
             // publish the requests
             requests.forEach(pair -> requestMap.addRequest(pair.getLeft(), pair.getRight()));
         }
-
-        return Pair.of(Response.Status.OK, makeResponse(null));
-    }
-
-    /**
-     * Makes a response.
-     *
-     * @param errorMsg error message, or {@code null} if there was no error
-     * @return a new response
-     */
-    public abstract R makeResponse(String errorMsg);
-
-    /**
-     * Finds a Policy having the given name and version. If the specified version is
-     * {@code null}, then it finds the matching Policy with the latest version.
-     *
-     * @param data session data
-     * @param desiredPolicy the policy desired, with the "name" and optional
-     *        "policyVersion" populated
-     * @return the matching Policy type
-     * @throws PolicyPapRuntimeException if there is no matching policy type or a DAO
-     *         error occurs
-     */
-    private ToscaPolicy getPolicy(SessionData data, ToscaPolicyIdentifierOptVersion desiredPolicy) {
-
-        return data.getPolicy(desiredPolicy);
     }
 
     /**
@@ -161,8 +127,7 @@ public abstract class ProviderBase<R extends SimpleResponse> {
      *
      * @param data session data
      * @param desiredPolicy request policy
-     * @throws PolicyPapRuntimeException if an error occurs
-     * @throws PfModelException if a DAO error occurred
+     * @throws PfModelException if an error occurred
      */
     protected void processPolicy(SessionData data, ToscaPolicyIdentifierOptVersion desiredPolicy)
                     throws PfModelException {
@@ -171,8 +136,8 @@ public abstract class ProviderBase<R extends SimpleResponse> {
 
         Collection<PdpGroup> groups = getGroups(data, policy.getTypeIdentifier());
         if (groups.isEmpty()) {
-            throw new PolicyPapRuntimeException("policy not supported by any PDP group: " + desiredPolicy.getName()
-                            + " " + desiredPolicy.getVersion());
+            throw new PfModelException(Status.BAD_REQUEST, "policy not supported by any PDP group: "
+                            + desiredPolicy.getName() + " " + desiredPolicy.getVersion());
         }
 
         BiFunction<PdpGroup, PdpSubGroup, Boolean> updater = makeUpdater(policy);
@@ -199,7 +164,7 @@ public abstract class ProviderBase<R extends SimpleResponse> {
      * @param policyType the policy type of interest
      * @return the matching PDP group, or {@code null} if no active group supports the
      *         given PDP types
-     * @throws PfModelException if an error occurs
+     * @throws PfModelException if an error occurred
      */
     private Collection<PdpGroup> getGroups(SessionData data, ToscaPolicyTypeIdentifier policyType)
                     throws PfModelException {
@@ -213,9 +178,9 @@ public abstract class ProviderBase<R extends SimpleResponse> {
      * @param data session data
      * @param group the original group, to be updated
      * @param updater function to update a group
+     * @throws PfModelRuntimeException if an error occurred
      */
-    private void upgradeGroup(SessionData data, PdpGroup group,
-                    BiFunction<PdpGroup, PdpSubGroup, Boolean> updater) {
+    private void upgradeGroup(SessionData data, PdpGroup group, BiFunction<PdpGroup, PdpSubGroup, Boolean> updater) {
 
         boolean updated = false;
 
@@ -268,8 +233,38 @@ public abstract class ProviderBase<R extends SimpleResponse> {
         update.setPdpGroup(group.getName());
         update.setPdpSubgroup(subgroup.getPdpType());
         update.setPolicies(subgroup.getPolicies().stream().map(ToscaPolicyIdentifierOptVersion::new)
-                        .map(data::getPolicy).collect(Collectors.toList()));
+                        .map(ident -> getPolicy(data, ident)).collect(Collectors.toList()));
 
         return update;
     }
+
+    /**
+     * Gets the specified policy.
+     *
+     * @param data session data
+     * @param ident policy identifier, with an optional version
+     * @return the policy of interest
+     * @throws PfModelRuntimeException if an error occurred or the policy was not found
+     */
+    private ToscaPolicy getPolicy(SessionData data, ToscaPolicyIdentifierOptVersion ident) {
+        try {
+            return data.getPolicy(ident);
+
+        } catch (PfModelException e) {
+            throw new PfModelRuntimeException(e.getErrorResponse().getResponseCode(),
+                            e.getErrorResponse().getErrorMessage(), e);
+        }
+    }
+
+    @FunctionalInterface
+    public static interface BiConsumerWithEx<F, S> {
+        /**
+         * Performs this operation on the given arguments.
+         *
+         * @param firstArg the first input argument
+         * @param secondArg the second input argument
+         * @throws PfModelException if an error occurred
+         */
+        void accept(F firstArg, S secondArg) throws PfModelException;
+    }
 }
index 5cd2f80..98a5e67 100644 (file)
@@ -27,6 +27,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
+import javax.ws.rs.core.Response.Status;
 import org.apache.commons.lang3.tuple.Pair;
 import org.onap.policy.models.base.PfModelException;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
@@ -40,14 +41,14 @@ 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.ToscaPolicyIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 
 /**
  * Data used during a single REST call when updating PDP policies.
  */
 public class SessionData {
     /**
-     * If a version string matches this, then it is just a prefix (i.e., major or major.minor).
+     * If a version string matches this, then it is just a prefix (i.e., major or
+     * major.minor).
      */
     private static final Pattern VERSION_PREFIX_PAT = Pattern.compile("[^.]+(?:[.][^.]*)?");
 
@@ -94,29 +95,24 @@ public class SessionData {
      *
      * @param desiredPolicy policy identifier
      * @return the specified policy
-     * @throws PolicyPapRuntimeException if an error occurs
+     * @throws PfModelException if an error occurred
      */
-    public ToscaPolicy getPolicy(ToscaPolicyIdentifierOptVersion desiredPolicy) {
+    public ToscaPolicy getPolicy(ToscaPolicyIdentifierOptVersion desiredPolicy) throws PfModelException {
 
-        ToscaPolicy policy = policyCache.computeIfAbsent(desiredPolicy, key -> {
+        ToscaPolicy policy = policyCache.get(desiredPolicy);
+        if (policy == null) {
+            ToscaPolicyFilterBuilder filterBuilder = ToscaPolicyFilter.builder().name(desiredPolicy.getName());
+            setPolicyFilterVersion(filterBuilder, desiredPolicy.getVersion());
 
-            try {
-                ToscaPolicyFilterBuilder filterBuilder = ToscaPolicyFilter.builder().name(desiredPolicy.getName());
-                setPolicyFilterVersion(filterBuilder, desiredPolicy.getVersion());
-
-                List<ToscaPolicy> lst = dao.getFilteredPolicyList(filterBuilder.build());
-                if (lst.isEmpty()) {
-                    throw new PolicyPapRuntimeException("cannot find policy: " + desiredPolicy.getName() + " "
-                                    + desiredPolicy.getVersion());
-                }
-
-                return lst.get(0);
-
-            } catch (PfModelException e) {
-                throw new PolicyPapRuntimeException(
-                                "cannot get policy: " + desiredPolicy.getName() + " " + desiredPolicy.getVersion(), e);
+            List<ToscaPolicy> lst = dao.getFilteredPolicyList(filterBuilder.build());
+            if (lst.isEmpty()) {
+                throw new PfModelException(Status.NOT_FOUND,
+                                "cannot find policy: " + desiredPolicy.getName() + " " + desiredPolicy.getVersion());
             }
-        });
+
+            policy = lst.get(0);
+            policyCache.put(desiredPolicy, policy);
+        }
 
         // desired version may have only been a prefix - cache with full identifier, too
         policyCache.putIfAbsent(new ToscaPolicyIdentifierOptVersion(policy.getIdentifier()), policy);
@@ -172,8 +168,8 @@ public class SessionData {
     }
 
     /**
-     * Adds a state-change to the set of state-change requests, replacing any previous entry for the given
-     * PDP.
+     * Adds a state-change to the set of state-change requests, replacing any previous
+     * entry for the given PDP.
      *
      * @param change the state-change to be added
      */
@@ -243,27 +239,22 @@ public class SessionData {
      *
      * @param name name of the group to get
      * @return the group, or {@code null} if it does not exist
-     * @throws PolicyPapRuntimeException if an error occurs
+     * @throws PfModelException if an error occurred
      */
-    public PdpGroup getGroup(String name) {
+    public PdpGroup getGroup(String name) throws PfModelException {
 
-        GroupData data = groupCache.computeIfAbsent(name, key -> {
-
-            try {
-                List<PdpGroup> lst = dao.getPdpGroups(key);
-                if (lst.isEmpty()) {
-                    return null;
-                }
-
-                return new GroupData(lst.get(0));
-
-            } catch (PfModelException e) {
-                throw new PolicyPapRuntimeException("cannot get group: " + name, e);
+        GroupData data = groupCache.get(name);
+        if (data == null) {
+            List<PdpGroup> lst = dao.getPdpGroups(name);
+            if (lst.isEmpty()) {
+                return null;
             }
 
-        });
+            data = new GroupData(lst.get(0));
+            groupCache.put(name, data);
+        }
 
-        return (data == null ? null : data.getGroup());
+        return data.getGroup();
     }
 
     /**
@@ -271,7 +262,7 @@ public class SessionData {
      *
      * @param type desired policy type
      * @return the active groups supporting the given policy
-     * @throws PfModelException if an error occurs
+     * @throws PfModelException if an error occurred
      */
     public List<PdpGroup> getActivePdpGroupsByPolicyType(ToscaPolicyTypeIdentifier type) throws PfModelException {
         List<GroupData> data = type2groups.get(type);
@@ -311,7 +302,7 @@ public class SessionData {
     /**
      * Update the DB with the changes.
      *
-     * @throws PfModelException if an error occurs
+     * @throws PfModelException if an error occurred
      */
     public void updateDb() throws PfModelException {
         // create new groups
@@ -333,7 +324,7 @@ public class SessionData {
      * executed later).
      *
      * @param group the group to be deleted
-     * @throws PfModelException if an error occurs
+     * @throws PfModelException if an error occurred
      */
     public void deleteGroupFromDb(PdpGroup group) throws PfModelException {
         dao.deletePdpGroup(group.getName());
index f739055..670d1e0 100644 (file)
@@ -29,6 +29,9 @@ import org.junit.Test;
 import org.onap.policy.models.pap.concepts.PdpGroupDeleteResponse;
 import org.onap.policy.pap.main.rest.CommonPapRestServer;
 
+/**
+ * Note: this tests failure cases; success cases are tested by tests in the "e2e" package.
+ */
 public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer {
 
     private static final String GROUP_NOT_FOUND = "group not found";
@@ -50,12 +53,12 @@ public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer {
         Invocation.Builder invocationBuilder = sendRequest(uri);
         Response rawresp = invocationBuilder.delete();
         PdpGroupDeleteResponse resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals(GROUP_NOT_FOUND, resp.getErrorDetails());
 
         rawresp = invocationBuilder.delete();
         resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals(GROUP_NOT_FOUND, resp.getErrorDetails());
 
         // verify it fails when no authorization info is included
@@ -69,12 +72,12 @@ public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer {
         Invocation.Builder invocationBuilder = sendRequest(uri);
         Response rawresp = invocationBuilder.delete();
         PdpGroupDeleteResponse resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals("cannot find policy: my-name null", resp.getErrorDetails());
 
         rawresp = invocationBuilder.delete();
         resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals("cannot find policy: my-name null", resp.getErrorDetails());
 
         // verify it fails when no authorization info is included
@@ -88,12 +91,12 @@ public class TestPdpGroupDeleteControllerV1 extends CommonPapRestServer {
         Invocation.Builder invocationBuilder = sendRequest(uri);
         Response rawresp = invocationBuilder.delete();
         PdpGroupDeleteResponse resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals("cannot find policy: my-name 3", resp.getErrorDetails());
 
         rawresp = invocationBuilder.delete();
         resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals("cannot find policy: my-name 3", resp.getErrorDetails());
 
         // verify it fails when no authorization info is included
index 5824b4b..72765ce 100644 (file)
@@ -23,7 +23,6 @@ package org.onap.policy.pap.main.rest.depundep;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
@@ -36,23 +35,19 @@ import static org.mockito.Mockito.when;
 
 import java.util.Arrays;
 import java.util.List;
-import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import javax.ws.rs.core.Response.Status;
-import org.apache.commons.lang3.tuple.Pair;
 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.PdpGroupDeleteResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.concepts.PdpUpdate;
 import org.onap.policy.models.pdp.enums.PdpState;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifier;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 
 public class TestPdpGroupDeleteProvider extends ProviderSuper {
     private static final String EXPECTED_EXCEPTION = "expected exception";
@@ -111,14 +106,17 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
 
         when(session.getGroup(GROUP1_NAME)).thenReturn(group);
 
-        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isInstanceOf(PolicyPapRuntimeException.class)
+        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isInstanceOf(PfModelException.class)
                         .hasMessage("group is still ACTIVE");
     }
 
     @Test
     public void testDeleteGroup_NotFound() throws Exception {
-        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isInstanceOf(PolicyPapRuntimeException.class)
-                        .hasMessage("group not found");
+        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isInstanceOf(PfModelException.class)
+                        .hasMessage("group not found").matches(thr -> {
+                            PfModelException ex = (PfModelException) thr;
+                            return (ex.getErrorResponse().getResponseCode() == Status.NOT_FOUND);
+                        });
     }
 
     @Test
@@ -144,15 +142,12 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
         PfModelException ex = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
         doThrow(ex).when(session).deleteGroupFromDb(group);
 
-        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isInstanceOf(PolicyPapRuntimeException.class)
-                        .hasMessage(ProviderBase.DB_ERROR_MSG);
+        assertThatThrownBy(() -> prov.deleteGroup(GROUP1_NAME)).isSameAs(ex);
     }
 
     @Test
-    public void testUndeploy_testDeletePolicy() {
-        Pair<Status, PdpGroupDeleteResponse> pair = prov.undeploy(optIdent);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+    public void testUndeploy_testDeletePolicy() throws Exception {
+        prov.undeploy(optIdent);
     }
 
     /**
@@ -169,9 +164,7 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
         when(dao.getFilteredPdpGroups(any())).thenReturn(Arrays.asList(group));
         when(dao.getFilteredPolicyList(any())).thenReturn(Arrays.asList(policy1));
 
-        Pair<Status, PdpGroupDeleteResponse> pair = new PdpGroupDeleteProvider().undeploy(optIdent);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        new PdpGroupDeleteProvider().undeploy(optIdent);
 
         // should have updated the old group
         List<PdpGroup> updates = getGroupUpdates();
@@ -199,8 +192,7 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
         prov = spy(prov);
         doThrow(exc).when(prov).processPolicy(any(), any());
 
-        assertThatThrownBy(() -> prov.undeploy(optIdent)).isInstanceOf(PolicyPapRuntimeException.class)
-                        .hasMessage(PdpGroupDeleteProvider.DB_ERROR_MSG);
+        assertThatThrownBy(() -> prov.undeploy(optIdent)).isSameAs(exc);
     }
 
     @Test
@@ -213,15 +205,6 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
         assertThatThrownBy(() -> prov.undeploy(optIdent)).isSameAs(exc);
     }
 
-    @Test
-    public void testMakeResponse() {
-        PdpGroupDeleteResponse resp = prov.makeResponse(null);
-        assertNull(resp.getErrorDetails());
-
-        resp = prov.makeResponse(EXPECTED_EXCEPTION);
-        assertEquals(EXPECTED_EXCEPTION, resp.getErrorDetails());
-    }
-
     @Test
     public void testMakeUpdater() {
         /*
@@ -263,10 +246,8 @@ public class TestPdpGroupDeleteProvider extends ProviderSuper {
     private class MyProvider extends PdpGroupDeleteProvider {
 
         @Override
-        protected <T> Pair<Status, PdpGroupDeleteResponse> process(T request, BiConsumer<SessionData, T> processor) {
+        protected <T> void process(T request, BiConsumerWithEx<SessionData, T> processor) throws PfModelException {
             processor.accept(session, request);
-
-            return Pair.of(Status.OK, new PdpGroupDeleteResponse());
         }
 
         @Override
index 6ebad5f..8c01e02 100644 (file)
@@ -37,6 +37,9 @@ import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
 import org.onap.policy.pap.main.rest.CommonPapRestServer;
 
+/**
+ * Note: this tests failure cases; success cases are tested by tests in the "e2e" package.
+ */
 public class TestPdpGroupDeployControllerV1 extends CommonPapRestServer {
 
     private static final String DEPLOY_GROUP_ENDPOINT = "pdps";
@@ -55,12 +58,12 @@ public class TestPdpGroupDeployControllerV1 extends CommonPapRestServer {
         Invocation.Builder invocationBuilder = sendRequest(DEPLOY_GROUP_ENDPOINT);
         Response rawresp = invocationBuilder.post(entgrp);
         PdpGroupDeployResponse resp = rawresp.readEntity(PdpGroupDeployResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawresp.getStatus());
         assertNotNull(resp.getErrorDetails());
 
         rawresp = invocationBuilder.post(entgrp);
         resp = rawresp.readEntity(PdpGroupDeployResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawresp.getStatus());
         assertNotNull(resp.getErrorDetails());
 
         // verify it fails when no authorization info is included
@@ -74,12 +77,12 @@ public class TestPdpGroupDeployControllerV1 extends CommonPapRestServer {
         Invocation.Builder invocationBuilder = sendRequest(DEPLOY_POLICIES_ENDPOINT);
         Response rawresp = invocationBuilder.post(entgrp);
         PdpGroupDeployResponse resp = rawresp.readEntity(PdpGroupDeployResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertNotNull(resp.getErrorDetails());
 
         rawresp = invocationBuilder.post(entgrp);
         resp = rawresp.readEntity(PdpGroupDeployResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertNotNull(resp.getErrorDetails());
 
         // verify it fails when no authorization info is included
index 12c2ada..406345c 100644 (file)
 
 package org.onap.policy.pap.main.rest.depundep;
 
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.onap.policy.pap.main.rest.depundep.ProviderBase.DB_ERROR_MSG;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -37,14 +36,13 @@ import java.util.List;
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 import javax.ws.rs.core.Response.Status;
-import org.apache.commons.lang3.tuple.Pair;
 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.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PdpDeployPolicies;
-import org.onap.policy.models.pap.concepts.PdpGroupDeployResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpGroups;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
@@ -56,7 +54,6 @@ import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifi
 
 public class TestPdpGroupDeployProvider extends ProviderSuper {
     private static final String EXPECTED_EXCEPTION = "expected exception";
-    private static final Object REQUEST_FAILED_MSG = "request failed";
 
     private static final String POLICY2_NAME = "policyB";
     private static final String POLICY1_VERSION = "1.2.3";
@@ -92,9 +89,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
     @Test
     public void testCreateOrUpdateGroups() throws Exception {
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(loadPdpGroups("emptyGroups.json"));
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.createOrUpdateGroups(loadPdpGroups("emptyGroups.json"));
 
         // no groups, so no action should have been taken
         assertNoGroupAction();
@@ -102,9 +97,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
     @Test
     public void testCreateOrUpdateGroups_InvalidRequest() throws Exception {
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(new PdpGroups());
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("is null"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(new PdpGroups())).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("is null");
 
         assertNoGroupAction();
     }
@@ -114,9 +108,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("pdpGroupState"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("pdpGroupState");
 
         assertNoGroupAction();
     }
@@ -127,7 +120,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroup group = groups.getGroups().get(0);
         group.setPdpGroupState(PdpState.PASSIVE);
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         // should not have updated the state
         assertEquals(PdpState.PASSIVE, group.getPdpGroupState());
@@ -140,9 +133,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("pdpGroupState"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("pdpGroupState");
 
         assertNoGroupAction();
     }
@@ -154,32 +146,31 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         // policy won't match supported type
         groups.getGroups().get(0).getPdpSubgroups().get(0).getSupportedPolicyTypes().get(0).setVersion("99.99.99");
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("supported policy"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("supported policy");
 
         assertNoGroupAction();
     }
 
     @Test
-    public void testValidateGroupOnly_NullState() {
+    public void testValidateGroupOnly_NullState() throws PfModelException {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(null);
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
     }
 
     @Test
-    public void testValidateGroupOnly_Active() {
+    public void testValidateGroupOnly_Active() throws PfModelException {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(PdpState.ACTIVE);
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
     }
 
     @Test
-    public void testValidateGroupOnly_Passive() {
+    public void testValidateGroupOnly_Passive() throws PfModelException {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(PdpState.PASSIVE);
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
     }
 
     @Test
@@ -187,9 +178,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroups groups = loadPdpGroups("createGroups.json");
         groups.getGroups().get(0).setPdpGroupState(PdpState.TERMINATED);
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("pdpGroupState"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("pdpGroupState");
     }
 
     @Test
@@ -200,7 +190,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroup group = new PdpGroup(groups.getGroups().get(0));
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertNoGroupAction();
     }
@@ -214,9 +204,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("properties"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("properties");
 
         assertNoGroupAction();
     }
@@ -229,7 +218,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         group.setDescription("old description");
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertGroupUpdateOnly(group);
 
@@ -243,7 +232,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         PdpGroup newgrp = groups.getGroups().get(0);
         assertEquals(newgrp.toString(), group.toString());
@@ -260,7 +249,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         // something different in this subgroup
         group.getPdpSubgroups().get(0).setDesiredInstanceCount(10);
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -281,7 +270,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"))
                         .thenReturn(loadPolicies("createGroupNewPolicy.json"));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
         Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
@@ -299,7 +288,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroup group = new PdpGroup(newgrp);
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertNoGroupAction();
     }
@@ -313,7 +302,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         group.setDescription(null);
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -328,7 +317,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         newgrp.setDescription(null);
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -343,7 +332,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         newgrp.setDescription(group.getDescription() + "-changed");
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -355,7 +344,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
         when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         PdpGroup newgrp = groups.getGroups().get(0);
 
@@ -367,6 +356,30 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         assertGroupUpdateOnly(group);
     }
 
+    @Test
+    public void testAddSubGroup_ValidationPolicyNotFound() throws Exception {
+        PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
+        PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
+        when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+
+        PfModelException exc = new PfModelException(Status.NOT_FOUND, EXPECTED_EXCEPTION);
+        when(dao.getFilteredPolicyList(any())).thenThrow(exc);
+
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).hasMessageContaining("unknown policy");
+    }
+
+    @Test
+    public void testAddSubGroup_ValidationPolicyDaoEx() throws Exception {
+        PdpGroups groups = loadPdpGroups("createGroupsNewSub.json");
+        PdpGroup group = loadPdpGroups("createGroups.json").getGroups().get(0);
+        when(dao.getPdpGroups(group.getName())).thenReturn(Arrays.asList(group));
+
+        PfModelException exc = new PfModelException(Status.CONFLICT, EXPECTED_EXCEPTION);
+        when(dao.getFilteredPolicyList(any())).thenThrow(exc);
+
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isSameAs(exc);
+    }
+
     @Test
     public void testUpdateSubGroup_Invalid() throws Exception {
         PdpGroups groups = loadPdpGroups("createGroups.json");
@@ -377,9 +390,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         // change properties
         newgrp.getPdpSubgroups().get(0).setProperties(new TreeMap<>());
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("properties"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("properties");
 
         assertNoGroupAction();
     }
@@ -393,7 +405,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         newgrp.getPdpSubgroups().get(0).getSupportedPolicyTypes().add(new ToscaPolicyTypeIdentifier("typeX", "9.8.7"));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -408,7 +420,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         newgrp.getPdpSubgroups().get(0).setDesiredInstanceCount(20);
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         assertEquals(newgrp.toString(), group.toString());
         assertGroupUpdateOnly(group);
@@ -427,7 +439,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         when(dao.getFilteredPolicyList(any())).thenReturn(loadPolicies("daoPolicyList.json"))
                         .thenReturn(loadPolicies("createGroupNewPolicy.json"));
 
-        assertEquals(Status.OK, prov.createOrUpdateGroups(groups).getLeft());
+        prov.createOrUpdateGroups(groups);
 
         Collections.sort(newgrp.getPdpSubgroups().get(0).getPolicies());
         Collections.sort(group.getPdpSubgroups().get(0).getPolicies());
@@ -447,52 +459,52 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         newgrp.setProperties(new TreeMap<>());
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.createOrUpdateGroups(groups);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertTrue(pair.getRight().getErrorDetails().contains("properties"));
+        assertThatThrownBy(() -> prov.createOrUpdateGroups(groups)).isInstanceOf(PfModelException.class)
+                        .hasMessageContaining("properties");
 
         assertNoGroupAction();
     }
 
     @Test
-    public void testDeployPolicies() {
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadEmptyRequest());
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+    public void testDeployPolicies() throws PfModelException {
+        prov.deployPolicies(loadEmptyRequest());
     }
 
     @Test
     public void testDeploySimplePolicies() throws Exception {
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.deployPolicies(loadEmptyRequest());
     }
 
     @Test
     public void testDeploySimplePolicies_DaoEx() throws Exception {
-        when(dao.getFilteredPdpGroups(any())).thenThrow(new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION));
+        PfModelException exc = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
+        when(dao.getFilteredPdpGroups(any())).thenThrow(exc);
+
+        assertThatThrownBy(() -> prov.deployPolicies(loadRequest())).isSameAs(exc);
+    }
+
+    @Test
+    public void testDeploySimplePolicies_DaoPfRtEx() throws Exception {
+        PfModelRuntimeException exc = new PfModelRuntimeException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
+        when(dao.getFilteredPdpGroups(any())).thenThrow(exc);
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals(DB_ERROR_MSG, pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.deployPolicies(loadRequest())).isSameAs(exc);
     }
 
     @Test
     public void testDeploySimplePolicies_RuntimeEx() throws Exception {
-        when(dao.getFilteredPolicyList(any())).thenThrow(new RuntimeException(EXPECTED_EXCEPTION));
+        RuntimeException exc = new RuntimeException(EXPECTED_EXCEPTION);
+        when(dao.getFilteredPolicyList(any())).thenThrow(exc);
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals(REQUEST_FAILED_MSG, pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.deployPolicies(loadRequest())).isInstanceOf(PfModelException.class).hasCause(exc);
     }
 
     @Test
     public void testDeploySimplePolicies_NoGroups() throws Exception {
         when(dao.getFilteredPdpGroups(any())).thenReturn(loadGroups("emptyGroups.json"));
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals("policy not supported by any PDP group: policyA 1.2.3", pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.deployPolicies(loadRequest())).isInstanceOf(PfModelException.class)
+                        .hasMessage("policy not supported by any PDP group: policyA 1.2.3");
     }
 
     @Test
@@ -511,9 +523,7 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
 
         when(dao.getFilteredPdpGroups(any())).thenReturn(loadGroups("upgradeGroupDao.json"));
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.deployPolicies(loadRequest());
 
         assertGroup(getGroupUpdates(), GROUP1_NAME);
 
@@ -528,10 +538,8 @@ public class TestPdpGroupDeployProvider extends ProviderSuper {
         // subgroup has no PDPs
         when(dao.getFilteredPdpGroups(any())).thenReturn(loadGroups("upgradeGroup_NoPdpsDao.json"));
 
-        Pair<Status, PdpGroupDeployResponse> pair = prov.deployPolicies(loadRequest());
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals("group " + GROUP1_NAME + " subgroup " + PDP1_TYPE + " has no active PDPs",
-                        pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.deployPolicies(loadRequest())).isInstanceOf(PfModelRuntimeException.class)
+                        .hasMessage("group " + GROUP1_NAME + " subgroup " + PDP1_TYPE + " has no active PDPs");
 
         verify(dao, never()).createPdpGroups(any());
         verify(dao, never()).updatePdpGroups(any());
index bec93e2..e8ddd82 100644 (file)
@@ -22,14 +22,12 @@ package org.onap.policy.pap.main.rest.depundep;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.any;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-import static org.onap.policy.pap.main.rest.depundep.ProviderBase.DB_ERROR_MSG;
 
 import java.util.Arrays;
 import java.util.Collections;
@@ -38,25 +36,22 @@ import java.util.List;
 import java.util.Queue;
 import java.util.function.BiFunction;
 import javax.ws.rs.core.Response.Status;
-import org.apache.commons.lang3.tuple.Pair;
 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.base.PfModelRuntimeException;
 import org.onap.policy.models.pap.concepts.PdpDeployPolicies;
-import org.onap.policy.models.pap.concepts.SimpleResponse;
 import org.onap.policy.models.pdp.concepts.PdpGroup;
 import org.onap.policy.models.pdp.concepts.PdpSubGroup;
 import org.onap.policy.models.pdp.concepts.PdpUpdate;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicy;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyIdentifierOptVersion;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 import org.powermock.reflect.Whitebox;
 
 public class TestProviderBase extends ProviderSuper {
     private static final String EXPECTED_EXCEPTION = "expected exception";
-    private static final Object REQUEST_FAILED_MSG = "request failed";
 
     private static final String POLICY1_NAME = "policyA";
     private static final String POLICY1_VERSION = "1.2.3";
@@ -103,9 +98,7 @@ public class TestProviderBase extends ProviderSuper {
 
     @Test
     public void testProcess() throws Exception {
-        Pair<Status, MyResponse> pair = prov.process(loadRequest(), this::handle);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.process(loadRequest(), this::handle);
 
         assertGroup(getGroupUpdates(), GROUP1_NAME);
 
@@ -114,29 +107,27 @@ public class TestProviderBase extends ProviderSuper {
 
     @Test
     public void testProcess_CreateEx() throws Exception {
-        when(daofact.create()).thenThrow(new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION));
+        PfModelException ex = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
+        when(daofact.create()).thenThrow(ex);
 
-        Pair<Status, MyResponse> pair = prov.process(loadEmptyRequest(), this::handle);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals(DB_ERROR_MSG, pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.process(loadEmptyRequest(), this::handle)).isSameAs(ex);
     }
 
     @Test
-    public void testProcess_PapEx() throws Exception {
-        when(daofact.create()).thenThrow(new PolicyPapRuntimeException(EXPECTED_EXCEPTION));
+    public void testProcess_PfRtEx() throws Exception {
+        PfModelRuntimeException ex = new PfModelRuntimeException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
+        when(daofact.create()).thenThrow(ex);
 
-        Pair<Status, MyResponse> pair = prov.process(loadEmptyRequest(), this::handle);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals(EXPECTED_EXCEPTION, pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.process(loadEmptyRequest(), this::handle)).isSameAs(ex);
     }
 
     @Test
     public void testProcess_RuntimeEx() throws Exception {
-        when(daofact.create()).thenThrow(new RuntimeException(EXPECTED_EXCEPTION));
+        RuntimeException ex = new RuntimeException(EXPECTED_EXCEPTION);
+        when(daofact.create()).thenThrow(ex);
 
-        Pair<Status, MyResponse> pair = prov.process(loadEmptyRequest(), this::handle);
-        assertEquals(Status.INTERNAL_SERVER_ERROR, pair.getLeft());
-        assertEquals(REQUEST_FAILED_MSG, pair.getRight().getErrorDetails());
+        assertThatThrownBy(() -> prov.process(loadEmptyRequest(), this::handle)).isInstanceOf(PfModelException.class)
+                        .hasMessage("request failed").hasCause(ex);
     }
 
     @Test
@@ -145,18 +136,18 @@ public class TestProviderBase extends ProviderSuper {
 
         SessionData session = new SessionData(dao);
         ToscaPolicyIdentifierOptVersion ident = new ToscaPolicyIdentifierOptVersion(POLICY1_NAME, POLICY1_VERSION);
-        assertThatThrownBy(() -> prov.processPolicy(session, ident)).isInstanceOf(PolicyPapRuntimeException.class)
+        assertThatThrownBy(() -> prov.processPolicy(session, ident)).isInstanceOf(PfModelException.class)
                         .hasMessage("policy not supported by any PDP group: policyA 1.2.3");
 
     }
 
     @Test
     public void testGetPolicy() throws Exception {
-        Pair<Status, MyResponse> pair = prov.process(loadRequest(), this::handle);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        PfModelException exc = new PfModelException(Status.CONFLICT, EXPECTED_EXCEPTION);
+        when(dao.getFilteredPolicyList(any())).thenThrow(exc);
 
-        verify(dao).getFilteredPolicyList(any());
+        assertThatThrownBy(() -> prov.process(loadRequest(), this::handle)).isInstanceOf(PfModelRuntimeException.class)
+                        .hasCause(exc);
     }
 
     @Test
@@ -164,9 +155,7 @@ public class TestProviderBase extends ProviderSuper {
         when(dao.getFilteredPdpGroups(any())).thenReturn(loadGroups("getGroupDao.json"))
                         .thenReturn(loadGroups("groups.json"));
 
-        Pair<Status, MyResponse> pair = prov.process(loadRequest(), this::handle);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.process(loadRequest(), this::handle);
 
         assertGroup(getGroupUpdates(), GROUP1_NAME);
     }
@@ -190,9 +179,7 @@ public class TestProviderBase extends ProviderSuper {
         prov.clear();
         prov.add(false, true, false, true);
 
-        Pair<Status, MyResponse> pair = prov.process(loadRequest(), this::handle);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.process(loadRequest(), this::handle);
 
         assertGroup(getGroupUpdates(), GROUP1_NAME);
 
@@ -242,15 +229,12 @@ public class TestProviderBase extends ProviderSuper {
         // multiple policies in the request
         PdpDeployPolicies request = loadFile("updateGroupReqMultiple.json", PdpDeployPolicies.class);
 
-        Pair<Status, MyResponse> pair = prov.process(request, (data, deploy) -> {
+        prov.process(request, (data, deploy) -> {
             for (ToscaPolicyIdentifierOptVersion policy : deploy.getPolicies()) {
                 handle(data, policy);
             }
         });
 
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
-
         // verify updates
         List<PdpGroup> changes = getGroupUpdates();
         assertGroup(changes, GROUP1_NAME);
@@ -267,9 +251,7 @@ public class TestProviderBase extends ProviderSuper {
         prov.clear();
         prov.add(false);
 
-        Pair<Status, MyResponse> pair = prov.process(loadRequest(), this::handle);
-        assertEquals(Status.OK, pair.getLeft());
-        assertNull(pair.getRight().getErrorDetails());
+        prov.process(loadRequest(), this::handle);
 
         verify(dao, never()).createPdpGroups(any());
         verify(dao, never()).updatePdpGroups(any());
@@ -320,18 +302,14 @@ public class TestProviderBase extends ProviderSuper {
      *
      * @param data session data
      * @param request request to be handled
+     * @throws PfModelException if an error occurred
      */
-    private void handle(SessionData data, ToscaPolicyIdentifierOptVersion request) {
-        try {
-            prov.processPolicy(data, request);
-
-        } catch (PfModelException e) {
-            throw new PolicyPapRuntimeException(e);
-        }
+    private void handle(SessionData data, ToscaPolicyIdentifierOptVersion request) throws PfModelException {
+        prov.processPolicy(data, request);
     }
 
 
-    private static class MyProvider extends ProviderBase<MyResponse> {
+    private static class MyProvider extends ProviderBase {
         /**
          * Used to determine whether or not to make an update when
          * {@link #makeUpdater(ToscaPolicy)} is called. The updater function removes an
@@ -356,11 +334,6 @@ public class TestProviderBase extends ProviderSuper {
             shouldUpdate.addAll(Arrays.asList(update));
         }
 
-        @Override
-        public MyResponse makeResponse(String errorMsg) {
-            return new MyResponse(errorMsg);
-        }
-
         @Override
         protected BiFunction<PdpGroup, PdpSubGroup, Boolean> makeUpdater(ToscaPolicy policy) {
             return (group, subgroup) -> {
@@ -376,10 +349,4 @@ public class TestProviderBase extends ProviderSuper {
             };
         }
     }
-
-    private static class MyResponse extends SimpleResponse {
-        public MyResponse(String errorMsg) {
-            setErrorDetails(errorMsg);
-        }
-    }
 }
index e74f9f8..17acd5a 100644 (file)
@@ -52,7 +52,6 @@ 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.ToscaPolicyIdentifierOptVersion;
 import org.onap.policy.models.tosca.authorative.concepts.ToscaPolicyTypeIdentifier;
-import org.onap.policy.pap.main.PolicyPapRuntimeException;
 
 public class TestSessionData extends ProviderSuper {
     private static final String GROUP_NAME = "groupA";
@@ -157,7 +156,7 @@ public class TestSessionData extends ProviderSuper {
         PfModelException ex = new PfModelException(Status.INTERNAL_SERVER_ERROR, "expected exception");
         when(dao.getFilteredPolicyList(any())).thenThrow(ex);
 
-        assertThatThrownBy(() -> session.getPolicy(ident)).hasMessage("cannot get policy: myPolicy 1.2.3").hasCause(ex);
+        assertThatThrownBy(() -> session.getPolicy(ident)).isSameAs(ex);
     }
 
     @Test
@@ -370,8 +369,7 @@ public class TestSessionData extends ProviderSuper {
         PfModelException ex = new PfModelException(Status.BAD_REQUEST, EXPECTED_EXCEPTION);
         when(dao.getPdpGroups(GROUP_NAME)).thenThrow(ex);
 
-        assertThatThrownBy(() -> session.getGroup(GROUP_NAME)).isInstanceOf(PolicyPapRuntimeException.class)
-                        .hasCause(ex);
+        assertThatThrownBy(() -> session.getGroup(GROUP_NAME)).isSameAs(ex);
     }
 
     @Test
index 9ffe103..463e8d6 100644 (file)
@@ -86,7 +86,7 @@ public class PdpGroupDeleteTest extends End2EndBase {
         // repeat - should fail
         rawresp = invocationBuilder.delete();
         resp = rawresp.readEntity(PdpGroupDeleteResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.NOT_FOUND.getStatusCode(), rawresp.getStatus());
         assertEquals("group not found", resp.getErrorDetails());
     }
 
index 5279236..69165d1 100644 (file)
@@ -124,7 +124,7 @@ public class PdpGroupDeployTest extends End2EndBase {
         groups.getGroups().get(0).setProperties(null);
         rawresp = invocationBuilder.post(entity);
         resp = rawresp.readEntity(PdpGroupDeployResponse.class);
-        assertEquals(Response.Status.INTERNAL_SERVER_ERROR.getStatusCode(), rawresp.getStatus());
+        assertEquals(Response.Status.BAD_REQUEST.getStatusCode(), rawresp.getStatus());
         assertTrue(resp.getErrorDetails().contains("cannot change properties"));
     }