X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fnetworkconfiguration%2Fneutron%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fnetworkconfig%2Fneutron%2Fnorthbound%2FNeutronNetworksNorthbound.java;h=52c3337e40047fb844352fd9dcc0b6c596fcb8d0;hb=b3d2a00776a1a5e3a139d73ced859aa557c931af;hp=c08ee80e24c44f3551d949e0ff607c7264be9167;hpb=7007ef0c2b418b9b49e56e6c3525e8906fefa522;p=controller.git
diff --git a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java
index c08ee80e24..52c3337e40 100644
--- a/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java
+++ b/opendaylight/northbound/networkconfiguration/neutron/src/main/java/org/opendaylight/controller/networkconfig/neutron/northbound/NeutronNetworksNorthbound.java
@@ -9,12 +9,15 @@
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;
@@ -22,7 +25,9 @@ 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.UriInfo;
import javax.ws.rs.core.Response;
import org.codehaus.enunciate.jaxrs.ResponseCode;
@@ -33,12 +38,15 @@ import org.opendaylight.controller.networkconfig.neutron.INeutronNetworkCRUD;
import org.opendaylight.controller.networkconfig.neutron.NeutronCRUDInterfaces;
import org.opendaylight.controller.networkconfig.neutron.NeutronNetwork;
import org.opendaylight.controller.northbound.commons.RestMessages;
+import org.opendaylight.controller.northbound.commons.exception.BadRequestException;
+import org.opendaylight.controller.northbound.commons.exception.ResourceConflictException;
+import org.opendaylight.controller.northbound.commons.exception.ResourceNotFoundException;
import org.opendaylight.controller.northbound.commons.exception.ServiceUnavailableException;
import org.opendaylight.controller.sal.utils.ServiceHelper;
/**
- * Open DOVE Northbound REST APIs for Network.
- * This class provides REST APIs for managing open DOVE internals related to Networks
+ * Neutron Northbound REST APIs for Network.
+ * This class provides REST APIs for managing neutron Networks
*
*
*
@@ -57,6 +65,9 @@ import org.opendaylight.controller.sal.utils.ServiceHelper;
@Path("/networks")
public class NeutronNetworksNorthbound {
+ @Context
+ UriInfo uriInfo;
+
private NeutronNetwork extractFields(NeutronNetwork o, List fields) {
return o.extractFields(fields);
}
@@ -69,7 +80,7 @@ public class NeutronNetworksNorthbound {
//@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 fields,
@@ -85,9 +96,9 @@ public class NeutronNetworksNorthbound {
@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);
@@ -127,9 +138,94 @@ public class NeutronNetworksNorthbound {
}
}
}
- //TODO: apply pagination to results
- return Response.status(200).entity(
- new NeutronNetworkRequest(ans)).build();
+
+ Comparator neutronNetworkComparator = new Comparator() {
+ @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 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();
+
}
/**
@@ -154,7 +250,7 @@ public class NeutronNetworksNorthbound {
+ RestMessages.SERVICEUNAVAILABLE.toString());
}
if (!networkInterface.networkExists(netUUID)) {
- return Response.status(404).build();
+ throw new ResourceNotFoundException("network UUID does not exist.");
}
if (fields.size() > 0) {
NeutronNetwork ans = networkInterface.getNetwork(netUUID);
@@ -189,7 +285,7 @@ public class NeutronNetworksNorthbound {
* network ID can't already exist
*/
if (networkInterface.networkExists(singleton.getID())) {
- return Response.status(400).build();
+ throw new BadRequestException("network UUID already exists");
}
Object[] instances = ServiceHelper.getGlobalInstances(INeutronNetworkAware.class, this, null);
@@ -226,10 +322,10 @@ public class NeutronNetworksNorthbound {
* already in this bulk request
*/
if (networkInterface.networkExists(test.getID())) {
- return Response.status(400).build();
+ throw new BadRequestException("network UUID already exists");
}
if (testMap.containsKey(test.getID())) {
- return Response.status(400).build();
+ throw new BadRequestException("network UUID already exists");
}
if (instances != null) {
for (Object instance: instances) {
@@ -285,10 +381,10 @@ public class NeutronNetworksNorthbound {
* network has to exist and only a single delta is supported
*/
if (!networkInterface.networkExists(netUUID)) {
- return Response.status(404).build();
+ throw new ResourceNotFoundException("network UUID does not exist.");
}
if (!input.isSingleton()) {
- return Response.status(400).build();
+ throw new BadRequestException("only singleton edits supported");
}
NeutronNetwork delta = input.getSingleton();
@@ -297,7 +393,7 @@ public class NeutronNetworksNorthbound {
*/
if (delta.getID() != null || delta.getTenantID() != null ||
delta.getStatus() != null) {
- return Response.status(400).build();
+ throw new BadRequestException("attribute edit blocked by Neutron");
}
Object[] instances = ServiceHelper.getGlobalInstances(INeutronNetworkAware.class, this, null);
@@ -347,10 +443,10 @@ public class NeutronNetworksNorthbound {
* network has to exist and not be in use before it can be removed
*/
if (!networkInterface.networkExists(netUUID)) {
- return Response.status(404).build();
+ throw new ResourceNotFoundException("network UUID does not exist.");
}
if (networkInterface.networkInUse(netUUID)) {
- return Response.status(409).build();
+ throw new ResourceConflictException("Network ID in use");
}
NeutronNetwork singleton = networkInterface.getNetwork(netUUID);