X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fswitchmanager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fswitchmanager%2Fnorthbound%2FSwitchNorthbound.java;h=e30dad24ab18866b1c455a8facf7bf347a0d22b2;hp=1edd945dfa708f7d68f5f6a081c3795f3bcefff8;hb=a2122cefdd97d2eaba4fb82d580e7e7ae7496eb2;hpb=ea480e65e834dfb817b35b715641c3dba5ef00f7 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 1edd945dfa..e30dad24ab 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 @@ -63,7 +63,9 @@ public class SwitchNorthbound { @Context public void setSecurityContext(SecurityContext context) { - if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); + if (context != null && context.getUserPrincipal() != null) { + username = context.getUserPrincipal().getName(); + } } protected String getUserName() { @@ -71,11 +73,10 @@ public class SwitchNorthbound { } private ISwitchManager getIfSwitchManagerService(String containerName) { - IContainerManager containerManager = (IContainerManager) ServiceHelper - .getGlobalInstance(IContainerManager.class, this); + IContainerManager containerManager = (IContainerManager) ServiceHelper.getGlobalInstance( + IContainerManager.class, this); if (containerManager == null) { - throw new ServiceUnavailableException("Container " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Container " + RestMessages.SERVICEUNAVAILABLE.toString()); } boolean found = false; @@ -88,16 +89,14 @@ public class SwitchNorthbound { } if (found == false) { - throw new ResourceNotFoundException(containerName + " " - + RestMessages.NOCONTAINER.toString()); + throw new ResourceNotFoundException(containerName + " " + RestMessages.NOCONTAINER.toString()); } - ISwitchManager switchManager = (ISwitchManager) ServiceHelper - .getInstance(ISwitchManager.class, containerName, this); + ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, + this); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } return switchManager; @@ -114,14 +113,14 @@ public class SwitchNorthbound { * {@link org.opendaylight.controller.sal.core.Property} attached to * it. * - *
+     *         
      *
      * Example:
      *
-     * RequestURL:
-     * http://localhost:8080/controller/nb/v2/switch/default/nodes
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/switchmanager/default/nodes
      *
-     * Response in XML:
+     * Response body in XML:
      * <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
      * <list>
      *        <nodeProperties>
@@ -156,10 +155,41 @@ public class SwitchNorthbound {
      *        </nodeProperties>
      * </list>
      *
-     * Response in JSON:
-     * {"nodeProperties":[{"node":{"id":"00:00:00:00:00:00:00:02","type":"OF"},"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"}}}]}
+     * Response body in JSON:
+     * {
+     *    "nodeProperties":[
+     *       {
+     *          "node":{
+     *             "id":"00:00:00:00:00:00:00:02",
+     *             "type":"OF"
+     *          },
+     *          "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"
+     *             }
+     *          }
+     *       }
+     *    ]
+     * }
      *
      * 
*/ @@ -167,34 +197,30 @@ public class SwitchNorthbound { @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @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") }) + @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) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.READ, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } List res = new ArrayList(); Set nodes = switchManager.getNodes(); if (nodes == null) { - return null; + return new Nodes(res); } for (Node node : nodes) { @@ -212,7 +238,9 @@ public class SwitchNorthbound { } /** - * Add a Description, Tier and Forwarding mode property to a node. + * Add a Description, Tier and Forwarding mode property to a node. This + * method returns a non-successful response if a node by that name already + * exists. * * @param containerName * Name of the Container (Eg. 'default') @@ -220,24 +248,24 @@ public class SwitchNorthbound { * 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') + * {@link org.opendaylight.controller.sal.core.Node} (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 + * 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. + * Value of the Property. Description can be any string (Eg. + * 'Node1'), valid values for tier are non negative numbers, 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://localhost:8080/controller/nb/v2/switch/default/node/OF/00:00:00:00:00:00:00:03/property/description/Switch3
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/switchmanager/default/node/OF/00:00:00:00:00:00:00:03/property/description/Switch3
      *
      * 
*/ @@ -247,34 +275,27 @@ public class SwitchNorthbound { @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(Response.class) @StatusCodes({ - @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 or conflicting description property"), - @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) - public Response addNodeProperty( - @Context UriInfo uriInfo, - @PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, - @PathParam("nodeId") String nodeId, - @PathParam("propertyName") String propertyName, - @PathParam("propertyValue") String propertyValue) { + @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 or conflicting description property"), + @ResponseCode(code = 503, condition = "One or more of Controller services are unavailable") }) + public Response addNodeProperty(@Context UriInfo uriInfo, @PathParam("containerName") String containerName, + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, + @PathParam("propertyName") String propertyName, @PathParam("propertyValue") String propertyValue) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } handleNodeAvailability(containerName, nodeType, nodeId); @@ -290,6 +311,9 @@ public class SwitchNorthbound { SwitchConfig newSwitchConfig = new SwitchConfig(node.toString(), nodeProperties); Status status = switchManager.updateNodeConfig(newSwitchConfig); if (status.isSuccess()) { + NorthboundUtils.auditlog("Property " + propertyName, username, "updated", + "of Node " + NorthboundUtils.getNodeDesc(node, switchManager), containerName); + return Response.created(uriInfo.getRequestUri()).build(); } return NorthboundUtils.getResponse(status); @@ -304,19 +328,19 @@ public class SwitchNorthbound { * 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') + * {@link org.opendaylight.controller.sal.core.Node} (Eg. + * '00:00:00:00:00:03:01:02') * @param propertyName * 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://localhost:8080/controller/nb/v2/switch/default/node/OF/00:00:00:00:00:00:00:03/property/forwarding
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/switchmanager/default/node/OF/00:00:00:00:00:00:00:03/property/forwarding
      *
      * 
*/ @@ -324,32 +348,26 @@ public class SwitchNorthbound { @Path("/{containerName}/node/{nodeType}/{nodeId}/property/{propertyName}") @DELETE @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @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") }) - public Response deleteNodeProperty( - @PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, - @PathParam("nodeId") String nodeId, + @StatusCodes({ @ResponseCode(code = 204, condition = "Property removed successfully"), + @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") }) + public Response deleteNodeProperty(@PathParam("containerName") String containerName, + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, @PathParam("propertyName") String propertyName) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } handleNodeAvailability(containerName, nodeType, nodeId); @@ -368,14 +386,95 @@ public class SwitchNorthbound { nodeProperties.remove(propertyName.toLowerCase()); SwitchConfig newSwitchConfig = new SwitchConfig(node.toString(), nodeProperties); status = switchManager.updateNodeConfig(newSwitchConfig); - if(status.isSuccess()){ - NorthboundUtils.auditlog("Static Route", username, "updated", nodeId, containerName); + if (status.isSuccess()) { + NorthboundUtils.auditlog("Property " + propertyName, username, "removed", "of Node " + + NorthboundUtils.getNodeDesc(node, switchManager), containerName); + return Response.noContent().build(); } } } return NorthboundUtils.getResponse(status); } + /** + * Get a property of a node + * + * @param containerName + * Name of the Container (Eg. 'SliceRed') + * @param nodeType + * 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. Properties that can be deleted are + * description, forwarding(only in default container) and tier. + * @return Property value of the property + * + *
+     *
+     * Example:
+     *
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/switchmanager/default/node/OF/00:00:00:00:00:00:00:01/property/description
+     *
+     * Response body in XML
+     * <description>
+     *       <value>switch1</value>
+     * </description>
+     *
+     * Response body in JSON
+     * {
+     *       "value": "switch1"
+     * }
+     * 
+ */ + + @Path("/{containerName}/node/{nodeType}/{nodeId}/property/{propertyName}") + @GET + @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @TypeHint(String.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 Property getNodeProperty(@PathParam("containerName") String containerName, + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, + @PathParam("propertyName") String propertyName) { + + if (!isValidContainer(containerName)) { + throw new ResourceNotFoundException("Container " + containerName + " does not exist."); + } + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); + } + ISwitchManager switchManager = getIfSwitchManagerService(containerName); + if (switchManager == null) { + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); + } + + handleNodeAvailability(containerName, nodeType, nodeId); + Node node = Node.fromString(nodeType, nodeId); + if (node == null) { + throw new ResourceNotFoundException(nodeId + " : " + RestMessages.NONODE.toString()); + } + SwitchConfig switchConfig = switchManager.getSwitchConfig(node.toString()); + if (switchConfig == null) { + throw new ResourceNotFoundException(nodeId + " : " + "Config Not Found" ); + } else { + Map nodeProperties = new HashMap(switchConfig.getNodeProperties()); + if (!nodeProperties.containsKey(propertyName.toLowerCase())) { + String msg = "Property " + propertyName + " does not exist or not " + + "configured for switch " + nodeId; + throw new ResourceNotFoundException(msg); + } else { + return nodeProperties.get(propertyName.toLowerCase()); + } + } + } + /** * * Retrieve a list of all the nodeconnectors and their properties in a given @@ -400,10 +499,10 @@ public class SwitchNorthbound { * * Example: * - * RequestURL: - * http://localhost:8080/controller/nb/v2/switch/default/node/OF/00:00:00:00:00:00:00:01 + * Request URL: + * http://localhost:8080/controller/nb/v2/switchmanager/default/node/OF/00:00:00:00:00:00:00:01 * - * Response in XML: + * Response body in XML: * <?xml version="1.0" encoding="UTF-8" standalone="yes"?> * <list> * <nodeConnectorProperties> @@ -429,9 +528,32 @@ public class SwitchNorthbound { * </nodeConnectorProperties> * </list> * - * Response in JSON: - * {"nodeConnectorProperties":[{"nodeconnector":{"node":{"id":"00:00:00:00:00:00:00:01","type":"OF"},"id":"2","type":"OF"}, - * "properties":{"state":{"value":"1"},"config":{"value":"1"},"name":{"value":"L1_2-C2_1"}}}]} + * Response body in JSON: + * { + * "nodeConnectorProperties":[ + * { + * "nodeconnector":{ + * "node":{ + * "id":"00:00:00:00:00:00:00:01", + * "type":"OF" + * }, + * "id":"2", + * "type":"OF" + * }, + * "properties":{ + * "state":{ + * "value":"1" + * }, + * "config":{ + * "value":"1" + * }, + * "name":{ + * "value":"L1_2-C2_1" + * } + * } + * } + * ] + * } * *
*/ @@ -439,30 +561,24 @@ public class SwitchNorthbound { @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @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( - @PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, - @PathParam("nodeId") String nodeId) { + @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(@PathParam("containerName") String containerName, + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.READ, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } handleNodeAvailability(containerName, nodeType, nodeId); @@ -474,14 +590,12 @@ public class SwitchNorthbound { } for (NodeConnector nc : ncs) { - Map propMap = switchManager - .getNodeConnectorProps(nc); + Map propMap = switchManager.getNodeConnectorProps(nc); if (propMap == null) { continue; } Set props = new HashSet(propMap.values()); - NodeConnectorProperties ncProps = new NodeConnectorProperties(nc, - props); + NodeConnectorProperties ncProps = new NodeConnectorProperties(nc, props); res.add(ncProps); } @@ -489,7 +603,9 @@ public class SwitchNorthbound { } /** - * Add Bandwidth property to a node connector + * Add node-connector property to a node connector. This method returns a + * non-successful response if a node connector by the given name already + * exists. * * @param containerName * Name of the Container (Eg. 'default') @@ -497,19 +613,20 @@ public class SwitchNorthbound { * 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') + * {@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 (Eg. 'OF') * @param nodeConnectorId * NodeConnector Identifier as specified by - * {@link org.opendaylight.controller.sal.core.NodeConnector} - * (Eg. '2') + * {@link org.opendaylight.controller.sal.core.NodeConnector}. + * (Eg. '2'). If nodeConnecterId contains forward slash(/), + * replace forward slash with underscore(_) in the URL. (Eg. for + * Ethernet1/2, use Ethernet1_2) * @param propertyName * Name of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its - * extended classes - * Property that can be configured is bandwidth + * extended classes Property that can be configured is bandwidth * @param propertyValue * Value of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its @@ -520,8 +637,8 @@ public class SwitchNorthbound { * * Example: * - * RequestURL: - * http://localhost:8080/controller/nb/v2/switch/default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth/1 + * Request URL: + * http://localhost:8080/controller/nb/v2/switchmanager/default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth/1 * *
*/ @@ -529,54 +646,49 @@ public class SwitchNorthbound { @Path("/{containerName}/nodeconnector/{nodeType}/{nodeId}/{nodeConnectorType}/{nodeConnectorId}/property/{propertyName}/{propertyValue}") @PUT @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - @StatusCodes({ - @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( - @Context UriInfo uriInfo, - @PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, - @PathParam("nodeId") String nodeId, - @PathParam("nodeConnectorType") String nodeConnectorType, - @PathParam("nodeConnectorId") String nodeConnectorId, - @PathParam("propertyName") String propertyName, + @StatusCodes({ @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(@Context UriInfo uriInfo, + @PathParam("containerName") String containerName, @PathParam("nodeType") String nodeType, + @PathParam("nodeId") String nodeId, @PathParam("nodeConnectorType") String nodeConnectorType, + @PathParam("nodeConnectorId") String nodeConnectorId, @PathParam("propertyName") String propertyName, @PathParam("propertyValue") String propertyValue) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } handleNodeAvailability(containerName, nodeType, nodeId); Node node = Node.fromString(nodeType, nodeId); - handleNodeConnectorAvailability(containerName, node, nodeConnectorType, - nodeConnectorId); - NodeConnector nc = NodeConnector - .fromStringNoNode(nodeConnectorType, nodeConnectorId, node); + if (nodeConnectorId.contains("_")) { + nodeConnectorId = nodeConnectorId.replace("_", "/"); + } + + handleNodeConnectorAvailability(containerName, node, nodeConnectorType, nodeConnectorId); + NodeConnector nc = NodeConnector.fromStringNoNode(nodeConnectorType, nodeConnectorId, node); Property prop = switchManager.createProperty(propertyName, propertyValue); if (prop == null) { - throw new ResourceNotFoundException( - RestMessages.INVALIDDATA.toString()); + throw new ResourceNotFoundException(RestMessages.INVALIDDATA.toString()); } Status ret = switchManager.addNodeConnectorProp(nc, prop); if (ret.isSuccess()) { + NorthboundUtils.auditlog("Property " + propertyName, username, "updated", "of Node Connector " + + NorthboundUtils.getPortName(nc, switchManager), containerName); return Response.created(uriInfo.getRequestUri()).build(); } throw new InternalServerErrorException(ret.getDescription()); @@ -591,14 +703,16 @@ public class SwitchNorthbound { * 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') + * {@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 (Eg. 'OF') * @param nodeConnectorId * NodeConnector Identifier as specified by * {@link org.opendaylight.controller.sal.core.NodeConnector} - * (Eg. '1') + * (Eg. '1'). If nodeConnecterId contains forward slash(/), + * replace forward slash with underscore(_) in the URL. (Eg. for + * Ethernet1/2, use Ethernet1_2) * @param propertyName * Name of the Property specified by * {@link org.opendaylight.controller.sal.core.Property} and its @@ -609,8 +723,8 @@ public class SwitchNorthbound { * * Example: * - * RequestURL: - * http://localhost:8080/controller/nb/v2/switch/default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth + * Request URL: + * http://localhost:8080/controller/nb/v2/switchmanager/default/nodeconnector/OF/00:00:00:00:00:00:00:01/OF/2/property/bandwidth * *
*/ @@ -618,46 +732,42 @@ public class SwitchNorthbound { @Path("/{containerName}/nodeconnector/{nodeType}/{nodeId}/{nodeConnectorType}/{nodeConnectorId}/property/{propertyName}") @DELETE @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( - @PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, - @PathParam("nodeId") String nodeId, + @StatusCodes({ @ResponseCode(code = 204, condition = "Property removed successfully"), + @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(@PathParam("containerName") String containerName, + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, @PathParam("nodeConnectorType") String nodeConnectorType, - @PathParam("nodeConnectorId") String nodeConnectorId, - @PathParam("propertyName") String propertyName) { + @PathParam("nodeConnectorId") String nodeConnectorId, @PathParam("propertyName") String propertyName) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } handleNodeAvailability(containerName, nodeType, nodeId); Node node = Node.fromString(nodeType, nodeId); - handleNodeConnectorAvailability(containerName, node, nodeConnectorType, - nodeConnectorId); - NodeConnector nc = NodeConnector - .fromStringNoNode(nodeConnectorType, nodeConnectorId, node); + if (nodeConnectorId.contains("_")) { + nodeConnectorId = nodeConnectorId.replace("_", "/"); + } + + handleNodeConnectorAvailability(containerName, node, nodeConnectorType, nodeConnectorId); + NodeConnector nc = NodeConnector.fromStringNoNode(nodeConnectorType, nodeConnectorId, node); Status ret = switchManager.removeNodeConnectorProp(nc, propertyName); if (ret.isSuccess()) { - NorthboundUtils.auditlog("Node Connector Property", username, "removed", nc + " from " + nodeConnectorId, containerName); - return Response.ok().build(); + NorthboundUtils.auditlog("Property " + propertyName, username, "removed", "of Node Connector " + + NorthboundUtils.getPortName(nc, switchManager), containerName); + return Response.noContent().build(); } throw new ResourceNotFoundException(ret.getDescription()); } @@ -669,40 +779,36 @@ public class SwitchNorthbound { * Name of the Container (Eg. 'default') * @return Response as dictated by the HTTP Response Status code * - *
+     *         
      *
      * Example:
      *
-     * RequestURL:
-     * http://localhost:8080/controller/nb/v2/switch/default/switch-config
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/switchmanager/default/save
      *
      * 
*/ - @Path("/{containerName}/switch-config") + @Path("/{containerName}/save") @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) { + @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) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = getIfSwitchManagerService(containerName); if (switchManager == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } Status ret = switchManager.saveSwitchConfig(); @@ -712,51 +818,41 @@ public class SwitchNorthbound { throw new InternalServerErrorException(ret.getDescription()); } - private Node handleNodeAvailability(String containerName, String nodeType, - String nodeId) { + private Node handleNodeAvailability(String containerName, String nodeType, String nodeId) { Node node = Node.fromString(nodeType, nodeId); if (node == null) { - throw new ResourceNotFoundException(nodeId + " : " - + RestMessages.NONODE.toString()); + throw new ResourceNotFoundException(nodeId + " : " + RestMessages.NONODE.toString()); } - ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (sm == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } if (!sm.getNodes().contains(node)) { - throw new ResourceNotFoundException(node.toString() + " : " - + RestMessages.NONODE.toString()); + throw new ResourceNotFoundException(node.toString() + " : " + RestMessages.NONODE.toString()); } return node; } - private void handleNodeConnectorAvailability(String containerName, - Node node, String nodeConnectorType, String nodeConnectorId) { + private void handleNodeConnectorAvailability(String containerName, Node node, String nodeConnectorType, + String nodeConnectorId) { - NodeConnector nc = NodeConnector.fromStringNoNode(nodeConnectorType, - nodeConnectorId, node); + NodeConnector nc = NodeConnector.fromStringNoNode(nodeConnectorType, nodeConnectorId, node); if (nc == null) { - throw new ResourceNotFoundException(nc + " : " - + RestMessages.NORESOURCE.toString()); + throw new ResourceNotFoundException(nc + " : " + RestMessages.NORESOURCE.toString()); } - ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + ISwitchManager sm = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (sm == null) { - throw new ServiceUnavailableException("Switch Manager " - + RestMessages.SERVICEUNAVAILABLE.toString()); + throw new ServiceUnavailableException("Switch Manager " + RestMessages.SERVICEUNAVAILABLE.toString()); } if (!sm.getNodeConnectors(node).contains(nc)) { - throw new ResourceNotFoundException(nc.toString() + " : " - + RestMessages.NORESOURCE.toString()); + throw new ResourceNotFoundException(nc.toString() + " : " + RestMessages.NORESOURCE.toString()); } } @@ -764,15 +860,14 @@ public class SwitchNorthbound { if (containerName.equals(GlobalConstants.DEFAULT.toString())) { return true; } - IContainerManager containerManager = (IContainerManager) ServiceHelper - .getGlobalInstance(IContainerManager.class, this); + IContainerManager containerManager = (IContainerManager) ServiceHelper.getGlobalInstance( + IContainerManager.class, this); if (containerManager == null) { - throw new InternalServerErrorException( - RestMessages.INTERNALERROR.toString()); + throw new InternalServerErrorException(RestMessages.INTERNALERROR.toString()); } if (containerManager.getContainerNames().contains(containerName)) { return true; - } + } return false; }