Support for FIQL queries on REST retreive operations
[controller.git] / opendaylight / northbound / containermanager / src / main / java / org / opendaylight / controller / containermanager / northbound / ContainerManagerNorthbound.java
index 511addae78135332f77cae3bdcbf570bb8029b24..754167814d763555ede965c5de8c6ee867f5c9f5 100644 (file)
@@ -9,7 +9,6 @@
 
 package org.opendaylight.controller.containermanager.northbound;
 
-import java.security.Principal;
 import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
@@ -18,22 +17,25 @@ import java.util.Set;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
-import javax.ws.rs.POST;
 import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
+import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.SecurityContext;
 import javax.ws.rs.core.UriInfo;
-import javax.xml.bind.JAXBElement;
+import javax.ws.rs.ext.ContextResolver;
 
 import org.codehaus.enunciate.jaxrs.ResponseCode;
 import org.codehaus.enunciate.jaxrs.StatusCodes;
 import org.codehaus.enunciate.jaxrs.TypeHint;
+import org.opendaylight.controller.containermanager.ContainerConfig;
+import org.opendaylight.controller.containermanager.ContainerFlowConfig;
 import org.opendaylight.controller.containermanager.IContainerAuthorization;
+import org.opendaylight.controller.containermanager.IContainerManager;
 import org.opendaylight.controller.northbound.commons.RestMessages;
 import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
 import org.opendaylight.controller.northbound.commons.exception.InternalServerErrorException;
@@ -41,6 +43,7 @@ import org.opendaylight.controller.northbound.commons.exception.ResourceConflict
 import org.opendaylight.controller.northbound.commons.exception.ResourceForbiddenException;
 import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
 import org.opendaylight.controller.northbound.commons.exception.UnauthorizedException;
+import org.opendaylight.controller.northbound.commons.query.QueryContext;
 import org.opendaylight.controller.northbound.commons.utils.NorthboundUtils;
 import org.opendaylight.controller.sal.authorization.Privilege;
 import org.opendaylight.controller.sal.authorization.UserLevel;
@@ -49,10 +52,6 @@ import org.opendaylight.controller.sal.utils.ServiceHelper;
 import org.opendaylight.controller.sal.utils.Status;
 import org.opendaylight.controller.usermanager.IUserManager;
 
-import org.opendaylight.controller.containermanager.ContainerFlowConfig;
-import org.opendaylight.controller.containermanager.IContainerManager;
-import org.opendaylight.controller.containermanager.ContainerConfig;
-
 /**
  * Container Manager Northbound API
  *
@@ -72,12 +71,20 @@ import org.opendaylight.controller.containermanager.ContainerConfig;
 @Path("/")
 public class ContainerManagerNorthbound {
     private String username;
+    private QueryContext queryContext;
+
+    @Context
+    public void setQueryContext(ContextResolver<QueryContext> queryCtxResolver) {
+      if (queryCtxResolver != null) {
+        queryContext = queryCtxResolver.getContext(QueryContext.class);
+      }
+    }
 
     @Context
     public void setSecurityContext(SecurityContext context) {
-        Principal principal;
-        principal = context.getUserPrincipal();
-        username = principal.getName();
+        if (context != null && context.getUserPrincipal() != null) {
+            username = context.getUserPrincipal().getName();
+        }
     }
 
     protected String getUserName() {
@@ -115,11 +122,11 @@ public class ContainerManagerNorthbound {
      * Example:
      *
      * Request URL:
-     * http://localhost:8080/controller/nb/v2/containermanager/all
+     * http://localhost:8080/controller/nb/v2/containermanager/containers
      *
-     * Response Payload in XML:
-     * &lt;container-config-list&gt;
-     *    &#x20;&#x20;&#x20;&lt;container-config&gt;
+     * Response body in XML:
+     * &lt;containerConfig-list&gt;
+     *    &#x20;&#x20;&#x20;&lt;containerConfig&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;container&gt;black&lt;/container&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;staticVlan&gt;10&lt;/staticVlan&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nodeConnectors&gt;OF|1@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
@@ -128,8 +135,8 @@ public class ContainerManagerNorthbound {
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;name&gt;tcp&lt;/name&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;TCP&lt;/protocol&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;/flowSpecs&gt;
-     *    &#x20;&#x20;&#x20;&#x20;&lt;/container-config&gt;
-     *    &#x20;&#x20;&#x20;&#x20;&lt;container-config&gt;
+     *    &#x20;&#x20;&#x20;&#x20;&lt;/containerConfig&gt;
+     *    &#x20;&#x20;&#x20;&#x20;&lt;containerConfig&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;container&gt;red&lt;/container&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;staticVlan&gt;20&lt;/staticVlan&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nodeConnectors&gt;OF|1@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
@@ -138,29 +145,56 @@ public class ContainerManagerNorthbound {
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;name&gt;udp&lt;/name&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;UDP&lt;/protocol&gt;
      *    &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;/flowSpecs&gt;
-     *  &#x20;&#x20;&#x20;&#x20;&lt;/container-config&gt;
-     * &lt;/container-config-list&gt;
-     *
-     * Response Payload in JSON:
-     * { "container-config" : [ { "name" : "black", "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|23@OF|00:00:00:00:00:00:20:21"], "staticVlan" : "10", "flowSpecs : [{ "name": "udp", "protocol": "UDP" }] } ] }
-     * { "container-config" : [ { "name" : "red", "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|23@OF|00:00:00:00:00:00:20:21"], "staticVlan" : "20", "flowSpecs": [{ "name": "tcp", "protocol": "TCP" }] } ] }
-     *
+     *  &#x20;&#x20;&#x20;&#x20;&lt;/containerConfig&gt;
+     * &lt;/containerConfig-list&gt;
+     *
+     * Response body in JSON:
+     * { "containerConfig" : [
+     *     { "container" : "black",
+     *       "nodeConnectors" : [
+     *          "OF|1@OF|00:00:00:00:00:00:00:01", "OF|23@OF|00:00:00:00:00:00:20:21"
+     *       ],
+     *       "staticVlan" : "10",
+     *       "flowSpecs : [
+     *          { "name": "udp",
+     *            "protocol": "UDP" }
+     *       ]
+     *     },
+     *     { "container" : "red",
+     *       "nodeConnectors" : [
+     *          "OF|1@OF|00:00:00:00:00:00:00:01",
+     *          "OF|23@OF|00:00:00:00:00:00:20:21"
+     *       ],
+     *       "staticVlan" : "20",
+     *       "flowSpecs": [
+     *          { "name": "tcp",
+     *            "protocol": "TCP"
+     *          }
+     *       ]
+     *     }
+     *   ]
+     * }
      * </pre>
      */
-    @Path("/all")
+    @Path("/containers")
     @GET
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @TypeHint(ContainerConfigs.class)
     @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"),
             @ResponseCode(code = 401, condition = "User is not authorized to perform this operation"),
             @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
-    public ContainerConfigs viewAllContainers() {
+    public ContainerConfigs viewAllContainers(@QueryParam("_q") String queryString) {
 
         handleNetworkAuthorization(getUserName());
 
         IContainerManager containerManager = getContainerManager();
-
-        return new ContainerConfigs(containerManager.getContainerConfigList());
+        ContainerConfigs result = new ContainerConfigs(
+                containerManager.getContainerConfigList());
+        if (queryString != null) {
+            queryContext.createQuery(queryString, ContainerConfigs.class)
+                .filter(result, ContainerConfig.class);
+        }
+        return result;
     }
 
     /**
@@ -177,17 +211,28 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/blue
      *
-     * Response Payload in XML:
-     * &lt;container-config&gt;
+     * Response body in XML:
+     * &lt;containerConfig&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;container&gt;blue&lt;/container&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;staticVlan&gt;10&lt;/staticVlan&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;nodeConnectors&gt;OF|1@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;nodeConnectors&gt;OF|23@OF|00:00:00:00:00:00:20:21&lt;/nodeConnectors&gt;
-     * &lt;/container-config&gt;
-     *
-     * Response Payload in JSON:
-     * { "container" : "blue", "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|23@OF|00:00:00:00:00:00:20:21"], "staticVlan" : "10" }
-     *
+     * &lt;/containerConfig&gt;
+     *
+     * Response body in JSON:
+     * {
+     *    "containerConfig": [
+     *       {
+     *        "container": "yellow",
+     *        "staticVlan": "10",
+     *        "nodeConnectors": [
+     *           "OF|1@OF|00:00:00:00:00:00:00:01",
+     *           "OF|2@OF|00:00:00:00:00:00:00:02"
+     *        ],
+     *        "flowSpecs": []
+     *       }
+     *    ]
+     * }
      * </pre>
      */
     @Path("/container/{container}")
@@ -229,20 +274,27 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/yellow
      *
-     * Request Payload in XML:
-     * &lt;container-config&gt;
+     * Request body in XML:
+     * &lt;containerConfig&gt;
      *   &#x20;&#x20;&#x20;&#x20;&lt;container&gt;yellow&lt;/container&gt;
      *   &#x20;&#x20;&#x20;&#x20;&lt;staticVlan&gt;10&lt;/staticVlan&gt;
      *   &#x20;&#x20;&#x20;&#x20;&lt;nodeConnectors&gt;&lt;/nodeConnectors&gt;
-     * &lt;/container-config&gt;
-     *
-     * Request Payload in JSON:
-     * { "container" : "yellow", "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|23@OF|00:00:00:00:00:00:20:21"], "staticVlan" : "10"}
+     * &lt;/containerConfig&gt;
+     *
+     * Request body in JSON:
+     * {
+     *    "container" : "yellow",
+     *    "nodeConnectors" : [
+     *       "OF|1@OF|00:00:00:00:00:00:00:01",
+     *       "OF|23@OF|00:00:00:00:00:00:20:21"
+     *    ],
+     *    "staticVlan" : "10"
+     * }
      *
      * </pre>
      */
     @Path("/container/{container}")
-    @POST
+    @PUT
     @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @StatusCodes({ @ResponseCode(code = 201, condition = "Container created successfully"),
             @ResponseCode(code = 400, condition = "Invalid Container configuration."),
@@ -324,18 +376,27 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/green/flowspec/ssh
      *
-     * Response Payload in XML:
-     * &lt;container-flowconfig&gt;
+     * Response body in XML:
+     * &lt;flow-spec-config&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;name&gt;ssh&lt;/name&gt;
+     *  &#x20;&#x20;&#x20;&#x20;&lt;dlVlan&gt;52&lt;/dlVlan&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;nwSrc&gt;10.0.0.101&lt;/nwSrc&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;nwDst&gt;10.0.0.102&lt;/nwDst&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;IPv4&lt;/protocol&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;tpSrc&gt;80&lt;/tpSrc&gt;
      *  &#x20;&#x20;&#x20;&#x20;&lt;tpDst&gt;100&lt;/tpDst&gt;
-     * &lt;/container-flowconfig&gt;
-     *
-     * Response Payload in JSON:
-     * { "protocol" : "IPv4", "nwDst" : "10.0.0.102", "name" : "ssh", "nwSrc" : "10.0.0.101", "tpSrc" : "80", "tpDst" : "100" }
+     * &lt;/flow-spec-config&gt;
+     *
+     * Response body in JSON:
+     * {
+     *    "protocol" : "IPv4",
+     *    "dlVlan" : "52",
+     *    "nwDst" : "10.0.0.102",
+     *    "name" : "ssh",
+     *    "nwSrc" : "10.0.0.101",
+     *    "tpSrc" : "80",
+     *    "tpDst" : "100"
+     * }
      *
      * </pre>
      */
@@ -381,40 +442,63 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/red/flowspec
      *
-     * Response Payload in XML:
-     * &lt;container-flowconfigs&gt;
-     *   &#x20;&#x20;&#x20;&#x20;&lt;container-flowconfig&gt;
+     * Response body in XML:
+     * &lt;flow-spec-configs&gt;
+     *   &#x20;&#x20;&#x20;&#x20;&lt;flow-spec-config&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;name&gt;ssh&lt;/name&gt;
+     *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;dlVlan&gt;52&lt;/dlVlan&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nwSrc&gt;10.0.0.101&lt;/nwSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nwDst&gt;10.0.0.102&lt;/nwDst&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;IPv4&lt;/protocol&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;tpSrc&gt;23&lt;/tpSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;tpDst&gt;100&lt;/tpDst&gt;
-     *   &#x20;&#x20;&#x20;&#x20;&lt;/container-flowconfig&gt;
-     *   &#x20;&#x20;&#x20;&#x20;&lt;container-flowconfig&gt;
+     *   &#x20;&#x20;&#x20;&#x20;&lt;/flow-spec-config&gt;
+     *   &#x20;&#x20;&#x20;&#x20;&lt;flow-spec-config&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;name&gt;http2&lt;/name&gt;
+     *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;dlVlan&gt;123&lt;/dlVlan&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nwSrc&gt;10.0.0.201&lt;/nwSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;nwDst&gt;10.0.0.202&lt;/nwDst&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;&lt;/protocol&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;tpSrc&gt;80&lt;/tpSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&#x20;&#x20;&lt;tpDst&gt;100&lt;/tpDst&gt;
-     *   &#x20;&#x20;&#x20;&#x20;&lt;/container-flowconfig&gt;
-     * &lt;/container-flowconfigs&gt;
-     *
-     * Response Payload in JSON:
-     * { "protocol" : "IPv4", "nwDst" : "10.0.0.102", "name" : "ssh" , "nwSrc" : "10.0.0.101", "tpSrc" : "23", "tpDst" : "100" }
-     * { "protocol" : "", "nwDst" : "10.0.0.202", "name" : "http" , "nwSrc" : "10.0.0.201", "tpSrc" : "80", "tpDst" : "100" }
+     *   &#x20;&#x20;&#x20;&#x20;&lt;/flow-spec-config&gt;
+     * &lt;/flow-spec-configs&gt;
+     *
+      * Response body in JSON:
+     * {
+     *   "flow-spec-config": [
+     *     {
+     *       "name": "http",
+     *       "dlVlan" : "52",
+     *       "nwSrc": "10.0.0.201",
+     *       "nwDst": "10.0.0.202",
+     *       "protocol": "",
+     *       "tpSrc": "80",
+     *       "tpDst": "100"
+     *     },
+     *     {
+     *       "name": "ssh",
+     *       "dlVlan" : "123",
+     *       "nwSrc": "10.0.0.101",
+     *       "nwDst": "10.0.0.102",
+     *       "protocol": "IPv4",
+     *       "tpSrc": "23",
+     *       "tpDst": "100"
+     *     }
+     *   ]
+     * }
      *
      * </pre>
      */
-    @Path("/container/{container}/flowspec")
+    @Path("/container/{container}/flowspecs")
     @GET
     @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
     @TypeHint(FlowSpecConfigs.class)
     @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"),
             @ResponseCode(code = 404, condition = "The container is not found"),
             @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") })
-    public FlowSpecConfigs viewContainerFlowSpecs(@PathParam(value = "container") String container) {
+    public FlowSpecConfigs viewContainerFlowSpecs(@PathParam(value = "container") String container,
+        @QueryParam("_q") String queryString) {
 
         handleContainerAuthorization(container, getUserName());
         handleForbiddenOnDefault(container);
@@ -422,8 +506,13 @@ public class ContainerManagerNorthbound {
         handleContainerNotExists(container);
 
         IContainerManager containerManager = getContainerManager();
-
-        return new FlowSpecConfigs(containerManager.getContainerFlows(container));
+        FlowSpecConfigs result = new FlowSpecConfigs(
+                containerManager.getContainerFlows(container));
+        if (queryString != null) {
+            queryContext.createQuery(queryString, FlowSpecConfigs.class)
+                .filter(result, ContainerFlowConfig.class);
+        }
+        return result;
     }
 
     /**
@@ -446,18 +535,27 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/purple/flowspec/http
      *
-     * Request Payload in XML:
-     *   &lt;container-flowconfig&gt;
+     * Request body in XML:
+     *   &lt;flow-spec-config&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;name&gt;http&lt;/name&gt;
+     *     &#x20;&#x20;&#x20;&#x20;&lt;dlVlan&gt;25&lt;/dlVlan&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;nwSrc&gt;10.0.0.101&lt;/nwSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;nwDst&gt;10.0.0.102&lt;/nwDst&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;protocol&gt;&lt;/protocol&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;tpSrc&gt;80&lt;/tpSrc&gt;
      *     &#x20;&#x20;&#x20;&#x20;&lt;tpDst&gt;100&lt;/tpDst&gt;
-     *   &lt;/container-flowconfig&gt;
-     *
-     * Request Payload in JSON:
-     * { "protocol" : "", "nwDst" : "10.0.0.102", "name" : "http", "nwSrc" : "10.0.0.101", "tpSrc" : "80", "tpDst" : "100" }
+     *   &lt;/flow-spec-config&gt;
+     *
+     * Request body in JSON:
+     * {
+     *    "name" : "http",
+     *    "dlVlan" : "25",
+     *    "nwSrc" : "10.0.0.101",
+     *    "nwDst" : "10.0.0.102",
+     *    "protocol" : "",
+     *    "tpSrc" : "80",
+     *    "tpDst" : "100"
+     * }
      *
      * </pre>
      */
@@ -554,16 +652,23 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/green/nodeconnector
      *
-     * Request Payload in XML:
-     * &lt;list&gt;
+     * Request body in XML:
+     * &lt;nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|1@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|2@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|3@OF|00:00:00:00:00:00:00:22&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|4@OF|00:00:00:00:00:00:00:22&lt;/nodeConnectors&gt;
-     * &lt;/list&gt;
-     *
-     * Request Payload in JSON:
-     * { "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|2@OF|00:00:00:00:00:00:00:01", "OF|3@OF|00:00:00:00:00:00:00:22", "OF|4@OF|00:00:00:00:00:00:00:22" }
+     * &lt;/nodeConnectors&gt;
+     *
+     * Request body in JSON:
+     * {
+     *    "nodeConnectors" : [
+     *       "OF|1@OF|00:00:00:00:00:00:00:01",
+     *       "OF|2@OF|00:00:00:00:00:00:00:01",
+     *       "OF|3@OF|00:00:00:00:00:00:00:22",
+     *       "OF|4@OF|00:00:00:00:00:00:00:22"
+     *    ]
+     * }
      *
      * </pre>
      */
@@ -609,16 +714,23 @@ public class ContainerManagerNorthbound {
      * Request URL:
      * http://localhost:8080/controller/nb/v2/containermanager/container/red/nodeconnector
      *
-     * Request Payload in XML:
-     * &lt;list&gt;
+     * Request body in XML:
+     * &lt;nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|1@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|2@OF|00:00:00:00:00:00:00:01&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|3@OF|00:00:00:00:00:00:00:22&lt;/nodeConnectors&gt;
      *     &lt;nodeConnectors&gt;OF|4@OF|00:00:00:00:00:00:00:22&lt;/nodeConnectors&gt;
-     * &lt;/list&gt;
-     *
-     * Request Payload in JSON:
-     * { "nodeConnectors" : ["OF|1@OF|00:00:00:00:00:00:00:01", "OF|2@OF|00:00:00:00:00:00:00:01", "OF|3@OF|00:00:00:00:00:00:00:22", "OF|4@OF|00:00:00:00:00:00:00:22" }
+     * &lt;/nodeConnectors&gt;
+     *
+     * Request body in JSON:
+     * {
+     *    "nodeConnectors" : [
+     *       "OF|1@OF|00:00:00:00:00:00:00:01",
+     *       "OF|2@OF|00:00:00:00:00:00:00:01",
+     *       "OF|3@OF|00:00:00:00:00:00:00:22",
+     *       "OF|4@OF|00:00:00:00:00:00:00:22"
+     *       ]
+     * }
      *
      * </pre>
      */