X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fnorthbound%2Fsubnets%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fsubnets%2Fnorthbound%2FSubnetsNorthboundJAXRS.java;h=e3c2189bf91550bd7c8d35526ec0d75413a88a6a;hp=5c327c4f72243b0cd9af6ddb92b1b747630bdca2;hb=a0704c894e7c7e4dd6714e850ba6489f70c3c541;hpb=eb9e1983a0fce7e4a381eff33e40cae957cddf53 diff --git a/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthboundJAXRS.java b/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthboundJAXRS.java index 5c327c4f72..e3c2189bf9 100644 --- a/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthboundJAXRS.java +++ b/opendaylight/northbound/subnets/src/main/java/org/opendaylight/controller/subnets/northbound/SubnetsNorthboundJAXRS.java @@ -8,7 +8,11 @@ package org.opendaylight.controller.subnets.northbound; import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import javax.ws.rs.Consumes; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.POST; @@ -20,6 +24,7 @@ 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 org.codehaus.enunciate.jaxrs.ResponseCode; import org.codehaus.enunciate.jaxrs.StatusCodes; @@ -39,8 +44,7 @@ import org.slf4j.LoggerFactory; @Path("/") public class SubnetsNorthboundJAXRS { - protected static final Logger logger = LoggerFactory - .getLogger(SubnetsNorthboundJAXRS.class); + protected static final Logger logger = LoggerFactory.getLogger(SubnetsNorthboundJAXRS.class); private String username; @@ -66,20 +70,15 @@ public class SubnetsNorthboundJAXRS { @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ @ResponseCode(code = 404, condition = "The containerName passed was not found") }) @TypeHint(SubnetConfigs.class) - public SubnetConfigs listSubnets( - @PathParam("containerName") String containerName) { - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.READ, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + public SubnetConfigs listSubnets(@PathParam("containerName") String containerName) { + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = null; - switchManager = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (switchManager == null) { - throw new ResourceNotFoundException( - RestMessages.NOCONTAINER.toString()); + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); } return new SubnetConfigs(switchManager.getSubnetsConfigList()); } @@ -98,37 +97,32 @@ public class SubnetsNorthboundJAXRS { @GET @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) @StatusCodes({ - @ResponseCode(code = 404, condition = "The containerName passed was not found"), - @ResponseCode(code = 404, condition = "Subnet does not exist") }) - @TypeHint(SubnetConfig.class) + @ResponseCode(code = 404, condition = "The containerName passed was not found"), + @ResponseCode(code = 404, condition = "Subnet does not exist") }) + @TypeHint(SubnetConfig.class) public SubnetConfig listSubnet( - @PathParam("containerName") String containerName, - @PathParam("subnetName") String subnetName) { + @PathParam("containerName") String containerName, + @PathParam("subnetName") String subnetName) { - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.READ, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.READ, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = null; - switchManager = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (switchManager == null) { - throw new ResourceNotFoundException( - RestMessages.NOCONTAINER.toString()); + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); } SubnetConfig res = switchManager.getSubnetConfig(subnetName); if (res == null) { - throw new ResourceNotFoundException( - RestMessages.NOSUBNET.toString()); + throw new ResourceNotFoundException(RestMessages.NOSUBNET.toString()); } else { return res; } } /** - * Add/Update a subnet to a container + * Add a subnet to a container * * @param containerName * container in which we want to add/update the subnet @@ -142,38 +136,30 @@ public class SubnetsNorthboundJAXRS { @Path("/{containerName}/{subnetName}") @POST @StatusCodes({ - @ResponseCode(code = 404, condition = "The containerName passed was not found"), - @ResponseCode(code = 404, condition = "Invalid Data passed"), - @ResponseCode(code = 201, condition = "Subnet added/modified"), - @ResponseCode(code = 500, condition = "Addition of subnet failed") }) - public Response addSubnet(@PathParam("containerName") String containerName, - @PathParam("subnetName") String subnetName, - @QueryParam("subnet") String subnet) { - - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + @ResponseCode(code = 404, condition = "Invalid Data passed"), + @ResponseCode(code = 201, condition = "Subnet added"), + @ResponseCode(code = 500, condition = "Addition of subnet failed") }) + public Response addSubnet( + @PathParam("containerName") String containerName, + @PathParam("subnetName") String subnetName, @QueryParam("subnet") String subnet) { + + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } if (subnetName == null) { - throw new ResourceNotFoundException( - RestMessages.INVALIDDATA.toString()); + throw new ResourceNotFoundException(RestMessages.INVALIDDATA.toString()); } if (subnet == null) { - throw new ResourceNotFoundException( - RestMessages.INVALIDDATA.toString()); + throw new ResourceNotFoundException(RestMessages.INVALIDDATA.toString()); } ISwitchManager switchManager = null; - switchManager = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (switchManager == null) { - throw new ResourceNotFoundException( - RestMessages.NOCONTAINER.toString()); + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); } - SubnetConfig cfgObject = new SubnetConfig(subnetName, subnet, - new ArrayList(0)); + SubnetConfig cfgObject = new SubnetConfig(subnetName, subnet, new ArrayList(0)); Status status = switchManager.addSubnet(cfgObject); if (status.isSuccess()) { return Response.status(Response.Status.CREATED).build(); @@ -193,29 +179,24 @@ public class SubnetsNorthboundJAXRS { @Path("/{containerName}/{subnetName}") @DELETE @StatusCodes({ - @ResponseCode(code = 404, condition = "The containerName passed was not found"), - @ResponseCode(code = 500, condition = "Removal of subnet failed") }) + @ResponseCode(code = 404, condition = "The containerName passed was not found"), + @ResponseCode(code = 500, condition = "Removal of subnet failed") }) public Response removeSubnet( - @PathParam("containerName") String containerName, - @PathParam("subnetName") String subnetName) { + @PathParam("containerName") String containerName, + @PathParam("subnetName") String subnetName) { if (subnetName == null) { - throw new ResourceNotFoundException( - RestMessages.INVALIDDATA.toString()); + throw new ResourceNotFoundException(RestMessages.INVALIDDATA.toString()); } - if (!NorthboundUtils.isAuthorized( - getUserName(), containerName, Privilege.WRITE, this)) { - throw new UnauthorizedException( - "User is not authorized to perform this operation on container " - + containerName); + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); } ISwitchManager switchManager = null; - switchManager = (ISwitchManager) ServiceHelper.getInstance( - ISwitchManager.class, containerName, this); + switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, this); if (switchManager == null) { - throw new ResourceNotFoundException( - RestMessages.NOCONTAINER.toString()); + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); } Status status = switchManager.removeSubnet(subnetName); if (status.isSuccess()) { @@ -224,57 +205,213 @@ public class SubnetsNorthboundJAXRS { throw new InternalServerErrorException(status.getDescription()); } - /* - * - * Add or remove switch ports to a subnet POST subnets/green/sw - * - * @param model + /** + * Modify a subnet. For now only changing the port list is allowed. * * @param containerName - * + * Name of the Container * @param name + * Name of the SubnetConfig to be modified + * @param subnetConfigData + * the {@link SubnetConfig} structure in JSON passed as a POST + * parameter + * @return If the operation is successful or not + */ + @Path("/{containerName}/{subnetName}/modify") + @POST + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @StatusCodes({ + @ResponseCode(code = 202, condition = "Operation successful"), + @ResponseCode(code = 400, condition = "Invalid request, i.e., requested changing the subnet name"), + @ResponseCode(code = 404, condition = "The containerName or subnetName is not found"), + @ResponseCode(code = 500, condition = "Internal server error") }) + public Response modifySubnet(@PathParam("containerName") String containerName, + @PathParam("subnetName") String name, + @TypeHint(SubnetConfig.class) JAXBElement subnetConfigData) { + + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); + } + + ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, + this); + if (switchManager == null) { + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); + } + + SubnetConfig subnetConf = subnetConfigData.getValue(); + SubnetConfig existingConf = switchManager.getSubnetConfig(name); + + boolean successful = true; + + // make sure that the name matches an existing subnet and we're not + // changing the name or subnet IP/mask + if (existingConf == null) { + // don't have a subnet by that name + return Response.status(Response.Status.NOT_FOUND).build(); + + } else if (!existingConf.getName().equals(subnetConf.getName()) + || !existingConf.getSubnet().equals(subnetConf.getSubnet())) { + // can't change the name of a subnet + return Response.status(Response.Status.BAD_REQUEST).build(); + + } else { + // create a set for fast lookups + Set newPorts = new HashSet(subnetConf.getNodePorts()); + + // go through the current ports and (1) remove ports that aren't + // there anymore and (2) remove ports that are still there from the + // set of ports to add + for (String s : existingConf.getNodePorts()) { + if (newPorts.contains(s)) { + newPorts.remove(s); + } else { + Status st = switchManager.removePortsFromSubnet(name, s); + successful = successful && st.isSuccess(); + } + } + + // add any remaining ports + for (String s : newPorts) { + Status st = switchManager.addPortsToSubnet(name, s); + successful = successful && st.isSuccess(); + } + } + + if (successful) { + return Response.status(Response.Status.ACCEPTED).build(); + } else { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + + /** * - * @param subnet: the subnet name name - * - * @param switchports: datapath ID/port list => - * xx:xx:xx:xx:xx:xx:xx:xx/a,b,c-m,r-t,y - * - * @return - * - * @RequestMapping(value = "/{containerName}/{name}", method = - * RequestMethod.POST) - * - * public View addSwitchports(Map model, - * - * @PathVariable(value = "containerName") String containerName, - * - * @PathVariable(value = "name") String name, - * - * @RequestParam(value = "nodeports") String nodePorts, - * - * @RequestParam(value = "action") String action) { - * - * checkDefaultDisabled(containerName); ISwitchManager switchManager = null; - * try { BundleContext bCtx = FrameworkUtil.getBundle(this.getClass()) - * .getBundleContext(); - * - * ServiceReference[] services = bCtx.getServiceReferences( - * ISwitchManager.class.getName(), "(containerName=" + containerName + ")"); - * - * if (services != null) { switchManager = (ISwitchManager) - * bCtx.getService(services[0]); logger.debug("Switch manager reference is:" - * + switchManager); } } catch (Exception e) { - * logger.error("Switch Manager reference is NULL"); } + * Add ports to a subnet * - * checkContainerExists(switchManager); + * @param containerName + * Name of the Container + * @param name + * Name of the SubnetConfig to be modified + * @param subnetConfigData + * the {@link SubnetConfig} structure in JSON passed as a POST + * parameter + * @return If the operation is successful or not + */ + @Path("/{containerName}/{subnetName}/add") + @POST + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @StatusCodes({ + @ResponseCode(code = 202, condition = "Operation successful"), + @ResponseCode(code = 400, condition = "Invalid request"), + @ResponseCode(code = 404, condition = "The containerName or subnetName is not found"), + @ResponseCode(code = 500, condition = "Internal server error") }) + public Response addNodePorts( + @PathParam("containerName") String containerName, + @PathParam("subnetName") String name, + @TypeHint(SubnetConfig.class) JAXBElement subnetConfigData) { + + SubnetConfig subnetConf = subnetConfigData.getValue(); + return addOrDeletePorts(containerName, name, subnetConf, "add"); + } + + /** * - * String ret; if (action.equals("add")) { ret = - * switchManager.addPortsToSubnet(name, nodePorts); } else if - * (action.equals("remove")) { ret = - * switchManager.removePortsFromSubnet(name, nodePorts); } else { throw new - * UnsupportedMediaTypeException(RestMessages.UNKNOWNACTION .toString() + - * ": " + action); } + * Delete ports from a subnet * - * return returnViewOrThrowConflicEx(model, ret); } + * @param containerName + * Name of the Container + * @param name + * Name of the SubnetConfig to be modified + * @param subnetConfigData + * the {@link SubnetConfig} structure in JSON passed as a POST + * parameter + * @return If the operation is successful or not */ + @Path("/{containerName}/{subnetName}/delete") + @POST + @Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) + @StatusCodes({ + @ResponseCode(code = 202, condition = "Operation successful"), + @ResponseCode(code = 400, condition = "Invalid request"), + @ResponseCode(code = 404, condition = "The containerName or subnetName is not found"), + @ResponseCode(code = 500, condition = "Internal server error") }) + public Response deleteNodePorts( + @PathParam("containerName") String containerName, + @PathParam("subnetName") String name, + @TypeHint(SubnetConfig.class) JAXBElement subnetConfigData) { + + SubnetConfig subnetConf = subnetConfigData.getValue(); + return addOrDeletePorts(containerName, name, subnetConf, "delete"); + } + + /** + * + * Add/Delete ports to/from a subnet + * + * @param containerName + * Name of the Container + * @param name + * Name of the SubnetConfig to be modified + * @param subnetConfig + * the {@link SubnetConfig} structure + * @param action + * add or delete + * @return If the operation is successful or not + */ + private Response addOrDeletePorts(String containerName, String name, SubnetConfig subnetConf, String action) { + + if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) { + throw new UnauthorizedException("User is not authorized to perform this operation on container " + + containerName); + } + + ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName, + this); + if (switchManager == null) { + throw new ResourceNotFoundException(RestMessages.NOCONTAINER.toString()); + } + + SubnetConfig existingConf = switchManager.getSubnetConfig(name); + + // make sure that the name matches an existing subnet and we're not + // changing the name or subnet IP/mask + if (existingConf == null) { + // don't have a subnet by that name + return Response.status(Response.Status.NOT_FOUND).build(); + } else if (!existingConf.getName().equals(subnetConf.getName()) + || !existingConf.getSubnet().equals(subnetConf.getSubnet())) { + // can't change the name of a subnet + return Response.status(Response.Status.BAD_REQUEST).build(); + } else { + Status st; + boolean successful = true; + List ports = subnetConf.getNodePorts(); + + if (action.equals("add")) { + // add new ports + ports.removeAll(existingConf.getNodePorts()); + for (String port : ports) { + st = switchManager.addPortsToSubnet(name, port); + successful = successful && st.isSuccess(); + } + } else if (action.equals("delete")) { + // delete existing ports + ports.retainAll(existingConf.getNodePorts()); + for (String port : ports) { + st = switchManager.removePortsFromSubnet(name, port); + successful = successful && st.isSuccess(); + } + } else { + return Response.status(Response.Status.BAD_REQUEST).build(); + } + + if (successful) { + return Response.status(Response.Status.ACCEPTED).build(); + } else { + return Response.status(Response.Status.INTERNAL_SERVER_ERROR).build(); + } + } + } }