From: Pramila Singh Date: Mon, 26 Aug 2013 17:01:46 +0000 (-0700) Subject: Northbound cleanup for Switch Manager X-Git-Tag: releasepom-0.1.0~174^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=48238a15a5d1fb46a7248d3fe276df71898f7c2a Northbound cleanup for Switch Manager Change-Id: If312264096eeefd0f32c2556fd8387d8a3d7a3de Signed-off-by: Pramila Singh --- diff --git a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeConnectors.java b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeConnectors.java index 4a31317d95..32e1002c94 100644 --- a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeConnectors.java +++ b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/NodeConnectors.java @@ -15,7 +15,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement +@XmlRootElement(name="list") @XmlAccessorType(XmlAccessType.NONE) public class NodeConnectors { diff --git a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/Nodes.java b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/Nodes.java index b7f1c53ae8..061e51732e 100644 --- a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/Nodes.java +++ b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/Nodes.java @@ -15,7 +15,7 @@ import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; -@XmlRootElement +@XmlRootElement(name="list") @XmlAccessorType(XmlAccessType.NONE) public class Nodes { diff --git a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java index e67d1b7568..98aa5ad94e 100644 --- a/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java +++ b/opendaylight/northbound/switchmanager/src/main/java/org/opendaylight/controller/switchmanager/northbound/SwitchNorthbound.java @@ -107,11 +107,56 @@ public class SwitchNorthbound { * Retrieve a list of all the nodes and their properties in the network * * @param containerName - * The container for which we want to retrieve the list + * Name of the Container (Eg. 'default') * @return A list of Pair each pair represents a * {@link org.opendaylight.controller.sal.core.Node} and Set of * {@link org.opendaylight.controller.sal.core.Property} attached to * it. + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/nodes
+     *
+     * Response in XML:
+     * <list>
+     *        <nodeProperties>
+     *               <node type="OF" id="00:00:00:00:00:00:00:02"/>
+     *               <properties>
+     *                      <tables>
+     *                             <value>-1</value>
+     *                      </tables>
+     *                      <description>
+     *                             <value>Switch2</value>
+     *                      </description>
+     *                      <actions>
+     *                             <value>4095</value>
+     *                      </actions>
+     *                      <macAddress>
+     *                             <value>00:00:00:00:00:02</value>
+     *                      </macAddress>
+     *                      <capabilities>
+     *                             <value>199</value>
+     *                      </capabilities>
+     *                      <timeStamp>
+     *                             <value>1377291227877</value>
+     *                             <name>connectedSince</name>
+     *                      </timeStamp>
+     *                      <buffers>
+     *                             <value>256</value>
+     *                      </buffers>
+     *               </properties>
+     *        </nodeProperties>
+     * </list>
+     *
+     * Response in JSON:
+     * {"nodeProperties":[{"node":{"@type":"OF","@id":"00:00:00:00:00:00:00:02"},"properties":{"tables":{"value":"-1"},
+     * "description":{"value":"None"},"actions":{"value":"4095"},"macAddress":{"value":"00:00:00:00:00:02"},"capabilities"
+     * :{"value":"199"},"timeStamp":{"value":"1377291227877","name":"connectedSince"},"buffers":{"value":"256"}}}]}
+     *
+     * 
*/ @Path("/{containerName}/nodes") @GET @@ -119,6 +164,7 @@ public class SwitchNorthbound { @TypeHint(Nodes.class) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public Nodes getNodes(@PathParam("containerName") String containerName) { @@ -161,49 +207,54 @@ public class SwitchNorthbound { } /** - * Add a Name, Tier and Forwarding mode property to a node. - * - *
-     * Example Request:
-     *  http://localhost:8080/controller/nb/v2/switch/red/node/OF/00:00:00:00:00:03/property/description/Switch3
-     *  (Valid properties that can be configured are: description, forwarding(only for default container) and tier)
-     * 
+ * Add a Description, Tier and Forwarding mode property to a node. * * @param containerName - * Name of the Container + * Name of the Container (Eg. 'default') * @param nodeType - * Type of the node being programmed + * Type of the node being programmed (Eg. 'OF') * @param nodeId * Node Identifier as specified by * {@link org.opendaylight.controller.sal.core.Node} - * @param propName - * Name of the Property specified by - * {@link org.opendaylight.controller.sal.core.Property} and its - * extended classes - * @param propValue - * Value of the Property specified by - * {@link org.opendaylight.controller.sal.core.Property} and its - * extended classes + * (Eg. '00:00:00:00:00:00:00:03') + * @param propertyName + * Name of the Property. Properties that can be + * configured are: description, forwarding(only for default + * container) and tier + * @param propertyValue + * Value of the Property. Description can be any string (Eg. 'Node1'), + * valid values for tier are 0, 1 and 2, and valid values for forwarding are 0 for + * reactive and 1 for proactive forwarding. * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/node/OF/00:00:00:00:00:00:00:03/property/description/Switch3
+     *
+     * 
*/ - @Path("/{containerName}/node/{nodeType}/{nodeId}/property/{propName}/{propValue}") + @Path("/{containerName}/node/{nodeType}/{nodeId}/property/{propertyName}/{propertyValue}") @PUT @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(Response.class) @StatusCodes({ - @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 201, condition = "Operation successful"), @ResponseCode(code = 400, condition = "The nodeId or configuration is invalid"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The Container Name or node or configuration name is not found"), @ResponseCode(code = 406, condition = "The property cannot be configured in non-default container"), - @ResponseCode(code = 409, condition = "Unable to update configuration due to cluster conflict"), + @ResponseCode(code = 409, condition = "Unable to update configuration due to cluster conflict or conflicting description property"), @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) public Response addNodeProperty( @PathParam("containerName") String containerName, @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, - @PathParam("propName") String propName, - @PathParam("propValue") String propValue) { + @PathParam("propertyName") String propertyName, + @PathParam("propertyValue") String propertyValue) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -222,9 +273,9 @@ public class SwitchNorthbound { handleNodeAvailability(containerName, nodeType, nodeId); Node node = Node.fromString(nodeType, nodeId); - Property prop = switchManager.createProperty(propName, propValue); + Property prop = switchManager.createProperty(propertyName, propertyValue); if (prop == null) { - throw new ResourceNotFoundException("Property with name " + propName + " does not exist."); + throw new ResourceNotFoundException("Property with name " + propertyName + " does not exist."); } SwitchConfig switchConfig = switchManager.getSwitchConfig(node.toString()); Map nodeProperties = (switchConfig == null) ? new HashMap() @@ -232,29 +283,36 @@ public class SwitchNorthbound { nodeProperties.put(prop.getName(), prop); SwitchConfig newSwitchConfig = new SwitchConfig(node.toString(), nodeProperties); Status status = switchManager.updateNodeConfig(newSwitchConfig); + if (status.isSuccess()) { + return Response.status(Response.Status.CREATED).build(); + } return NorthboundUtils.getResponse(status); } /** * Delete a property of a node * - *
-     * Example Request:
-     *  http://localhost:8080/controller/nb/v2/switch/default/node/OF/00:00:00:00:00:03/property/forwarding
-     * 
- * * @param containerName - * Name of the Container + * Name of the Container (Eg. 'SliceRed') * @param nodeType - * Type of the node being programmed + * Type of the node being programmed (Eg. 'OF') * @param nodeId * Node Identifier as specified by * {@link org.opendaylight.controller.sal.core.Node} + * (Eg. '00:00:00:00:00:03:01:02') * @param propertyName - * Name of the Property specified by - * {@link org.opendaylight.controller.sal.core.Property} and its - * extended classes + * Name of the Property. Properties that can be deleted are + * description, forwarding(only in default container) and tier. * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/node/OF/00:00:00:00:00:00:00:03/property/forwarding
+     *
+     * 
*/ @Path("/{containerName}/node/{nodeType}/{nodeId}/property/{propertyName}") @@ -263,6 +321,7 @@ public class SwitchNorthbound { @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 400, condition = "The nodeId or configuration is invalid"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The Container Name or nodeId or configuration name is not found"), @ResponseCode(code = 409, condition = "Unable to delete property due to cluster conflict"), @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) @@ -313,21 +372,56 @@ public class SwitchNorthbound { /** * - * Retrieve a list of all the node connectors and their properties in a + * Retrieve a list of all the nodeconnectors and their properties in a * given node * * @param containerName - * The container for which we want to retrieve the list + * The container for which we want to retrieve the list (Eg. + * 'default') * @param nodeType - * Type of the node being programmed + * Type of the node being programmed (Eg. 'OF') * @param nodeId * Node Identifier as specified by - * {@link org.opendaylight.controller.sal.core.Node} + * {@link org.opendaylight.controller.sal.core.Node} (Eg. + * '00:00:00:00:00:00:00:03') * @return A List of Pair each pair represents a * {@link org.opendaylight.controller.sal.core.NodeConnector} and * its corresponding * {@link org.opendaylight.controller.sal.core.Property} attached to * it. + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/node/OF/00:00:00:00:00:00:00:01
+     *
+     * Response in XML:
+     * <list>
+     *        <nodeConnectorProperties>
+     *               <nodeconnector type="OF" id="2">
+     *                      <node type="OF" id="00:00:00:00:00:00:00:01"/>
+     *               </nodeconnector>
+     *               <properties>
+     *                      <state>
+     *                             <value>1</value>
+     *                      </state>
+     *                      <config>
+     *                             <value>1</value>
+     *                      </config>
+     *                      <name>
+     *                             <value>L1_2-C2_1</value>
+     *                      </name>
+     *               </properties>
+     *        </nodeConnectorProperties>
+     * </list>
+     *
+     * Response in JSON:
+     * {"nodeConnectorProperties":[{"nodeconnector":{"@type":"OF","@id":"2","node":{"@type":"OF","@id":"00:00:00:00:00:00:00:01"}},
+     * "properties":{"state":{"value":"1"},"config":{"value":"1"},"name":{"value":"L1_2-C2_1"}}}]}
+     *
+     * 
*/ @Path("/{containerName}/node/{nodeType}/{nodeId}") @GET @@ -335,6 +429,7 @@ public class SwitchNorthbound { @TypeHint(NodeConnectors.class) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public NodeConnectors getNodeConnectors( @@ -382,37 +477,51 @@ public class SwitchNorthbound { } /** - * Add a Name/Bandwidth property to a node connector + * Add Bandwidth property to a node connector * * @param containerName - * Name of the Container + * Name of the Container (Eg. 'default') * @param nodeType - * Type of the node being programmed + * Type of the node being programmed (Eg. 'OF') * @param nodeId * Node Identifier as specified by * {@link org.opendaylight.controller.sal.core.Node} + * (Eg. '00:00:00:00:00:00:00:03') * @param nodeConnectorType - * Type of the node connector being programmed + * Type of the node connector being programmed (Eg. 'OF') * @param nodeConnectorId * NodeConnector Identifier as specified by * {@link org.opendaylight.controller.sal.core.NodeConnector} - * @param propName + * (Eg. '2') + * @param propertyName * Name of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its * extended classes - * @param propValue + * Property that can be configured is bandwidth + * @param propertyValue * Value of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its * extended classes * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth/1
+     *
+     * 
*/ - @Path("/{containerName}/nodeconnector/{nodeType}/{nodeId}/{nodeConnectorType}/{nodeConnectorId}/property/{propName}/{propValue}") + @Path("/{containerName}/nodeconnector/{nodeType}/{nodeId}/{nodeConnectorType}/{nodeConnectorId}/property/{propertyName}/{propertyValue}") @PUT @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ - @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 201, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The Container Name or nodeId or configuration name is not found"), + @ResponseCode(code = 409, condition = "Unable to add property due to cluster conflict"), @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) public Response addNodeConnectorProperty( @PathParam("containerName") String containerName, @@ -420,8 +529,8 @@ public class SwitchNorthbound { @PathParam("nodeId") String nodeId, @PathParam("nodeConnectorType") String nodeConnectorType, @PathParam("nodeConnectorId") String nodeConnectorId, - @PathParam("propName") String propName, - @PathParam("propValue") String propValue) { + @PathParam("propertyName") String propertyName, + @PathParam("propertyValue") String propertyValue) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -447,7 +556,7 @@ public class SwitchNorthbound { NodeConnector nc = NodeConnector .fromStringNoNode(nodeConnectorType, nodeConnectorId, node); - Property prop = switchManager.createProperty(propName, propValue); + Property prop = switchManager.createProperty(propertyName, propertyValue); if (prop == null) { throw new ResourceNotFoundException( RestMessages.INVALIDDATA.toString()); @@ -464,22 +573,33 @@ public class SwitchNorthbound { * Delete a property of a node connector * * @param containerName - * Name of the Container + * Name of the Container (Eg. 'default') * @param nodeType - * Type of the node being programmed + * Type of the node being programmed (Eg. 'OF') * @param nodeId * Node Identifier as specified by * {@link org.opendaylight.controller.sal.core.Node} + * (Eg. '00:00:00:00:00:00:00:01') * @param nodeConnectorType - * Type of the node connector being programmed + * Type of the node connector being programmed (Eg. 'OF') * @param nodeConnectorId * NodeConnector Identifier as specified by * {@link org.opendaylight.controller.sal.core.NodeConnector} + * (Eg. '1') * @param propertyName * Name of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its - * extended classes + * extended classes. Property that can be deleted is bandwidth * @return Response as dictated by the HTTP Response Status code + * + *
+     *
+     * Example:
+     *
+     * RequestURL:
+     * http://.../default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth
+     *
+     * 
*/ @Path("/{containerName}/nodeconnector/{nodeType}/{nodeId}/{nodeConnectorType}/{nodeConnectorId}/property/{propertyName}") @@ -487,6 +607,7 @@ public class SwitchNorthbound { @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The Container Name or nodeId or configuration name is not found"), @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) public Response deleteNodeConnectorProperty( @@ -528,125 +649,30 @@ public class SwitchNorthbound { throw new ResourceNotFoundException(ret.getDescription()); } - /* *//** - * Retrieve a list of Span ports that were configured previously. - * - * @param containerName - * Name of the Container - * @return list of - * {@link org.opendaylight.controller.switchmanager.SpanConfig} - * resources - */ - /* - * @Path("/span-config/{containerName}") - * - * @GET - * - * @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - * - * @StatusCodes( { - * - * @ResponseCode(code = 200, condition = "Operation successful"), - * - * @ResponseCode(code = 404, condition = "The containerName is not found"), - * - * @ResponseCode(code = 503, condition = - * "One or more of Controller Services are unavailable") }) public - * List getSpanConfigList(@PathParam("containerName") String - * containerName) { ISwitchManager switchManager = (ISwitchManager) - * getIfSwitchManagerService(containerName); if (switchManager == null) { - * throw new ServiceUnavailableException("Switch Manager " + - * RestMessages.SERVICEUNAVAILABLE.toString()); } - * - * return switchManager.getSpanConfigList(); } - *//** - * Add a span configuration - * - * @param containerName - * Name of the Container - * @param config - * {@link org.opendaylight.controller.switchmanager.SpanConfig} - * in JSON or XML format - * @return Response as dictated by the HTTP Response Status code - */ - /* - * @Path("/span-config/{containerName}") - * - * @PUT - * - * @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - * - * @StatusCodes( { - * - * @ResponseCode(code = 200, condition = "Operation successful"), - * - * @ResponseCode(code = 404, condition = "The containerName is not found"), - * - * @ResponseCode(code = 503, condition = - * "One or more of Controller Services are unavailable") }) public Response - * addSpanConfig(@PathParam("containerName") String containerName, - * - * @TypeHint(SubnetConfig.class) JAXBElement config) { - * ISwitchManager switchManager = (ISwitchManager) - * getIfSwitchManagerService(containerName); if (switchManager == null) { - * throw new ServiceUnavailableException("Switch Manager " + - * RestMessages.SERVICEUNAVAILABLE.toString()); } - * - * String ret = switchManager.addSpanConfig(config.getValue()); if - * (ret.equals(ReturnString.SUCCESS.toString())) { return - * Response.status(Response.Status.CREATED).build(); } throw new - * InternalServerErrorException(ret); } - *//** - * Delete a span configuration + /** + * Save the current switch configurations * * @param containerName - * Name of the Container - * @param config - * {@link org.opendaylight.controller.switchmanager.SpanConfig} - * in JSON or XML format + * Name of the Container (Eg. 'default') * @return Response as dictated by the HTTP Response Status code - */ - /* - * @Path("/span-config/{containerName}") - * - * @DELETE - * - * @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) * - * @StatusCodes( { - * - * @ResponseCode(code = 200, condition = "Operation successful"), - * - * @ResponseCode(code = 404, condition = "The containerName is not found"), + *
      *
-     * @ResponseCode(code = 503, condition =
-     * "One or more of Controller Services are unavailable") }) public Response
-     * deleteSpanConfig(@PathParam("containerName") String containerName,
+     * Example:
      *
-     * @TypeHint(SubnetConfig.class) JAXBElement config) {
-     * ISwitchManager switchManager = (ISwitchManager)
-     * getIfSwitchManagerService(containerName); if (switchManager == null) {
-     * throw new ServiceUnavailableException("Switch Manager " +
-     * RestMessages.SERVICEUNAVAILABLE.toString()); }
+     * RequestURL:
+     * http://.../default/switch-config
      *
-     * String ret = switchManager.removeSpanConfig(config.getValue()); if
-     * (ret.equals(ReturnString.SUCCESS.toString())) { return
-     * Response.ok().build(); } throw new ResourceNotFoundException(ret); }
-     */
-
-    /**
-     * Save the current switch configurations
-     *
-     * @param containerName
-     *            Name of the Container
-     * @return Response as dictated by the HTTP Response Status code
+     * 
*/ @Path("/{containerName}/switch-config") @POST @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 401, condition = "User not authorized to perform this operation"), @ResponseCode(code = 404, condition = "The containerName is not found"), + @ResponseCode(code = 500, condition = "Failed to save switch configuration. Failure Reason included in HTTP Error response"), @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable") }) public Response saveSwitchConfig( @PathParam("containerName") String containerName) {