Merge "Update Autogenerated Swagger"
diff --git a/INFO.yaml b/INFO.yaml
index 67c665b..8051847 100644
--- a/INFO.yaml
+++ b/INFO.yaml
@@ -1,7 +1,7 @@
 ---
 project: 'policy-clamp'
 project_creation_date: '2020-12-03'
-lifecycle_state: 'Incubation'
+lifecycle_state: 'Mature'
 project_category: ''
 project_lead: &onap_releng_ptl
     name: 'Jim Hahn'
diff --git a/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java b/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java
index b5f9837..4145844 100644
--- a/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java
+++ b/src/main/java/org/onap/policy/clamp/clds/util/LoggingUtils.java
@@ -58,13 +58,19 @@
 
     private static final String DATE_FORMATTER_ISO = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX";
 
-    /** String constant for messages <tt>ENTERING</tt>, <tt>EXITING</tt>, etc. */
+    /**
+     * String constant for messages <tt>ENTERING</tt>, <tt>EXITING</tt>, etc.
+     */
     private static final String EMPTY_MESSAGE = "";
 
-    /** Logger delegate. */
+    /**
+     * Logger delegate.
+     */
     private final Logger mlogger;
 
-    /** Automatic UUID, overrideable per adapter or per invocation. */
+    /**
+     * Automatic UUID, overrideable per adapter or per invocation.
+     */
     private static final UUID sInstanceUUID = UUID.randomUUID();
 
     /**
@@ -98,7 +104,7 @@
      * Set time related logging variables in thread local data via MDC.
      *
      * @param beginTimeStamp Start time
-     * @param endTimeStamp End time
+     * @param endTimeStamp   End time
      */
     public static void setTimeContext(@NotNull Date beginTimeStamp, @NotNull Date endTimeStamp) {
         MDC.put("EntryTimestamp", generateTimestampStr(beginTimeStamp));
@@ -109,9 +115,9 @@
     /**
      * Set response related logging variables in thread local data via MDC.
      *
-     * @param code Response code ("0" indicates success)
+     * @param code        Response code ("0" indicates success)
      * @param description Response description
-     * @param className class name of invoking class
+     * @param className   class name of invoking class
      */
     public static void setResponseContext(String code, String description, String className) {
         MDC.put("ResponseCode", code);
@@ -123,7 +129,7 @@
     /**
      * Set target related logging variables in thread local data via MDC.
      *
-     * @param targetEntity Target entity (an external/sub component, for ex. "sdc")
+     * @param targetEntity      Target entity (an external/sub component, for ex. "sdc")
      * @param targetServiceName Target service name (name of API invoked on target)
      */
     public static void setTargetContext(String targetEntity, String targetServiceName) {
@@ -134,7 +140,7 @@
     /**
      * Set error related logging variables in thread local data via MDC.
      *
-     * @param code Error code
+     * @param code        Error code
      * @param description Error description
      */
     public static void setErrorContext(String code, String description) {
@@ -175,7 +181,7 @@
     /**
      * Report <tt>ENTERING</tt> marker.
      *
-     * @param request non-null incoming request (wrapper)
+     * @param request     non-null incoming request (wrapper)
      * @param serviceName service name
      */
     public void entering(HttpServletRequest request, String serviceName) {
@@ -183,16 +189,16 @@
         checkNotNull(request);
         // Extract MDC values from standard HTTP headers.
         final String requestId =
-            defaultToUuid(request.getHeader(OnapLogConstants.Headers.REQUEST_ID));
+                defaultToUuid(request.getHeader(OnapLogConstants.Headers.REQUEST_ID));
         final String invocationId =
-            defaultToUuid(request.getHeader(OnapLogConstants.Headers.INVOCATION_ID));
+                defaultToUuid(request.getHeader(OnapLogConstants.Headers.INVOCATION_ID));
         final String partnerName =
-            defaultToEmpty(request.getHeader(OnapLogConstants.Headers.PARTNER_NAME));
+                defaultToEmpty(request.getHeader(OnapLogConstants.Headers.PARTNER_NAME));
 
         // Default the partner name to the user name used to login to clamp
         if (partnerName.equalsIgnoreCase(EMPTY_MESSAGE)) {
             MDC.put(OnapLogConstants.Mdcs.PARTNER_NAME,
-                AuthorizationController.getPrincipalName(SecurityContextHolder.getContext()));
+                    AuthorizationController.getPrincipalName(SecurityContextHolder.getContext()));
         }
 
         // Set standard MDCs. Override this entire method if you want to set
@@ -200,7 +206,7 @@
         // depending on where you need them to appear, OR extend the
         // ServiceDescriptor to add them.
         MDC.put(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC)
-            .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO)));
+                .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO)));
         MDC.put(OnapLogConstants.Mdcs.REQUEST_ID, requestId);
         MDC.put(OnapLogConstants.Mdcs.INVOCATION_ID, invocationId);
         MDC.put(OnapLogConstants.Mdcs.CLIENT_IP_ADDRESS, defaultToEmpty(request.getRemoteAddr()));
@@ -217,7 +223,7 @@
 
         // Set the Response Status code to in progress
         MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE,
-            OnapLogConstants.ResponseStatus.INPROGRESS.toString());
+                OnapLogConstants.ResponseStatus.INPROGRESS.toString());
         setElapsedTime();
 
         this.mlogger.info(OnapLogConstants.Markers.ENTRY, "Entering");
@@ -226,18 +232,17 @@
     /**
      * Report <tt>EXITING</tt> marker.
      *
-     *
-     * @param code response code
-     * @param descrption response description
-     * @param severity response severity
-     * @param status response status code
+     * @param code        response code
+     * @param description response description
+     * @param severity    response severity
+     * @param status      response status code
      */
-    public void exiting(int code, String descrption, Level severity,
-        OnapLogConstants.ResponseStatus status) {
+    public void exiting(int code, String description, Level severity,
+                        OnapLogConstants.ResponseStatus status) {
         try {
 
             MDC.put(OnapLogConstants.Mdcs.RESPONSE_CODE, defaultToEmpty(code));
-            MDC.put(OnapLogConstants.Mdcs.RESPONSE_DESCRIPTION, defaultToEmpty(descrption));
+            MDC.put(OnapLogConstants.Mdcs.RESPONSE_DESCRIPTION, defaultToEmpty(description));
             MDC.put(OnapLogConstants.Mdcs.RESPONSE_SEVERITY, defaultToEmpty(severity));
             MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE, defaultToEmpty(status));
 
@@ -249,12 +254,11 @@
     }
 
     private void setElapsedTime() {
-        ZonedDateTime startTime =
-            ZonedDateTime.parse(MDC.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP),
-                DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC));
-        ZonedDateTime endTime = ZonedDateTime.now(ZoneOffset.UTC);
-        long duration = ChronoUnit.MILLIS.between(startTime, endTime);
-        MDC.put(OnapLogConstants.Mdcs.ELAPSED_TIME, String.valueOf(duration));
+        String entryTimestamp = MDC.get(OnapLogConstants.Mdcs.ENTRY_TIMESTAMP);
+        MDC.put(OnapLogConstants.Mdcs.ELAPSED_TIME, String.valueOf(ChronoUnit.MILLIS
+                .between(ZonedDateTime.parse(entryTimestamp != null ? entryTimestamp : ZonedDateTime.now(ZoneOffset.UTC)
+                                .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO)),
+                        DateTimeFormatter.ISO_DATE_TIME.withZone(ZoneOffset.UTC)), ZonedDateTime.now(ZoneOffset.UTC))));
     }
 
     /**
@@ -271,13 +275,13 @@
      * Report pending invocation with <tt>INVOKE</tt> marker,
      * setting standard ONAP logging headers automatically.
      *
-     * @param con The HTTP url connection
-     * @param targetEntity The target entity
+     * @param con               The HTTP url connection
+     * @param targetEntity      The target entity
      * @param targetServiceName The target service name
      * @return The HTTP url connection
      */
     public HttpURLConnection invoke(final HttpURLConnection con, String targetEntity,
-        String targetServiceName) {
+                                    String targetServiceName) {
         return this.invokeGeneric(con, targetEntity, targetServiceName);
     }
 
@@ -285,7 +289,7 @@
      * Report pending invocation with <tt>INVOKE</tt> marker,
      * setting standard ONAP logging headers automatically.
      *
-     * @param targetEntity The target entity
+     * @param targetEntity      The target entity
      * @param targetServiceName The target service name
      */
     public void invoke(String targetEntity, String targetServiceName) {
@@ -304,13 +308,13 @@
      * Report pending invocation with <tt>INVOKE</tt> marker,
      * setting standard ONAP logging headers automatically.
      *
-     * @param con The HTTPS url connection
-     * @param targetEntity The target entity
+     * @param con               The HTTPS url connection
+     * @param targetEntity      The target entity
      * @param targetServiceName The target service name
      * @return The HTTPS url connection
      */
     public HttpsURLConnection invokeHttps(final HttpsURLConnection con, String targetEntity,
-        String targetServiceName) {
+                                          String targetServiceName) {
         return this.invokeGeneric(con, targetEntity, targetServiceName);
     }
 
@@ -319,7 +323,7 @@
      */
     public void invokeReturn() {
         MDC.put(OnapLogConstants.Mdcs.RESPONSE_STATUS_CODE,
-            OnapLogConstants.ResponseStatus.COMPLETE.toString());
+                OnapLogConstants.ResponseStatus.COMPLETE.toString());
         // Add the Invoke-return marker and clear the needed MDC
         this.mlogger.info(OnapLogConstants.Markers.INVOKE_RETURN, "INVOKE-RETURN");
         invokeReturnContext();
@@ -328,7 +332,7 @@
     /**
      * Dependency-free nullcheck.
      *
-     * @param in to be checked
+     * @param in  to be checked
      * @param <T> argument (and return) type
      * @return input arg
      */
@@ -368,16 +372,16 @@
     /**
      * Set target related logging variables in thread local data via MDC.
      *
-     * @param targetEntity Target entity (an external/sub component, for ex. "sdc")
+     * @param targetEntity      Target entity (an external/sub component, for ex. "sdc")
      * @param targetServiceName Target service name (name of API invoked on target)
-     * @param invocationId The invocation ID
+     * @param invocationId      The invocation ID
      */
     private void invokeContext(String targetEntity, String targetServiceName, String invocationId) {
         MDC.put(OnapLogConstants.Mdcs.TARGET_ENTITY, defaultToEmpty(targetEntity));
         MDC.put(OnapLogConstants.Mdcs.TARGET_SERVICE_NAME, defaultToEmpty(targetServiceName));
         MDC.put(OnapLogConstants.Mdcs.INVOCATIONID_OUT, invocationId);
         MDC.put(OnapLogConstants.Mdcs.INVOKE_TIMESTAMP, ZonedDateTime.now(ZoneOffset.UTC)
-            .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO)));
+                .format(DateTimeFormatter.ofPattern(DATE_FORMATTER_ISO)));
     }
 
     /**
@@ -392,15 +396,15 @@
     }
 
     private <T extends URLConnection> T invokeGeneric(final T con, String targetEntity,
-        String targetServiceName) {
+                                                      String targetServiceName) {
         final String invocationId = UUID.randomUUID().toString();
 
         // Set standard HTTP headers on (southbound request) builder.
         con.setRequestProperty(OnapLogConstants.Headers.REQUEST_ID,
-            defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.REQUEST_ID)));
+                defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.REQUEST_ID)));
         con.setRequestProperty(OnapLogConstants.Headers.INVOCATION_ID, invocationId);
         con.setRequestProperty(OnapLogConstants.Headers.PARTNER_NAME,
-            defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.PARTNER_NAME)));
+                defaultToEmpty(MDC.get(OnapLogConstants.Mdcs.PARTNER_NAME)));
 
         invokeContext(targetEntity, targetServiceName, invocationId);
 
diff --git a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupPayload.java b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupPayload.java
index a10f6df..c6b4407 100644
--- a/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupPayload.java
+++ b/src/main/java/org/onap/policy/clamp/policy/pdpgroup/PdpGroupPayload.java
@@ -62,7 +62,7 @@
      * Constructor that takes a list of actions in input.
      *
      * @param listOfPdpActions The list of actions that needs to be done.
-     *                            e.g: {"Pdpactions":["DELETE/PdpGroup1/PdpSubGroup1/PolicyName1/1.0.0",....]}
+     *                         e.g: {"Pdpactions":["DELETE/PdpGroup1/PdpSubGroup1/PolicyName1/1.0.0",....]}
      * @throws PdpGroupPayloadException in case of issues to read the listOfActions
      */
     public PdpGroupPayload(final JsonElement listOfPdpActions) throws PdpGroupPayloadException {
@@ -74,7 +74,7 @@
      * This method converts the list of actions directly to the pdp payload query as String.
      *
      * @param listOfPdpActions The list of actions that needs to be done.
-     *                            e.g: {"Pdpactions":["DELETE/PdpGroup1/PdpSubGroup1/PolicyName1/1.0.0",....]}
+     *                         e.g: {"Pdpactions":["DELETE/PdpGroup1/PdpSubGroup1/PolicyName1/1.0.0",....]}
      * @return The string containing the PDP payload that can be sent directly
      * @throws PdpGroupPayloadException in case of issues to read the listOfActions
      */
@@ -115,12 +115,16 @@
         newSubGroup.setPdpType(pdpSubGroup);
         newSubGroup.setAction(DeploymentSubGroup.Action.valueOf(action));
         newSubGroup.setPolicies(Arrays.asList(new ToscaConceptIdentifier(policyName, policyVersion)));
-        // Then the group
-        DeploymentGroup newGroup = new DeploymentGroup();
-        newGroup.setName(pdpGroup);
-        newGroup.setDeploymentSubgroups(Arrays.asList(newSubGroup));
         // Add to deployment Groups structure
-        this.deploymentGroups.getGroups().add(newGroup);
+        this.deploymentGroups.getGroups().stream().filter(group ->
+                group.getName().equals(pdpGroup)).findFirst()
+                .ifPresentOrElse(group -> group.getDeploymentSubgroups().add(newSubGroup),
+                        () -> {
+                            DeploymentGroup newGroup = new DeploymentGroup();
+                            newGroup.setName(pdpGroup);
+                            newGroup.setDeploymentSubgroups(new ArrayList<>(Arrays.asList(newSubGroup)));
+                            this.deploymentGroups.getGroups().add(newGroup);
+                        });
     }
 
     /**
diff --git a/src/main/resources/clds/camel/rest/clamp-api-v2.xml b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
index 50e8d58..bba76f7 100644
--- a/src/main/resources/clds/camel/rest/clamp-api-v2.xml
+++ b/src/main/resources/clds/camel/rest/clamp-api-v2.xml
@@ -1461,10 +1461,9 @@
             </route>
         </delete>
 
-        <put uri="/v2/policies/pdpDeployment"
-             type="com.google.gson.JsonElement"
-             consumes="application/json">
+        <put uri="/v2/policies/pdpDeployment" type="com.google.gson.JsonElement" consumes="application/json">
             <route>
+                <removeHeaders pattern="*"/>
                 <doTry>
                     <to
                             uri="bean:org.onap.policy.clamp.flow.log.FlowLogOperation?method=startLog(*, 'Pdp group deployment update')"/>
diff --git a/src/test/resources/example/policy/pdp-group-multi-policies-payload.json b/src/test/resources/example/policy/pdp-group-multi-policies-payload.json
index f8625eb..5e9c77f 100644
--- a/src/test/resources/example/policy/pdp-group-multi-policies-payload.json
+++ b/src/test/resources/example/policy/pdp-group-multi-policies-payload.json
@@ -12,12 +12,7 @@
               "version": "1.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpgroup1",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpsubgroup1",
           "action": "POST",
@@ -27,12 +22,7 @@
               "version": "1.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpgroup1",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpsubgroup1",
           "action": "POST",
@@ -57,12 +47,7 @@
               "version": "1.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpgroup2",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpsubgroup2",
           "action": "POST",
@@ -72,12 +57,7 @@
               "version": "2.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpgroup2",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpsubgroup2",
           "action": "DELETE",
@@ -91,4 +71,4 @@
       ]
     }
   ]
-}
\ No newline at end of file
+}
diff --git a/src/test/resources/example/policy/pdp-group-policy-payload.json b/src/test/resources/example/policy/pdp-group-policy-payload.json
index 44a48da..897fb43 100644
--- a/src/test/resources/example/policy/pdp-group-policy-payload.json
+++ b/src/test/resources/example/policy/pdp-group-policy-payload.json
@@ -12,12 +12,7 @@
               "version": "1.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpGroup2",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpSubgroup2",
           "action": "POST",
@@ -27,12 +22,7 @@
               "version": "1.0.0"
             }
           ]
-        }
-      ]
-    },
-    {
-      "name": "pdpGroup2",
-      "deploymentSubgroups": [
+        },
         {
           "pdpType": "pdpSubgroup1",
           "action": "POST",