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;
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.NodeConnector;
protected static final Logger logger = LoggerFactory.getLogger(SubnetsNorthbound.class);
private String username;
+ private QueryContext queryContext;
+
+ @Context
+ public void setQueryContext(ContextResolver<QueryContext> queryCtxResolver) {
+ if (queryCtxResolver != null) {
+ queryContext = queryCtxResolver.getContext(QueryContext.class);
+ }
+ }
@Context
public void setSecurityContext(SecurityContext context) {
*
* @return a List of SubnetConfig
*
- * <pre>
+ * <pre>
* Example:
*
- * Request URL: http://localhost:8080/controller/nb/v2/subnetservice/default/subnets
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/subnetservice/default/subnets
*
- * Response in XML:
+ * Response body in XML:
+ * <list>
* <subnetConfig>
* <name>marketingdepartment</name>
* <subnet>30.31.54.254/24</subnet>
* <subnetConfig>
* <name>salesdepartment</name>
* <subnet>20.18.1.254/16</subnet>
- * <nodeConnectors>0F|11@OF|00:00:00:aa:bb:cc:dd:ee>/nodeConnectors>
- * <nodeConnectors>0F|13@OF|00:00:00:aa:bb:cc:dd:ee>/nodeConnectors>
+ * <nodeConnectors>OF|11@OF|00:00:00:aa:bb:cc:dd:ee</nodeConnectors>
+ * <nodeConnectors>OF|13@OF|00:00:00:aa:bb:cc:dd:ee</nodeConnectors>
* </subnetConfig>
- *
- * Response in JSON:
+ * </list>
+ * Response body in JSON:
* {
- * "name":"marketingdepartment",
- * "subnet":"30.31.54.254/24",
- * }
- * {
- * "name":"salesdepartment",
- * "subnet":"20.18.1.254/16",
- * "nodeConnectors":["0F|11@OF|00:00:00:aa:bb:cc:dd:ee", "0F|13@OF|00:00:00:aa:bb:cc:dd:ee"]
+ * "subnetConfig": [
+ * {
+ * "name": "marketingdepartment",
+ * "subnet": "30.31.54.254/24",
+ * "nodeConnectors": [
+ * "OF|04@OF|00:00:00:00:00:00:00:04",
+ * "OF|07@OF|00:00:00:00:00:00:00:07"
+ * ]
+ * },
+ * {
+ * "name":"salesdepartment",
+ * "subnet":"20.18.1.254/16",
+ * "nodeConnectors": [
+ * "OF|11@OF|00:00:00:aa:bb:cc:dd:ee",
+ * "OF|13@OF|00:00:00:aa:bb:cc:dd:ee"
+ * ]
+ * }
+ * ]
* }
+ *
* </pre>
*/
@Path("/{containerName}/subnets")
@Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({ @ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
@ResponseCode(code = 404, condition = "The containerName passed was not found"),
- @ResponseCode(code = 503, condition = "Service unavailable") })
+ @ResponseCode(code = 503, condition = "Service unavailable"),
+ @ResponseCode(code = 400, condition = "Incorrect query syntex") })
@TypeHint(SubnetConfigs.class)
- public SubnetConfigs listSubnets(@PathParam("containerName") String containerName) {
+ public SubnetConfigs listSubnets(@PathParam("containerName") String containerName,
+ @QueryParam("_q") String queryString) {
handleContainerDoesNotExist(containerName);
if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) {
if (switchManager == null) {
throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
- return new SubnetConfigs(switchManager.getSubnetsConfigList());
+ List<SubnetConfig> subnets = switchManager.getSubnetsConfigList();
+ if (queryString != null) {
+ subnets = queryContext.createQuery(queryString, SubnetConfig.class)
+ .find(subnets);
+
+ }
+ return new SubnetConfigs(subnets);
}
/**
* <pre>
* Example:
*
- * Request URL: http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/marketingdepartment
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/marketingdepartment
*
- * Response in XML:
+ * Response body in XML:
* <subnetConfig>
* <name>marketingdepartment</name>
* <subnet>30.0.0.1/24</subnet>
- * <nodeConnectors>0F|1@OF|00:00:11:22:33:44:55:66>/nodePorts>
- * <nodeConnectors>0F|3@OF|00:00:11:22:33:44:55:66>/nodePorts>
+ * <nodeConnectors>OF|1@OF|00:00:00:00:00:00:00:01</nodePorts>
+ * <nodeConnectors>OF|3@OF|00:00:00:00:00:00:00:03</nodePorts>
* </subnetConfig>
*
- * Response in JSON:
+ * Response body in JSON:
* {
* "name":"marketingdepartment",
* "subnet":"30.0.0.1/24",
- * "nodeConnectors":["0F|1@OF|00:00:11:22:33:44:55:66", "0F|3@OF|00:00:11:22:33:44:55:66"]
+ * "nodeConnectors":[
+ * "OF|1@OF|00:00:00:00:00:00:00:01",
+ * "OF|3@OF|00:00:00:00:00:00:00:03"
+ * ]
* }
* </pre>
*/
* <pre>
* Example:
*
- * Request URL: http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
*
- * Request XML:
+ * Request body in XML:
* <subnetConfig>
* <name>salesdepartment</name>
* <subnet>172.173.174.254/24</subnet>
- * <nodeConnectors>0F|22@OF|00:00:11:22:33:44:55:66>/nodeConnectors>
- * <nodeConnectors>0F|39@OF|00:00:ab:cd:33:44:55:66>/nodeConnectors>
+ * <nodeConnectors>OF|22@OF|00:00:11:22:33:44:55:66</nodeConnectors>
+ * <nodeConnectors>OF|39@OF|00:00:ab:cd:33:44:55:66</nodeConnectors>
* </subnetConfig>
*
- * Request in JSON:
+ * Request body in JSON:
* {
* "name":"salesdepartment",
- * "subnet":"172.173.174.254/24"
- * "nodeConnectors":["0F|22@OF|00:00:11:22:33:44:55:66", "0F|39@OF|00:00:ab:cd:33:44:55:66"]
+ * "subnet":"172.173.174.254/24",
+ * "nodeConnectors":[
+ * "OF|22@OF|00:00:11:22:33:44:55:66",
+ * "OF|39@OF|00:00:ab:cd:33:44:55:66"
+ * ]
* }
* </pre>
*/
* name of new subnet to be deleted
* @return Response as dictated by the HTTP Response Status code
*
- * <pre>
+ * <pre>
* Example:
- * Request URL: http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/engdepartment
+ *
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/engdepartment
*
* </pre>
*/
* <pre>
* Example:
*
- * Request URL: http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
+ * Request URL:
+ * http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
*
- * Request in XML:
+ * Request body in XML:
* <subnetConfig>
* <name>salesdepartment</name>
* <subnet>172.173.174.254/24</subnet>
- * <nodeConnectors>0F|22@OF|00:00:11:22:33:44:55:66>/nodeConnectors>
- * <nodeConnectors>0F|39@OF|00:00:ab:cd:33:44:55:66>/nodeConnectors>
+ * <nodeConnectors>OF|22@OF|00:00:11:22:33:44:55:66</nodeConnectors>
+ * <nodeConnectors>OF|39@OF|00:00:ab:cd:33:44:55:66</nodeConnectors>
* </subnetConfig>
*
- * Request in JSON:
+ * Request body in JSON:
* {
* "name":"salesdepartment",
- * "subnet":"172.173.174.254/24"
- * "nodeConnectors":["0F|22@OF|00:00:11:22:33:44:55:66", "0F|39@OF|00:00:ab:cd:33:44:55:66"]
+ * "subnet":"172.173.174.254/24",
+ * "nodeConnectors":[
+ * "OF|22@OF|00:00:11:22:33:44:55:66",
+ * "OF|39@OF|00:00:ab:cd:33:44:55:66"
+ * ]
* }
* </pre>
*/