X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fstaticrouting%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fforwarding%2Fstaticrouting%2Fnorthbound%2FStaticRoutingNorthbound.java;h=20f6cb40a56cb812fa5370a5dd01cc6bf2ef85e8;hb=refs%2Fchanges%2F10%2F7610%2F5;hp=3deb8dfa7b59766fab862b6151e3b2f00e4fc6d3;hpb=abe7cd0f3412d447cf054e618ce1c7c7fa096745;p=controller.git diff --git a/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java b/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java index 3deb8dfa7b..20f6cb40a5 100644 --- a/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java +++ b/opendaylight/northbound/staticrouting/src/main/java/org/opendaylight/controller/forwarding/staticrouting/northbound/StaticRoutingNorthbound.java @@ -15,15 +15,17 @@ import java.util.List; 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.xml.bind.JAXBElement; +import javax.ws.rs.core.UriInfo; +import javax.ws.rs.ext.ContextResolver; import org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -37,6 +39,7 @@ import org.opendaylight.controller.northbound.commons.exception.NotAcceptableExc import org.opendaylight.controller.northbound.commons.exception.ResourceConflictException; 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.utils.GlobalConstants; @@ -44,25 +47,48 @@ import org.opendaylight.controller.sal.utils.ServiceHelper; import org.opendaylight.controller.sal.utils.Status; /** - * Static Routing Northbound APIs + *

Static Routing Northbound API allows for the management of the static + * routes.

+ *
+ * An example request/response for retrieving the static routes may look like this:
+ *
+ * GET http://localhost:8080/controller/nb/v2/staticroute/default HTTP/1.1
+ * Accept: application/json
+ *
+ * HTTP/1.1 200 OK
+ * Content-Type: application/json
+ *
+ * { "staticRoute":[
+ *       "name":"route-1",
+ *       "prefix":"10.10.1.0/24",
+ *       "nextHop":"1.1.1.1"
+ *   ]
+ * }
+ *
+ * 
* *

* Authentication scheme : HTTP Basic
* Authentication realm : opendaylight
* Transport : HTTP and HTTPS
*
- * HTTPS Authentication is disabled by default. Administrator can enable it in tomcat-server.xml after adding - * a proper keystore / SSL certificate from a trusted authority.
- * More info : http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration */ @Path("/") public class StaticRoutingNorthbound { 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) { - username = context.getUserPrincipal().getName(); + if (context != null && context.getUserPrincipal() != null) username = context.getUserPrincipal().getName(); } protected String getUserName() { return username; @@ -93,12 +119,39 @@ public class StaticRoutingNorthbound { } /** - * Returns a list of static routes present on the given container + * Get a list of static routes present on the given container. * * @param containerName Name of the Container. The Container name for the base controller is "default". * @return List of configured static routes on the given container + * + *
+     * Example:
+     *
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/staticroute/default/routes
+     *
+     * Response body in XML:
+     *  <list>
+     *   <staticRoute>
+     *     <name>route-1</name>
+     *     <prefix>10.10.1.0/24</prefix>
+     *     <nextHop>1.1.1.1</nextHop>
+     *   </staticRoute>
+     *  </list>
+     *
+     * Response body in JSON:
+     * {
+     *    "staticRoute": [
+     *      {
+     *       "name": "route-1",
+     *       "prefix": "10.10.1.0/24",
+     *       "nextHop": "1.1.1.1"
+     *      }
+     *    ]
+     * }
+     * 
*/ - @Path("/{containerName}") + @Path("/{containerName}/routes") @GET @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(StaticRoutes.class) @@ -106,7 +159,8 @@ public class StaticRoutingNorthbound { @ResponseCode(code = 200, condition = "Operation successful"), @ResponseCode(code = 404, condition = "The containerName passed was not found") }) public StaticRoutes getStaticRoutes( - @PathParam("containerName") String containerName) { + @PathParam("containerName") String containerName, + @QueryParam("_q") String queryString) { if(!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)){ @@ -114,17 +168,45 @@ public class StaticRoutingNorthbound { UnauthorizedException("User is not authorized to perform this operation on container " + containerName); } - return new StaticRoutes(getStaticRoutesInternal(containerName)); + StaticRoutes result = new StaticRoutes(getStaticRoutesInternal(containerName)); + if (queryString != null) { + queryContext.createQuery(queryString, StaticRoutes.class) + .filter(result, StaticRoute.class); + } + return result; } /** * Returns the static route for the provided configuration name on a given container * * @param containerName Name of the Container. The Container name for the base controller is "default". - * @param name Name of the Static Route configuration + * @param route Name of the Static Route configuration * @return Static route configured with the supplied Name. + * + *
+     * Example:
+     *
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+     *
+     * Response body in XML:
+     *
+     *   <staticRoute>
+     *     <name>route-1</name>
+     *     <prefix>10.10.1.0/24</prefix>
+     *     <nextHop>1.1.1.1</nextHop>
+     *   </staticRoute>
+     *
+     * Response body in JSON:
+     * {
+     *    "name":"route-1",
+     *    "prefix":"10.10.1.0/24",
+     *    "nextHop":"1.1.1.1"
+     * }
+     *
+     * 
*/ - @Path("/{containerName}/{name}") + @Path("/{containerName}/route/{route}") @GET @Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @TypeHint(StaticRoute.class) @@ -133,7 +215,7 @@ public class StaticRoutingNorthbound { @ResponseCode(code = 404, condition = "The Container Name or Static Route Configuration name passed was not found") }) public StaticRoute getStaticRoute( @PathParam("containerName") String containerName, - @PathParam("name") String name) { + @PathParam("route") String route) { if(!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)){ @@ -142,9 +224,9 @@ public class StaticRoutingNorthbound { + containerName); } List routes = this.getStaticRoutesInternal(containerName); - for (StaticRoute route : routes) { - if (route.getName().equalsIgnoreCase(name)) { - return route; + for (StaticRoute r : routes) { + if (r.getName().equalsIgnoreCase(route)) { + return r; } } @@ -154,14 +236,35 @@ public class StaticRoutingNorthbound { /** * - * Add a new Static Route + * Add a new Static Route. If a route by the given name already exists, this + * method will return a non-successful status response. * * @param containerName Name of the Container. The Container name for the base controller is "default". - * @param name Name of the Static Route configuration + * @param route Name of the Static Route configuration * @return Response as dictated by the HTTP Response code + * + *
+     * Example:
+     *
+     * Request URL:
+     * http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+     *
+     * Request body in XML:
+     * <staticRoute>
+     *   <name>route-1</name>
+     *   <prefix>10.10.1.0/24</prefix>
+     *   <nextHop>1.1.1.1</nextHop>
+     *   </staticRoute>
+     * Request body in JSON:
+     * {
+     *    "name":"route-1",
+     *    "prefix":"10.10.1.0/24",
+     *    "nextHop":"1.1.1.1"
+     * }
+     * 
*/ - @Path("/{containerName}/{name}") - @POST + @Path("/{containerName}/route/{route}") + @PUT @Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes( { @ResponseCode(code = 201, condition = "Created Static Route successfully"), @@ -169,9 +272,10 @@ public class StaticRoutingNorthbound { @ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active"), @ResponseCode(code = 409, condition = "Failed to create Static Route entry due to Conflicting Name or Prefix."), }) public Response addStaticRoute( + @Context UriInfo uriInfo, @PathParam(value = "containerName") String containerName, - @PathParam(value = "name") String name, - @TypeHint(StaticRoute.class) JAXBElement staticRouteData) { + @PathParam(value = "route") String route, + @TypeHint(StaticRoute.class) StaticRoute staticRouteData) { if(!NorthboundUtils.isAuthorized(getUserName(), containerName, @@ -191,13 +295,13 @@ public class StaticRoutingNorthbound { .toString()); } - StaticRoute sRoute = staticRouteData.getValue(); + StaticRoute sRoute = staticRouteData; StaticRouteConfig cfgObject = new StaticRouteConfig(sRoute.getName(), sRoute.getPrefix(), sRoute.getNextHop()); Status response = staticRouting.addStaticRoute(cfgObject); if (response.isSuccess()) { - NorthboundUtils.auditlog("Static Route", username, "added", name, containerName); - return Response.status(Response.Status.CREATED).build(); + NorthboundUtils.auditlog("Static Route", username, "added", route, containerName); + return Response.created(uriInfo.getRequestUri()).build(); } throw new ResourceConflictException(response.getDescription()); } @@ -207,20 +311,27 @@ public class StaticRoutingNorthbound { * Delete a Static Route * * @param containerName Name of the Container. The Container name for the base controller is "default". - * @param name Name of the Static Route configuration to be removed + * @param route Name of the Static Route configuration to be removed * * @return Response as dictated by the HTTP Response code + * + *
+     * Example:
+     *
+     * Request URL:
+     * DELETE http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+     *
+     * 
*/ - - @Path("/{containerName}/{name}") + @Path("/{containerName}/route/{route}") @DELETE @StatusCodes( { - @ResponseCode(code = 200, condition = "Operation successful"), + @ResponseCode(code = 204, condition = "Static route removed successfully"), @ResponseCode(code = 404, condition = "Container Name or Configuration Name not found"), @ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active") }) public Response removeStaticRoute( @PathParam(value = "containerName") String containerName, - @PathParam(value = "name") String name) { + @PathParam(value = "route") String route) { if(!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)){ @@ -239,12 +350,12 @@ public class StaticRoutingNorthbound { .toString()); } - Status status = staticRouting.removeStaticRoute(name); + Status status = staticRouting.removeStaticRoute(route); if (status.isSuccess()) { - NorthboundUtils.auditlog("Static Route", username, "removed", name, containerName); - return Response.ok().build(); + NorthboundUtils.auditlog("Static Route", username, "removed", route, containerName); + return Response.noContent().build(); } - throw new ResourceNotFoundException(status.getDescription()); + return NorthboundUtils.getResponse(status); } private void handleDefaultDisabled(String containerName) {