package org.opendaylight.controller.networkconfig.neutron.northbound;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
+import javax.ws.rs.DefaultValue;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
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.UriInfo;
import javax.ws.rs.core.Response;
import org.codehaus.enunciate.jaxrs.ResponseCode;
@Path("/networks")
public class NeutronNetworksNorthbound {
+ @Context
+ UriInfo uriInfo;
+
private NeutronNetwork extractFields(NeutronNetwork o, List<String> fields) {
return o.extractFields(fields);
}
//@TypeHint(OpenStackNetworks.class)
@StatusCodes({
@ResponseCode(code = 200, condition = "Operation successful"),
- @ResponseCode(code = 401, condition = "Unauthorized") })
+ @ResponseCode(code = 401, condition = "Unauthorized")})
public Response listNetworks(
// return fields
@QueryParam("fields") List<String> fields,
@QueryParam("provider_physical_network") String queryProviderPhysicalNetwork,
@QueryParam("provider_segmentation_id") String queryProviderSegmentationID,
// pagination
- @QueryParam("limit") String limit,
+ @QueryParam("limit") Integer limit,
@QueryParam("marker") String marker,
- @QueryParam("page_reverse") String pageReverse
+ @DefaultValue("false") @QueryParam("page_reverse") Boolean pageReverse
// sorting not supported
) {
INeutronNetworkCRUD networkInterface = NeutronCRUDInterfaces.getINeutronNetworkCRUD( this);
}
}
}
- //TODO: apply pagination to results
- return Response.status(200).entity(
- new NeutronNetworkRequest(ans)).build();
+
+ Comparator<NeutronNetwork> neutronNetworkComparator = new Comparator<NeutronNetwork>() {
+ @Override
+ public int compare(NeutronNetwork o1, NeutronNetwork o2) {
+ return o1.getID().compareTo(o2.getID());
+ }
+ };
+
+ Collections.sort(ans, neutronNetworkComparator);
+
+ if (limit != null && ans.size() > 1) {
+ List<NeutronPageLink> links = new ArrayList<>();
+ Integer startPos = null;
+ String startMarker;
+ String endMarker;
+ Boolean firstPage = false;
+ Boolean lastPage = false;
+
+ if (marker == null) {
+ startPos = 0;
+ }
+
+ else {
+
+ NeutronNetwork markerNetwork = new NeutronNetwork();
+ markerNetwork.setNetworkUUID(marker);
+
+ startPos = Collections.binarySearch(ans, markerNetwork, neutronNetworkComparator);
+
+ if (!pageReverse){
+ startPos = startPos + 1;
+ }
+ else {
+ startPos = startPos - limit;
+ }
+
+ }
+
+ if (startPos == null) {
+ throw new ResourceNotFoundException("UUID for marker:" + marker + " could not be found");
+ }
+
+ if (startPos == 0){
+ firstPage = true;
+ }
+
+ if (startPos + limit >= ans.size()) {
+ ans = ans.subList(startPos, ans.size());
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(ans.size() - 1).getID();
+ lastPage = true;
+ }
+ else if (startPos < 0) {
+ if (startPos + limit > 0) {
+ ans = ans.subList(0, startPos + limit);
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(ans.size() - 1).getID();
+ firstPage = true;
+ }
+ else {
+ throw new BadRequestException("Requested page is out of bounds. Please check the supplied limit and marker");
+ }
+ }
+ else {
+ ans = ans.subList(startPos, startPos + limit);
+ startMarker = ans.get(0).getID();
+ endMarker = ans.get(limit-1).getID();
+ }
+
+ if (!lastPage) {
+ NeutronPageLink next = new NeutronPageLink();
+ next.setRef("next");
+ next.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + endMarker);
+ links.add(next);
+ }
+
+ if (!firstPage) {
+ NeutronPageLink previous = new NeutronPageLink();
+ previous.setRef("previous");
+ previous.setHref(uriInfo.getAbsolutePath().toString() + "?limit=" + limit.toString() + "&marker=" + startMarker + "&page_reverse=True");
+ links.add(previous);
+ }
+
+ return Response.status(200).entity(new PaginatedNeutronNetworkRequest(ans, links)).build();
+ }
+
+ return Response.status(200).entity(new NeutronNetworkRequest(ans)).build();
+
}
/**