Change-Id: I252c0338780be7eb80d577bbcdfe8455aa171c8c
Signed-off-by: Prasanth Pallamreddy <ppallamr@cisco.com>
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
-@XmlRootElement
-@XmlAccessorType(XmlAccessType.NONE)
- * This class contains static route data that is returned as a response to the NorthBound GET request.
- *
- *
+ * StaticRoute represents the static route data that is returned as a response to
+ * the NorthBound GET request.
+@XmlRootElement
+@XmlAccessorType(XmlAccessType.NONE)
public class StaticRoute {
public class StaticRoute {
+ /**
+ * The name of the static route.
+ */
@XmlElement
private String name;
@XmlElement
private String name;
+
+ /**
+ * The prefix for the route.
+ * Format: A.B.C.D/MM Where A.B.C.D is the Default Gateway IP (L3) or ARP Querier IP (L2)
+ */
- private String prefix; // A.B.C.D/MM Where A.B.C.D is the Default Gateway IP (L3) or ARP Querier IP (L2)
+ private String prefix;
+
+ /**
+ * NextHop IP-Address (or) datapath ID/port list: xx:xx:xx:xx:xx:xx:xx:xx/a,b,c-m,r-t,y
+ */
- private String nextHop; // NextHop IP-Address (or) datapath ID/port list: xx:xx:xx:xx:xx:xx:xx:xx/a,b,c-m,r-t,y
+ private String nextHop;
import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
import org.opendaylight.controller.forwardingrulesmanager.FlowConfig;
+/**
+ * This class represents a list of static routes.
+ */
+@XmlRootElement(name = "list")
@XmlAccessorType(XmlAccessType.NONE)
@XmlAccessorType(XmlAccessType.NONE)
public class StaticRoutes {
@XmlElement
List<StaticRoute> staticRoute;
public class StaticRoutes {
@XmlElement
List<StaticRoute> staticRoute;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.SecurityContext;
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 org.codehaus.enunciate.jaxrs.ResponseCode;
import javax.xml.bind.JAXBElement;
import org.codehaus.enunciate.jaxrs.ResponseCode;
import org.opendaylight.controller.sal.utils.Status;
/**
import org.opendaylight.controller.sal.utils.Status;
/**
- * Static Routing Northbound APIs
+ * <p>Static Routing Northbound API allows for the management of the static
+ * routes.</p>
+ * </br>
+ * An example request/response for retrieving the static routes may look like this: </br>
+ * <pre>
+ * 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"}}
+ *
+ * </pre>
*
* <br><br>
* Authentication scheme : <b>HTTP Basic</b><br>
* Authentication realm : <b>opendaylight</b><br>
* Transport : <b>HTTP and HTTPS</b><br>
* <br>
*
* <br><br>
* Authentication scheme : <b>HTTP Basic</b><br>
* Authentication realm : <b>opendaylight</b><br>
* Transport : <b>HTTP and HTTPS</b><br>
* <br>
- * 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.<br>
- * More info : http://tomcat.apache.org/tomcat-7.0-doc/ssl-howto.html#Configuration
*/
@Path("/")
public class StaticRoutingNorthbound {
*/
@Path("/")
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
*
* @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
+ *
+ * <pre>
+ * Example:
+ *
+ * Request URL:
+ * GET http://localhost:8080/controller/nb/v2/staticroute/default
+ *
+ * Response in XML:
+ * <list>
+ * <staticRoute>
+ * <name>route-1</name>
+ * <prefix>10.10.1.0/24</prefix>
+ * <nextHop>1.1.1.1</nextHop>
+ * </staticRoute>
+ * </list>
+ *
+ * Response in JSON:
+ * {"staticRoute":{"name":"route-1","prefix":"10.10.1.0/24","nextHop":"1.1.1.1"}}
+ *
+ * </pre>
*/
@Path("/{containerName}")
@GET
*/
@Path("/{containerName}")
@GET
* 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".
* 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.
* @return Static route configured with the supplied Name.
+ *
+ * <pre>
+ * Example:
+ *
+ * Request URL:
+ * GET http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+ *
+ * Response in XML:
+ *
+ * <staticRoute>
+ * <name>route-1</name>
+ * <prefix>10.10.1.0/24</prefix>
+ * <nextHop>1.1.1.1</nextHop>
+ * </staticRoute>
+ *
+ * Response in JSON:
+ * {"name":"route-1","prefix":"10.10.1.0/24","nextHop":"1.1.1.1"}
+ *
+ * </pre>
- @Path("/{containerName}/{name}")
+ @Path("/{containerName}/route/{route}")
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(StaticRoute.class)
@GET
@Produces( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@TypeHint(StaticRoute.class)
@ResponseCode(code = 404, condition = "The Container Name or Static Route Configuration name passed was not found") })
public StaticRoute getStaticRoute(
@PathParam("containerName") String containerName,
@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)){
if(!NorthboundUtils.isAuthorized(getUserName(), containerName,
Privilege.WRITE, this)){
+ containerName);
}
List<StaticRoute> routes = this.getStaticRoutesInternal(containerName);
+ containerName);
}
List<StaticRoute> 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;
* Add a new Static Route
*
* @param containerName Name of the Container. The Container name for the base controller is "default".
* Add a new 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
+ * @param route Name of the Static Route configuration
* @return Response as dictated by the HTTP Response code
* @return Response as dictated by the HTTP Response code
+ *
+ * <pre>
+ * Example:
+ *
+ * Request URL:
+ * POST http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+ *
+ * Request payload in JSON:
+ * {"name":"route-1","prefix":"10.10.1.0/24","nextHop":"1.1.1.1"}
+ *
+ * </pre>
- @Path("/{containerName}/{name}")
+ @Path("/{containerName}/route/{route}")
@POST
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes( {
@POST
@Consumes( { MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes( {
@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(
@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 = "containerName") String containerName,
- @PathParam(value = "name") String name,
+ @PathParam(value = "route") String route,
@TypeHint(StaticRoute.class) JAXBElement<StaticRoute> staticRouteData) {
@TypeHint(StaticRoute.class) JAXBElement<StaticRoute> staticRouteData) {
sRoute.getPrefix(), sRoute.getNextHop());
Status response = staticRouting.addStaticRoute(cfgObject);
if (response.isSuccess()) {
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());
}
}
throw new ResourceConflictException(response.getDescription());
}
* Delete a Static Route
*
* @param containerName Name of the Container. The Container name for the base controller is "default".
* 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
*
* @return Response as dictated by the HTTP Response code
+ *
+ * <pre>
+ * Example:
+ *
+ * Request URL:
+ * DELETE http://localhost:8080/controller/nb/v2/staticroute/default/route/route-1
+ *
+ * </pre>
-
- @Path("/{containerName}/{name}")
+ @Path("/{containerName}/route/{route}")
@DELETE
@StatusCodes( {
@ResponseCode(code = 200, condition = "Operation successful"),
@DELETE
@StatusCodes( {
@ResponseCode(code = 200, condition = "Operation successful"),
@ResponseCode(code = 406, condition = "Cannot operate on Default Container when other Containers are active") })
public Response removeStaticRoute(
@PathParam(value = "containerName") String containerName,
@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)){
if(!NorthboundUtils.isAuthorized(getUserName(), containerName,
Privilege.WRITE, this)){
- Status status = staticRouting.removeStaticRoute(name);
+ Status status = staticRouting.removeStaticRoute(route);
if (status.isSuccess()) {
if (status.isSuccess()) {
- NorthboundUtils.auditlog("Static Route", username, "removed", name, containerName);
+ NorthboundUtils.auditlog("Static Route", username, "removed", route, containerName);
return Response.ok().build();
}
throw new ResourceNotFoundException(status.getDescription());
return Response.ok().build();
}
throw new ResourceNotFoundException(status.getDescription());