X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fswitchmanager%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fswitchmanager%2Fnorthbound%2FSwitchNorthbound.java;h=dab5d7d1b26785b6f2564d1d0ebb3fbecda861e5;hb=refs%2Fchanges%2F10%2F7610%2F5;hp=662af723ed4861aa339ff99c3cacedb00af20cf2;hpb=8d85564b9e960d56311fee040d2f562d83aed99e;p=controller.git 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 662af723ed..dab5d7d1b2 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 @@ -23,11 +23,13 @@ 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.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -38,6 +40,7 @@ import org.opendaylight.controller.northbound.commons.exception.InternalServerEr import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException; import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException; 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.core.Node; @@ -60,6 +63,14 @@ import org.opendaylight.controller.switchmanager.SwitchConfig; public class SwitchNorthbound { private String username; + private QueryContext queryContext; + + @Context + public void setQueryContext(ContextResolver queryCtxResolver) { + if (queryCtxResolver != null) { + queryContext = queryCtxResolver.getContext(QueryContext.class); + } + } @Context public void setSecurityContext(SecurityContext context) { @@ -200,8 +211,9 @@ public class SwitchNorthbound { @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) { + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex") }) + public Nodes getNodes(@PathParam("containerName") String containerName, @QueryParam("_q") String queryString) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -233,8 +245,12 @@ public class SwitchNorthbound { NodeProperties nodeProps = new NodeProperties(node, props); res.add(nodeProps); } - - return new Nodes(res); + Nodes result = new Nodes(res); + if (queryString != null) { + queryContext.createQuery(queryString, Nodes.class) + .filter(result, NodeProperties.class); + } + return result; } /** @@ -396,6 +412,85 @@ public class SwitchNorthbound { 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 @@ -485,9 +580,11 @@ public class SwitchNorthbound { @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") }) + @ResponseCode(code = 503, condition = "One or more of Controller Services are unavailable"), + @ResponseCode(code = 400, condition = "Incorrect query syntex") }) public NodeConnectors getNodeConnectors(@PathParam("containerName") String containerName, - @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId) { + @PathParam("nodeType") String nodeType, @PathParam("nodeId") String nodeId, + @QueryParam("_q") String queryString) { if (!isValidContainer(containerName)) { throw new ResourceNotFoundException("Container " + containerName + " does not exist."); @@ -519,8 +616,12 @@ public class SwitchNorthbound { NodeConnectorProperties ncProps = new NodeConnectorProperties(nc, props); res.add(ncProps); } - - return new NodeConnectors(res); + NodeConnectors result = new NodeConnectors(res); + if (queryString != null) { + queryContext.createQuery(queryString, NodeConnectors.class) + .filter(result, NodeConnectorProperties.class); + } + return result; } /**