subnets = switchManager.getSubnetsConfigList();
if (queryString != null) {
subnets = queryContext.createQuery(queryString, SubnetConfig.class)
.find(subnets);
}
return new SubnetConfigs(subnets);
}
/**
* List the configuration of a subnet in a given container
*
* @param containerName
* container in which we want to query the subnet
* @param subnetName
* of the subnet being queried
*
* @return SubnetConfig
*
*
* Example:
*
* Request URL:
* http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/marketingdepartment
*
* Response body in XML:
* <subnetConfig>
* <name>marketingdepartment</name>
* <subnet>30.0.0.1/24</subnet>
* <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 body in JSON:
* {
* "name":"marketingdepartment",
* "subnet":"30.0.0.1/24",
* "nodeConnectors":[
* "OF|1@OF|00:00:00:00:00:00:00:01",
* "OF|3@OF|00:00:00:00:00:00:00:03"
* ]
* }
*
*/
@Path("/{containerName}/subnet/{subnetName}")
@GET
@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 or subnetName passed was not found"),
@ResponseCode(code = 503, condition = "Service unavailable") })
@TypeHint(SubnetConfig.class)
public SubnetConfig listSubnet(@PathParam("containerName") String containerName,
@PathParam("subnetName") String subnetName) {
handleContainerDoesNotExist(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 = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName,
this);
if (switchManager == null) {
throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
SubnetConfig res = switchManager.getSubnetConfig(subnetName);
if (res == null) {
throw new ResourceNotFoundException(RestMessages.NOSUBNET.toString());
}
return res;
}
/**
* Add a subnet into the specified container context, node connectors are
* optional
*
* @param containerName
* name of the container context in which the subnet needs to be
* added
* @param subnetName
* name of new subnet to be added
* @param subnetConfigData
* the {@link SubnetConfig} structure in request body
*
* @return Response as dictated by the HTTP Response Status code
*
*
* Example:
*
* Request URL:
* http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
*
* Request body in XML:
* <subnetConfig>
* <name>salesdepartment</name>
* <subnet>172.173.174.254/24</subnet>
* <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 body in JSON:
* {
* "name":"salesdepartment",
* "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"
* ]
* }
*
*/
@Path("/{containerName}/subnet/{subnetName}")
@PUT
@StatusCodes({ @ResponseCode(code = 201, condition = "Subnet created successfully"),
@ResponseCode(code = 400, condition = "Invalid data passed"),
@ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
@ResponseCode(code = 409, condition = "Subnet name in url conflicts with name in request body"),
@ResponseCode(code = 404, condition = "Container name passed was not found or subnet config is null"),
@ResponseCode(code = 500, condition = "Internal Server Error: Addition of subnet failed"),
@ResponseCode(code = 503, condition = "Service unavailable") })
public Response addSubnet(@PathParam("containerName") String containerName,
@PathParam("subnetName") String subnetName, @TypeHint(SubnetConfig.class) SubnetConfig subnetConfigData) {
handleContainerDoesNotExist(containerName);
if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) {
throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ containerName);
}
SubnetConfig cfgObject = subnetConfigData;
handleNameMismatch(cfgObject.getName(), subnetName);
ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName,
this);
if (switchManager == null) {
throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Status status = switchManager.addSubnet(cfgObject);
if (status.isSuccess()) {
NorthboundUtils.auditlog("Subnet Gateway", username, "added", subnetName, containerName);
if (subnetConfigData.getNodeConnectors() != null) {
for (NodeConnector port : subnetConfigData.getNodeConnectors()) {
NorthboundUtils.auditlog("Port", getUserName(), "added",
NorthboundUtils.getPortName(port, switchManager) + " to Subnet Gateway " + subnetName,
containerName);
}
}
return Response.status(Response.Status.CREATED).build();
}
return NorthboundUtils.getResponse(status);
}
/**
* Delete a subnet from the specified container context
*
* @param containerName
* name of the container in which subnet needs to be removed
* @param subnetName
* name of new subnet to be deleted
* @return Response as dictated by the HTTP Response Status code
*
*
* Example:
*
* Request URL:
* http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/engdepartment
*
*
*/
@Path("/{containerName}/subnet/{subnetName}")
@DELETE
@StatusCodes({ @ResponseCode(code = 204, condition = "No Content"),
@ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
@ResponseCode(code = 404, condition = "The containerName passed was not found"),
@ResponseCode(code = 500, condition = "Internal Server Error : Removal of subnet failed"),
@ResponseCode(code = 503, condition = "Service unavailable") })
public Response removeSubnet(@PathParam("containerName") String containerName,
@PathParam("subnetName") String subnetName) {
handleContainerDoesNotExist(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 = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName,
this);
if (switchManager == null) {
throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
Status status = switchManager.removeSubnet(subnetName);
if (status.isSuccess()) {
NorthboundUtils.auditlog("Subnet Gateway", username, "removed", subnetName, containerName);
return Response.status(Response.Status.NO_CONTENT).build();
}
return NorthboundUtils.getResponse(status);
}
/**
* Modify a subnet. Replace the existing subnet with the new specified one.
* For now only port list modification is allowed. If the respective subnet
* configuration does not exist this call is equivalent to a subnet
* creation.
*
* @param containerName
* Name of the Container context
* @param subnetName
* Name of the subnet to be modified
* @param subnetConfigData
* the {@link SubnetConfig} structure in request body parameter
* @return Response as dictated by the HTTP Response Status code
*
*
* Example:
*
* Request URL:
* http://localhost:8080/controller/nb/v2/subnetservice/default/subnet/salesdepartment
*
* Request body in XML:
* <subnetConfig>
* <name>salesdepartment</name>
* <subnet>172.173.174.254/24</subnet>
* <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 body in JSON:
* {
* "name":"salesdepartment",
* "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"
* ]
* }
*
*/
@Path("/{containerName}/subnet/{subnetName}")
@POST
@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
@StatusCodes({ @ResponseCode(code = 200, condition = "Configuration replaced successfully"),
@ResponseCode(code = 401, condition = "User not authorized to perform this operation"),
@ResponseCode(code = 409, condition = "Subnet name in url conflicts with name in request body"),
@ResponseCode(code = 404, condition = "The containerName or subnetName is not found"),
@ResponseCode(code = 500, condition = "Internal server error: Modify subnet failed"),
@ResponseCode(code = 503, condition = "Service unavailable") })
public Response modifySubnet(@Context UriInfo uriInfo, @PathParam("containerName") String containerName,
@PathParam("subnetName") String subnetName, @TypeHint(SubnetConfig.class) SubnetConfig subnetConfigData) {
handleContainerDoesNotExist(containerName);
if (!NorthboundUtils.isAuthorized(getUserName(), containerName, Privilege.WRITE, this)) {
throw new UnauthorizedException("User is not authorized to perform this operation on container "
+ containerName);
}
handleNameMismatch(subnetConfigData.getName(), subnetName);
ISwitchManager switchManager = (ISwitchManager) ServiceHelper.getInstance(ISwitchManager.class, containerName,
this);
if (switchManager == null) {
throw new ServiceUnavailableException("SwitchManager " + RestMessages.SERVICEUNAVAILABLE.toString());
}
// Need to check this until Status does not return a CREATED status code
SubnetConfig existingConf = switchManager.getSubnetConfig(subnetName);
Status status = switchManager.modifySubnet(subnetConfigData);
if (status.isSuccess()) {
if (existingConf == null) {
NorthboundUtils.auditlog("Subnet Gateway", username, "added", subnetName, containerName);
if (subnetConfigData.getNodeConnectors() != null) {
for (NodeConnector port : subnetConfigData.getNodeConnectors()) {
NorthboundUtils.auditlog("Port", getUserName(), "added",
NorthboundUtils.getPortName(port, switchManager) + " to Subnet Gateway" + subnetName,
containerName);
}
}
return Response.created(uriInfo.getRequestUri()).build();
} else {
Set existingNCList = existingConf.getNodeConnectors();
if (existingNCList == null) {
existingNCList = new HashSet(0);
}
if (subnetConfigData.getNodeConnectors() != null) {
for (NodeConnector port : subnetConfigData.getNodeConnectors()) {
if (!existingNCList.contains(port)) {
NorthboundUtils.auditlog("Port", getUserName(), "added",
NorthboundUtils.getPortName(port, switchManager) + " to Subnet Gateway "
+ subnetName, containerName);
}
}
}
for (NodeConnector port : existingNCList) {
if (!subnetConfigData.getNodeConnectors().contains(port)) {
NorthboundUtils
.auditlog("Port", getUserName(), "removed",
NorthboundUtils.getPortName(port, switchManager) + " from Subnet Gateway "
+ subnetName, containerName);
}
}
}
}
return NorthboundUtils.getResponse(status);
}
}